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 babelbox
Reads 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 errors
We 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.csv
en_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/.../lang
en_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 -p
en_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 -p
en_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 install
Run tests:
$ invoke test
The project follows black
codestyle. Import statements are sorted with isort
. Code formatting and type checking is enforced using pre-commit