forked from zoontek/react-native-localize
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.web.js
More file actions
148 lines (136 loc) · 3.73 KB
/
index.web.js
File metadata and controls
148 lines (136 loc) · 3.73 KB
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// @flow
import React from "react";
import LocaleCurrency from "locale-currency";
import bcp47 from "bcp-47";
import type {
Option,
Calendar,
LocalizationEvent,
TemperatureUnit,
Locale,
NumberFormatSettings,
LocalizationConstants,
} from "./types";
function logUnsupportedEvent(type: string) {
console.error(`\`${type}\` is not a valid RNLocalize event`);
}
function getPartialTag({ languageCode, scriptCode }: Locale) {
return languageCode + (scriptCode ? "-" + scriptCode : "");
}
const fahrenheitCountries = ["BS", "BZ", "KY", "PR", "PW", "US"];
const imperialCountries = ["LR", "MM", "US"];
const rtlCountries = [
"ar",
"ckb",
"fa",
"he",
"ks",
"lrc",
"mzn",
"ps",
"ug",
"ur",
"yi",
];
export function getCalendar(): Calendar {
return "gregorian";
}
export function getCountry(): string {
const locales = getLocales();
return locales[0] && locales[0].countryCode;
}
export function getCurrencies(): string[] {
return [LocaleCurrency.getCurrency(getCountry())];
}
export function getLocales(): Locale[] {
return navigator.languages.map(languageTag => {
const { language: languageCode, region: countryCode } = bcp47.parse(
languageTag,
);
return {
languageTag,
countryCode,
languageCode,
isRTL: rtlCountries.includes(countryCode.toLowerCase()),
};
});
}
export function getNumberFormatSettings(): NumberFormatSettings {
const locales = getLocales();
const languageTag = locales[0] && locales[0].languageTag;
const numberFormat = new Intl.NumberFormat(languageTag);
const result = numberFormat.format(123456.789);
const [groupingSeparator, decimalSeparator] = [...result.replace(/\d/g, "")];
return { groupingSeparator, decimalSeparator };
}
export function getTemperatureUnit(): TemperatureUnit {
return fahrenheitCountries.find(code => code === getCountry())
? "fahrenheit"
: "celsius";
}
export function getTimeZone(): string {
return Intl.DateTimeFormat().resolvedOptions().timeZone || "Etc/UTC";
}
export function uses24HourClock(): boolean {
const date = new Date(Date.UTC(2012, 11, 12, 3, 0, 0));
const dateString = date.toLocaleTimeString();
return !(dateString.match(/am|pm/i) || date.toString().match(/am|pm/i));
}
export function usesMetricSystem(): boolean {
return !imperialCountries.find(code => code === getCountry());
}
export function usesAutoDateAndTime(): Option<boolean> {
return false;
}
export function usesAutoTimeZone(): Option<boolean> {
return false;
}
export function addEventListener(
type: LocalizationEvent,
handler: Function,
): void {
if (type !== "change") {
logUnsupportedEvent(type);
} else {
window.addEventListener("languagechange", handler);
}
}
export function removeEventListener(
type: LocalizationEvent,
handler: Function,
): void {
if (type !== "change") {
logUnsupportedEvent(type);
} else {
window.removeEventListener("languagechange", handler);
}
}
export function findBestAvailableLanguage(
languageTags: string[],
): {|
languageTag: string,
isRTL: boolean,
|} | void {
const locales = getLocales();
for (let index = 0; index < locales.length; index++) {
const currentLocale = locales[index];
const { languageTag, languageCode, isRTL } = currentLocale;
if (languageTags.includes(languageTag)) {
return { languageTag, isRTL };
}
const partialTag = getPartialTag(currentLocale);
const next = locales[index + 1];
if (
(!next || partialTag !== getPartialTag(next)) &&
languageTags.includes(partialTag)
) {
return { languageTag: partialTag, isRTL };
}
if (
(!next || languageCode !== next.languageCode) &&
languageTags.includes(languageCode)
) {
return { languageTag: languageCode, isRTL };
}
}
}