UNPKG

2.41 kBJavaScriptView Raw
1import fs from 'mz/fs.js'
2
3let GET_INITIAL_LANGUAGE = {
4 'react-dom': `export default supported => closest(navigator.language || navigator.browserLanguage, supported)
5
6let base = item => item.substr(0, 2);
7let closest = (value, list) =>
8 value
9 ? list.find(item => item === value) ||
10list.find(item => base(item) === value) ||
11 closest(value.length > 2 ? base(value) : null, list)
12 : list[0];
13
14// example to take a querystring param named "lang" into account
15//
16// import qs from 'querystringify'
17// export default supported => closest(qs.parse(window.location.search).lang || navigator.language || navigator.browserLanguage, supported)`,
18 'react-native': `import { Util } from 'expo'
19
20export default async supported => closest(await Util.getCurrentLocaleAsync(), supported)
21
22let base = item => item.substr(0, 2);
23let closest = (value, list) =>
24 value
25 ? list.find(item => item === value) ||
26list.find(item => base(item) === value) ||
27 closest(value.length > 2 ? base(value) : null, list)
28 : list[0];`,
29}
30
31let LOCAL_CONTAINER = {
32 'react-dom': supported => `import { Container } from 'unstated';
33import getInitialLanguage from './get-initial-language.js';
34
35export default class LocalContainer extends Container {
36 constructor() {
37 super()
38
39 let supported = ${JSON.stringify(supported).replace(/"/g, "'")}
40
41 this.state = {
42 lang: getInitialLanguage(supported),
43 supported,
44 };
45 }
46
47 set(lang) {
48 if (!this.state.supported.includes(lang)) return;
49
50 this.setState({ lang });
51 }
52}`,
53 'react-native': supported => `import { Container } from 'unstated';
54import getInitialLanguage from './get-initial-language.js';
55
56export default class LocalContainer extends Container {
57 constructor() {
58 super()
59
60 let supported = ${JSON.stringify(supported).replace(/"/g, "'")}
61
62 this.state = {
63 lang: supported[0],
64 supported,
65 };
66
67 getInitialLanguage(supported).then(this.set)
68 }
69
70 set(lang) {
71 if (!this.state.supported.includes(lang)) return;
72
73 this.setState({ lang });
74 }
75}`,
76}
77
78export default async function ensureLocalContainer({
79 as,
80 file,
81 fileGetInitialLanguage,
82 supported,
83}) {
84 if (!(await fs.exists(fileGetInitialLanguage))) {
85 await fs.writeFile(fileGetInitialLanguage, GET_INITIAL_LANGUAGE[as], {
86 encoding: 'utf8',
87 })
88 }
89 await fs.writeFile(file, LOCAL_CONTAINER[as](supported), { encoding: 'utf8' })
90}