112 lines
2.8 KiB
TypeScript
112 lines
2.8 KiB
TypeScript
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { createIntl } from '@formatjs/intl';
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
|
|
// Note: if this warning appears and build fails:
|
|
//
|
|
// "warning 6040: LangString "MUI_TEXT_INSTALLING_TITLE" is not set in language..."
|
|
//
|
|
// Make sure to sync up the values in `util/nsis` with upstream
|
|
// `app-builder-lib`.
|
|
import { REQUIRED_LANGUAGES, LCID } from '../util/nsis';
|
|
|
|
const STRING_VARS = new Map([
|
|
[
|
|
'signalMinWinVersionErr',
|
|
{
|
|
id: 'icu:UnsupportedOSErrorToast',
|
|
replacements: {
|
|
OS: 'Windows',
|
|
},
|
|
},
|
|
],
|
|
[
|
|
'signalMinAppVersionErr',
|
|
{
|
|
id: 'icu:NSIS__semver-downgrade',
|
|
replacements: {},
|
|
},
|
|
],
|
|
]);
|
|
|
|
console.log('Generating updates NSIS script');
|
|
console.log();
|
|
|
|
const USED = new Set<number>();
|
|
|
|
const ROOT_DIR = path.join(__dirname, '..', '..');
|
|
const LOCALES_DIR = path.join(ROOT_DIR, '_locales');
|
|
|
|
const fallbackMessages = JSON.parse(
|
|
fs.readFileSync(path.join(LOCALES_DIR, 'en', 'messages.json')).toString()
|
|
);
|
|
|
|
const nsisStrings = new Array<string>();
|
|
for (const lang of REQUIRED_LANGUAGES) {
|
|
const langId = LCID[lang] ?? LCID.en_US;
|
|
if (USED.has(langId)) {
|
|
continue;
|
|
}
|
|
USED.add(langId);
|
|
|
|
// We use "-" in folder names
|
|
const folder = lang.replace(/_/g, '-');
|
|
const fallbacks = [folder, folder.replace(/-.*/g, ''), 'en'];
|
|
if (lang === 'zh_TW') {
|
|
fallbacks.unshift('zh-Hant');
|
|
}
|
|
let json: Buffer | undefined;
|
|
for (const f of fallbacks) {
|
|
try {
|
|
json = fs.readFileSync(path.join(LOCALES_DIR, f, 'messages.json'));
|
|
if (f !== folder) {
|
|
console.error(`Fallback from ${folder} to ${f}`);
|
|
}
|
|
break;
|
|
} catch {
|
|
// no-op
|
|
}
|
|
}
|
|
if (!json) {
|
|
throw new Error(`No messages for ${folder}`);
|
|
}
|
|
|
|
const messages = JSON.parse(json.toString());
|
|
|
|
nsisStrings.push(`# ${lang}`);
|
|
for (const [varName, { id, replacements }] of STRING_VARS) {
|
|
let message = messages[id];
|
|
if (!message) {
|
|
console.error(`No string for ${id} in ${folder}, using english version`);
|
|
message = fallbackMessages[id];
|
|
}
|
|
|
|
const intl = createIntl({
|
|
locale: folder,
|
|
messages: {
|
|
message: message.messageformat,
|
|
},
|
|
});
|
|
|
|
const text = intl.formatMessage({ id: 'message' }, replacements);
|
|
nsisStrings.push(`LangString ${varName} ${langId} ${JSON.stringify(text)}`);
|
|
}
|
|
}
|
|
|
|
// See: https://www.electron.build/configuration/nsis.html#custom-nsis-script
|
|
// for description of what `build/installer.nsh` does.
|
|
fs.writeFileSync(
|
|
path.join(ROOT_DIR, 'build', 'SignalStrings.nsh'),
|
|
[
|
|
'# Copyright 2023 Signal Messenger, LLC',
|
|
'# SPDX-License-Identifier: AGPL-3.0-only',
|
|
'#',
|
|
'# DO NOT EDIT. This is a generated file.',
|
|
'',
|
|
...nsisStrings,
|
|
'',
|
|
].join('\n')
|
|
);
|