taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit c8fd7ab60266ab9e9f37da10c8afe62edb0cfdbe
parent 011b25c5965600d5f7b99d9aacc2a10e28aaa533
Author: Sebastian <sebasjm@gmail.com>
Date:   Mon,  4 Nov 2024 15:04:18 -0300

languate stats tool

Diffstat:
Mpackages/merchant-backoffice-ui/build.mjs | 2+-
Apackages/merchant-backoffice-ui/src/lang.ts | 126+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 127 insertions(+), 1 deletion(-)

diff --git a/packages/merchant-backoffice-ui/build.mjs b/packages/merchant-backoffice-ui/build.mjs @@ -20,7 +20,7 @@ import { build } from "@gnu-taler/web-util/build"; await build({ type: "production", source: { - js: ["src/index.tsx"], + js: ["src/index.tsx","src/lang.ts"], assets: [{base:"src",files:["src/index.html"]}], }, destination: "./dist/prod", diff --git a/packages/merchant-backoffice-ui/src/lang.ts b/packages/merchant-backoffice-ui/src/lang.ts @@ -0,0 +1,126 @@ +/* + This file is part of GNU Taler + (C) 2021-2024 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +import { strings } from "./i18n/strings.js"; + +const keys = Object.keys(strings); +type Actions = "SHOW_STATS" | "SHOW_MISSING" | "SUGGEST"; +const options = process.argv.reduce( + (prev, arg, idx, arr) => { + if (arg === "--missing") { + prev.ACTION = "SHOW_MISSING"; + } + if (arg === "--lang") { + prev.lang = idx + 1 < arr.length ? arr[idx + 1] : undefined; + } + if (arg === "--suggest") { + prev.ACTION = "SUGGEST"; + } + return prev; + }, + { + ACTION: "SHOW_STATS" as Actions, + lang: undefined as string | undefined, + }, +); + +switch (options.ACTION) { + case "SHOW_MISSING": { + keys.forEach((key) => { + if (options.lang && options.lang !== key) { + return; + } + const msgs = Object.entries( + strings[key].locale_data.messages as Record<string, string[]>, + ); + let empty = msgs.filter(([key, value]) => { + if (!value || !value.length || !value[0]) return true; + return false; + }); + empty.forEach((msg) => { + console.log(msg[0]); + }); + }); + break; + } + case "SUGGEST": { + keys.forEach((key) => { + if (options.lang && options.lang !== key) { + return; + } + // const content = fs.readFileSync(`./src/i18n/${key}.po`).toString("utf-8") + const content = `#: src/Application.tsx:208 +#, c-format +msgid "checking compatibility with server..." +msgstr "" + +#: src/Application.tsx:217 +#, fuzzy, c-format +msgid "Contacting the server failed" +msgstr "No se pudo aceder al servidor" + +#: src/Application.tsx:229 +#, c-format +msgid "The server version is not supported" +msgstr "" + +#: src/Application.tsx:230 +#, c-format +msgid "Supported version \"%1$s\", server version \"%2$s\"." +msgstr "" +` + const msgs = Object.entries( + strings[key].locale_data.messages as Record<string, string[]>, + ); + let empty = msgs.filter(([key, value]) => { + if (!value || !value.length || !value[0]) return true; + return false; + }); + empty.forEach((msg) => { + const search = new RegExp(`\n\n(#.*\n)+msgid "${msg[0]}"\nmsgstr .*\n\n`,"gm"); + const res = search.exec(content) + if (res) { + console.log(res[0].trim()) + } + }); + + }) + break; + } + case "SHOW_STATS": { + keys.forEach((key) => { + const com = strings[key].completeness as number; + const msgs = Object.entries( + strings[key].locale_data.messages as Record<string, string[]>, + ); + const empty = msgs.filter(([key, value]) => { + if (!value || !value.length || !value[0]) return true; + return false; + }).length; + console.log( + ` * ${key}: ${com.toLocaleString(undefined, { + minimumIntegerDigits: 2, + })}% ${(msgs.length - empty).toLocaleString(undefined, { + minimumIntegerDigits: 3, + })} of ${msgs.length}`, + ); + }); + break; + } + default: { + throw Error(`unkown action: ${options.ACTION}`); + } +}