Stringtable.xml: Difference between revisions
Lou Montana (talk | contribs) m (Text replacement - "<tt>([^= ]+)<\/tt>" to "{{hl|$1}}") |
Lou Montana (talk | contribs) m (Text replacement - "<tt>([^ ]*=[^ ]*)<\/tt>" to "{{hl|c= $1}}") |
||
Line 215: | Line 215: | ||
* Normal text, such as {{hl|Hello there}} | * Normal text, such as {{hl|Hello there}} | ||
* [[format]] text, such as {{hl|Hello %1}} | * [[format]] text, such as {{hl|Hello %1}} | ||
* [[Structured Text]], such as | * [[Structured Text]], such as {{hl|c= <t size='2'>Hello</t> there}}, '''but''':<br><!-- | ||
-->{{Feature | important | The HTML tag characters {{hl|<}} and {{hl|>}} must respectively be encoded as {{hl|&lt;}} and {{hl|&gt;}}.}}<!-- | -->{{Feature | important | The HTML tag characters {{hl|<}} and {{hl|>}} must respectively be encoded as {{hl|&lt;}} and {{hl|&gt;}}.}}<!-- | ||
--> | -->{{hl|c= <t size='2'>Hello</t> there}} would then become {{hl|c= &lt;t size='2'&gt;Hello&lt;/t&gt; there}}. | ||
Revision as of 00:23, 16 November 2021
String tables are used to make internationalization easier for the game. They are used in addons, missions, and scripts, and are located in the root of the mission or addon folders.
Any strings that are used in the game can be kept separate from the code, and can therefore easily be edited and expanded into different languages. Instead of using strings directly in the code, you are using a variable. This variable will then contain the actual string, read from stringtable.xml, with the language that is being read depending on the game settings.
Stringtable Editors
It is strongly recommended to use a tool to edit the XML file; a selection of Stringtable Community Tools can be found in the Community Tools - Localisation Tools page section.
Example
<?xml version="1.0" encoding="utf-8" ?>
<Project name="Any Name">
<Package name="Mission One">
<Container name="Some Words">
<Key ID="STR_TAG_Yes">
<Original>yes</Original>
<English>yes</English>
<Czech>ano</Czech>
<French>oui</French>
<German>ja</German>
<Italian>sì</Italian>
<Polish>tak</Polish>
<Portuguese>sim</Portuguese>
<Russian>да</Russian>
<Spanish>sí</Spanish>
<Korean>네</Korean>
<Japanese>はい</Japanese>
<Chinesesimp>是</Chinesesimp>
<Chinese>是(繁體)</Chinese>
</Key>
<Key ID="STR_TAG_No">
<Original>no</Original>
</Key>
</Container>
<Container name="Another Container">
<Key ID="STR_TAG_formatted">
<Original>Hello, %1.</Original>
</Key>
<Key ID="STR_TAG_structuredText">
<Original>Some text <t color='%1'>%2</t></Original>
</Key>
</Container>
</Package>
</Project>
Supported languages
Arma 2 & Arma 2: Operation Arrowhead | Arma 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Key naming convention
Same as global variables, it is recommended to use a TAG to prevent translation collision between mods (e.g STR_TAG_helloThere).
String Formats
Strings stored in the stringtable can be in the following formats:
- Normal text, such as Hello there
- format text, such as Hello %1
- Structured Text, such as <t size='2'>Hello</t> there, but:
<t size='2'>Hello</t> there would then become <t size='2'>Hello</t> there.
Usage
Script
A translation can be retrieved and used in a script by using the localize command:
hint localize "STR_TAG_Yes"; // returns "Yes" in English, "Oui" in French, etc. hint format [localize "STR_TAG_formatted", name player]; hint localize "str_TAG_structuredText"; // casing in scripting does not matter
Config
Whether it is in Description.ext, Campaign Description.ext, Dialogs etc., a translated Config entry must use the $ prefix (to an uppercase STR) for the engine to look the translation key up:
onLoadName = "$STR_TAG_missionName";
onLoadMission = $STR_TAG_loadMissionText; // works without quotes too - not recommended
overviewText = "$str_TAG_overviewText"; // invalid, will return "$str_TAG_overviewImage" (with $ sign)
The preprocessor will replace $STR entries with their corresponding Stringtable value.
Editor
In markers and other Eden Editor fields (e.g Mission Name), translation keys should be prefixed with @, without any quotes around - e.g @STR_myMarkerName. Casing does not matter here either.
Multiplayer
Multiplayer Scripting should consider that the translation implementation should ideally happen client-side; clients and server are likely to be configured in a different language, as a server-side call to global effect text commands (such as setMarkerText) would set the text in the server's language to everyone.
Example of client-side translation of a server message:
// Server-side if (isServer) then { [nil, nil, rHINT, localize "STR_TAG_myMessage"] call RE; // Arma 2 - server language [nil, nil, rSPAWN, { hint localize "STR_TAG_myMessage" }] call RE; // Arma 2 - client language ["STR_TAG_myMessage"] remoteExecCall ["TAG_fnc_localHint"]; // Arma 3 }; // Client-side executed function TAG_fnc_localHint = { if (hasInterface) then { // hintSilent parseText (localize _this); // Arma 2 hintSilent parseText (_this call BIS_fnc_localize); // Arma 3 }; };
Commands & Functions
- localize
- isLocalized
- BIS_fnc_localize (since Arma 3)
- getTextRaw (since Arma 3 v2.01)