Difference between revisions of "Internationalization"

From Forge Community Wiki
m (SciWhiz12 moved page Internalization to Internationalization without leaving a redirect: rename to correct name)
(Update again)
 
(5 intermediate revisions by 4 users not shown)
Line 5: Line 5:
 
Localization will happen in the game’s locale. In a Minecraft client the locale is specified by the language settings. On a dedicated server, the only supported locale is <code>en_us</code>. A list of available locales can be found on the [https://minecraft.gamepedia.com/Language#Available_languages Minecraft Wiki].
 
Localization will happen in the game’s locale. In a Minecraft client the locale is specified by the language settings. On a dedicated server, the only supported locale is <code>en_us</code>. A list of available locales can be found on the [https://minecraft.gamepedia.com/Language#Available_languages Minecraft Wiki].
  
{{Colored box|title=Important|content=The only purpose of a translation key is internationalization. Do not use them for logic, such as comparing if two blocks are equal. Use their [[Registration|registry names]] instead.}}
+
{{Tip/Important|The only purpose of a translation key is internationalization. Do not use them for logic, such as comparing if two blocks are equal. Use their [[Registration|registry names]] instead.}}
  
 
== Language files ==
 
== Language files ==
Line 21: Line 21:
 
== Usage with Blocks and Items ==
 
== Usage with Blocks and Items ==
  
Block, Item, and a few other Minecraft classes have built-in translation keys used to display their names. These translation keys are specified by overriding <code>getTranslationKey()</code>. Item also has <code>getTranslationKey(ItemStack)</code> which can be overridden to provide different translation keys depending on <code>ItemStack</code> NBT.
+
Block, Item, and a few other Minecraft classes have built-in translation keys used to display their names. These translation keys are specified by overriding <code>getDescriptionId()</code>. Item also has <code>getDescriptionId(ItemStack)</code> which can be overridden to provide different translation keys depending on <code>ItemStack</code> NBT.
  
By default, <code>getTranslationKey()</code> will return <code>block</code> or <code>item</code>. prepended to the registry name of the block or item, with the colon replaced by a dot. <code>BlockItem</code>s will take their corresponding Block's translation key by default. For example, an item with ID <code>examplemod:example_item</code> effectively requires the following line in a language file:
+
By default, <code>getDescriptionId()</code> will return <code>block</code> or <code>item</code>. prepended to the registry name of the block or item, with the colon replaced by a dot. <code>BlockItem</code>s will take their corresponding Block's translation key by default. For example, an item with ID <code>examplemod:example_item</code> effectively requires the following line in a language file:
  
 
<syntaxhighlight lang="json">
 
<syntaxhighlight lang="json">
Line 33: Line 33:
 
== Localization methods ==
 
== Localization methods ==
  
{{Colored box|title=Important|content=A common issue is having the server localize for clients. The server can only localize in its own locale, which does not necessarily match the locale of connected clients.
+
{{Tip/Important|A common issue is having the server localize for clients. The server can only localize in its own locale, which does not necessarily match the locale of connected clients.
 
<br/><br/>
 
<br/><br/>
To respect the language settings of clients, the server should have clients localize text in their own locale using <code>TranslationTextComponent</code> or other methods preserving the language neutral translation keys.}}
+
To respect the language settings of clients, the server should have clients localize text in their own locale using components with <code>TranslatableContents</code> or other methods preserving the language neutral translation keys.}}
  
<h3 id="I18n"><tt style="font-size: 100%">net.minecraft.client.resources.I18n</tt></h3>
+
<h3 id="I18n"><tt style="font-size: 100%">net.minecraft.client.resources.language.I18n</tt></h3>
  
{{Colored box|background-title-color=#d4101c|title=Warning|content='''This I18n class can only be found on the [[Sides#Different_Kinds_of_Sides|physical client]]!''' It is intended to be used by code that only runs on the client. Attempts to use this on a server will throw exceptions and crash.}}
+
{{Tip/Danger|'''This I18n class can only be found on the [[Sides#Different_Kinds_of_Sides|physical client]]!''' It is intended to be used by code that only runs on the client. Attempts to use this on a server will throw exceptions and crash.}}
  
<code>format(String, Object...)</code> localizes in the client’s locale with formatting. The first parameter is a translation key, and the rest are formatting arguments for <code>String.format(String, Object...)</code>.
+
<code>get(String, Object...)</code> localizes in the client’s locale with formatting. The first parameter is a translation key, and the rest are formatting arguments for <code>String.format(String, Object...)</code>.
  
=== <tt style="font-size: 100%">TranslationTextComponent</tt> ===
+
=== <tt style="font-size: 100%">TranslatableContents</tt> ===
  
<code>TranslationTextComponent</code> is an <code>ITextComponent</code> that is localized and formatted lazily. It is very useful when sending messages to players because it will be automatically localized in their own locale.
+
<code>TranslatableContents</code> is a <code>ComponentContents</code> that is localized and formatted lazily. It is very useful when sending messages to players because it will be automatically localized in their own locale.
  
The first parameter of the <code>TranslationTextComponent(String, Object...)</code> constructor is a translation key, and the rest are used for formatting. The only supported format specifiers are <code>%s</code> and <code>%1$s</code>, <code>%2$s</code>, <code>%3$s</code> etc. Formatting arguments may be other <code>ITextComponent</code>s that will be inserted into the resulting formatted text with all their attributes preserved.
+
The first parameter of the <code>TranslatableContents(String, Object...)</code> constructor is a translation key, and the rest are used for formatting. The only supported format specifiers are <code>%s</code> and <code>%1$s</code>, <code>%2$s</code>, <code>%3$s</code> etc. Formatting arguments may be other <code>Component</code>s that will be inserted into the resulting formatted text with all their attributes preserved.
 +
 
 +
A <code>MutableComponent</code> can be created using <code>Component#translatable</code> by passing in the <code>TranslatableContents</code>'s parameters. It can also be created using <code>MutableComponent#create</code> by passing in the <code>ComponentContents</code> itself.
 +
 
 +
[[Category:Common Concepts]]

Latest revision as of 19:45, 13 June 2022

Internationalization (shortened as i18n), is a way of designing code so that it requires no changes to be adapted for various languages. Localization (shortened as l10n) is the process of adapting displayed text to the user’s language.

Internationalization is implemented using translation keys. A translation key is a string that identifies a piece of displayable text in no specific language. For example, block.minecraft.dirt is the translation key referring to the name of the Dirt block. This way, displayable text may be referenced with no concern for a specific language. The code requires no changes to be adapted in a new language.

Localization will happen in the game’s locale. In a Minecraft client the locale is specified by the language settings. On a dedicated server, the only supported locale is en_us. A list of available locales can be found on the Minecraft Wiki.

Important

The only purpose of a translation key is internationalization. Do not use them for logic, such as comparing if two blocks are equal. Use their registry names instead.

Language files

Language files are located by assets/[namespace]/lang/[locale].json (e.g. the US English translation for examplemod would be assets/examplemod/lang/en_us.json). The file format is simply a json map from translation keys to values. The file must be encoded in UTF-8.

{
  "item.examplemod.example_item": "Example Item Name",
  "block.examplemod.example_block": "Example Block Name",
  "commands.examplemod.example_command.error": "Example Command Errored!"
}

Usage with Blocks and Items

Block, Item, and a few other Minecraft classes have built-in translation keys used to display their names. These translation keys are specified by overriding getDescriptionId(). Item also has getDescriptionId(ItemStack) which can be overridden to provide different translation keys depending on ItemStack NBT.

By default, getDescriptionId() will return block or item. prepended to the registry name of the block or item, with the colon replaced by a dot. BlockItems will take their corresponding Block's translation key by default. For example, an item with ID examplemod:example_item effectively requires the following line in a language file:

{
  "item.examplemod.example_item": "Example Item Name"
}

Localization methods

Important

A common issue is having the server localize for clients. The server can only localize in its own locale, which does not necessarily match the locale of connected clients.

To respect the language settings of clients, the server should have clients localize text in their own locale using components with TranslatableContents or other methods preserving the language neutral translation keys.

net.minecraft.client.resources.language.I18n

Danger

This I18n class can only be found on the physical client! It is intended to be used by code that only runs on the client. Attempts to use this on a server will throw exceptions and crash.

get(String, Object...) localizes in the client’s locale with formatting. The first parameter is a translation key, and the rest are formatting arguments for String.format(String, Object...).

TranslatableContents

TranslatableContents is a ComponentContents that is localized and formatted lazily. It is very useful when sending messages to players because it will be automatically localized in their own locale.

The first parameter of the TranslatableContents(String, Object...) constructor is a translation key, and the rest are used for formatting. The only supported format specifiers are %s and %1$s, %2$s, %3$s etc. Formatting arguments may be other Components that will be inserted into the resulting formatted text with all their attributes preserved.

A MutableComponent can be created using Component#translatable by passing in the TranslatableContents's parameters. It can also be created using MutableComponent#create by passing in the ComponentContents itself.