Move percentage threshold to build time

Once listed, always listed
pull/1126/head
Lim Chee Aun 2025-04-20 08:11:00 +08:00
rodzic 61edf3de45
commit 75556b37cc
4 zmienionych plików z 119 dodań i 39 usunięć

Wyświetl plik

@ -3,6 +3,13 @@ import fs from 'node:fs';
// Dependency from Lingui, not listed in package.json // Dependency from Lingui, not listed in package.json
import PO from 'pofile'; 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 DEFAULT_LANG = 'en';
const IGNORE_LANGS = [DEFAULT_LANG, 'pseudo-LOCALE']; const IGNORE_LANGS = [DEFAULT_LANG, 'pseudo-LOCALE'];
@ -82,12 +89,41 @@ const fullCatalogs = Object.entries(catalogs)
return { code, nativeName, name, completion }; 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 // Sort by completion
const sortedCatalogs = [...fullCatalogs].sort( const sortedCatalogs = [...listedCatalogs].sort(
(a, b) => b.completion - a.completion, (a, b) => b.completion - a.completion,
); );
console.table(sortedCatalogs); 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'; 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); 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}.`,
);
}

Wyświetl plik

@ -3,168 +3,196 @@
"code": "ar-SA", "code": "ar-SA",
"nativeName": "العربية", "nativeName": "العربية",
"name": "Arabic", "name": "Arabic",
"completion": 24 "completion": 24,
"listed": false
}, },
{ {
"code": "ca-ES", "code": "ca-ES",
"nativeName": "català", "nativeName": "català",
"name": "Catalan", "name": "Catalan",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "cs-CZ", "code": "cs-CZ",
"nativeName": "čeština", "nativeName": "čeština",
"name": "Czech", "name": "Czech",
"completion": 81 "completion": 81,
"listed": true
}, },
{ {
"code": "de-DE", "code": "de-DE",
"nativeName": "Deutsch", "nativeName": "Deutsch",
"name": "German", "name": "German",
"completion": 92 "completion": 92,
"listed": true
}, },
{ {
"code": "eo-UY", "code": "eo-UY",
"nativeName": "Esperanto", "nativeName": "Esperanto",
"name": "Esperanto", "name": "Esperanto",
"completion": 99 "completion": 99,
"listed": true
}, },
{ {
"code": "es-ES", "code": "es-ES",
"nativeName": "español", "nativeName": "español",
"name": "Spanish", "name": "Spanish",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "eu-ES", "code": "eu-ES",
"nativeName": "euskara", "nativeName": "euskara",
"name": "Basque", "name": "Basque",
"completion": 98 "completion": 98,
"listed": true
}, },
{ {
"code": "fa-IR", "code": "fa-IR",
"nativeName": "فارسی", "nativeName": "فارسی",
"name": "Persian", "name": "Persian",
"completion": 71 "completion": 71,
"listed": true
}, },
{ {
"code": "fi-FI", "code": "fi-FI",
"nativeName": "suomi", "nativeName": "suomi",
"name": "Finnish", "name": "Finnish",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "fr-FR", "code": "fr-FR",
"nativeName": "français", "nativeName": "français",
"name": "French", "name": "French",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "gl-ES", "code": "gl-ES",
"nativeName": "galego", "nativeName": "galego",
"name": "Galician", "name": "Galician",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "he-IL", "code": "he-IL",
"nativeName": "עברית", "nativeName": "עברית",
"name": "Hebrew", "name": "Hebrew",
"completion": 10 "completion": 10,
"listed": false
}, },
{ {
"code": "it-IT", "code": "it-IT",
"nativeName": "italiano", "nativeName": "italiano",
"name": "Italian", "name": "Italian",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "ja-JP", "code": "ja-JP",
"nativeName": "日本語", "nativeName": "日本語",
"name": "Japanese", "name": "Japanese",
"completion": 47 "completion": 47,
"listed": false
}, },
{ {
"code": "kab", "code": "kab",
"nativeName": "Taqbaylit", "nativeName": "Taqbaylit",
"name": "Kabyle", "name": "Kabyle",
"completion": 95 "completion": 95,
"listed": true
}, },
{ {
"code": "ko-KR", "code": "ko-KR",
"nativeName": "한국어", "nativeName": "한국어",
"name": "Korean", "name": "Korean",
"completion": 88 "completion": 88,
"listed": true
}, },
{ {
"code": "lt-LT", "code": "lt-LT",
"nativeName": "lietuvių", "nativeName": "lietuvių",
"name": "Lithuanian", "name": "Lithuanian",
"completion": 98 "completion": 98,
"listed": true
}, },
{ {
"code": "nb-NO", "code": "nb-NO",
"nativeName": "norsk bokmål", "nativeName": "norsk bokmål",
"name": "Norwegian Bokmål", "name": "Norwegian Bokmål",
"completion": 49 "completion": 49,
"listed": false
}, },
{ {
"code": "nl-NL", "code": "nl-NL",
"nativeName": "Nederlands", "nativeName": "Nederlands",
"name": "Dutch", "name": "Dutch",
"completion": 75 "completion": 75,
"listed": true
}, },
{ {
"code": "pl-PL", "code": "pl-PL",
"nativeName": "polski", "nativeName": "polski",
"name": "Polish", "name": "Polish",
"completion": 67 "completion": 67,
"listed": true
}, },
{ {
"code": "pt-BR", "code": "pt-BR",
"nativeName": "português", "nativeName": "português",
"name": "Portuguese", "name": "Portuguese",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "pt-PT", "code": "pt-PT",
"nativeName": "português", "nativeName": "português",
"name": "Portuguese", "name": "Portuguese",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "ru-RU", "code": "ru-RU",
"nativeName": "русский", "nativeName": "русский",
"name": "Russian", "name": "Russian",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "th-TH", "code": "th-TH",
"nativeName": "ไทย", "nativeName": "ไทย",
"name": "Thai", "name": "Thai",
"completion": 8 "completion": 8,
"listed": false
}, },
{ {
"code": "tr-TR", "code": "tr-TR",
"nativeName": "Türkçe", "nativeName": "Türkçe",
"name": "Turkish", "name": "Turkish",
"completion": 47 "completion": 47,
"listed": false
}, },
{ {
"code": "uk-UA", "code": "uk-UA",
"nativeName": "українська", "nativeName": "українська",
"name": "Ukrainian", "name": "Ukrainian",
"completion": 92 "completion": 92,
"listed": true
}, },
{ {
"code": "zh-CN", "code": "zh-CN",
"nativeName": "简体中文", "nativeName": "简体中文",
"name": "Simplified Chinese", "name": "Simplified Chinese",
"completion": 100 "completion": 100,
"listed": true
}, },
{ {
"code": "zh-TW", "code": "zh-TW",
"nativeName": "繁體中文", "nativeName": "繁體中文",
"name": "Traditional Chinese", "name": "Traditional Chinese",
"completion": 32 "completion": 32,
"listed": false
} }
] ]

Wyświetl plik

@ -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"
]

Wyświetl plik

@ -3,22 +3,15 @@ import catalogs from './data/catalogs.json';
export const DEFAULT_LANG = 'en'; export const DEFAULT_LANG = 'en';
export const CATALOGS = catalogs; export const CATALOGS = catalogs;
// Get locales that's >= X% translated
const PERCENTAGE_THRESHOLD = 50;
const locales = [ const locales = [
DEFAULT_LANG, DEFAULT_LANG,
...catalogs ...catalogs.filter(({ listed }) => listed).map(({ code }) => code),
.filter(({ completion }) => completion >= PERCENTAGE_THRESHOLD)
.map(({ code }) => code),
]; ];
export const LOCALES = locales; export const LOCALES = locales;
let devLocales = []; let devLocales = [];
if (import.meta.env?.DEV || import.meta.env?.PHANPY_SHOW_DEV_LOCALES) { if (import.meta.env?.DEV || import.meta.env?.PHANPY_SHOW_DEV_LOCALES) {
devLocales = catalogs devLocales = catalogs.filter(({ listed }) => !listed).map(({ code }) => code);
.filter(({ completion }) => completion < PERCENTAGE_THRESHOLD)
.map(({ code }) => code);
devLocales.push('pseudo-LOCALE'); devLocales.push('pseudo-LOCALE');
} }
export const DEV_LOCALES = devLocales; export const DEV_LOCALES = devLocales;