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.
This commit is contained in:
parent
37d6e5f918
commit
26a361d873
4 changed files with 274 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -10,6 +10,7 @@
|
|||
|
||||
|
||||
/app/dist
|
||||
/app/locales
|
||||
/app/node_modules
|
||||
/build/venv
|
||||
/lbry-app-venv
|
||||
|
|
196
ui/js/langs.js
Normal file
196
ui/js/langs.js
Normal file
|
@ -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;
|
|
@ -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();
|
||||
|
|
|
@ -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 (
|
||||
<main className="main--single-column">
|
||||
<SubHeader />
|
||||
<section className="card">
|
||||
<div className="card__content">
|
||||
<h3>{__("Language")}</h3>
|
||||
</div>
|
||||
<div className="card__content">
|
||||
<div className="form-row">
|
||||
<FormField
|
||||
type="radio"
|
||||
name="language"
|
||||
label={__("English")}
|
||||
onChange={() => {
|
||||
this.onLanguageChange("en");
|
||||
}}
|
||||
defaultChecked={this.state.language == "en"}
|
||||
/>
|
||||
</div>
|
||||
{window.app.i18n.localLanguages.map((dLang) => (
|
||||
<div key={dLang} className="form-row">
|
||||
<FormField
|
||||
type="radio"
|
||||
name="language"
|
||||
key={dLang}
|
||||
label={window.app.i18n.resLang(dLang)}
|
||||
onChange={() => {
|
||||
this.onLanguageChange(dLang);
|
||||
}}
|
||||
defaultChecked={this.state.language == dLang}
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
<section className="card">
|
||||
<div className="card__content">
|
||||
<h3>{__("Download Directory")}</h3>
|
||||
|
|
Loading…
Reference in a new issue