Skip to content

OrangeUtan/babelbox

Repository files navigation

Code style: black

Babelbox

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.

Installation

$ pip install babelbox

Usage

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

Getting started

Single file source:

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

Directory source

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

Shorten variable names:

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.

Organize translations in folders

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

Beet plugin

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

Contributing

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

About

A language localization generator for Minecraft

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages