====== Name translations ======
Notice how your item has a weird display name, such as //item.tutorial.my_item//? This is because your item's name doesn't have a translation in your game's selected language. Translations are used to support multiple different languages for a single string.
===== Creating a lang file =====
You can use lang files to provide translations for translatable strings in-game. You'll need to create a file with an appropriate file name for your language-- to find your languages' code, visit [[https://minecraft.wiki/w/Language#Languages|Minecraft Wiki]]. English is en_us. Once you have your language code, create a JSON file at __resources/assets/modid/lang/__; a full example for an English translation file would be __resources/assets/tutorial/lang/en_us.json__.
===== Adding a translation =====
After you've created the lang file, you can use this basic template to add translations:
{
"item.tutorial.my_item": "My Item",
"item.tutorial.my_awesome.item": "My Awesome Item",
[...]
}
where the first string is any translatable string (such as an item name, or ''''). If you're following along in the wiki tutorial, remember to change modid to `tutorial`, or whatever modid you've chosen.
===== Using custom translatable text =====
Whenever a function accepts '''', you have the option of giving it a ''new ()'' or ''Text.literal()'' (for versions since 1.19),
which means minecraft will use the string in the constructor argument as-is. However, this is not advisable because
that would make it difficult to translate that text to another language, should you wish to do that. This is why
whenever a '''' object is needed, you should give it a ''new ()'' or ''Text.translatable'' with a translation key,
and then translate the key in the lang file.
For example, when adding a tooltip, do:
@Override
public void method_9568(class_1799 itemStack, class_1937 world, List tooltip, class_1836 tooltipContext) {
// 1.18.2 and before
tooltip.add(new class_2588("item.tutorial.fabric_item.tooltip"));
// 1.19 and later
tooltip.add(Text.translatable("item.tutorial.fabric_item.tooltip"));
}
And then add in the lang file:
{
"item.tutorial.fabric_item.tooltip": "My Tooltip"
}
And the tooltip will be displayed as "My Tooltip"!
==== Adding dynamic values to translatable text ====
Say you want the text to change based on some variable, like the current day and month.
For a dynamic number, we put a %d where you want the number to show in the lang entry value, for example:
{
"item.tutorial.fabric_item.tooltip": "My Tooltip in day %d, and month %d"
}
Then we pass the variables we use in our string by the order it appears in the text. First the day, then the month:
int currentDay = 4;
int currentMonth = 7;
// 1.18.2 and before:
tooltip.add(new class_2588("item.tutorial.fabric_item.tooltip", currentDay, currentMonth));
// 1.19 and later:
tooltip.add(Text.translatable("item.tutorial.fabric_item.tooltip", currentDay, currentMonth));
And the tooltip will be displayed as "My Tooltip in day 4, and month 7".
In order to pass a string, we use ''%s'' instead of ''%d''. If you want for it to literally show ''%'', use ''%%''.
For more information, see [[https://dzone.com/articles/java-string-format-examples|Java String.format]] (it works the same way).
==== Adding a new line ====
Making ''\n'' work was far too difficult for Mojang, so in order to have a string with multiple lines you must split the translation key into multiple keys:
{
"item.tutorial.fabric_item.tooltip_1": "Line 1 of my tooltip",
"item.tutorial.fabric_item.tooltip_2": "Line 2 of my tooltip"
}
Then add the '''' parts individually:
// 1.18.2 and below:
tooltip.add(new class_2588("item.tutorial.fabric_item.tooltip_1"));
tooltip.add(new class_2588("item.tutorial.fabric_item.tooltip_2"));
// 1.19 and later
tooltip.add(Text.translatable("item.tutorial.fabric_item.tooltip_1"));
tooltip.add(Text.translatable("item.tutorial.fabric_item.tooltip_2"));
And the tooltip will be displayed as:
Line 1 of my tooltip
Line 2 of my tooltip
====== Translation format ======
The translation key for objects you have registered is in the form
''..'' (namespace and path as defined by the registered '''').
^ Object Type ^ Format ^ Example ^
| | ''block..'' |''"block.tutorial.example_block": "Example Block"'' |
| |''item..'' |''"item.tutorial.my_item": "My Item"'' |
| | ''itemGroup..'' | ''"itemGroup.tutorial.my_group": "My Group"''|
| | ''fluid..''||
| | ''sound_event..''||
| | ''effect..''||
| | ''enchantment..''||
| | ''entity..''||
| | ''biome..''||
| | ''stat..''||
For types not in this list, see ''''.