feat(desktop): add i18n infrastructure with react-intl (#8105)
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Cross-platform i18n check script.
|
||||
* Extracts messages to a temp file and compares against the committed file
|
||||
* to ensure src/i18n/messages/en.json is up to date.
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const os = require('os');
|
||||
const path = require('path');
|
||||
const { execFileSync } = require('child_process');
|
||||
|
||||
const projectDir = path.join(__dirname, '..');
|
||||
const formatjs = require.resolve('@formatjs/cli/bin/formatjs');
|
||||
const enFile = path.join(projectDir, 'src', 'i18n', 'messages', 'en.json');
|
||||
const tmpFile = path.join(os.tmpdir(), 'en.i18n-check.json');
|
||||
|
||||
execFileSync(
|
||||
process.execPath,
|
||||
[formatjs, 'extract', 'src/**/*.{ts,tsx}', '--out-file', tmpFile, '--flatten'],
|
||||
{ stdio: 'inherit', cwd: projectDir }
|
||||
);
|
||||
|
||||
const committed = fs.readFileSync(enFile, 'utf8');
|
||||
const extracted = fs.readFileSync(tmpFile, 'utf8');
|
||||
|
||||
try {
|
||||
fs.unlinkSync(tmpFile);
|
||||
} catch (_) {
|
||||
// ignore cleanup errors
|
||||
}
|
||||
|
||||
if (JSON.stringify(JSON.parse(committed)) !== JSON.stringify(JSON.parse(extracted))) {
|
||||
console.error(
|
||||
'Error: src/i18n/messages/en.json is out of date. Run pnpm i18n:extract to update it.'
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Cross-platform i18n compile script.
|
||||
* Compiles all JSON message files in src/i18n/messages/ using formatjs.
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { execFileSync } = require('child_process');
|
||||
|
||||
const projectDir = path.join(__dirname, '..');
|
||||
const formatjs = require.resolve('@formatjs/cli/bin/formatjs');
|
||||
const messagesDir = path.join(projectDir, 'src', 'i18n', 'messages');
|
||||
const compiledDir = path.join(projectDir, 'src', 'i18n', 'compiled');
|
||||
|
||||
fs.mkdirSync(compiledDir, { recursive: true });
|
||||
|
||||
const files = fs.readdirSync(messagesDir).filter((f) => f.endsWith('.json'));
|
||||
|
||||
for (const file of files) {
|
||||
const locale = path.basename(file, '.json');
|
||||
const inFile = path.join(messagesDir, file);
|
||||
const outFile = path.join(compiledDir, `${locale}.json`);
|
||||
execFileSync(process.execPath, [formatjs, 'compile', inFile, '--out-file', outFile], {
|
||||
stdio: 'inherit',
|
||||
cwd: projectDir,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user