diff --git a/scripts/catalogs.js b/scripts/catalogs.js index debb0d43..e21d7a49 100644 --- a/scripts/catalogs.js +++ b/scripts/catalogs.js @@ -3,6 +3,13 @@ import fs from 'node:fs'; // Dependency from Lingui, not listed in package.json import PO from 'pofile'; +let listedLocales = []; +try { + listedLocales = JSON.parse( + fs.readFileSync('src/data/listed-locales.json', 'utf8'), + ); +} catch (e) {} + const DEFAULT_LANG = 'en'; const IGNORE_LANGS = [DEFAULT_LANG, 'pseudo-LOCALE']; @@ -82,12 +89,41 @@ const fullCatalogs = Object.entries(catalogs) return { code, nativeName, name, completion }; }); +// Set listed: true if completion > PERCENTAGE_THRESHOLD +const PERCENTAGE_THRESHOLD = 50; +const listedCatalogs = fullCatalogs.map((catalog) => ({ + ...catalog, + // Once listed, always listed + // A locale may exceed percentage threshold today, but not tomorrow + // So it should't suddenly become unlisted + listed: + listedLocales.includes(catalog.code) || + catalog.completion >= PERCENTAGE_THRESHOLD, +})); + // Sort by completion -const sortedCatalogs = [...fullCatalogs].sort( +const sortedCatalogs = [...listedCatalogs].sort( (a, b) => b.completion - a.completion, ); + console.table(sortedCatalogs); +console.log( + `Total listed/unlisted: ${listedCatalogs.filter((c) => c.listed).length}/${ + listedCatalogs.filter((c) => !c.listed).length + }`, +); const path = 'src/data/catalogs.json'; -fs.writeFileSync(path, JSON.stringify(fullCatalogs, null, 2)); +fs.writeFileSync(path, JSON.stringify(listedCatalogs, null, 2)); console.log('File written:', path); + +const path2 = 'src/data/listed-locales.json'; +const codes = listedCatalogs.filter((c) => c.listed).map((c) => c.code); +if (codes.length >= listedLocales.length) { + fs.writeFileSync(path2, JSON.stringify(codes, null, 2)); + console.log('File written:', path2); +} else { + console.error( + `Number of listed locales reduced from ${listedLocales.length} to ${codes.length}.`, + ); +} diff --git a/src/data/catalogs.json b/src/data/catalogs.json index c32eca7f..2e84b1df 100644 --- a/src/data/catalogs.json +++ b/src/data/catalogs.json @@ -3,168 +3,196 @@ "code": "ar-SA", "nativeName": "العربية", "name": "Arabic", - "completion": 24 + "completion": 24, + "listed": false }, { "code": "ca-ES", "nativeName": "català", "name": "Catalan", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "cs-CZ", "nativeName": "čeština", "name": "Czech", - "completion": 81 + "completion": 81, + "listed": true }, { "code": "de-DE", "nativeName": "Deutsch", "name": "German", - "completion": 92 + "completion": 92, + "listed": true }, { "code": "eo-UY", "nativeName": "Esperanto", "name": "Esperanto", - "completion": 99 + "completion": 99, + "listed": true }, { "code": "es-ES", "nativeName": "español", "name": "Spanish", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "eu-ES", "nativeName": "euskara", "name": "Basque", - "completion": 98 + "completion": 98, + "listed": true }, { "code": "fa-IR", "nativeName": "فارسی", "name": "Persian", - "completion": 71 + "completion": 71, + "listed": true }, { "code": "fi-FI", "nativeName": "suomi", "name": "Finnish", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "fr-FR", "nativeName": "français", "name": "French", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "gl-ES", "nativeName": "galego", "name": "Galician", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "he-IL", "nativeName": "עברית", "name": "Hebrew", - "completion": 10 + "completion": 10, + "listed": false }, { "code": "it-IT", "nativeName": "italiano", "name": "Italian", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "ja-JP", "nativeName": "日本語", "name": "Japanese", - "completion": 47 + "completion": 47, + "listed": false }, { "code": "kab", "nativeName": "Taqbaylit", "name": "Kabyle", - "completion": 95 + "completion": 95, + "listed": true }, { "code": "ko-KR", "nativeName": "한국어", "name": "Korean", - "completion": 88 + "completion": 88, + "listed": true }, { "code": "lt-LT", "nativeName": "lietuvių", "name": "Lithuanian", - "completion": 98 + "completion": 98, + "listed": true }, { "code": "nb-NO", "nativeName": "norsk bokmål", "name": "Norwegian Bokmål", - "completion": 49 + "completion": 49, + "listed": false }, { "code": "nl-NL", "nativeName": "Nederlands", "name": "Dutch", - "completion": 75 + "completion": 75, + "listed": true }, { "code": "pl-PL", "nativeName": "polski", "name": "Polish", - "completion": 67 + "completion": 67, + "listed": true }, { "code": "pt-BR", "nativeName": "português", "name": "Portuguese", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "pt-PT", "nativeName": "português", "name": "Portuguese", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "ru-RU", "nativeName": "русский", "name": "Russian", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "th-TH", "nativeName": "ไทย", "name": "Thai", - "completion": 8 + "completion": 8, + "listed": false }, { "code": "tr-TR", "nativeName": "Türkçe", "name": "Turkish", - "completion": 47 + "completion": 47, + "listed": false }, { "code": "uk-UA", "nativeName": "українська", "name": "Ukrainian", - "completion": 92 + "completion": 92, + "listed": true }, { "code": "zh-CN", "nativeName": "简体中文", "name": "Simplified Chinese", - "completion": 100 + "completion": 100, + "listed": true }, { "code": "zh-TW", "nativeName": "繁體中文", "name": "Traditional Chinese", - "completion": 32 + "completion": 32, + "listed": false } ] \ No newline at end of file diff --git a/src/data/listed-locales.json b/src/data/listed-locales.json new file mode 100644 index 00000000..98458537 --- /dev/null +++ b/src/data/listed-locales.json @@ -0,0 +1,23 @@ +[ + "ca-ES", + "es-ES", + "fi-FI", + "gl-ES", + "it-IT", + "pt-BR", + "pt-PT", + "zh-CN", + "eo-UY", + "ru-RU", + "eu-ES", + "lt-LT", + "kab", + "de-DE", + "uk-UA", + "fr-FR", + "ko-KR", + "cs-CZ", + "nl-NL", + "fa-IR", + "pl-PL" +] \ No newline at end of file diff --git a/src/locales.js b/src/locales.js index b19934c6..ef72c8fd 100644 --- a/src/locales.js +++ b/src/locales.js @@ -3,22 +3,15 @@ import catalogs from './data/catalogs.json'; export const DEFAULT_LANG = 'en'; export const CATALOGS = catalogs; -// Get locales that's >= X% translated -const PERCENTAGE_THRESHOLD = 50; - const locales = [ DEFAULT_LANG, - ...catalogs - .filter(({ completion }) => completion >= PERCENTAGE_THRESHOLD) - .map(({ code }) => code), + ...catalogs.filter(({ listed }) => listed).map(({ code }) => code), ]; export const LOCALES = locales; let devLocales = []; if (import.meta.env?.DEV || import.meta.env?.PHANPY_SHOW_DEV_LOCALES) { - devLocales = catalogs - .filter(({ completion }) => completion < PERCENTAGE_THRESHOLD) - .map(({ code }) => code); + devLocales = catalogs.filter(({ listed }) => !listed).map(({ code }) => code); devLocales.push('pseudo-LOCALE'); } export const DEV_LOCALES = devLocales;