Want to help translate FrankerFaceZ into your language? This isn't quite the right place. We manage translations using Weblate while this repository acts as a sort of back end storage and update system.
Please find us on Discord and ask about translation to get started.
Please report localization issues on our Discord. Our community translators are all there and can be reached about fixing any issues that way.
This repository contains all localizable strings for the FrankerFaceZ project, as well as all translations. This repository is intended for use with Weblate.
All updates to this repository are synced with Weblate, and when translations are approved on Weblate, they're sent back here to this repository. When that happens, CI actions are used to deploy the updated strings to our CDN.
Source strings are extracted automatically. A push to the
FrankerFaceZ,
Add-Ons or
Link-Service repository
dispatches the Extract Strings workflow in this repository, which:
- checks out the source repository and runs
scripts/extract.js, a static extractor that understandst()/tList()calls,<t-list>, the settings tree, and the other metadata patterns FFZ uses; - runs
scripts/merge.mjsto add new keys tostrings.jsonand the matchingstrings/<component>/en-US.po, update changed English phrases, and move keys (with their translations) between components when needed; - commits to
main, triggersBuild and Deploy, and posts a summary to Discord viascripts/notify-discord.mjs.
Keys the extractor no longer finds are never deleted automatically. They are listed as orphaned in the workflow log, the job summary, and the Discord message so they can be reviewed and removed by hand.
Components map to the chunks the client loads: client and settings for
core, embed for the link service's rich-content tokens, and addon.<id> for
each add-on, where <id> is the add-on's source directory name.
To run it locally:
pnpm install
node scripts/extract.js --root ../FrankerFaceZ --out extract
node scripts/merge.mjs extract/meta.json --report extract/report.json --dry-run