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/dist
|
||||||
|
/app/locales
|
||||||
/app/node_modules
|
/app/node_modules
|
||||||
/build/venv
|
/build/venv
|
||||||
/lbry-app-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 { toQueryString } from "util/query_params";
|
||||||
import { selectBadgeNumber } from "selectors/app";
|
import { selectBadgeNumber } from "selectors/app";
|
||||||
import * as types from "constants/action_types";
|
import * as types from "constants/action_types";
|
||||||
|
import fs from "fs";
|
||||||
|
import http from "http";
|
||||||
|
|
||||||
const env = ENV;
|
const env = ENV;
|
||||||
const { remote, ipcRenderer, shell } = require("electron");
|
const { remote, ipcRenderer, shell } = require("electron");
|
||||||
const contextMenu = remote.require("./menu/context-menu");
|
const contextMenu = remote.require("./menu/context-menu");
|
||||||
const app = require("./app");
|
const app = require("./app");
|
||||||
|
app.i18n.resLang = require("./langs").default;
|
||||||
|
|
||||||
lbry.showMenuIfNeeded();
|
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();
|
init();
|
||||||
|
|
|
@ -85,6 +85,12 @@ class SettingsPage extends React.PureComponent {
|
||||||
this.props.setClientSetting("showNsfw", event.target.checked);
|
this.props.setClientSetting("showNsfw", event.target.checked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onLanguageChange(language) {
|
||||||
|
lbry.setClientSetting('language', language);
|
||||||
|
window.app.i18n.setLocale(language);
|
||||||
|
this.setState({language: language})
|
||||||
|
}
|
||||||
|
|
||||||
// onLanguageChange(language) {
|
// onLanguageChange(language) {
|
||||||
// lbry.setClientSetting('language', language);
|
// lbry.setClientSetting('language', language);
|
||||||
// i18n.setLocale(language);
|
// i18n.setLocale(language);
|
||||||
|
@ -151,6 +157,38 @@ class SettingsPage extends React.PureComponent {
|
||||||
return (
|
return (
|
||||||
<main className="main--single-column">
|
<main className="main--single-column">
|
||||||
<SubHeader />
|
<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">
|
<section className="card">
|
||||||
<div className="card__content">
|
<div className="card__content">
|
||||||
<h3>{__("Download Directory")}</h3>
|
<h3>{__("Download Directory")}</h3>
|
||||||
|
|
Loading…
Reference in a new issue