aboutsummaryrefslogtreecommitdiffstats
path: root/packages/website/ts/utils/translate.ts
diff options
context:
space:
mode:
authorFabio Berger <me@fabioberger.com>2018-02-22 09:09:33 +0800
committerGitHub <noreply@github.com>2018-02-22 09:09:33 +0800
commitdfe2579eebdaf348bb2e5690f901ca717c5f6392 (patch)
tree59a0d97371fd69f79a54f6dd4f6c602561f04115 /packages/website/ts/utils/translate.ts
parentbe19316dfb45600b2ce264a90dde7ace460fd0ac (diff)
parent1b3a9102f1d9c83ca6675a0e95cea6c4ceab01eb (diff)
downloaddexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar.gz
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar.bz2
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar.lz
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar.xz
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.tar.zst
dexon-0x-contracts-dfe2579eebdaf348bb2e5690f901ca717c5f6392.zip
Merge pull request #410 from 0xProject/translateHomepage
Translate Landing Page
Diffstat (limited to 'packages/website/ts/utils/translate.ts')
-rw-r--r--packages/website/ts/utils/translate.ts83
1 files changed, 83 insertions, 0 deletions
diff --git a/packages/website/ts/utils/translate.ts b/packages/website/ts/utils/translate.ts
new file mode 100644
index 000000000..5148e48ad
--- /dev/null
+++ b/packages/website/ts/utils/translate.ts
@@ -0,0 +1,83 @@
+import * as _ from 'lodash';
+import { Deco, Key, Language } from 'ts/types';
+
+import * as chinese from '../../translations/chinese.json';
+import * as english from '../../translations/english.json';
+import * as korean from '../../translations/korean.json';
+import * as russian from '../../translations/russian.json';
+import * as spanish from '../../translations/spanish.json';
+
+const languageToTranslations = {
+ [Language.English]: english,
+ [Language.Spanish]: spanish,
+ [Language.Chinese]: chinese,
+ [Language.Korean]: korean,
+ [Language.Russian]: russian,
+};
+
+const languagesWithoutCaps = [Language.Chinese, Language.Korean];
+
+interface Translation {
+ [key: string]: string;
+}
+
+export class Translate {
+ private _selectedLanguage: Language;
+ private _translation: Translation;
+ constructor(desiredLanguage?: Language) {
+ if (!_.isUndefined(desiredLanguage)) {
+ this.setLanguage(desiredLanguage);
+ return;
+ }
+ const browserLanguage = (window.navigator as any).userLanguage || window.navigator.language || 'en-US';
+ let language = Language.English;
+ if (_.includes(browserLanguage, 'es-')) {
+ language = Language.Spanish;
+ } else if (_.includes(browserLanguage, 'zh-')) {
+ language = Language.Chinese;
+ } else if (_.includes(browserLanguage, 'ko-')) {
+ language = Language.Korean;
+ } else if (_.includes(browserLanguage, 'ru-')) {
+ language = Language.Russian;
+ }
+ this.setLanguage(language);
+ }
+ public getLanguage() {
+ return this._selectedLanguage;
+ }
+ public setLanguage(language: Language) {
+ const isLanguageSupported = !_.isUndefined(languageToTranslations[language]);
+ if (!isLanguageSupported) {
+ throw new Error(`${language} not supported`);
+ }
+ this._selectedLanguage = language;
+ this._translation = languageToTranslations[language];
+ }
+ public get(key: Key, decoration?: Deco) {
+ let text = this._translation[key];
+ if (!_.isUndefined(decoration) && !_.includes(languagesWithoutCaps, this._selectedLanguage)) {
+ switch (decoration) {
+ case Deco.Cap:
+ text = this._capitalize(text);
+ break;
+
+ case Deco.Upper:
+ text = text.toUpperCase();
+ break;
+
+ case Deco.CapWords:
+ const words = text.split(' ');
+ const capitalizedWords = _.map(words, w => this._capitalize(w));
+ text = capitalizedWords.join(' ');
+ break;
+
+ default:
+ throw new Error(`Unrecognized decoration: ${decoration}`);
+ }
+ }
+ return text;
+ }
+ private _capitalize(text: string) {
+ return `${text.charAt(0).toUpperCase()}${text.slice(1)}`;
+ }
+}