Добавлена генерация index.json файла с информацией о доступных локалях

This commit is contained in:
ErickSkrauch 2017-05-19 01:33:13 +03:00
parent d8e7ec8294
commit 9445ed4505
4 changed files with 69 additions and 24 deletions

View File

@ -8,6 +8,7 @@ import ch from 'chalk';
const LANG_DIR = `${__dirname}/../src/i18n`; const LANG_DIR = `${__dirname}/../src/i18n`;
const SOURCE_LANG = 'en'; // Базовый язык, относительно которого будут формироваться все остальные переводы const SOURCE_LANG = 'en'; // Базовый язык, относительно которого будут формироваться все остальные переводы
const SOURCE_FILE_NAME = 'i18n.json'; // Название файла с исходными строками внутри OneSky const SOURCE_FILE_NAME = 'i18n.json'; // Название файла с исходными строками внутри OneSky
const INDEX_FILE_NAME = 'index.json'; // Название файла с информацией о переводах
const MIN_RELEASE_PROGRESS = 80; // Какой процент локали перевода должен быть выполнен, чтобы локаль была опубликована const MIN_RELEASE_PROGRESS = 80; // Какой процент локали перевода должен быть выполнен, чтобы локаль была опубликована
/** /**
@ -84,8 +85,7 @@ function sortByKeys(object) {
async function pullReadyLanguages() { async function pullReadyLanguages() {
const languages = JSON.parse(await onesky.getLanguages({...defaultOptions})); const languages = JSON.parse(await onesky.getLanguages({...defaultOptions}));
return languages.data return languages.data
.filter((elem) => elem.is_ready_to_publish || parseFloat(elem.translation_progress) > MIN_RELEASE_PROGRESS) .filter((elem) => elem.is_ready_to_publish || parseFloat(elem.translation_progress) > MIN_RELEASE_PROGRESS);
.map((elem) => elem.custom_locale || elem.code);
} }
async function pullTranslate(language) { async function pullTranslate(language) {
@ -97,14 +97,26 @@ async function pullTranslate(language) {
async function pull() { async function pull() {
console.log('Pulling locales list...'); console.log('Pulling locales list...');
const langs = await pullReadyLanguages(); const langs = await pullReadyLanguages();
const langsList = langs.map((elem) => elem.custom_locale || elem.code);
console.log(ch.green('Pulled locales: ') + langs.map((lang) => code2locale(lang)).join(', ')); console.log(ch.green('Pulled locales: ') + langsList.map((lang) => code2locale(lang)).join(', '));
console.log('Pulling translates...'); console.log('Pulling translates...');
await Promise.all(langs.map(async (lang) => { await Promise.all(langsList.map(async (lang) => {
await pullTranslate(lang); await pullTranslate(lang);
console.log(ch.green('Locale ') + ch.white.bold(code2locale(lang)) + ch.green(' successfully pulled')); console.log(ch.green('Locale ') + ch.white.bold(code2locale(lang)) + ch.green(' successfully pulled'));
})); }));
console.log('Writing an index file...');
const mapFileContent = {};
langs.map((elem) => {
mapFileContent[elem.locale] = {
name: elem.local_name.match(/^([^\(]+)/)[0].trim(), // Обрезаем значения в скобках
progress: parseFloat(elem.translation_progress),
};
});
fs.writeFileSync(`${LANG_DIR}/${INDEX_FILE_NAME}`, formatTranslates(mapFileContent));
console.log(ch.green('The index file was successfully written'));
} }
async function publish() { async function publish() {

View File

@ -7,18 +7,7 @@ import { FormattedMessage as Message } from 'react-intl';
import styles from './langMenu.scss'; import styles from './langMenu.scss';
import messages from './langMenu.intl.json'; import messages from './langMenu.intl.json';
const LANGS = { import LANGS from 'i18n/index.json';
be: 'Беларуская',
en: 'English',
id: 'Bahasa Indonesia',
pl: 'Polski',
ro: 'Română',
ru: 'Русский',
sl: 'Slovenščina',
pt: 'Português (Br)',
uk: 'Українська',
vi: 'Tiếng Việt',
};
class LangMenu extends Component { class LangMenu extends Component {
static displayName = 'LangMenu'; static displayName = 'LangMenu';
@ -59,12 +48,12 @@ class LangMenu extends Component {
<ul className={classNames(styles.menu, { <ul className={classNames(styles.menu, {
[styles.menuActive]: isActive [styles.menuActive]: isActive
})}> })}>
{Object.keys(LANGS).map((lang) => ( {Object.keys(LANGS).map((locale) => (
<li className={classNames(styles.menuItem, { <li className={classNames(styles.menuItem, {
[styles.activeMenuItem]: lang === userLang [styles.activeMenuItem]: locale === userLang
})} onClick={this.onChangeLang(lang)} key={lang} })} onClick={this.onChangeLang(locale)} key={locale}
> >
{this.renderLangLabel(lang)} {this.renderLangLabel(locale)}
</li> </li>
))} ))}
<li className={styles.improveTranslatesLink}> <li className={styles.improveTranslatesLink}>
@ -93,12 +82,12 @@ class LangMenu extends Component {
); );
} }
renderLangLabel(lang) { renderLangLabel(locale) {
const langLabel = LANGS[lang]; const langLabel = LANGS[locale].name;
return ( return (
<span> <span>
<span className={styles[`lang${lang[0].toUpperCase() + lang.slice(1)}`]} /> <span className={styles[`lang${locale[0].toUpperCase() + locale.slice(1)}`]} />
{langLabel} {langLabel}
</span> </span>
); );

42
src/i18n/index.json Normal file
View File

@ -0,0 +1,42 @@
{
"be": {
"name": "Беларуская",
"progress": 100
},
"en": {
"name": "English",
"progress": 100
},
"id": {
"name": "Bahasa Indonesia",
"progress": 99.5
},
"pl": {
"name": "Polski",
"progress": 100
},
"pt": {
"name": "Português",
"progress": 100
},
"ro": {
"name": "Română",
"progress": 95.4
},
"ru": {
"name": "Русский",
"progress": 100
},
"sl": {
"name": "Slovenščina",
"progress": 100
},
"uk": {
"name": "Українська",
"progress": 100
},
"vi": {
"name": "Tiếng Việt",
"progress": 100
}
}

View File

@ -1,3 +1,5 @@
import locales from 'i18n/index.json';
import { addLocaleData } from 'react-intl'; import { addLocaleData } from 'react-intl';
import beLocaleData from 'react-intl/locale-data/be'; import beLocaleData from 'react-intl/locale-data/be';
import enLocaleData from 'react-intl/locale-data/en'; import enLocaleData from 'react-intl/locale-data/en';
@ -22,7 +24,7 @@ addLocaleData(ptLocaleData);
addLocaleData(ukLocaleData); addLocaleData(ukLocaleData);
addLocaleData(viLocaleData); addLocaleData(viLocaleData);
const SUPPORTED_LANGUAGES = ['be', 'en', 'id', 'pl', 'ro', 'ru', 'sl', 'pt', 'uk', 'vi']; const SUPPORTED_LANGUAGES = Object.keys(locales);
const DEFAULT_LANGUAGE = 'en'; const DEFAULT_LANGUAGE = 'en';
const needPolyfill = !window.Intl; const needPolyfill = !window.Intl;