1 | import fs from 'mz/fs.js'
|
2 |
|
3 | let GET_INITIAL_LANGUAGE = {
|
4 | 'react-dom': `export default supported => closest(navigator.language || navigator.browserLanguage, supported)
|
5 |
|
6 | let base = item => item.substr(0, 2);
|
7 | let closest = (value, list) =>
|
8 | value
|
9 | ? list.find(item => item === value) ||
|
10 | list.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 |
|
20 | export default async supported => closest(await Util.getCurrentLocaleAsync(), supported)
|
21 |
|
22 | let base = item => item.substr(0, 2);
|
23 | let closest = (value, list) =>
|
24 | value
|
25 | ? list.find(item => item === value) ||
|
26 | list.find(item => base(item) === value) ||
|
27 | closest(value.length > 2 ? base(value) : null, list)
|
28 | : list[0];`,
|
29 | }
|
30 |
|
31 | let LOCAL_CONTAINER = {
|
32 | 'react-dom': supported => `import { Container } from 'unstated';
|
33 | import getInitialLanguage from './get-initial-language.js';
|
34 |
|
35 | export 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';
|
54 | import getInitialLanguage from './get-initial-language.js';
|
55 |
|
56 | export 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 |
|
78 | export 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 | }
|