Skip to content

Commit 13a4bb3

Browse files
committed
WIP: Add support for multiple locale directories
1 parent bb66b7b commit 13a4bb3

File tree

3 files changed

+66
-24
lines changed

3 files changed

+66
-24
lines changed

docs/started.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ module.export = {
4444
// pattern: './path/to/locales/*.{json,json5,yaml,yml}', // extension is glob formatting!
4545
// localeKey: 'file' // or 'key'
4646
// }
47+
// or
48+
// localeDir: [
49+
// {
50+
// pattern: './path/to/locales1/*.{json,json5,yaml,yml}',
51+
// localeKey: 'file' // or 'key'
52+
// },
53+
// {
54+
// pattern: './path/to/locales2/*.{json,json5,yaml,yml}',
55+
// localeKey: 'file' // or 'key'
56+
// },
57+
// ]
4758
}
4859
}
4960
}
@@ -53,13 +64,14 @@ See [the rule list](../rules/)
5364

5465
### `settings['vue-i18n']`
5566

56-
- `localeDir` ... You can specify a string or an object.
67+
- `localeDir` ... You can specify a string or an object or an array.
5768
- String option ... A glob for specifying files that store localization messages of project.
5869
- Object option
5970
- `pattern` (`string`) ... A glob for specifying files that store localization messages of project.
6071
- `localeKey` (`'file' | 'key'`) ... Specifies how to determine the locale for localization messages.
6172
- `'file'` ... Determine the locale name from the filename. The resource file should only contain messages for that locale. Use this option if you use `vue-cli-plugin-i18n`. This option is also used when String option is specified.
6273
- `'key'` ... Determine the locale name from the root key name of the file contents. The value of that key should only contain messages for that locale. Used when the resource file is in the format given to the `messages` option of the `VueI18n` constructor option.
74+
- Array option ... An array of String option and Object option. Useful if you have multiple locale directories.
6375

6476
### Running ESLint from command line
6577

lib/types/settings.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type LocaleKeyType = 'file' | 'key'
1212
export type SettingsVueI18nLocaleDir =
1313
| SettingsVueI18nLocaleDirGlob
1414
| SettingsVueI18nLocaleDirObject
15+
| (SettingsVueI18nLocaleDirGlob | SettingsVueI18nLocaleDirObject)[]
1516
/**
1617
* A glob for specifying files that store localization messages of project.
1718
*/

lib/utils/index.ts

+52-23
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,15 @@ import type {
1717
TemplateListener,
1818
RuleListener,
1919
LocaleKeyType,
20-
SettingsVueI18nLocaleDir
20+
SettingsVueI18nLocaleDir,
21+
SettingsVueI18nLocaleDirObject,
22+
SettingsVueI18nLocaleDirGlob
2123
} from '../types'
2224

25+
interface LocaleFiles {
26+
files: string[]
27+
localeKey: LocaleKeyType
28+
}
2329
const UNEXPECTED_ERROR_LOCATION = { line: 1, column: 0 }
2430
/**
2531
* Register the given visitor to parser services.
@@ -48,16 +54,24 @@ export function defineTemplateBodyVisitor(
4854
)
4955
}
5056

51-
/**
52-
* @param {string[]} files
53-
* @param {LocaleKeyType} localeKey
54-
* @returns {LocaleMessage[]}
55-
*/
56-
function loadLocaleMessages(files: string[], localeKey: LocaleKeyType) {
57-
return files.map(file => {
58-
const fullpath = resolve(process.cwd(), file)
59-
return new FileLocaleMessage({ fullpath, localeKey })
60-
})
57+
function loadLocaleMessages(
58+
localeFilesList: LocaleFiles[],
59+
cwd: string
60+
): FileLocaleMessage[] {
61+
const results: FileLocaleMessage[] = []
62+
const checkDupeMap: { [file: string]: LocaleKeyType[] } = {}
63+
for (const { files, localeKey } of localeFilesList) {
64+
for (const file of files) {
65+
const localeKeys = checkDupeMap[file] || (checkDupeMap[file] = [])
66+
if (localeKeys.includes(localeKey)) {
67+
continue
68+
}
69+
localeKeys.push(localeKey)
70+
const fullpath = resolve(cwd, file)
71+
results.push(new FileLocaleMessage({ fullpath, localeKey }))
72+
}
73+
}
74+
return results
6175
}
6276

6377
/** @type {Set<RuleContext>} */
@@ -105,34 +119,49 @@ export function getLocaleMessages(context: RuleContext): LocaleMessages {
105119
class LocaleDirLocaleMessagesCache {
106120
private _targetFilesLoader: CacheLoader<[string, string], string[]>
107121
private _loadLocaleMessages: (
108-
files: string[],
109-
localeKey: LocaleKeyType,
122+
localeFilesList: LocaleFiles[],
110123
cwd: string
111124
) => FileLocaleMessage[]
112125
constructor() {
113126
this._targetFilesLoader = new CacheLoader(pattern => glob.sync(pattern))
114127

115-
this._loadLocaleMessages = defineCacheFunction((files, localeKey) => {
116-
return loadLocaleMessages(files, localeKey)
117-
})
128+
this._loadLocaleMessages = defineCacheFunction(
129+
(localeFilesList: LocaleFiles[], cwd) => {
130+
return loadLocaleMessages(localeFilesList, cwd)
131+
}
132+
)
118133
}
119134
/**
120135
* @param {SettingsVueI18nLocaleDir} localeDir
121136
* @returns {LocaleMessage[]}
122137
*/
123138
getLocaleMessagesFromLocaleDir(localeDir: SettingsVueI18nLocaleDir) {
124139
const cwd = process.cwd()
140+
let localeFilesList: LocaleFiles[]
141+
if (Array.isArray(localeDir)) {
142+
localeFilesList = localeDir.map(dir => this._toLocaleFiles(dir, cwd))
143+
} else {
144+
localeFilesList = [this._toLocaleFiles(localeDir, cwd)]
145+
}
146+
return this._loadLocaleMessages(localeFilesList, cwd)
147+
}
148+
149+
private _toLocaleFiles(
150+
localeDir: SettingsVueI18nLocaleDirGlob | SettingsVueI18nLocaleDirObject,
151+
cwd: string
152+
): LocaleFiles {
125153
const targetFilesLoader = this._targetFilesLoader
126-
let files
127-
let localeKey: LocaleKeyType
128154
if (typeof localeDir === 'string') {
129-
files = targetFilesLoader.get(localeDir, cwd)
130-
localeKey = 'file'
155+
return {
156+
files: targetFilesLoader.get(localeDir, cwd),
157+
localeKey: 'file'
158+
}
131159
} else {
132-
files = targetFilesLoader.get(localeDir.pattern, cwd)
133-
localeKey = String(localeDir.localeKey ?? 'file') as LocaleKeyType
160+
return {
161+
files: targetFilesLoader.get(localeDir.pattern, cwd),
162+
localeKey: String(localeDir.localeKey ?? 'file') as LocaleKeyType
163+
}
134164
}
135-
return this._loadLocaleMessages(files, localeKey, cwd)
136165
}
137166
}
138167

0 commit comments

Comments
 (0)