From 26a361d873036b79bd5581af0ceb95ce7b08ba75 Mon Sep 17 00:00:00 2001 From: Fillerino Date: Sun, 2 Jul 2017 21:13:37 +0200 Subject: [PATCH] Added Language Downloading and Settings Added basic downloading of languages and a dynamic settings panel which allows the user to change the language between the downloaded ones. --- .gitignore | 1 + ui/js/langs.js | 196 +++++++++++++++++++++++++++++++++++ ui/js/main.js | 39 +++++++ ui/js/page/settings/view.jsx | 38 +++++++ 4 files changed, 274 insertions(+) create mode 100644 ui/js/langs.js diff --git a/.gitignore b/.gitignore index c212707ad..5ec3a5c07 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ /app/dist +/app/locales /app/node_modules /build/venv /lbry-app-venv diff --git a/ui/js/langs.js b/ui/js/langs.js new file mode 100644 index 000000000..8bc52581f --- /dev/null +++ b/ui/js/langs.js @@ -0,0 +1,196 @@ +/* + This file contains the function to resolve a 2-letter country code + to the language name in both english and the local language. +*/ +const langs = { +"aa":["Afar","Afar"], +"ab":["Abkhazian","Аҧсуа"], +"af":["Afrikaans","Afrikaans"], +"ak":["Akan","Akana"], +"am":["Amharic","አማርኛ"], +"an":["Aragonese","Aragonés"], +"ar":["Arabic","العربية"], +"as":["Assamese","অসমীয়া"], +"av":["Avar","Авар"], +"ay":["Aymara","Aymar"], +"az":["Azerbaijani","Azərbaycanca / آذربايجان"], +"ba":["Bashkir","Башҡорт"], +"be":["Belarusian","Беларуская"], +"bg":["Bulgarian","Български"], +"bh":["Bihari","भोजपुरी"], +"bi":["Bislama","Bislama"], +"bm":["Bambara","Bamanankan"], +"bn":["Bengali","বাংলা"], +"bo":["Tibetan","བོད་ཡིག / Bod skad"], +"br":["Breton","Brezhoneg"], +"bs":["Bosnian","Bosanski"], +"ca":["Catalan","Català"], +"ce":["Chechen","Нохчийн"], +"ch":["Chamorro","Chamoru"], +"co":["Corsican","Corsu"], +"cr":["Cree","Nehiyaw"], +"cs":["Czech","Česky"], +"cu":["Old Church Slavonic / Old Bulgarian","словѣньскъ / slověnĭskŭ"], +"cv":["Chuvash","Чăваш"], +"cy":["Welsh","Cymraeg"], +"da":["Danish","Dansk"], +"de":["German","Deutsch"], +"dv":["Divehi","ދިވެހިބަސް"], +"dz":["Dzongkha","ཇོང་ཁ"], +"ee":["Ewe","Ɛʋɛ"], +"el":["Greek","Ελληνικά"], +"en":["English","English"], +"eo":["Esperanto","Esperanto"], +"es":["Spanish","Español"], +"et":["Estonian","Eesti"], +"eu":["Basque","Euskara"], +"fa":["Persian","فارسی"], +"ff":["Peul","Fulfulde"], +"fi":["Finnish","Suomi"], +"fj":["Fijian","Na Vosa Vakaviti"], +"fo":["Faroese","Føroyskt"], +"fr":["French","Français"], +"fy":["West Frisian","Frysk"], +"ga":["Irish","Gaeilge"], +"gd":["Scottish Gaelic","Gàidhlig"], +"gl":["Galician","Galego"], +"gn":["Guarani","Avañe'ẽ"], +"gu":["Gujarati","ગુજરાતી"], +"gv":["Manx","Gaelg"], +"ha":["Hausa","هَوُسَ"], +"he":["Hebrew","עברית"], +"hi":["Hindi","हिन्दी"], +"ho":["Hiri Motu","Hiri Motu"], +"hr":["Croatian","Hrvatski"], +"ht":["Haitian","Krèyol ayisyen"], +"hu":["Hungarian","Magyar"], +"hy":["Armenian","Հայերեն"], +"hz":["Herero","Otsiherero"], +"ia":["Interlingua","Interlingua"], +"id":["Indonesian","Bahasa Indonesia"], +"ie":["Interlingue","Interlingue"], +"ig":["Igbo","Igbo"], +"ii":["Sichuan Yi","ꆇꉙ / 四川彝语"], +"ik":["Inupiak","Iñupiak"], +"io":["Ido","Ido"], +"is":["Icelandic","Íslenska"], +"it":["Italian","Italiano"], +"iu":["Inuktitut","ᐃᓄᒃᑎᑐᑦ"], +"ja":["Japanese","日本語"], +"jv":["Javanese","Basa Jawa"], +"ka":["Georgian","ქართული"], +"kg":["Kongo","KiKongo"], +"ki":["Kikuyu","Gĩkũyũ"], +"kj":["Kuanyama","Kuanyama"], +"kk":["Kazakh","Қазақша"], +"kl":["Greenlandic","Kalaallisut"], +"km":["Cambodian","ភាសាខ្មែរ"], +"kn":["Kannada","ಕನ್ನಡ"], +"ko":["Korean","한국어"], +"kr":["Kanuri","Kanuri"], +"ks":["Kashmiri","कश्मीरी / كشميري"], +"ku":["Kurdish","Kurdî / كوردی"], +"kv":["Komi","Коми"], +"kw":["Cornish","Kernewek"], +"ky":["Kirghiz","Kırgızca / Кыргызча"], +"la":["Latin","Latina"], +"lb":["Luxembourgish","Lëtzebuergesch"], +"lg":["Ganda","Luganda"], +"li":["Limburgian","Limburgs"], +"ln":["Lingala","Lingála"], +"lo":["Laotian","ລາວ / Pha xa lao"], +"lt":["Lithuanian","Lietuvių"], +"lv":["Latvian","Latviešu"], +"mg":["Malagasy","Malagasy"], +"mh":["Marshallese","Kajin Majel / Ebon"], +"mi":["Maori","Māori"], +"mk":["Macedonian","Македонски"], +"ml":["Malayalam","മലയാളം"], +"mn":["Mongolian","Монгол"], +"mo":["Moldovan","Moldovenească"], +"mr":["Marathi","मराठी"], +"ms":["Malay","Bahasa Melayu"], +"mt":["Maltese","bil-Malti"], +"my":["Burmese","Myanmasa"], +"na":["Nauruan","Dorerin Naoero"], +"nd":["North Ndebele","Sindebele"], +"ne":["Nepali","नेपाली"], +"ng":["Ndonga","Oshiwambo"], +"nl":["Dutch","Nederlands"], +"nn":["Norwegian Nynorsk","Norsk (nynorsk)"], +"no":["Norwegian","Norsk (bokmål / riksmål)"], +"nr":["South Ndebele","isiNdebele"], +"nv":["Navajo","Diné bizaad"], +"ny":["Chichewa","Chi-Chewa"], +"oc":["Occitan","Occitan"], +"oj":["Ojibwa","ᐊᓂᔑᓈᐯᒧᐎᓐ / Anishinaabemowin"], +"om":["Oromo","Oromoo"], +"or":["Oriya","ଓଡ଼ିଆ"], +"os":["Ossetian / Ossetic","Иронау"], +"pa":["Panjabi / Punjabi","ਪੰਜਾਬੀ / पंजाबी / پنجابي"], +"pi":["Pali","Pāli / पाऴि"], +"pl":["Polish","Polski"], +"ps":["Pashto","پښتو"], +"pt":["Portuguese","Português"], +"qu":["Quechua","Runa Simi"], +"rm":["Raeto Romance","Rumantsch"], +"rn":["Kirundi","Kirundi"], +"ro":["Romanian","Română"], +"ru":["Russian","Русский"], +"rw":["Rwandi","Kinyarwandi"], +"sa":["Sanskrit","संस्कृतम्"], +"sc":["Sardinian","Sardu"], +"sd":["Sindhi","सिनधि"], +"se":["Northern Sami","Sámegiella"], +"sg":["Sango","Sängö"], +"sh":["Serbo-Croatian","Srpskohrvatski / Српскохрватски"], +"si":["Sinhalese","සිංහල"], +"sk":["Slovak","Slovenčina"], +"sl":["Slovenian","Slovenščina"], +"sm":["Samoan","Gagana Samoa"], +"sn":["Shona","chiShona"], +"so":["Somalia","Soomaaliga"], +"sq":["Albanian","Shqip"], +"sr":["Serbian","Српски"], +"ss":["Swati","SiSwati"], +"st":["Southern Sotho","Sesotho"], +"su":["Sundanese","Basa Sunda"], +"sv":["Swedish","Svenska"], +"sw":["Swahili","Kiswahili"], +"ta":["Tamil","தமிழ்"], +"te":["Telugu","తెలుగు"], +"tg":["Tajik","Тоҷикӣ"], +"th":["Thai","ไทย / Phasa Thai"], +"ti":["Tigrinya","ትግርኛ"], +"tk":["Turkmen","Туркмен / تركمن"], +"tl":["Tagalog / Filipino","Tagalog"], +"tn":["Tswana","Setswana"], +"to":["Tonga","Lea Faka-Tonga"], +"tr":["Turkish","Türkçe"], +"ts":["Tsonga","Xitsonga"], +"tt":["Tatar","Tatarça"], +"tw":["Twi","Twi"], +"ty":["Tahitian","Reo Mā`ohi"], +"ug":["Uyghur","Uyƣurqə / ئۇيغۇرچە"], +"uk":["Ukrainian","Українська"], +"ur":["Urdu","اردو"], +"uz":["Uzbek","Ўзбек"], +"ve":["Venda","Tshivenḓa"], +"vi":["Vietnamese","Tiếng Việt"], +"vo":["Volapük","Volapük"], +"wa":["Walloon","Walon"], +"wo":["Wolof","Wollof"], +"xh":["Xhosa","isiXhosa"], +"yi":["Yiddish","ייִדיש"], +"yo":["Yoruba","Yorùbá"], +"za":["Zhuang","Cuengh / Tôô / 壮语"], +"zh":["Chinese","中文"], +"zu":["Zulu","isiZulu"] +} + +const resLang = function(uLang) { + this.lang = uLang.substring(0, 2); + return (`${langs[this.lang][0]} (${langs[this.lang][1]})`) +} + +export default resLang; \ No newline at end of file diff --git a/ui/js/main.js b/ui/js/main.js index 9bef9aae1..1437fddce 100644 --- a/ui/js/main.js +++ b/ui/js/main.js @@ -11,11 +11,14 @@ import { doChangePath, doNavigate, doDaemonReady } from "actions/app"; import { toQueryString } from "util/query_params"; import { selectBadgeNumber } from "selectors/app"; import * as types from "constants/action_types"; +import fs from "fs"; +import http from "http"; const env = ENV; const { remote, ipcRenderer, shell } = require("electron"); const contextMenu = remote.require("./menu/context-menu"); const app = require("./app"); +app.i18n.resLang = require("./langs").default; lbry.showMenuIfNeeded(); @@ -130,4 +133,40 @@ var init = function() { } }; +const download = (url, dest, lang, cb) => { + const file = fs.createWriteStream(dest); + const request = http.get(url, response => { + response.pipe(file); + file.on('finish', () => { + file.close(cb); // close() is async, call cb after close completes. + app.i18n.localLanguages.push(lang.replace(".json", "")); // push to our local list + }); + }).on('error', err => { // Handle errors + fs.unlink(dest); // Delete the file async. (But we don't check the result) + if (cb) cb(err.message); + }); +}; + +const downloadLanguages = () => { + if (!fs.existsSync("app/locales")){ + fs.mkdirSync("app/locales"); + } + http.request({ host: 'i18n.lbry.io', path: '/' }, response => { + let str = ''; + + response.on('data', chunk => { + str += chunk; + }); + + response.on('end', () => { + const files = JSON.parse(str);JSON.parse(str); + app.i18n.localLanguages = []; + for (let i = 0; i < files.length; i++) { + download(`http://i18n.lbry.io/langs/${files[i]}`, `app/locales/${files[i]}`, files[i], () => {}); + } + }); + }).end(); +}; + +downloadLanguages(); init(); diff --git a/ui/js/page/settings/view.jsx b/ui/js/page/settings/view.jsx index 7704a37e1..4530f0b51 100644 --- a/ui/js/page/settings/view.jsx +++ b/ui/js/page/settings/view.jsx @@ -85,6 +85,12 @@ class SettingsPage extends React.PureComponent { this.props.setClientSetting("showNsfw", event.target.checked); } + onLanguageChange(language) { + lbry.setClientSetting('language', language); + window.app.i18n.setLocale(language); + this.setState({language: language}) + } + // onLanguageChange(language) { // lbry.setClientSetting('language', language); // i18n.setLocale(language); @@ -151,6 +157,38 @@ class SettingsPage extends React.PureComponent { return (
+
+
+

{__("Language")}

+
+
+
+ { + this.onLanguageChange("en"); + }} + defaultChecked={this.state.language == "en"} + /> +
+ {window.app.i18n.localLanguages.map((dLang) => ( +
+ { + this.onLanguageChange(dLang); + }} + defaultChecked={this.state.language == dLang} + /> +
+ ))} +
+

{__("Download Directory")}