Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 43 additions & 22 deletions _tools/check-ui-zh.mjs
Original file line number Diff line number Diff line change
@@ -1,30 +1,51 @@
import { readFileSync } from "node:fs";
import { resolve } from "node:path";

const files = [
"src/modules/features/SettingDialogue/PaneHatch.ts",
"src/modules/features/SettingDialogue/PaneMaintenance.ts",
"src/modules/features/SettingDialogue/PaneRemoteConfig.ts",
"src/modules/features/SettingDialogue/PanePatches.ts",
];
const root = resolve(import.meta.dirname, "..");
const messageDir = resolve(root, "src/common/messagesJson");
const en = JSON.parse(readFileSync(resolve(messageDir, "en.json"), "utf8"));
const zh = JSON.parse(readFileSync(resolve(messageDir, "zh.json"), "utf8"));
const zhTw = JSON.parse(readFileSync(resolve(messageDir, "zh-tw.json"), "utf8"));
const placeholderRe = /(%\{[^}]+\}|\$\{[^}]+\})/g;
const tokens = (value) => Array.from(String(value).matchAll(placeholderRe), (match) => match[1]).sort();

const pattern =
/(setName|setDesc|setButtonText|appendText|setTitle|promptCopyToClipboard|askString|askYesNoDialog)\(".*[A-Za-z].*"\)/;
const allowedFallbackKey = /^(lang-.*|K\.long_p2p_sync|K\.short_p2p_sync|moduleLiveSyncMain\.logPluginVersion|obsidianLiveSyncSettingTab\.linkTroubleshooting|obsidianLiveSyncSettingTab\.(optionCouchDB|optionLiveSync|titleCouchDB)|P2P\.PaneTitle|TweakMismatchResolve\.Table\.Row|Ui\.SetupWizard\.SetupRemote\.CouchDbOption|Ui\.UseSetupURI\.Label|moduleMigration\.docUri|Setup\.QRCode)$/;
const allowedFallbackValue = /^(MB|CouchDB|P2P|S3|MinIO|R2|JWT|IndexedDB|IDB|E2EE|Hatch|Vault|Obsidian|LiveSync|Self-hosted LiveSync|PouchDB|WebRTC|WebSocket|HTTP|HTTPS|Red Flag)$/;

let hasFinding = false;

for (const file of files) {
const lines = readFileSync(file, "utf8").split(/\r?\n/);
lines.forEach((line, index) => {
if (line.trimStart().startsWith("//")) return;
if (pattern.test(line)) {
hasFinding = true;
console.log(`${file}:${index + 1}:${line.trim()}`);
function checkLanguage(lang, messages) {
const issues = [];
for (const [key, enValue] of Object.entries(en)) {
if (!(key in messages)) {
issues.push(`${lang}: missing key ${key}`);
continue;
}
const value = String(messages[key]);
if (/[?]{2,}|�/.test(value)) {
issues.push(`${lang}: damaged value ${key}=${JSON.stringify(value)}`);
}
if (
value === enValue &&
!allowedFallbackKey.test(key) &&
!allowedFallbackValue.test(String(enValue))
) {
issues.push(`${lang}: untranslated value ${key}`);
}
});
const expectedTokens = JSON.stringify(tokens(enValue));
const actualTokens = JSON.stringify(tokens(value));
if (expectedTokens !== actualTokens) {
issues.push(`${lang}: placeholder mismatch ${key}: expected ${expectedTokens}, got ${actualTokens}`);
}
}
return issues;
}

if (hasFinding) {
process.exitCode = 1;
} else {
console.log("No direct English UI string patterns found in targeted panes.");
const issues = [...checkLanguage("zh", zh), ...checkLanguage("zh-tw", zhTw)];
if (issues.length > 0) {
console.error(issues.slice(0, 50).join("\n"));
if (issues.length > 50) {
console.error(`...and ${issues.length - 50} more issues`);
}
process.exit(1);
}

console.log("Chinese UI i18n check passed");
2 changes: 2 additions & 0 deletions src/common/messages/combinedMessages.dev.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { PartialMessages as def } from "./def.ts";
import { PartialMessages as de } from "./de.ts";
import { PartialMessages as es } from "./es.ts";
import { PartialMessages as fr } from "./fr.ts";
import { PartialMessages as he } from "./he.ts";
Expand All @@ -13,6 +14,7 @@ type MessageKeys = keyof typeof def.def;

const messages = {
...def,
...de,
...es,
...fr,
...he,
Expand Down
6,641 changes: 6,021 additions & 620 deletions src/common/messages/combinedMessages.prod.ts

Large diffs are not rendered by default.

1,119 changes: 1,069 additions & 50 deletions src/common/messagesJson/de.json

Large diffs are not rendered by default.

477 changes: 359 additions & 118 deletions src/common/messagesJson/en.json

Large diffs are not rendered by default.

672 changes: 658 additions & 14 deletions src/common/messagesJson/es.json

Large diffs are not rendered by default.

532 changes: 515 additions & 17 deletions src/common/messagesJson/ja.json

Large diffs are not rendered by default.

576 changes: 556 additions & 20 deletions src/common/messagesJson/ko.json

Large diffs are not rendered by default.

673 changes: 574 additions & 99 deletions src/common/messagesJson/ru.json

Large diffs are not rendered by default.

1,142 changes: 1,046 additions & 96 deletions src/common/messagesJson/zh-tw.json

Large diffs are not rendered by default.

646 changes: 446 additions & 200 deletions src/common/messagesJson/zh.json

Large diffs are not rendered by default.

2,500 changes: 2,310 additions & 190 deletions src/common/messagesYAML/de.yaml

Large diffs are not rendered by default.

1,054 changes: 761 additions & 293 deletions src/common/messagesYAML/en.yaml

Large diffs are not rendered by default.

1,655 changes: 1,507 additions & 148 deletions src/common/messagesYAML/es.yaml

Large diffs are not rendered by default.

864 changes: 712 additions & 152 deletions src/common/messagesYAML/ja.yaml

Large diffs are not rendered by default.

982 changes: 829 additions & 153 deletions src/common/messagesYAML/ko.yaml

Large diffs are not rendered by default.

1,662 changes: 1,382 additions & 280 deletions src/common/messagesYAML/ru.yaml

Large diffs are not rendered by default.

1,872 changes: 1,615 additions & 257 deletions src/common/messagesYAML/zh-tw.yaml

Large diffs are not rendered by default.

1,204 changes: 690 additions & 514 deletions src/common/messagesYAML/zh.yaml

Large diffs are not rendered by default.