diff --git a/ts/scripts/after-pack.ts b/ts/scripts/after-pack.ts index aeede9979908..ac5221872283 100644 --- a/ts/scripts/after-pack.ts +++ b/ts/scripts/after-pack.ts @@ -1,11 +1,13 @@ -// Copyright 2021 Signal Messenger, LLC +// Copyright 2021-2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { AfterPackContext } from 'electron-builder'; import { afterPack as fuseElectron } from './fuse-electron'; import { afterPack as mergeASARs } from './merge-macos-asars'; +import { afterPack as copyPacks } from './copy-language-packs'; export async function afterPack(context: AfterPackContext): Promise { await mergeASARs(context); await fuseElectron(context); + await copyPacks(context); } diff --git a/ts/scripts/copy-language-packs.ts b/ts/scripts/copy-language-packs.ts new file mode 100644 index 000000000000..741f089582b0 --- /dev/null +++ b/ts/scripts/copy-language-packs.ts @@ -0,0 +1,74 @@ +// Copyright 2022 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import fse from 'fs-extra'; +import path from 'path'; +import type { AfterPackContext } from 'electron-builder'; + +export async function afterPack({ + appOutDir, + packager, + electronPlatformName, +}: AfterPackContext): Promise { + let defaultLocale: string; + let ourLocales = await fse.readdir( + path.join(__dirname, '..', '..', '_locales') + ); + + let localesPath: string; + if (electronPlatformName === 'darwin') { + const { productFilename } = packager.appInfo; + + // en.lproj/locale.pak + // zh_CN.lproj/locale.pak + defaultLocale = 'en.lproj'; + ourLocales = ourLocales.map(locale => `${locale}.lproj`); + + localesPath = path.join( + appOutDir, + `${productFilename}.app`, + 'Contents', + 'Frameworks', + 'Electron Framework.framework', + 'Resources' + ); + } else if ( + electronPlatformName === 'linux' || + electronPlatformName === 'win32' + ) { + // Shared between windows and linux + defaultLocale = 'en-US.pak'; + ourLocales = ourLocales.map(locale => { + if (locale === 'en') { + return defaultLocale; + } + + return `${locale.replace(/_/g, '-')}.pak`; + }); + + localesPath = path.join(appOutDir, 'locales'); + } else { + console.error( + `Unsupported platform: ${electronPlatformName}, not copying pak files` + ); + return; + } + + const electronLocales = new Set(await fse.readdir(localesPath)); + const promises = new Array>(); + for (const locale of ourLocales) { + if (electronLocales.has(locale)) { + continue; + } + + console.log(`Copying ${defaultLocale} to ${locale}`); + promises.push( + fse.copy( + path.join(localesPath, defaultLocale), + path.join(localesPath, locale) + ) + ); + } + + await Promise.all(promises); +}