Community project · unofficial

Localize Eorzea

Help your community translate Final Fantasy XIV.
You translate a line, a check validates it, and the game shows it a few minutes later.

How it works

Five steps take a line from the game back into the game, translated. Two repositories, a pull request and a plugin take part. No file of the game is modified.

1 AHLDSKYF I'm the hired captain of the Orion. DefaultTalk#590415.20 TEXT IN FFXIV every line of FFXIV has an identifier 2 DefaultTalk#590415.20 en "I'm the hired captain of the Orion." flat/DefaultTalk.json CORPUS ffxiv-corpus-en enriched with other languages, speaker and glossary 3 DefaultTalk#590415.20 target "" target "Sono il capitano dell'Orion." YOUR LANGUAGE PACK ffxiv-language-pack-xx same key: you fill in target 4 VALIDATE REVIEW auto-merge → release PULL REQUEST automatic validation and human review (optional) 5 AHLDSKYF Sono il capitano dell'Orion. GUBAL LIBRARY TEXT IN FFXIV Gubal Library Every merge into main publishes a release that shows up in the game a few minutes later.
Full path

With a clone and an editor

The English is in one repository and your language in another. Both have the same files and the same lines. With both open in an editor, you translate with the French and the Japanese in view.

1

Open the two repositories

Open ffxiv-corpus-en and your language's repository in Visual Studio Code or another editor. Both have the same structure under corpus/: one file per conversation and one file per interface sheet.

Visual Studio Code
EXPLORER
▾ ffxiv-corpus-en
▾ corpus
▾ quest
▾ 041
AktKba101_04102.json
▾ ffxiv-language-pack-xx
▾ corpus
▾ quest
▾ 041
AktKba101_04102.json
ffxiv-language-pack-xx ›corpus / quest / 041 / AktKba101_04102.json
{
  "conversation": "quest/041/AktKba101_04102",
  "gameVersion": "2026.08.11.0000.0000",
  "entries": [
    { "gameKey": "quest/041/AktKba101_04102#TEXT_AKTKBA101_04102_SEQ_00", "hash": "6100EBD3346502DA", "target": "" },
    { "gameKey": "quest/041/AktKba101_04102#TEXT_AKTKBA101_04102_SEQ_01", "hash": "A91C0F3E6D2B7C10", "target": "" },
    …
  • Fork the language repository on GitHub and clone the fork. That is how you can push your branch.
  • ffxiv-corpus-en is read only. Clone it or browse it on GitHub. It is not edited.
2

Find the same file in both

The file path is the same in both repositories, and so is every gameKey. The English file has the line in English, French and Japanese. Yours has the same key, a hash and an empty target.

Visual Studio Code
ffxiv-corpus-en ›corpus / quest / 041 / AktKba101_04102.json
{
  "gameKey": "quest/041/AktKba101_04102#TEXT_AKTKBA101_04102_SEQ_02",
  "en": "The effort to find the blasphemy is being led by none other than the Elder Seedseer herself, Kan-E-Senna.",
  "macro": "The effort to find the blasphemy is being led by none other than the Elder Seedseer herself, Kan<-->E<-->Senna.",
  "fr": "Les recherches du blasphème sont menées par la Grande Prophétesse en personne, Kan-E-Senna.",
  "ja": "ブラスフェミーの捜索は、カヌ・エ・センナ様が自ら指揮を執っている。",
  "hash": "3C7D2A9E5B1F8E04"
}
ffxiv-language-pack-xx ›corpus / quest / 041 / AktKba101_04102.json
{
  "gameKey": "quest/041/AktKba101_04102#TEXT_AKTKBA101_04102_SEQ_02",
  "hash": "3C7D2A9E5B1F8E04",
  "target": ""
}
  • Split the editor: the English on one side and your file on the other.
  • When in doubt, search by gameKey. It is the value both files share.
3

Translate

Write the translation in target. Start from the English, the French or the Japanese, whichever you understand best. Text between angle brackets is a macro the game fills in when it shows the line: the player's name, a line break, a variant by gender. Copy the macros as they are.

Visual Studio Code
ffxiv-language-pack-xx ›corpus / quest / 041 / AktKba101_04102.json
{
  "gameKey": "quest/041/AktKba101_04102#TEXT_AKTKBA101_04102_SEQ_02",
  "hash": "3C7D2A9E5B1F8E04",
  "target": "La búsqueda de la blasfemia la dirige nada menos que la Gran Vidente en persona, Kan<-->E<-->Senna."
}
  • Save the file without changing its format: UTF-8 without BOM and the same indentation. An editor that understands JSON does this by itself.
  • A conversation is a file. Translate it whole so the voices stay consistent.
4

Commit, push, pull request

Create a branch in your fork. Make a commit with a message that says what you translated. Push the branch and open a pull request against the language repository. You can do this from the terminal or from the editor's git panel.

Terminal
$ git checkout -b ahldskyf
$ git commit -am "Ahldskyf, capitano dell'Orion"
$ git push -u origin ahldskyf
$ gh pr create --fill
  • Open one pull request per batch of lines, not per line. The release notes list its commits.
  • From here on, the process is the same as in the browser: the check, the merge and the release.

What is not touched

Four rules, valid on both paths. The check enforces the first three. The fourth makes the translation good.

After the pull request

Nobody intervenes. The check runs, the merge happens, the release is built, and the plugin offers it to every player at start.

ffxiv-language-pack-xx· Pull request → Release
validate checks every changed row: only target changed, the JSON is valid, the macros are in place and there are no placeholdersvalidate
If the language has a reviewer, the merge waits for their approval. If it has none, it does not waitreview
Merged into main
Release built and published. It takes two to three minutesrelease
Gubal Library offers the new version at start and shows your lineGubal Library
The Unending Codex in Spanish, showing Alphinaud's entry
The Unending CodexThe Spanish pack translates the Codex entries about characters, places and concepts.
Quest dialogue in the game's own conversation window, translated
What the player readsThe Spanish pack in the conversation window. Yours looks the same: the game draws your text with its own font, italics and colours.

The languages

One repository per language. The translated share is read from each repository when the page loads.

LanguageRepositoryTranslatedWrong line?
Español (España)ffxiv-language-pack-es-esissues
Italianoffxiv-language-pack-itissues
Português (Brasil)ffxiv-language-pack-pt-brissues
Polskiffxiv-language-pack-plissues

Another language? Ask on GitHub Discussions.