Babelbox allows you to write your language files in .csv files and then generate Minecraft language.json files from them.
Creating translations in CSV gives you an easy overview over any errors or missing translations.
$ pip install babelboxReads translations from all sources and then generates minecraft language files for all language codes
$ # Single .csv file source
$ babelbox <file.csv>
$ # Directory containing .csv files as source
$ babelbox <directory>
$ # Multiple sources require output directory
$ babelbox <file1.csv> <directory> <file2.csv> -o <output_dir>All options:
$ babelbox SOURCES...
-o, --out The output directory of the generated files
-p, --prefix-identifiers Prefix identifiers with their path relative
to their SOURCES entry
--dialect [excel|excel-tab|unix]
CSV dialect used to parse CSV. Dialect will
be automatically detected of omitted
-d, --delimiter CSV delimiter overwrite
--quotechar CSV quote char overwrite
-m, --minify Minify generated files
-i, --indent Indentation used when generating files
--dry Dry run. Don not generate any files
-v, --verbose Increase verbosity
-q, --quiet Only output errorsWe have one .csv file containing translations:
resourcepack
⠇
└╴lang
└╴ items.csv
| Item | en_us | de_de |
|---|---|---|
| item.stick.name | stick | Stock |
| # You can create comments like this | ||
| item.snowball.name | snowball | Schneeball |
Passing items.csv as a source to babelbox generates the language files en_us.json and de_de.json:
$ babelbox resourcepack/.../lang/items.csven_us.json
{
"item.stick.name": "stick",
"item.snowball.name": "snowball",
}
de_de.json
{
"item.stick.name": "Stock",
"item.snowball.name": "Schneeball",
}resourcepack
⠇
└╴lang
├╴ items.csv
├╴ en_us.json
└╴ de_de.json
We have two .csv files containing translations:
resourcepack
⠇
└╴lang
├╴ items.csv
└╴ blocks.csv
items.csv
| Item | en_us | de_de |
|---|---|---|
| item.stick.name | stick | Stock |
blocks.csv
| Block | en_us | de_de |
|---|---|---|
| block.log.name | log | Holzstamm |
Passing the lang directory as a source to babelbox generates the language files en_us.json and de_de.json:
$ babelbox resourcepack/.../langen_us.json
{
"item.stick.name": "stick",
"block.log.name": "log",
}
de_de.json
{
"item.stick.name": "Stock",
"block.log.name": "Holzstamm",
}resourcepack
⠇
└╴lang
├╴ items.csv
├╴ blocks.csv
├╴ en_us.json
└╴ de_de.json
We can use the --prefix-identifiers flag to save ourselve some typing. If all identifiers share a common prefix, we can name the file to that prefix and let Babelbox prepend it.
resourcepack
⠇
└╴lang
└╴ item.swords.csv
| Swords | en_us | de_de |
|---|---|---|
| diamond.name | Diamond Sword | Diamantschwert |
| gold.name | Gold sword | Goldschwert |
$ babelbox resourcepack/.../lang --prefix-identifiers
$ # Or abbreviated
$ babelbox resourcepack/.../lang -pen_us.json
{
"item.swords.diamond.name": "Diamond Sword",
"item.swords.gold.name": "Gold sword",
}
de_de.json
{
"item.swords.diamond.name": "Diamantschwert",
"item.swords.gold.name": "Goldschwert",
}All identifiers have been prefixed with item.swords.
We can save ourselves even more typing and organize our translations files in a directory structure:
resourcepack
⠇
└╴lang
├╴ item
│ └╴ swords.csv
└╴ block
└╴ heavy.csv
swords.csv
| Swords | en_us | de_de |
|---|---|---|
| gold.name | Gold sword | Goldschwert |
heavy.csv
| Heavy Blocks | en_us | de_de |
|---|---|---|
| lead.name | Lead Block | Bleiblock |
$ babelbox resourcepack/.../lang -pen_us.json
{
"item.swords.gold.name": "Gold sword",
"block.heavy.lead.name": "Lead Block",
}
de_de.json
{
"item.swords.gold.name": "Goldschwert",
"block.heavy.lead.name": "Bleiblock",
}resourcepack
⠇
└╴lang
├╴ item
│ └╴ swords.csv
├╴ block
│ └╴ heavy.csv
├╴ en_us.json
└╴ de_de.json
Babelbox can be used as a beet plugin.
Here is a example beet project using babelbox:
beet.json
resourcepack
⠇
└╴lang
└╴item.swords.csv
swords.csv
| Swords | en_us | de_de |
|---|---|---|
| gold.name | Gold sword | Goldschwert |
beet.json
{
"output": "build",
"resource_pack": {
"load": ["resourcepack"]
},
"pipeline": [
"babelbox.integration.beet"
],
"meta": {
"babelbox": {
"load": ["resourcepack/assets/minecraft/lang"],
"prefix_identifiers": true
}
}
}Running beet build generates the language files:
beet.json
resourcepack
⠇
└╴lang
└╴item.swords.csv
build
⠇
└╴lang
├╴en_us.json
└╴de_de.json
Contributions are welcome. Make sure to first open an issue discussing the problem or the new feature before creating a pull request. The project uses poetry. Setup dev environment with invoke:
$ invoke installRun tests:
$ invoke testThe project follows black codestyle. Import statements are sorted with isort. Code formatting and type checking is enforced using pre-commit