This repository has been archived by the owner on May 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 21
/
index.ts
58 lines (55 loc) · 1.87 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright 2018 The Outline Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
function makeLookUpLanguage(availableLanguages: string[]) {
return (languageId: string): string|undefined => {
languageId = languageId.toLowerCase();
for (const availableLanguage of availableLanguages) {
const parts = availableLanguage.toLowerCase().split('-');
while (parts.length) {
const joined = parts.join('-');
if (languageId === joined) {
return availableLanguage;
}
parts.pop();
}
}
};
}
function getBrowserLanguages(): string[] {
// Ensure that navigator.languages is defined and not empty, as can be the case with some browsers
// (i.e. Chrome 59 on Electron).
const languages = navigator.languages as string[];
if (languages && languages.length > 0) {
return languages;
}
return [navigator.language];
}
// tslint:disable-next-line:no-any
(window as any).OutlineI18n = {
getBestMatchingLanguage(available: string[]): string |
undefined {
const lookUpAvailable = makeLookUpLanguage(available);
for (const candidate of getBrowserLanguages()) {
const parts = candidate.split('-');
while (parts.length) {
const joined = parts.join('-');
const closest = lookUpAvailable(joined);
if (closest) {
return closest;
}
parts.pop();
}
}
}
};