Stringtable.xml: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "<tt>([a-zA-Z0-9\. _"\\']+)<\/tt>" to "{{hl|$1}}")
m (→‎Config: removed hl in comment)
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{TOC|side}}
{{TOC|side}}
{{Feature | Informative | [[Stringtable.xml]] was introduced with {{arma1}}. For {{ofp}}, see [[Stringtable.csv]].}}
{{Feature|informative|[[Stringtable.xml]] was introduced with {{arma1}}. For {{ofp}}, see [[Stringtable.csv]].}}
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.
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.


Line 8: Line 8:
== Stringtable Editors ==
== Stringtable Editors ==


It is strongly recommended to use a tool to edit the XML file; a selection of Stringtable [[:Category:Community Tools|Community Tools]] can be found in the [[:Category:Community Tools#Localisation Tools|Community Tools - Localisation Tools]] page section.
It is strongly recommended to use a tool to edit the XML file;
a selection of Stringtable [[:Category:Community Tools|Community Tools]] can be found in the [[:Category:Community Tools#Localisation Tools|Community Tools - Localisation Tools]] page section.




== Example ==
== Example ==


<syntaxhighlight lang="xml"></syntaxhighlight><!-- so the syntaxhighlight works in the spoiler tag -->
<spoiler text="Show Stringtable.xml example">
<spoiler text="Show Stringtable.xml example">
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
Line 53: Line 53:
</spoiler>
</spoiler>


{{Feature | Informative | {{hl|Package}} and {{hl|Container}} "groups" are only helpful for organisation and have no impact on the translations; use them for your own sanity.}}
{{Feature|informative|{{hl|Package}} and {{hl|Container}} "groups" are only helpful for organisation and have no impact on the translations; use them for your own sanity.}}
{{Feature | important | [[Stringtable.xml]] must be saved with '''UTF-8 Encoding''' for international characters to display and save correctly.}}
{{Feature|important|[[Stringtable.xml]] must be saved with '''UTF-8 Encoding''' for international characters to display and save correctly.}}




== Supported languages ==
== Supported Languages ==


{|
{|
Line 205: Line 205:
|}
|}


== Key naming convention ==
=== Unsupported language English in stringtable ===


Same as [[Identifier#Recommendations|global variables]], it is recommended to use a '''{{Color|purple|TAG}}''' to prevent translation collision between mods (e.g <tt>STR_{{Color|purple|TAG}}_helloThere</tt>).
See [[Crash_Files#Common_Errors_and_Warnings|Common Errors and Warnings]].
 
 
== Key Naming Convention ==
 
Same as [[Identifier#Recommendations|global variables]], it is recommended to use a '''{{Color|purple|TAG}}''' to prevent translation collision between mods (e.g {{hl|STR_{{Color|purple|TAG}}_helloThere}}).




Line 214: Line 219:
Strings stored in the stringtable can be in the following formats:
Strings stored in the stringtable can be in the following formats:
* Normal text, such as {{hl|Hello there}}
* Normal text, such as {{hl|Hello there}}
* [[format]] text, such as <tt>Hello %1</tt>
* [[format]] text, such as {{hl|Hello %1}}
* [[Structured Text]], such as <tt><t size='2'>Hello</t> there</tt>, '''but''':<br><!--
* [[Structured Text]], such as {{hl|c= <t size='2'>Hello</t> there}}, '''but''':<br><!--
-->{{Feature | important | The HTML tag characters <tt>&lt;</tt> and <tt>&gt;</tt> must respectively be encoded as <tt>&amp;lt;</tt> and <tt>&amp;gt;</tt>.}}<!--
-->{{Feature | important | The HTML tag characters {{hl|&lt;}} and {{hl|&gt;}} must respectively be encoded as {{hl|&amp;lt;}} and {{hl|&amp;gt;}}.}}<!--
--><tt><t size='2'>Hello</t> there</tt> would then become <tt>&amp;lt;t size='2'&amp;gt;Hello&amp;lt;/t&amp;gt; there</tt>.
-->{{hl|c= <t size='2'>Hello</t> there}} would then become {{hl|c= &amp;lt;t size='2'&amp;gt;Hello&amp;lt;/t&amp;gt; there}}.




Line 225: Line 230:


A translation can be retrieved and used in a script by using the [[localize]] command:
A translation can be retrieved and used in a script by using the [[localize]] command:
 
<sqf>
[[hint]] [[localize]] "STR_TAG_Yes"; {{cc|returns "Yes" in English, "Oui" in French, etc.}}
hint localize "STR_TAG_Yes"; // returns "Yes" in English, "Oui" in French, etc.
[[hint]] [[format]] [<nowiki/>[[localize]] "STR_TAG_formatted", [[name]] [[player]]];
hint format [localize "STR_TAG_formatted", name player];
[[hint]] [[localize]] "str_TAG_structuredText"; {{cc|casing in scripting does not matter}}
hint localize "str_TAG_structuredText"; // casing in scripting does not matter
</sqf>


=== Config ===
=== Config ===


Whether it is in [[Description.ext]], [[Campaign Description.ext]], Dialogs etc., a translated [[Config]] entry '''must''' use the <tt>$</tt> prefix (to an '''uppercase''' {{hl|STR}}) for the engine to look the translation key up:
Whether it is in [[Description.ext]], [[Campaign Description.ext]], Dialogs etc., a translated [[Config]] entry '''must''' use the {{hl|$}} prefix (to an '''uppercase''' {{hl|STR}}) for the engine to look the translation key up:


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
onLoadName = "$STR_TAG_missionName";
onLoadName = "$STR_TAG_missionName";
onLoadMission = $STR_TAG_loadMissionText; // works without quotes too - not recommended
overviewText = "$str_TAG_overviewText"; // invalid, will display "$str_TAG_overviewText" (with the $ sign)
overviewText = "$str_TAG_overviewText"; // invalid, will return "$str_TAG_overviewImage" (with $ sign)
onLoadMission = $STR_TAG_loadMissionText; // works without quotes but this is NOT recommended
</syntaxhighlight>
</syntaxhighlight>


The preprocessor will replace <tt>$STR</tt> entries with their corresponding Stringtable value.
The preprocessor will replace {{hl|$STR}} entries with their corresponding Stringtable value.
 
==== Translated Sounds ====
The Stringtable can be used to use different voices depending on the user's language setting:
<syntaxhighlight lang="cpp">
class CfgRadio
{
class TAG_V01
{
name = "$STR_TAG_V01_name";
sound[] = { "$STR_TAG_V01_path", 1, 1 };
title = "$STR_TAG_V01_subtitle";
};
};
</syntaxhighlight>
the Stringtable's entries looking like this:
<syntaxhighlight lang="xml">
<Key ID="STR_V01_name">
<English>"Hello There" by OWK</English>
<French>"Salut à tous" par OWK</French>
</Key>
<Key ID="STR_V01_path">
<English>Sound\EN\v01.ogg</English>
<French>Sound\FR\v01.ogg</French>
</Key>
<Key ID="STR_V01_subtitle">
<English>Hello There!</English>
<French>Salut à tous !</French>
</Key>
</syntaxhighlight>
Then using it in-game:
<sqf>player sideRadio "TAG_V01";</sqf>


=== Editor ===
=== Editor ===


In markers and other [[Eden Editor]] fields (e.g Mission Name), translation keys should be prefixed with <tt>@</tt>, without any quotes around - e.g <tt>@STR_myMarkerName</tt>. Casing does not matter here either.
In markers and other [[:Category:Eden Editor|Eden Editor]] fields (e.g Mission Name), translation keys should be prefixed with {{hl|@}}, without any quotes around - e.g {{hl|@STR_myMarkerName}}. Casing does not matter here.




Line 252: Line 289:


Example of client-side translation of a server message:
Example of client-side translation of a server message:
<sqf>
// 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
};


{{cc|Server-side}}
// Client-side executed function
[[if]] ([[isServer]]) [[then]]
TAG_fnc_localHint = {
{
if (hasInterface) then
[<nowiki/>[[nil]], [[nil]], rHINT, [[localize]] "STR_TAG_myMessage"] [[call]] [[Arma 2: Multiplayer Framework|RE]]; {{cc|{{arma2}} - server language}}
{
[<nowiki/>[[nil]], [[nil]], rSPAWN, { [[hint]] [[localize]] "STR_TAG_myMessage" }] [[call]] [[Arma 2: Multiplayer Framework|RE]]; {{cc|{{arma2}} - client language}}
// hintSilent parseText (localize _this); // Arma 2
["STR_TAG_myMessage"] [[remoteExecCall]] ["TAG_fnc_localHint"]; {{cc|{{arma3}}}}
hintSilent parseText (_this call BIS_fnc_localize); // Arma 3
};
};
};
{{cc|Client-side executed function}}
</sqf>
TAG_fnc_localHint = {
[[if]] ([[hasInterface]]) [[then]]
{
{{cc|[[hintSilent]] [[parseText]] ([[localize]] [[Magic Variables#this|_this]]); // {{arma2}}}}
[[hintSilent]] [[parseText]] ([[Magic Variables#this|_this]] [[call]] [[BIS_fnc_localize]]); {{cc|{{arma3}}}}
};
};




== Commands & Functions ==
== Commands & Functions ==


* [[localize]]
See also [[:Category:Command Group: Localization|Command Group: Localization]]:
* [[isLocalized]]
 
* [[BIS_fnc_localize]] (since {{arma3}})
* {{GVI|ofp|1.00|size= 0.75}} [[localize]]
* [[getTextRaw]] (since {{arma3}} v2.01)
* {{GVI|arma3|0.50|size= 0.75}} [[isLocalized]]
* {{GVI|arma3|1.00|size= 0.75}} [[BIS_fnc_localize]]
* {{GVI|arma3|2.02|size= 0.75}} [[getTextRaw]]
* {{GVI|arma3|2.04|size= 0.75}} [[diag_localized]]





Latest revision as of 10:41, 22 September 2023

Stringtable.xml was introduced with Armed Assault. For Operation Flashpoint, see Stringtable.csv.

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></Italian>
				<Polish>tak</Polish>
				<Portuguese>sim</Portuguese>
				<Russian>да</Russian>
				<Spanish></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 &lt;t color='%1'&gt;%2&lt;/t&gt;</Original>
			</Key>
		</Container>
	</Package>
</Project>
↑ Back to spoiler's top

Package and Container "groups" are only helpful for organisation and have no impact on the translations; use them for your own sanity.
Stringtable.xml must be saved with UTF-8 Encoding for international characters to display and save correctly.


Supported Languages

Arma 2 & Arma 2: Operation Arrowhead Arma 3
className In-game name Note
English English
Czech Čeština
French Français
Spanish Español
Italian Italiano
Polish Polski
Russian Русский
German Deutsch
Hungarian Magyar Partially supported
Portuguese Portuguese Not available in-game
className In-game name Note
English English
Czech Čeština
French Français
Spanish Español
Italian Italiano
Polish Polski
Portuguese Português do Brasil
Russian Русский
German Deutsch
Korean 한국어
Japanese 日本語
Chinese 繁體中文 Chinese Traditional
Chinesesimp 简体中文 Chinese Simplified
Turkish Türkçe
Swedish N/A Cannot be set in-game.
Edit arma3.cfg to use that language.
Slovak N/A
SerboCroatian N/A
Norwegian N/A
Icelandic N/A
Hungarian Magyar
Greek N/A
Finnish N/A
Dutch N/A

Unsupported language English in stringtable

See Common Errors and Warnings.


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:
    The HTML tag characters < and > must respectively be encoded as &lt; and &gt;.
    <t size='2'>Hello</t> there would then become &lt;t size='2'&gt;Hello&lt;/t&gt; 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";
overviewText = "$str_TAG_overviewText";		// invalid, will display "$str_TAG_overviewText" (with the $ sign)
onLoadMission = $STR_TAG_loadMissionText;	// works without quotes but this is NOT recommended

The preprocessor will replace $STR entries with their corresponding Stringtable value.

Translated Sounds

The Stringtable can be used to use different voices depending on the user's language setting:

class CfgRadio
{
	class TAG_V01
	{
		name = "$STR_TAG_V01_name";
		sound[] = { "$STR_TAG_V01_path", 1, 1 };
		title = "$STR_TAG_V01_subtitle";
	};
};

the Stringtable's entries looking like this:

<Key ID="STR_V01_name">
	<English>"Hello There" by OWK</English>
	<French>"Salut à tous" par OWK</French>
</Key>
<Key ID="STR_V01_path">
	<English>Sound\EN\v01.ogg</English>
	<French>Sound\FR\v01.ogg</French>
</Key>
<Key ID="STR_V01_subtitle">
	<English>Hello There!</English>
	<French>Salut à tous !</French>
</Key>

Then using it in-game:

player sideRadio "TAG_V01";

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.


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

See also Command Group: Localization: