Anhand der Stringtable könnt ihr eure Missionen mehrsprachig übersetzen und so der internationalen Community eure Szenarien anbieten. Seit ArmA2 wird die Stringtable nicht mehr wie üblich als Stringtable.csv geschrieben, sondern als Stringtable.xml. Das mag den einen oder anderen etwas kompliziert erscheinen, aber nach eurer ersten Stringtable habt ihr dies allemal im Griff. Vor allem die Arbeit mit den Tags. (<Tag/>)
Als xml ist so eine Stringtable nicht nur übersichtlicher, sondern auch einfacher zu schreiben. Alle Texte die in einer Mission geschrieben wurden, werden in der Stringtable.xml als sogenannten Key hinterlegt und im Spiel mit dem Localize-Befehl abgerufen.
Das geht folgendermasen: Statt dass Du bei den Funksprüchen, Actionmenueinträgen, Texten oder oder dergleichen immer den deutschen Text eintippst, schreibst du dort einfach nur einen "SDtring-Namen" rein. ArmA2 sucht dann in der stringtable.xml nach dem entsprechendem Key und lokalisiert dann den Text in der entsprechenden Sprache, der in der xml von Dir definiert wurde.
Lass uns eine Stringtable.xml schreiben: Du nimmst den normalen Texteditor und erstellst eine Datei und speicherst sie als stringtable.xml. Als allererste Zeilen in einer xml schreiben wir folgendes rein. Wie ihr seht wird hier schon einmal die Enkodierung zu UTF-8 ausgesprochen. Somit habt ihr dieses nervige Umlaute-Problem nicht mehr.
Die Angaben "Project name", "Package name" und "Container name" haben her keine wichtige Rolle und dienen eher der Vollständigkeit. Unser Augenmerk gilt der sogenannten "Key ID" und den Tags, welche für die jeweilige Sprachzuordnung verantwortlich sind. Über den "Key ID" wird unsere entsprechende Textzeile lokalisiert und in den <German> bzw. <English> Tags stehen die entsprechenden Übersetzungen eurer Missions-Texte.
Wir schreiben immer English als erste Sprache, so wird ArmA2 den englischen Text ausgeben, wenn ein Spieler der deine Mission spielt, zum Beispiel eine spanische Version von ArmA2 hat. Da englisch nunmal eine globale Sprache ist, versteht ein Spanier oder Franzose eher englisch als deutsch. Du kannst es natürlich noch um Spanish, French, Polish usw. erweitern.
In den folgenden Zeilen schreiben wir nun die nötigen Stringnamen für jeden zu übersetzenden Text rein. Alle Stringnamen werden später in xml als KEY-ID ausgegeben. Gewöhnt euch daher eine klare Struktur im Umgang mit Stringnamen an, so behaltet ihr den Überblick und könnt so leichter eine Stringtable für eure nächste Mission übernehmen. Hier mal Beispiele für Stringnamen wie ich sie zum Beispiel nutze. Ihr könnt natürlich beliebige Namen oder Buchstaben eingeben, so wie ihr am besten zurecht kommt.
STR_DIA: Diary Einträge (Notizen im Briefing) STR_TSK: Task Einträge (Objectives im Briefing) STR_HINT: Hint-Texte STR_CUT: Cut-Texte STR_RADIO: Funktexte STR_WPX: Texte oder Namen in Wegpunkten STR_TRX: Texte oder Namen in Auslösern STR_MARK: Texte oder Namen in Markern STR_OVER: Text im Overview STR_DEBR: Text im Debriefing
Und dann folgt die Übersetzung des Textes in die unterstützten Sprachen. Sehen wir uns einen Auszug einer stringtable.xml etwas genauer an.
<Key ID="str_cut_01"> <English>Horatio, glad to find you. I thought you where dead!</English> <German>Horatio, bin ich froh dich gefunden zu haben. Dachte du wärst tot!</German>
<Key ID="str_hint_03"> <English>Horatio is dead!</English> <German>Horatio ist tot!</German> </Key>
Somit tragt ihr alles an Texten aus eurer Mission ein und übersetzt sie entsprechend. Achtet darauf, dass ihr bei jedem Tag auch ein Endtag setzt. (< Dein Text />) Denn sonst wird der entsprechende Text nicht übersetzt. Besser gesagt, er wird nicht im Spiel angezeigt.
Wie ihr jetzt einen Text in einem Script, Wegpunkt, Auslöser oder Marker in Zusammenarbeit mit der xml aufruft, zeige ich euch nun an diesen Beispielen.
Einen Cuttext aufrufen:
Statt...
CutText ["Alle Panzer wurden zerstört","Plain Down"];
Jetzt...
CutText [localize "STR_CUT_05","Plain Down"];
Hier wird ArmA2 in der xml den Key Eintrag STR_CUT_05 suchen und lokalisieren, dann den Text entsprechend übersetzen und ausgeben. Ganz einfach. ;-)
Hinweis: Die Zahlen z.B bei STR_CUT_07 bezieht sich auf einen Durchnummerierung der Cuttexte in der xml. In diesem Beispiel also der 7te.
Einen Hint-Text aufrufen:
Statt...
hint "Sie haben das erste Ziel erreicht";
Jetzt...
hintLocalize "STR_HINT_07";
Einen Funktext aufrufen:
Statt...
Player sidechat"Bitten um Unterstützung. Wir werden beschossen";
Jetzt...
Player sidechatLocalize "STR_RADIO_03";
oder...
Player groupchatLocalize "STR_RADIO_02";
oder...
[west,"HQ"] sidechatLocalize "STR_RADIO_04";
Einen Text im Auslöser, Wegpunkt oder Marker aufrufen:
In diesem Beispiel gebt ihr also in einem Auslöser statt dem Text einfach den Aufruf zum entsprechendem Key in der XML. Hier also der STR_TRX_03, der mit @STR_TRX_03 aufgerufen wird.
Statt...
Die Fahrzeuge nähern sich eurer Position!;
Jetzt...
@STR_TRX_03
oder...
@STR_WPX_02
oder...
@STR_MARK_01
Einen onLoadMission Text aufrufen:
In der Description.ext eurer Mission könnt ihr einen sogenannten onLoadMission Text angeben, welcher beim Laden der Mission im Spiel eingeblendet wird. Oder einen onLoadIntro Text, welcher beim Laden des Missionsintros eingeblendet wird. (Einleitung)
Hier ein Beispiel einer Mission aus meiner Mission.
Statt...
onLoadMission = D E I N T E X T;
jetzt...
onLoadMission = @STR_M01_onLoad;
in der XML dann...
<Key ID="STR_M01_onLoad"> <German>Search At War</German> <English>Search At War</English> </Key>
Einen Actionmenü Eintrag aufrufen:
Statt...
player addAction ["Rucksack öffnen","scriptname.sqs"];
jetzt...
player addAction [Localize "STR_PARA_01","scriptname.sqs"];
Einen Diary-und Task Eintrag im Briefing:
Statt...
_diary1 = player createDiaryRecord ["Diary", ["Versorgung", "Wir können euch während des Einsatzes auch aus der Luft versorgen. Funkt einfach Team Hotel an, ein Versorgungs-Heli wird euch Waffen, Munition und einen UAZ an der von euch vorgegebenen Koordinate abwerfen."]];
jetzt...
_diary1 = player createDiaryRecord ["Diary", [ localize "STR_DIA_01", localize "STR_DIA_01"]];
Statt...
task3 = player createSimpleTask ["Hauptziel: Tristian töten"];
task3 setSimpleTaskDescription ["Wir wissen dass sich Tristian irgendwo in der Ortschaft <marker name=""Stadt"">Myshkino</marker> oder in dem versteckten <marker name=""Lager"">Nachschublager</marker> aufhält. Finden und töten sie ihn!","Hauptziel: Tristian töten","Hauptziel: Tristian töten"];
jetzt...
task3 = player createSimpleTask [Localize "STR_TSK_03"];