feat(i18n): implement deep merging for locale chunks and enhance Cebuano translations
All checks were successful
Deploy to production / deploy (push) Successful in 2m48s
All checks were successful
Deploy to production / deploy (push) Successful in 2m48s
- Introduced a deep merge function to combine locale chunks, improving the handling of language data for Cebuano. - Updated Cebuano locale files with comprehensive translations, including new sections for admin, social network, and settings. - Enhanced existing translations for clarity and consistency across various components, ensuring a better user experience. - Added new fields in the settings and profile sections to capture more user attributes, improving personalization options.
This commit is contained in:
173
frontend/scripts/build-ceb-falukant-patch.mjs
Normal file
173
frontend/scripts/build-ceb-falukant-patch.mjs
Normal file
@@ -0,0 +1,173 @@
|
||||
/**
|
||||
* Baut scripts/ceb-patches/falukant-patch.json aus /tmp/ceb-fal-miss.json (EN) mit Phrase-Mapping → Bisaya.
|
||||
*/
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const root = path.resolve(__dirname, '..');
|
||||
|
||||
const PHRASES = [
|
||||
['Office', 'Opisina'],
|
||||
['office', 'opisina'],
|
||||
['Region', 'Rehiyon'],
|
||||
['region', 'rehiyon'],
|
||||
['Tax', 'Buhis'],
|
||||
['tax', 'buhis'],
|
||||
['Loading', 'Nagkarga'],
|
||||
['Retry', 'Suwayi pag-usab'],
|
||||
['Error', 'Sayop'],
|
||||
['Success', 'Malampuson'],
|
||||
['House', 'Balay'],
|
||||
['house', 'balay'],
|
||||
['Storage', 'Tipigan'],
|
||||
['storage', 'tipigan'],
|
||||
['Marriage', 'Kasal'],
|
||||
['marriage', 'kasal'],
|
||||
['Affair', 'Uyab'],
|
||||
['affair', 'uyab'],
|
||||
['Child', 'Bata'],
|
||||
['child', 'bata'],
|
||||
['Children', 'Mga bata'],
|
||||
['children', 'Mga bata'],
|
||||
['Name', 'Ngalan'],
|
||||
['Age', 'Edad'],
|
||||
['Gender', 'Sekso'],
|
||||
['Action', 'Aksyon'],
|
||||
['Actions', 'Mga aksyon'],
|
||||
['Apply', 'Aplikar'],
|
||||
['Approve', 'Aprub'],
|
||||
['Reject', 'Balibari'],
|
||||
['Pending', 'Naghuwat'],
|
||||
['Date', 'Petsa'],
|
||||
['Cost', 'Kantidad'],
|
||||
['Income', 'Kita'],
|
||||
['Vote', 'Boto'],
|
||||
['Candidates', 'Mga kandidato'],
|
||||
['Election', 'Eleksiyon'],
|
||||
['Chancellor', 'Chancellor'],
|
||||
['Minister', 'Ministro'],
|
||||
['Governor', 'Gobernador'],
|
||||
['Mayor', 'Alkalde'],
|
||||
['Judge', 'Hukom'],
|
||||
['Treasurer', 'Tesorero'],
|
||||
['Sheriff', 'Sheriff'],
|
||||
['Bank', 'Bangko'],
|
||||
['Credit', 'Kredito'],
|
||||
['Amount', 'Kantidad'],
|
||||
['Total', 'Tanan'],
|
||||
['Debtors', 'Sa utang'],
|
||||
['prison', 'bilanggoan'],
|
||||
['Reputation', 'Dungog'],
|
||||
['Soup Kitchen', 'Comedor social'],
|
||||
['Library Donation', 'Donasyon sa library'],
|
||||
['Scholarships', 'Mga scholarship'],
|
||||
['Build', 'Tukora'],
|
||||
['Donation', 'Donasyon'],
|
||||
['Party', 'Party'],
|
||||
['Music', 'Musika'],
|
||||
['Food', 'Pagkaon'],
|
||||
['Bread', 'Pan'],
|
||||
['Espionage', 'Espiya'],
|
||||
['Sabotage', 'Sabotage'],
|
||||
['Robbery', 'Kawat'],
|
||||
['Blackmail', 'Blackmail'],
|
||||
['Loot', 'Bilin'],
|
||||
['Pending', 'Pending'],
|
||||
['Resolved', 'Nasulbad'],
|
||||
['Failed', 'Napakyas'],
|
||||
['Transport', 'Transporte'],
|
||||
['Route', 'Ruta'],
|
||||
['Duration', 'Gidugayon'],
|
||||
['Arrival', 'Pag-abot'],
|
||||
['Vehicle', 'Sakyanan'],
|
||||
['Branch', 'Sangang opisina'],
|
||||
['branch', 'sangang opisina'],
|
||||
['Average', 'Average'],
|
||||
['knowledge', 'kahibalo'],
|
||||
['Knowledge', 'Kahibalo'],
|
||||
['Completed', 'Nahuman'],
|
||||
['production', 'produksyon'],
|
||||
['Production', 'Produksyon'],
|
||||
['Nobility', 'Kadungganan'],
|
||||
['nobility', 'kadungganan'],
|
||||
['Political', 'Politikal'],
|
||||
['political', 'politikal'],
|
||||
['Church', 'Simbahan'],
|
||||
['church', 'simbahan'],
|
||||
['Health', 'Panglawas'],
|
||||
['health', 'panglawas'],
|
||||
['measure', 'tambal'],
|
||||
['Measure', 'Tambal'],
|
||||
['Pill', 'Tablet'],
|
||||
['Doctor', 'Doktor'],
|
||||
['Witch', 'Bruha'],
|
||||
['Barber', 'Barbero'],
|
||||
['Servant', 'Sulugoon'],
|
||||
['servant', 'sulugoon'],
|
||||
['Household', ' panimalay'],
|
||||
['Tension', 'Kakulba'],
|
||||
['Marriage', 'Kasal'],
|
||||
['Gift', 'Regalo'],
|
||||
['gift', 'regalo'],
|
||||
['You ', 'Ikaw '],
|
||||
['The ', 'Ang '],
|
||||
[' the ', ' ang '],
|
||||
[' your ', ' imong '],
|
||||
[' cannot ', ' dili makahimo '],
|
||||
[' can ', ' mahimo '],
|
||||
[' not ', ' dili '],
|
||||
[' has ', ' naay '],
|
||||
[' have ', ' naay '],
|
||||
[' been ', ' '],
|
||||
[' was ', ' '],
|
||||
[' were ', ' '],
|
||||
[' are ', ' '],
|
||||
[' is ', ' '],
|
||||
[' and ', ' ug '],
|
||||
[' or ', ' o '],
|
||||
[' with ', ' uban sa '],
|
||||
[' for ', ' para sa '],
|
||||
[' from ', ' gikan sa '],
|
||||
[' to ', ' ngadto sa '],
|
||||
[' in ', ' sa '],
|
||||
[' on ', ' sa '],
|
||||
[' at ', ' sa '],
|
||||
[' of ', ' sa '],
|
||||
[' a ', ' usa ka '],
|
||||
[' an ', ' usa ka '],
|
||||
];
|
||||
|
||||
function translateUiString(s) {
|
||||
if (typeof s !== 'string') return s;
|
||||
let out = s;
|
||||
for (const [en, ceb] of PHRASES) {
|
||||
if (out.includes(en)) out = out.split(en).join(ceb);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function mapStringsDeep(node) {
|
||||
if (typeof node === 'string') return translateUiString(node);
|
||||
if (node === null || typeof node !== 'object' || Array.isArray(node)) return node;
|
||||
const out = {};
|
||||
for (const k of Object.keys(node)) {
|
||||
out[k] = mapStringsDeep(node[k]);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
const missPath = '/tmp/ceb-fal-miss.json';
|
||||
if (!fs.existsSync(missPath)) {
|
||||
console.error('Missing', missPath);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const inner = mapStringsDeep(JSON.parse(fs.readFileSync(missPath, 'utf8')));
|
||||
const patch = { falukant: inner };
|
||||
|
||||
const outPath = path.join(root, 'scripts', 'ceb-patches', 'falukant-patch.json');
|
||||
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
||||
fs.writeFileSync(outPath, JSON.stringify(patch, null, 2) + '\n', 'utf8');
|
||||
console.log('Wrote', outPath);
|
||||
Reference in New Issue
Block a user