UNPKG

2.38 kBJavaScriptView Raw
1import parseLanguageList from './parse-language-list'
2
3import availableLocaleIds from './locale-ids'
4
5/**
6 * 检查单项,如果和availableLocales内的项目有匹配,返回匹配,否则返回null
7 * @param {string} input 检查项
8 * @returns 匹配的 localeId 或 null
9 */
10const checkItem = (input) => {
11 let id
12
13 // input = input.toLowerCase().replace(/_/g, '-')
14
15 availableLocaleIds.some(_localeId => {
16 if (_localeId == input)
17 id = _localeId
18 return id
19 })
20
21 const parseSeg = (id, localeId, str) => {
22 if (id) return id
23
24 const seg = localeId.split(str)
25
26 if (!id) {
27 availableLocaleIds.some(_localeId => {
28 if (_localeId == seg[0] + '-' + seg[seg.length - 1])
29 id = _localeId
30 return id
31 })
32 }
33
34 if (!id) {
35 availableLocaleIds.some(_localeId => {
36 if (_localeId == seg[0])
37 id = _localeId
38 return id
39 })
40 }
41
42 return id || null
43 }
44
45 id = parseSeg(id, input, '-')
46
47 return id || null
48}
49
50/**
51 * 根据输入内容返回availableLocales内匹配的语言包ID(localeId)
52 * 如果没有匹配,返回availableLocales的第一项
53 * 注:仅为返回,没有赋值操作
54 *
55 * @param {string|array} input
56 *
57 * @returns 匹配的语言包ID localeId 或 availableLocaleIds[0]
58 */
59const parseLocaleId = (input) => {
60
61 // 检查是否包含分号,如果是,按语言列表处理为array
62 // eg: zh-CN,zh;q=0.8,en;q=0.6
63 if (typeof input === 'string' && input.indexOf(';') > -1)
64 input = parseLanguageList(input)
65
66 // 检查是否为array
67 if (Array.isArray(input)) {
68 let id
69
70 input.some(thisId => {
71 id = checkItem(thisId)
72 return id
73 })
74
75 return id || availableLocaleIds[0]
76 }
77
78 else if (!input && typeof navigator !== 'undefined')
79 return parseLocaleId(navigator.languages || navigator.language || navigator.browserLanguage || navigator.systemLanguage || navigator.userLanguage || availableLocaleIds[0])
80
81 else if (input)
82 return checkItem(input) || availableLocaleIds[0]
83
84 return availableLocaleIds[0]
85}
86
87export default parseLocaleId