From c7885e87266287d52d7516085a70fcb96f94528d Mon Sep 17 00:00:00 2001 From: Isaac Grynsztein Date: Sun, 15 Mar 2020 14:52:07 -0400 Subject: [PATCH] Added ability to select language in settings Fixed locale support so that it actually works at runtime Removed unused library --- package.json | 3 +- src/app/settings/locales_list.ts | 735 +++++++++++++++++++++++ src/app/settings/settings.component.html | 9 + src/app/settings/settings.component.scss | 5 + src/app/settings/settings.component.ts | 19 +- src/main.ts | 35 +- 6 files changed, 793 insertions(+), 13 deletions(-) create mode 100644 src/app/settings/locales_list.ts diff --git a/package.json b/package.json index 7806154..dcbef0f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@angular/platform-browser": "^9.0.6", "@angular/platform-browser-dynamic": "^9.0.6", "@angular/router": "^9.0.6", - "@soluling/angular": "^1.0.0", + "@locl/core": "0.0.1-beta.2", "core-js": "^2.4.1", "file-saver": "^2.0.2", "ng-lazyload-image": "^7.0.1", @@ -49,6 +49,7 @@ "@angular/cli": "^9.0.6", "@angular/compiler-cli": "^9.0.6", "@angular/language-service": "^9.0.6", + "@locl/cli": "0.0.1-beta.6", "@types/core-js": "^2.5.2", "@types/file-saver": "^2.0.1", "@types/jasmine": "2.5.45", diff --git a/src/app/settings/locales_list.ts b/src/app/settings/locales_list.ts new file mode 100644 index 0000000..62ba078 --- /dev/null +++ b/src/app/settings/locales_list.ts @@ -0,0 +1,735 @@ +/** +* @author Phil Teare +* using wikipedia data +* Link: https://stackoverflow.com/a/4900304 +*/ +export const isoLangs = { + 'ab': { + 'name': 'Abkhaz', + 'nativeName': 'аҧсуа' + }, + 'aa': { + 'name': 'Afar', + 'nativeName': 'Afaraf' + }, + 'af': { + 'name': 'Afrikaans', + 'nativeName': 'Afrikaans' + }, + 'ak': { + 'name': 'Akan', + 'nativeName': 'Akan' + }, + 'sq': { + 'name': 'Albanian', + 'nativeName': 'Shqip' + }, + 'am': { + 'name': 'Amharic', + 'nativeName': 'አማርኛ' + }, + 'ar': { + 'name': 'Arabic', + 'nativeName': 'العربية' + }, + 'an': { + 'name': 'Aragonese', + 'nativeName': 'Aragonés' + }, + 'hy': { + 'name': 'Armenian', + 'nativeName': 'Հայերեն' + }, + 'as': { + 'name': 'Assamese', + 'nativeName': 'অসমীয়া' + }, + 'av': { + 'name': 'Avaric', + 'nativeName': 'авар мацӀ, магӀарул мацӀ' + }, + 'ae': { + 'name': 'Avestan', + 'nativeName': 'avesta' + }, + 'ay': { + 'name': 'Aymara', + 'nativeName': 'aymar aru' + }, + 'az': { + 'name': 'Azerbaijani', + 'nativeName': 'azərbaycan dili' + }, + 'bm': { + 'name': 'Bambara', + 'nativeName': 'bamanankan' + }, + 'ba': { + 'name': 'Bashkir', + 'nativeName': 'башҡорт теле' + }, + 'eu': { + 'name': 'Basque', + 'nativeName': 'euskara, euskera' + }, + 'be': { + 'name': 'Belarusian', + 'nativeName': 'Беларуская' + }, + 'bn': { + 'name': 'Bengali', + 'nativeName': 'বাংলা' + }, + 'bh': { + 'name': 'Bihari', + 'nativeName': 'भोजपुरी' + }, + 'bi': { + 'name': 'Bislama', + 'nativeName': 'Bislama' + }, + 'bs': { + 'name': 'Bosnian', + 'nativeName': 'bosanski jezik' + }, + 'br': { + 'name': 'Breton', + 'nativeName': 'brezhoneg' + }, + 'bg': { + 'name': 'Bulgarian', + 'nativeName': 'български език' + }, + 'my': { + 'name': 'Burmese', + 'nativeName': 'ဗမာစာ' + }, + 'ca': { + 'name': 'Catalan; Valencian', + 'nativeName': 'Català' + }, + 'ch': { + 'name': 'Chamorro', + 'nativeName': 'Chamoru' + }, + 'ce': { + 'name': 'Chechen', + 'nativeName': 'нохчийн мотт' + }, + 'ny': { + 'name': 'Chichewa; Chewa; Nyanja', + 'nativeName': 'chiCheŵa, chinyanja' + }, + 'zh': { + 'name': 'Chinese', + 'nativeName': '中文 (Zhōngwén), 汉语, 漢語' + }, + 'cv': { + 'name': 'Chuvash', + 'nativeName': 'чӑваш чӗлхи' + }, + 'kw': { + 'name': 'Cornish', + 'nativeName': 'Kernewek' + }, + 'co': { + 'name': 'Corsican', + 'nativeName': 'corsu, lingua corsa' + }, + 'cr': { + 'name': 'Cree', + 'nativeName': 'ᓀᐦᐃᔭᐍᐏᐣ' + }, + 'hr': { + 'name': 'Croatian', + 'nativeName': 'hrvatski' + }, + 'cs': { + 'name': 'Czech', + 'nativeName': 'česky, čeština' + }, + 'da': { + 'name': 'Danish', + 'nativeName': 'dansk' + }, + 'dv': { + 'name': 'Divehi; Dhivehi; Maldivian;', + 'nativeName': 'ދިވެހި' + }, + 'nl': { + 'name': 'Dutch', + 'nativeName': 'Nederlands, Vlaams' + }, + 'en': { + 'name': 'English', + 'nativeName': 'English' + }, + 'eo': { + 'name': 'Esperanto', + 'nativeName': 'Esperanto' + }, + 'et': { + 'name': 'Estonian', + 'nativeName': 'eesti, eesti keel' + }, + 'ee': { + 'name': 'Ewe', + 'nativeName': 'Eʋegbe' + }, + 'fo': { + 'name': 'Faroese', + 'nativeName': 'føroyskt' + }, + 'fj': { + 'name': 'Fijian', + 'nativeName': 'vosa Vakaviti' + }, + 'fi': { + 'name': 'Finnish', + 'nativeName': 'suomi, suomen kieli' + }, + 'fr': { + 'name': 'French', + 'nativeName': 'français, langue française' + }, + 'ff': { + 'name': 'Fula; Fulah; Pulaar; Pular', + 'nativeName': 'Fulfulde, Pulaar, Pular' + }, + 'gl': { + 'name': 'Galician', + 'nativeName': 'Galego' + }, + 'ka': { + 'name': 'Georgian', + 'nativeName': 'ქართული' + }, + 'de': { + 'name': 'German', + 'nativeName': 'Deutsch' + }, + 'el': { + 'name': 'Greek, Modern', + 'nativeName': 'Ελληνικά' + }, + 'gn': { + 'name': 'Guaraní', + 'nativeName': 'Avañeẽ' + }, + 'gu': { + 'name': 'Gujarati', + 'nativeName': 'ગુજરાતી' + }, + 'ht': { + 'name': 'Haitian; Haitian Creole', + 'nativeName': 'Kreyòl ayisyen' + }, + 'ha': { + 'name': 'Hausa', + 'nativeName': 'Hausa, هَوُسَ' + }, + 'he': { + 'name': 'Hebrew (modern)', + 'nativeName': 'עברית' + }, + 'hz': { + 'name': 'Herero', + 'nativeName': 'Otjiherero' + }, + 'hi': { + 'name': 'Hindi', + 'nativeName': 'हिन्दी, हिंदी' + }, + 'ho': { + 'name': 'Hiri Motu', + 'nativeName': 'Hiri Motu' + }, + 'hu': { + 'name': 'Hungarian', + 'nativeName': 'Magyar' + }, + 'ia': { + 'name': 'Interlingua', + 'nativeName': 'Interlingua' + }, + 'id': { + 'name': 'Indonesian', + 'nativeName': 'Bahasa Indonesia' + }, + 'ie': { + 'name': 'Interlingue', + 'nativeName': 'Originally called Occidental; then Interlingue after WWII' + }, + 'ga': { + 'name': 'Irish', + 'nativeName': 'Gaeilge' + }, + 'ig': { + 'name': 'Igbo', + 'nativeName': 'Asụsụ Igbo' + }, + 'ik': { + 'name': 'Inupiaq', + 'nativeName': 'Iñupiaq, Iñupiatun' + }, + 'io': { + 'name': 'Ido', + 'nativeName': 'Ido' + }, + 'is': { + 'name': 'Icelandic', + 'nativeName': 'Íslenska' + }, + 'it': { + 'name': 'Italian', + 'nativeName': 'Italiano' + }, + 'iu': { + 'name': 'Inuktitut', + 'nativeName': 'ᐃᓄᒃᑎᑐᑦ' + }, + 'ja': { + 'name': 'Japanese', + 'nativeName': '日本語 (にほんご/にっぽんご)' + }, + 'jv': { + 'name': 'Javanese', + 'nativeName': 'basa Jawa' + }, + 'kl': { + 'name': 'Kalaallisut, Greenlandic', + 'nativeName': 'kalaallisut, kalaallit oqaasii' + }, + 'kn': { + 'name': 'Kannada', + 'nativeName': 'ಕನ್ನಡ' + }, + 'kr': { + 'name': 'Kanuri', + 'nativeName': 'Kanuri' + }, + 'ks': { + 'name': 'Kashmiri', + 'nativeName': 'कश्मीरी, كشميري‎' + }, + 'kk': { + 'name': 'Kazakh', + 'nativeName': 'Қазақ тілі' + }, + 'km': { + 'name': 'Khmer', + 'nativeName': 'ភាសាខ្មែរ' + }, + 'ki': { + 'name': 'Kikuyu, Gikuyu', + 'nativeName': 'Gĩkũyũ' + }, + 'rw': { + 'name': 'Kinyarwanda', + 'nativeName': 'Ikinyarwanda' + }, + 'ky': { + 'name': 'Kirghiz, Kyrgyz', + 'nativeName': 'кыргыз тили' + }, + 'kv': { + 'name': 'Komi', + 'nativeName': 'коми кыв' + }, + 'kg': { + 'name': 'Kongo', + 'nativeName': 'KiKongo' + }, + 'ko': { + 'name': 'Korean', + 'nativeName': '한국어 (韓國語), 조선말 (朝鮮語)' + }, + 'ku': { + 'name': 'Kurdish', + 'nativeName': 'Kurdî, كوردی‎' + }, + 'kj': { + 'name': 'Kwanyama, Kuanyama', + 'nativeName': 'Kuanyama' + }, + 'la': { + 'name': 'Latin', + 'nativeName': 'latine, lingua latina' + }, + 'lb': { + 'name': 'Luxembourgish, Letzeburgesch', + 'nativeName': 'Lëtzebuergesch' + }, + 'lg': { + 'name': 'Luganda', + 'nativeName': 'Luganda' + }, + 'li': { + 'name': 'Limburgish, Limburgan, Limburger', + 'nativeName': 'Limburgs' + }, + 'ln': { + 'name': 'Lingala', + 'nativeName': 'Lingála' + }, + 'lo': { + 'name': 'Lao', + 'nativeName': 'ພາສາລາວ' + }, + 'lt': { + 'name': 'Lithuanian', + 'nativeName': 'lietuvių kalba' + }, + 'lu': { + 'name': 'Luba-Katanga', + 'nativeName': '' + }, + 'lv': { + 'name': 'Latvian', + 'nativeName': 'latviešu valoda' + }, + 'gv': { + 'name': 'Manx', + 'nativeName': 'Gaelg, Gailck' + }, + 'mk': { + 'name': 'Macedonian', + 'nativeName': 'македонски јазик' + }, + 'mg': { + 'name': 'Malagasy', + 'nativeName': 'Malagasy fiteny' + }, + 'ms': { + 'name': 'Malay', + 'nativeName': 'bahasa Melayu, بهاس ملايو‎' + }, + 'ml': { + 'name': 'Malayalam', + 'nativeName': 'മലയാളം' + }, + 'mt': { + 'name': 'Maltese', + 'nativeName': 'Malti' + }, + 'mi': { + 'name': 'Māori', + 'nativeName': 'te reo Māori' + }, + 'mr': { + 'name': 'Marathi (Marāṭhī)', + 'nativeName': 'मराठी' + }, + 'mh': { + 'name': 'Marshallese', + 'nativeName': 'Kajin M̧ajeļ' + }, + 'mn': { + 'name': 'Mongolian', + 'nativeName': 'монгол' + }, + 'na': { + 'name': 'Nauru', + 'nativeName': 'Ekakairũ Naoero' + }, + 'nv': { + 'name': 'Navajo, Navaho', + 'nativeName': 'Diné bizaad, Dinékʼehǰí' + }, + 'nb': { + 'name': 'Norwegian Bokmål', + 'nativeName': 'Norsk bokmål' + }, + 'nd': { + 'name': 'North Ndebele', + 'nativeName': 'isiNdebele' + }, + 'ne': { + 'name': 'Nepali', + 'nativeName': 'नेपाली' + }, + 'ng': { + 'name': 'Ndonga', + 'nativeName': 'Owambo' + }, + 'nn': { + 'name': 'Norwegian Nynorsk', + 'nativeName': 'Norsk nynorsk' + }, + 'no': { + 'name': 'Norwegian', + 'nativeName': 'Norsk' + }, + 'ii': { + 'name': 'Nuosu', + 'nativeName': 'ꆈꌠ꒿ Nuosuhxop' + }, + 'nr': { + 'name': 'South Ndebele', + 'nativeName': 'isiNdebele' + }, + 'oc': { + 'name': 'Occitan', + 'nativeName': 'Occitan' + }, + 'oj': { + 'name': 'Ojibwe, Ojibwa', + 'nativeName': 'ᐊᓂᔑᓈᐯᒧᐎᓐ' + }, + 'cu': { + 'name': 'Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic', + 'nativeName': 'ѩзыкъ словѣньскъ' + }, + 'om': { + 'name': 'Oromo', + 'nativeName': 'Afaan Oromoo' + }, + 'or': { + 'name': 'Oriya', + 'nativeName': 'ଓଡ଼ିଆ' + }, + 'os': { + 'name': 'Ossetian, Ossetic', + 'nativeName': 'ирон æвзаг' + }, + 'pa': { + 'name': 'Panjabi, Punjabi', + 'nativeName': 'ਪੰਜਾਬੀ, پنجابی‎' + }, + 'pi': { + 'name': 'Pāli', + 'nativeName': 'पाऴि' + }, + 'fa': { + 'name': 'Persian', + 'nativeName': 'فارسی' + }, + 'pl': { + 'name': 'Polish', + 'nativeName': 'polski' + }, + 'ps': { + 'name': 'Pashto, Pushto', + 'nativeName': 'پښتو' + }, + 'pt': { + 'name': 'Portuguese', + 'nativeName': 'Português' + }, + 'qu': { + 'name': 'Quechua', + 'nativeName': 'Runa Simi, Kichwa' + }, + 'rm': { + 'name': 'Romansh', + 'nativeName': 'rumantsch grischun' + }, + 'rn': { + 'name': 'Kirundi', + 'nativeName': 'kiRundi' + }, + 'ro': { + 'name': 'Romanian, Moldavian, Moldovan', + 'nativeName': 'română' + }, + 'ru': { + 'name': 'Russian', + 'nativeName': 'русский язык' + }, + 'sa': { + 'name': 'Sanskrit (Saṁskṛta)', + 'nativeName': 'संस्कृतम्' + }, + 'sc': { + 'name': 'Sardinian', + 'nativeName': 'sardu' + }, + 'sd': { + 'name': 'Sindhi', + 'nativeName': 'सिन्धी, سنڌي، سندھی‎' + }, + 'se': { + 'name': 'Northern Sami', + 'nativeName': 'Davvisámegiella' + }, + 'sm': { + 'name': 'Samoan', + 'nativeName': 'gagana faa Samoa' + }, + 'sg': { + 'name': 'Sango', + 'nativeName': 'yângâ tî sängö' + }, + 'sr': { + 'name': 'Serbian', + 'nativeName': 'српски језик' + }, + 'gd': { + 'name': 'Scottish Gaelic; Gaelic', + 'nativeName': 'Gàidhlig' + }, + 'sn': { + 'name': 'Shona', + 'nativeName': 'chiShona' + }, + 'si': { + 'name': 'Sinhala, Sinhalese', + 'nativeName': 'සිංහල' + }, + 'sk': { + 'name': 'Slovak', + 'nativeName': 'slovenčina' + }, + 'sl': { + 'name': 'Slovene', + 'nativeName': 'slovenščina' + }, + 'so': { + 'name': 'Somali', + 'nativeName': 'Soomaaliga, af Soomaali' + }, + 'st': { + 'name': 'Southern Sotho', + 'nativeName': 'Sesotho' + }, + 'es': { + 'name': 'Spanish; Castilian', + 'nativeName': 'español, castellano' + }, + 'su': { + 'name': 'Sundanese', + 'nativeName': 'Basa Sunda' + }, + 'sw': { + 'name': 'Swahili', + 'nativeName': 'Kiswahili' + }, + 'ss': { + 'name': 'Swati', + 'nativeName': 'SiSwati' + }, + 'sv': { + 'name': 'Swedish', + 'nativeName': 'svenska' + }, + 'ta': { + 'name': 'Tamil', + 'nativeName': 'தமிழ்' + }, + 'te': { + 'name': 'Telugu', + 'nativeName': 'తెలుగు' + }, + 'tg': { + 'name': 'Tajik', + 'nativeName': 'тоҷикӣ, toğikī, تاجیکی‎' + }, + 'th': { + 'name': 'Thai', + 'nativeName': 'ไทย' + }, + 'ti': { + 'name': 'Tigrinya', + 'nativeName': 'ትግርኛ' + }, + 'bo': { + 'name': 'Tibetan Standard, Tibetan, Central', + 'nativeName': 'བོད་ཡིག' + }, + 'tk': { + 'name': 'Turkmen', + 'nativeName': 'Türkmen, Түркмен' + }, + 'tl': { + 'name': 'Tagalog', + 'nativeName': 'Wikang Tagalog, ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔' + }, + 'tn': { + 'name': 'Tswana', + 'nativeName': 'Setswana' + }, + 'to': { + 'name': 'Tonga (Tonga Islands)', + 'nativeName': 'faka Tonga' + }, + 'tr': { + 'name': 'Turkish', + 'nativeName': 'Türkçe' + }, + 'ts': { + 'name': 'Tsonga', + 'nativeName': 'Xitsonga' + }, + 'tt': { + 'name': 'Tatar', + 'nativeName': 'татарча, tatarça, تاتارچا‎' + }, + 'tw': { + 'name': 'Twi', + 'nativeName': 'Twi' + }, + 'ty': { + 'name': 'Tahitian', + 'nativeName': 'Reo Tahiti' + }, + 'ug': { + 'name': 'Uighur, Uyghur', + 'nativeName': 'Uyƣurqə, ئۇيغۇرچە‎' + }, + 'uk': { + 'name': 'Ukrainian', + 'nativeName': 'українська' + }, + 'ur': { + 'name': 'Urdu', + 'nativeName': 'اردو' + }, + 'uz': { + 'name': 'Uzbek', + 'nativeName': 'zbek, Ўзбек, أۇزبېك‎' + }, + 've': { + 'name': 'Venda', + 'nativeName': 'Tshivenḓa' + }, + 'vi': { + 'name': 'Vietnamese', + 'nativeName': 'Tiếng Việt' + }, + 'vo': { + 'name': 'Volapük', + 'nativeName': 'Volapük' + }, + 'wa': { + 'name': 'Walloon', + 'nativeName': 'Walon' + }, + 'cy': { + 'name': 'Welsh', + 'nativeName': 'Cymraeg' + }, + 'wo': { + 'name': 'Wolof', + 'nativeName': 'Wollof' + }, + 'fy': { + 'name': 'Western Frisian', + 'nativeName': 'Frysk' + }, + 'xh': { + 'name': 'Xhosa', + 'nativeName': 'isiXhosa' + }, + 'yi': { + 'name': 'Yiddish', + 'nativeName': 'ייִדיש' + }, + 'yo': { + 'name': 'Yoruba', + 'nativeName': 'Yorùbá' + }, + 'za': { + 'name': 'Zhuang, Chuang', + 'nativeName': 'Saɯ cueŋƅ, Saw cuengh' + } +}; diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index ec76f1c..8d03462 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -1,6 +1,15 @@

Settings

+ +
+ Language:    + + {{all_locales[locale]['nativeName']}} + + +
+ diff --git a/src/app/settings/settings.component.scss b/src/app/settings/settings.component.scss index 22cef34..ee91f38 100644 --- a/src/app/settings/settings.component.scss +++ b/src/app/settings/settings.component.scss @@ -1,3 +1,8 @@ .settings-expansion-panel { margin-bottom: 20px; +} + +.locale-select { + margin-bottom: 10px; + width: 175px; } \ No newline at end of file diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index 7386852..e582e77 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -1,5 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; +import { isoLangs } from './locales_list'; +import { MatSnackBar } from '@angular/material/snack-bar'; @Component({ selector: 'app-settings', @@ -7,12 +9,15 @@ import { PostsService } from 'app/posts.services'; styleUrls: ['./settings.component.scss'] }) export class SettingsComponent implements OnInit { + all_locales = isoLangs; + supported_locales = ['en', 'es']; + initialLocale = localStorage.getItem('locale'); initial_config = null; new_config = null loading_config = false; - constructor(private postsService: PostsService) { } + constructor(private postsService: PostsService, private snackBar: MatSnackBar) { } ngOnInit() { this.getConfig(); @@ -46,4 +51,16 @@ export class SettingsComponent implements OnInit { }) } + localeSelectChanged(new_val) { + localStorage.setItem('locale', new_val); + this.openSnackBar('Language successfully changed! Reload to update the page.') + } + + // snackbar helper + public openSnackBar(message: string, action: string = '') { + this.snackBar.open(message, action, { + duration: 2000, + }); + } + } diff --git a/src/main.ts b/src/main.ts index 18c3083..8dfc77d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,12 @@ +import '@angular/localize/init'; + import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; -import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; import { loadTranslations } from '@angular/localize'; -import { getTranslations } from '@soluling/angular'; -import '@angular/localize/init'; +import { getTranslations, ParsedTranslationBundle } from '@locl/core'; if (environment.production) { enableProdMode(); @@ -14,14 +14,27 @@ if (environment.production) { const locale = localStorage.getItem('locale'); if (locale) { - fetch(`./assets/i18n/messages.${locale}.json`).then(res => res.json()).then((resp) => { - console.log(resp); - loadTranslations(resp); - platformBrowserDynamic().bootstrapModule(AppModule); - }, err => { - platformBrowserDynamic().bootstrapModule(AppModule); - }); + getTranslations(`./assets/i18n/messages.${locale}.json`).then( + (data: ParsedTranslationBundle) => { + loadTranslations(data as any); + import('./app/app.module').then(module => { + platformBrowserDynamic() + .bootstrapModule(module.AppModule) + .catch(err => console.error(err)); + }); + } + ).catch(err => { + import('./app/app.module').then(module => { + platformBrowserDynamic() + .bootstrapModule(module.AppModule) + .catch(err2 => console.error(err2)); + }); + }); } else { console.log('no locale'); - platformBrowserDynamic().bootstrapModule(AppModule); + import('./app/app.module').then(module => { + platformBrowserDynamic() + .bootstrapModule(module.AppModule) + .catch(err => console.error(err)); + }); }