Skip to content
This repository was archived by the owner on Apr 22, 2024. It is now read-only.

Commit 3dec7a5

Browse files
committed
⭐ new: add locale directory setting
1 parent 35f06a4 commit 3dec7a5

File tree

6 files changed

+68
-45
lines changed

6 files changed

+68
-45
lines changed

generator/index.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ function buildEnvContent (values) {
2828
}
2929

3030
module.exports = (api, options, rootOptions) => {
31-
const { locale, fallbackLocale, enableInSFC } = options
31+
const { locale, fallbackLocale, localeDir, enableInSFC } = options
3232
debug('options', options)
3333
debug('rootOptions', rootOptions)
3434

3535
try {
3636
const lang = api.hasPlugin('typescript') ? 'ts' : 'js'
3737
const classComponent = checkInstalled('./node_modules/vue-class-component/package.json') &&
3838
checkInstalled('./node_modules/vue-property-decorator/package.json')
39-
const additionalOptions = { ...options, ...{ lang, classComponent } }
39+
const additionalOptions = { ...options, ...{ lang, localeDir, classComponent } }
4040
debug('additionalOptions', additionalOptions)
4141

4242
/*
@@ -48,7 +48,7 @@ module.exports = (api, options, rootOptions) => {
4848
'vue-i18n': '^8.0.0'
4949
},
5050
vue: {
51-
pluginOptions: { enableInSFC }
51+
pluginOptions: { locale, fallbackLocale, localeDir, enableInSFC }
5252
}
5353
}
5454

@@ -72,6 +72,14 @@ module.exports = (api, options, rootOptions) => {
7272

7373
api.extendPackage(pkg)
7474

75+
/*
76+
* Modify main.(js|ts)
77+
*/
78+
const file = lang === 'ts' ? 'src/main.ts' : 'src/main.js'
79+
debug('target file', file)
80+
api.injectImports(file, `import i18n from './i18n'`)
81+
api.injectRootOptions(file, `i18n,`)
82+
7583
/*
7684
* render templates
7785
*/
@@ -83,14 +91,6 @@ module.exports = (api, options, rootOptions) => {
8391
if (enableInSFC) {
8492
api.render('./templates/sfc', { ...additionalOptions })
8593
}
86-
87-
/*
88-
* Modify main.(js|ts)
89-
*/
90-
const file = lang === 'ts' ? 'src/main.ts' : 'src/main.js'
91-
debug('target file', file)
92-
api.injectImports(file, `import i18n from './i18n'`)
93-
api.injectRootOptions(file, `i18n,`)
9494
} catch (e) {
9595
api.exitLog(`unexpected error in vue-cli-plugin-i18n: ${e.message}`, 'error')
9696
return
@@ -113,17 +113,17 @@ module.exports = (api, options, rootOptions) => {
113113
}
114114
}
115115

116-
const localesDirPath = api.resolve('src/locales')
116+
const localesDirPath = api.resolve(`src/${localeDir}`)
117117
if (!exists(localesDirPath)) {
118118
if (!mkdir(localesDirPath)) {
119119
api.exitLog(`cannot make ${localesDirPath}`, 'error')
120120
return
121121
}
122122
}
123123

124-
writeLocaleFile(api.resolve(`src/locales/${locale}.json`))
124+
writeLocaleFile(api.resolve(`src/${localeDir}/${locale}.json`))
125125
if (locale !== fallbackLocale) {
126-
writeLocaleFile(api.resolve(`src/locales/${fallbackLocale}.json`))
126+
writeLocaleFile(api.resolve(`src/${localeDir}/${fallbackLocale}.json`))
127127
}
128128

129129
const envPath = api.resolve('.env')

generator/templates/js/src/i18n.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import VueI18n from 'vue-i18n'
44
Vue.use(VueI18n)
55

66
function loadLocaleMessages () {
7-
const locales = require.context('./locales', true, /[a-z0-9]+\.json$/i)
7+
const locales = require.context('./<%- localeDir %>', true, /[a-z0-9]+\.json$/i)
88
const messages = {}
99
locales.keys().forEach(key => {
1010
const matched = key.match(/([a-z0-9]+)\./i)

generator/templates/ts/src/i18n.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import VueI18n, { LocaleMessages } from 'vue-i18n'
44
Vue.use(VueI18n)
55

66
function loadLocaleMessages (): LocaleMessages {
7-
const locales = require.context('./locales', true, /[a-z0-9]+\.json$/i)
7+
const locales = require.context('./<%- localeDir %>', true, /[a-z0-9]+\.json$/i)
88
const messages: LocaleMessages = {}
99
locales.keys().forEach(key => {
1010
const matched = key.match(/([a-z0-9]+)\./i)

index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
const debug = require('debug')('vue-cli-plugin-i18n:service')
2+
13
module.exports = (api, options) => {
24
const { enableInSFC } = options.pluginOptions
5+
debug('options', options)
36

47
api.chainWebpack(webpackConfig => {
8+
debug('chainWebpack called')
9+
510
if (enableInSFC) {
611
webpackConfig.module
712
.rule('i18n')

prompts.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ module.exports = [{
1010
message: 'The locale of project fallback localization.',
1111
validate: input => !!input,
1212
default: 'en'
13+
}, {
14+
type: 'input',
15+
name: 'localeDir',
16+
message: 'The directory where store localization messages of project. It\'s stored under `src` directory.',
17+
validate: input => !!input,
18+
default: 'locales'
1319
}, {
1420
type: 'confirm',
1521
name: 'enableInSFC',

ui.js

Lines changed: 41 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ function assignValuesWithPath (path, value, messages) {
3737

3838
function getLocales (targetPath) {
3939
debug('getLocales', targetPath)
40-
return fs.readdirSync(`${targetPath}/src/locales`).map(locale => {
40+
return fs.readdirSync(targetPath).map(locale => {
4141
return path.basename(locale, '.json')
4242
})
4343
}
4444

4545
function getLocaleMessages (targetPath, locales) {
4646
debug('getLocaleMessages', targetPath, locales)
4747
return locales.reduce((val, locale) => {
48-
const fullPath = `${targetPath}/src/locales/${locale}.json`
48+
const fullPath = `${targetPath}/${locale}.json`
4949
val[locale] = require(fullPath)
5050
delete require.cache[require.resolve(fullPath)]
5151
return val
@@ -65,52 +65,60 @@ function writeLocaleMessages (targetPath, locale, messages, order) {
6565
const sortedMessages = sortObject(messages, order)
6666
debug('writeLocaleMessages after:', sortedMessages)
6767
return fs.writeFileSync(
68-
`${targetPath}/src/locales/${locale}.json`,
68+
`${targetPath}/${locale}.json`,
6969
JSON.stringify(sortedMessages, null, 2), { encoding: 'utf8' }
7070
)
7171
}
7272

7373
module.exports = api => {
7474
const { getSharedData, setSharedData, watchSharedData } = api.namespace('vue-i18n-')
7575

76-
function setupAddon (path) {
77-
debug(`setupAddon: path -> ${path}`)
76+
function setupAddon (path, options) {
77+
debug(`setupAddon: path -> ${path}, options -> ${options}`)
78+
const localeDir = options.localeDir
7879
setSharedData('order', 'asc')
7980
const env = readEnv(`${path}/.env`)
8081
const current = env['VUE_APP_I18N_LOCALE'] || 'en'
8182
const defaultLocale = env['VUE_APP_I18N_FALLBACK_LOCALE'] || 'en'
8283
setSharedData('current', defaultLocale)
8384
setSharedData('defaultLocale', defaultLocale)
8485
debug(`setupAddon: current -> ${current}, defaultLocale -> ${defaultLocale}`)
85-
const locales = getLocales(path)
86+
const locales = getLocales(`${path}/src/${localeDir}`)
8687
setSharedData('locales', locales)
87-
const messages = getLocaleMessages(path, locales)
88+
const messages = getLocaleMessages(`${path}/src/${localeDir}`, locales)
8889
setSharedData('localeMessages', messages)
8990
setSharedData('localePaths', getLocalePaths(messages))
9091
}
9192

9293
try {
9394
let currentProject = null
95+
let currentConfig = null
9496

9597
api.onProjectOpen((project, previousProject) => {
9698
debug('onProjectOpen', project, previousProject)
9799
})
98100

99101
api.onPluginReload(project => {
100102
debug('onPluginReload', project)
101-
setupAddon(project.path)
103+
const rawConfig = require(`${project.path}/vue.config`)
104+
const config = rawConfig.pluginOptions || { localeDir: 'locales' }
105+
if (!config.localeDir) { config.localeDir = 'locales' }
106+
debug('onPluginReload : load vue.config', config)
107+
setupAddon(project.path, config)
102108
currentProject = project
109+
currentConfig = config
103110
})
104111

105112
api.onAction('add-path-action', ({ path, locale }) => {
106113
debug('add-path-action onAction', path, locale)
107-
if (!currentProject && !path) {
114+
if (!currentProject || !currentConfig || !path) {
108115
console.error('add-path-action: invalid pre-condition !!')
109116
return
110117
}
111118

112-
const locales = getLocales(currentProject.path)
113-
const messages = getLocaleMessages(currentProject.path, locales)
119+
const localePath = `${currentProject.path}/src/${currentConfig.localeDir}`
120+
const locales = getLocales(localePath)
121+
const messages = getLocaleMessages(localePath, locales)
114122
const orderData = getSharedData('order')
115123

116124
const additional = {}
@@ -120,21 +128,22 @@ module.exports = api => {
120128
debug('additional', additional)
121129
const message = deepmerge(original, unflatten(additional))
122130
debug('merged', message)
123-
writeLocaleMessages(currentProject.path, locale, message, orderData.value)
131+
writeLocaleMessages(localePath, locale, message, orderData.value)
124132
messages[locale] = message
125133
setSharedData('localeMessages', messages)
126134
setSharedData('localePaths', getLocalePaths(messages))
127135
})
128136

129137
api.onAction('update-path-action', ({ path, old, locale }) => {
130138
debug('update-path-action onAction', path, old, locale)
131-
if (!currentProject && !path && !old) {
139+
if (!currentProject || !currentConfig || !path || !old) {
132140
console.error('update-path-action: invalid pre-condition !!')
133141
return
134142
}
135143

136-
const locales = getLocales(currentProject.path)
137-
const messages = getLocaleMessages(currentProject.path, locales)
144+
const localePath = `${currentProject.path}/src/${currentConfig.localeDir}`
145+
const locales = getLocales(localePath)
146+
const messages = getLocaleMessages(localePath, locales)
138147
const orderData = getSharedData('order')
139148

140149
const original = messages[locale]
@@ -143,28 +152,29 @@ module.exports = api => {
143152
delete flattendOriginal[old]
144153
const newMessage = unflatten(flattendOriginal)
145154
assignValuesWithPath(path, oldValues, newMessage)
146-
writeLocaleMessages(currentProject.path, locale, newMessage, orderData.value)
155+
writeLocaleMessages(localePath, locale, newMessage, orderData.value)
147156
messages[locale] = newMessage
148157
setSharedData('localeMessages', messages)
149158
setSharedData('localePaths', getLocalePaths(messages))
150159
})
151160

152161
api.onAction('delete-path-action', ({ path, locale }) => {
153162
debug('delete-path-action onAction', path, locale)
154-
if (!currentProject && !path) {
163+
if (!currentProject || !currentConfig || !path) {
155164
console.log('delete-path-action: invalid pre-condition')
156165
return
157166
}
158167

159-
const locales = getLocales(currentProject.path)
160-
const messages = getLocaleMessages(currentProject.path, locales)
168+
const localePath = `${currentProject.path}/src/${currentConfig.localeDir}`
169+
const locales = getLocales(localePath)
170+
const messages = getLocaleMessages(localePath, locales)
161171
const orderData = getSharedData('order')
162172

163173
const message = messages[locale]
164174
const flattendMessage = flatten(message)
165175
delete flattendMessage[path]
166176
messages[locale] = unflatten(flattendMessage)
167-
const ret = writeLocaleMessages(currentProject.path, locale, messages[locale], orderData.value)
177+
const ret = writeLocaleMessages(localePath, locale, messages[locale], orderData.value)
168178
debug('write data', ret)
169179

170180
setSharedData('localeMessages', messages)
@@ -173,46 +183,48 @@ module.exports = api => {
173183

174184
api.onAction('edit-message-action', ({ path, value, locale }) => {
175185
debug('edit-message-action onAction', path, value, locale)
176-
if (!currentProject && !path) {
186+
if (!currentProject || !currentConfig || !path) {
177187
console.error('edit-message-action: invalid pre-condition !!')
178188
return
179189
}
180190

181-
const locales = getLocales(currentProject.path)
182-
const localeMessages = getLocaleMessages(currentProject.path, locales)
191+
const localePath = `${currentProject.path}/src/${currentConfig.localeDir}`
192+
const locales = getLocales(localePath)
193+
const localeMessages = getLocaleMessages(localePath, locales)
183194
const orderData = getSharedData('order')
184195

185196
const messages = localeMessages[locale]
186197
const flattendMessage = flatten(messages)
187198
flattendMessage[path] = value
188199
localeMessages[locale] = unflatten(flattendMessage)
189-
writeLocaleMessages(currentProject.path, locale, localeMessages[locale], orderData.value)
200+
writeLocaleMessages(localePath, locale, localeMessages[locale], orderData.value)
190201

191202
setSharedData('localeMessages', localeMessages)
192203
setSharedData('localePaths', getLocalePaths(localeMessages))
193204
})
194205

195206
api.onAction('add-locale-action', ({ locale }) => {
196207
debug('add-locale-action onAction', locale)
197-
if (!currentProject && !locale) {
208+
if (!currentProject || !currentConfig || !locale) {
198209
console.error('add-locale-action: invalid pre-condition')
199210
return
200211
}
201212

213+
const localePath = `${currentProject.path}/src/${currentConfig.localeDir}`
202214
const defaultLocaleData = getSharedData('defaultLocale')
203215
const defaultLocale = defaultLocaleData.value
204-
const oldMessages = getLocaleMessages(currentProject.path, getLocales(currentProject.path))
216+
const oldMessages = getLocaleMessages(localePath, getLocales(localePath))
205217
const orderData = getSharedData('order')
206218

207219
const oldFlattendMessages = flatten(oldMessages[defaultLocale])
208220
const newLocaleMessages = Object.keys(oldFlattendMessages).reduce((val, p) => {
209221
val[p] = oldFlattendMessages[p]
210222
return val
211223
}, {})
212-
writeLocaleMessages(currentProject.path, locale, unflatten(newLocaleMessages), orderData.value)
224+
writeLocaleMessages(localePath, locale, unflatten(newLocaleMessages), orderData.value)
213225

214-
const locales = getLocales(currentProject.path)
215-
const messages = getLocaleMessages(currentProject.path, locales)
226+
const locales = getLocales(localePath)
227+
const messages = getLocaleMessages(localePath, locales)
216228
setSharedData('localeMessages', messages)
217229
setSharedData('localePaths', getLocalePaths(messages))
218230
setSharedData('locales', locales)

0 commit comments

Comments
 (0)