Charakterbogen i18n, oder Internationalisierung, ermöglicht es Ihnen, IhrenCharakterbogenso zu gestalten, dass unsere Gemeinschaft von Übersetzern Ihren Bogen in ihre Sprache übersetzen kann und diese Sprache für jeden in Roll20 verfügbar ist. Wenn dein Charakterbogen in eine andere Sprache übersetzt wurde, sagen wir Französisch, und jemand, der deinen Charakterbogen verwendet, hat seine Kontosprache auf Französisch gesetzt, wird dein Charakterbogen mit den übersetzten Texten für diesen Benutzer angezeigt.
Entwurf deines Charakterbogens
Das Einrichten IhresBlatts, um den i18n-Dienst nutzen zu können, ist sehr einfach und dauert nur etwas Zeit, insbesondere wenn Sie mit einem großen vorgefertigten Blatt arbeiten. Es gibt 2 Schritte, die du unternehmen musst, um deinen Charakterbogen übersetzen zu können. Schritt eins, markiere die Elemente, die den übersetzten Text enthalten sollen. Schritt zwei, erstelle eine Übersetzungsdatei, die alle zu übersetzenden Zeichenketten enthält. Diese Datei wird unserem Übersetzungsdienst Crowdin zugeführt, wo unsere Freiwilligen Zeichenkette für Zeichenkette übersetzen können. Dadurch wird die gleiche Übersetzungsdatei in allen anderen Sprachen generiert, die wir dann entsprechend verwenden werden, wenn jemand diese Sprache auf Roll20 ausgewählt hat.
Da es schwierig sein kann, ein einziges Design zu erstellen, das zu mehreren Größen von übersetztem Text passt, haben wir der Elternklasse "charsheet" einen Klassenattribut hinzugefügt, mit dem du eine separate CSS für einzelne Sprachen haben kannst. Die Klasse lautet "lang-[2 Zeichen Ländercode]", also für Englisch "lang-en" oder für Französisch "lang-fr". Dadurch hast du die Möglichkeit, nachdem dein Charakterbogen übersetzt wurde, das Layout speziell für eine Sprache zu ändern, wenn der neue Text für diese Sprache nicht zu deinem aktuellen Design passt.
Schritt Eins, Bogeneinteilung
Du möchtest das "data-i18n=[unique-key]" Attribut zu jedem Element hinzufügen, das Text enthält, der übersetzt werden soll. Behalte den gesamten Text im Element bei, da er beim Erstellen der Übersetzungsdatei verwendet werden kann, wenn du fertig bist (später erklärt). Es ist besonders wichtig, dass der Text dort bleibt, während der sheet-i18n-Code nur in der Entwicklungsumgebung vorhanden ist, da ansonsten dein Sheet auf der Hauptseite nicht mehr funktioniert, bis sheet-i18n auf der Hauptseite verfügbar ist. Wenn du weitere Beispiele dafür möchtest, wie die i18n-Übersetzungen funktionieren, schau dir den 5th Edition OGL by Roll20 Sheet an, das bereits mit dem i18n-Text formatiert wurde.
Standardtext
<div class="col"> <div class="row"> <span data-i18n="acrobatics-u">AKROBATIK <span>(Gew)</span></span> <input class="num" type="text" name="attr_npc_acrobatics" placeholder="0"> </div> <div class="row"> <span data-i18n="animal-handling-u">TIERHALTUNG</span> <input class="num" type="text" name="attr_npc_animal_handling" placeholder="0"> </div> <div class="row"> <span data-i18n="arcana-u">ARKANA</span> <input class="num" type="text" name="attr_npc_arcana" placeholder="0"> </div> <div class="row"> <span data-i18n="athletics-u">ATHLETIK</span> <input class="num" type="text" name="attr_npc_athletics" placeholder="0"> </div> <div class="row"> <span data-i18n="deception-u">TÄUSCHUNG</span> <input class="num" type="text" name="attr_npc_deception" placeholder="0"> </div> <div class="row"> <span data-i18n="history-u">GESCHICHTE</span> <input class="num" type="text" name="attr_npc_history" placeholder="0"> </div> </div>
Beachte, wie jedes Span-Element in diesem Codeblock das data-i18n-Attribut mit einem Schlüssel enthält, der auf den Text im Span verweist. Beachte auch, dass HTML innerhalb des Spans vorhanden ist, das ist völlig in Ordnung. Das HTML wird von Crowdin markiert, damit es ihnen leicht fällt, das HTML in ihre Übersetzung zu kopieren und einzufügen. Während HTML innerhalb der Übersetzung in Ordnung ist, versuche es so einfach wie möglich zu halten, da die Übersetzer wahrscheinlich keine Erfahrung im Programmieren haben und möglicherweise Probleme beim Kopieren des Codes haben, wenn er nicht einfach ist. Es ist sehr wichtig, dass jeder eindeutige String einen eindeutigen Schlüssel hat; beachte, dass ich am Ende jedes Schlüssels ein -u verwende, da dieser Text vollständig großgeschrieben ist. Das liegt daran, dass diese Wörter später im Sheet auftauchen, aber normal geschrieben werden.
Es gibt einige Fälle, in denen du dem Schlüssel zusätzlichen Kontext hinzufügen möchtest, den der Übersetzer möglicherweise nicht aus dem Text allein bekommt, wie bei Abkürzungen.
<div class="row"> <span data-i18n="components:-u">KOMPONENTEN:</span> <input type="checkbox" name="attr_spellcomp_v" value="{{v=1}}" checked="checked"> <span data-i18n="spell-component-verbal">V</span> <input type="checkbox" name="attr_spellcomp_s" value="{{s=1}}" checked="checked"> <span data-i18n="spell-component-somatic">S</span> <input type="checkbox" name="attr_spellcomp_m" value="{{m=1}}" checked="checked"> <span data-i18n="spell-component-material">M</span> <input type="text" name="attr_spellcomp_materials" accept="Material" style="margin-left: 17px; width: 215px;" placeholder="ruby dust worth 50gp" data-i18n-place="ruby-dust-place"> </div>
Beachte, dass die Schlüssel für die V, S und M Texte genau das bezeichnen, worauf sich der einzelne Buchstabe bezieht. Andernfalls hätte der Übersetzer keine Ahnung, was "V" bedeutet. Auf diese Weise kann der Übersetzer "V" durch den ersten Buchstaben dessen ersetzen, worauf sich "Verbal" in seiner Sprache bezieht, falls es sich unterscheidet.
Element Attribut Text
Oftmals befindet sich Text in einem Elementattribut, der übersetzt werden muss, wie zum Beispiel bei Platzhaltern und Titeln. Um den Text in diesen Attributen zu ersetzen, kannst du "data-i18n-[attribute]='key'" verwenden, um dem Parser mitzuteilen, dass der bereitgestellte Schlüssel verwendet werden soll, um den Text im angegebenen Attribut zu ersetzen. Zum Beispiel, wenn du den Text in einem Platzhalterattribut ersetzt:
<input name="attr_weapon_name" data-i18n-placeholder="weapon-name" placeholder="Hand Axe" />
Die unterstützten Attribute sind: title, alt, aria-label, label, placeholder
Variablenersatz
Ein besonderer Fall ist, wenn du Text in einem String hast, der nicht übersetzt werden soll, kannst du spezielle Variablen und das "data-i18n-vars"-Attribut verwenden.
<span data-i18n="var-test" data-i18n-vars="will not|be translated">Dieser Text {{0}} {{1}}</span>
Der Text im data-i18n-vars-Attribut wird durch das Zeichen "|" geteilt und in einem Array platziert. Du kannst dann dieses Array verwenden, indem du {{[index]}} verwendest, um auf die bestimmte Reihe des Arrays zu verweisen.
Dynamischer Schlüsselersatz
Es gibt Situationen, in denen du eine Übersetzung basierend auf einem sich ändernden Schlüssel abrufen musst. Zum Beispiel hast du ein Dropdown-Menü für die "Klassenauswahl", in dem der Benutzer seine Klasse auswählen kann. Die Klassennamen, die in dieser Liste angezeigt werden, können mit den normalen Werkzeugen übersetzt werden. Aber du kannst den Wert innerhalb der Option in der Select-Box nicht übersetzen. (Wir tun dies, so dass, wenn du die Sprache änderst, die Daten des Blattes nicht übersetzt werden müssen. Das Übersetzungssystem bleibt rein in der Front-End und nicht in der Daten-Ebene) Stattdessen, wo du diesen Klassennamen anzeigen möchtest, übersetzt du ihn und markierst den Span mit dem Attribut "data-i18n-dynamic". Dies sagt dem Parser, den Wert zu verwenden, der normalerweise im Span angezeigt wird, um eine Übersetzung abzurufen.
// Dieser Teil muss sich nicht ändern <select class="hiding" name="attr_class" style="width: 64px;"> <option value="Barbarian" data-i18n="barbarian">Bárbaro</option> <option value="Bard" data-i18n="bard">Bardo</option> <option value="Cleric" data-i18n="cleric">Clerigo</option> <option value="Druid" data-i18n="druid">Druida</option> </select>
<span data-i18n="class-options">Class Options</span> (<span name="attr_class" data-i18n-dynamic></span>)
{ "Barbarian":"Bárbaro", "Bard":"Bardo", "Cleric":"Clerigo", "Druid":"Druida" }
Jetzt, mit dem obigen Code, wird bei Auswahl von "Bárbaro" aus der Auswahlliste "Barbarian" unter attr_class gespeichert. Aber wenn das Blatt aktualisiert wird und der Span mit name="attr_class" normalerweise mit "Barbarian" gefüllt wäre, wird stattdessen "Barbarian" als Schlüssel zur Referenzierung des Übersetzungs-JSON und zur Anzeige von "Bárbaro" verwendet.
Würfelabfragen
Texte in Würfelabfragen können nicht im HTML des Charakterbogens übersetzt werden, jedoch können die Texte mithilfe vonSheet Worker Scriptsin JavaScript übersetzt und in der Würfelabfrage eingefügt werden.
<script type="text/worker">on("sheet:opened", function(eventInfo){ setAttrs({ bonusmacro: getTranslationByKey("ask-bonus") }); }); }); </script>
<span style="display: none" data-i18n="ask-bonus">Was ist dein Bonus?</span> <button type='roll' value='[[d20 + ?{@{bonusmacro}|0}]]' ></button>
Das Tag <span> wird nicht angezeigt, verursacht jedoch das Hinzufügen des Schlüssels "ask-bonus" zur generierten Übersetzungsdatei. Das Skript wird ein Attribut namens "bonusmacro" mit dem Wert "Was ist dein Bonus?" erstellen und die Rollenschaltfläche wird diesen Wert verwenden, um den Befehl "[[d20 + ?{Was ist dein Bonus?|0}]]" zu senden. Wenn das Blatt geöffnet wird, während eine andere Übersetzungsdatei aktiv ist, wird es das Attribut auf den neuen übersetzten Wert für "bonusmacro" setzen. Diese Technik kann verwendet werden, um einzelne Schlüssel zu ersetzen, oder ein einziges Attribut kann verwendet werden, um eine komplexe Abfrage zu speichern. Dabei fügt das Sheet Worker-Skript übersetzte Schlüssel nach Bedarf in den Abfragecode ein.
<script type="text/worker"> on("sheet:opened", function(eventInfo){ setAttrs({ rollquery: "?{" + getTranslationByKey("advantageordisadvantage") +"|" + getTranslationByKey("neither") + ",d20|" + getTranslationByKey("advantage") + ",2d20kh1[" + getTranslationByKey("withadvantage") + "]|" + getTranslationByKey("disadvantage") + ",2d20kl1[" + getTranslationByKey("withdisadvantage") + "]}", }); }); </script>
<span style="display: none" data-i18n="advantageordisadvantage">Rollst du mit Vorteil oder Nachteil?</span> <span style="display: none" data-i18n="neither">Weder</span> <span style="display: none" data-i18n="advantage">Vorteil</span> <span style="display: none" data-i18n="withadvantage">mit Vorteil</span> <span style="display: none" data-i18n="disadvantage">Nachteil</span> <span style="display: none" data-i18n="withdisadvantage">mit Nachteil</span> <button type='roll' value='[[@{rollquery}]]' ></button>
Mit diesem Beispiel wird der folgende Wurf mit der Standard-Übersetzungsdatei erstellt
[[?{Rollst du mit Vorteil oder Nachteil?|Weder,w20|Vorteil,2w20kh1[mit Vorteil]|Nachteil,2w20kl1[mit Nachteil]}]]
Würfelvorlagen
Der statische HTML-Code innerhalb der Würfelvorlagen-Definition des Blatts kann alle oben genannten Werkzeuge, einschließlich dynamischer Schlüssel, verwenden. Wenn er sich in der Würfelvorlagen-Definition des Blatts befindet, gibt Code wie {{strength-key}} den übersetzten Wert dessen zurück, was der Wert von {{strength-key}} ist. Wenn du dynamisch übersetzte Werte in einer Wurf-Funktion senden möchtest, benutze das folgende Werkzeug.
Innerhalb einer Würfelfunktion kannst du jeden Text in "^{ [key] }" einpacken, um den Text als Übersetzungsschlüssel zu kennzeichnen. Dieser Text wird durch die übersetzte Version ersetzt, die mit diesem Schlüssel verknüpft ist. Dieser Schritt erfolgt nach dem Austausch der Werte des Charakterbogens, daher wird "^{ @{ability_key} }", wenn ability_key = STRENGTH ist, als "^{STRENGTH}" interpretiert und zeigt den Übersetzungswert für "STRENGTH" an, den du hast. Dies funktioniert auch bei Schlüssel-/Wertpaaren, die in der Funktion allprops() verwendet werden. Zum Beispiel: "{{^{TEXT}=@{content} }}" hat den Übersetzungswert "TEXT" als "{{key}}" innerhalb der Funktion allprops().
List Ordering
Wenn du eine Liste von Gegenständen in einem Behälter hast, die auf Englisch alphabetisch geordnet ist, und du die Reihenfolge in anderen Sprachen ändern möchtest, kannst du dieses Tool verwenden. Das Umordnen respektiert alle aktuellen Formatierungen in der Liste, sodass alles unabhängig von den Unterkontainern gleich formatiert bleibt.
Erkenne den Behälter. Alle Listenelemente müssen sich im Behälter befinden, sonst werden sie ignoriert:
data-i18n-list="list-key"
Identifizieren Sie die einzelnen Elemente in der Liste. Diese Elemente können ein Block von HTML sein. Wenn sie umsortiert werden, wird der gesamte Block verschoben.
data-i18n-list-item="item-key"
(Optional) Die "startende" Reihenfolge der Liste wird angenommen, von oben nach unten im HTML gelesen zu werden. Wenn deine Reihenfolge anders ist, kannst du die Elemente manuell nummerieren (beginnend bei 1), um die Reihenfolge festzulegen.
data-i18n-list-item-num="1"
(Besonderheit) Das ist kein Tag, den du "benutzt", er wird erstellt, wenn ein Fehler bei der Formatierung vorliegt. Wenn ein Fehler mit deinem List Order-Code vorliegt, wird die Liste ignoriert und dieser Tag wird auf dem List-Container-Element mit dem Fehler erstellt. Wenn die Liste nicht in der erwarteten Reihenfolge umsortiert wird, überprüfe das übergeordnete Element auf einen Fehler.
data-i18n-error="Fehlermeldung"
Füge den Schlüssel zu deiner Übersetzungsdatei hinzu. Dies wird eine kommagetrennte Liste aller Schlüssel in der Sprache der Originalübersetzung enthalten. Das Umordnen dieser Schlüssel wird die Elemente neu ordnen. Der Listenschlüssel kann für mehrere Listen verwendet werden, wenn alle zu sortierenden Elemente die "gleichen" Elemente sind. Der HTML-Code muss nicht gleich sein, nur die Wörter, die sortiert werden. Eine Liste von "Fähigkeiten" in D&D kann zum Beispiel an verschiedenen Stellen auf einem Bogen mit völlig unterschiedlichem HTML auftauchen, aber alle können den gleichen Listenschlüssel verwenden. Ich verwende den unten stehenden Beispielcode, um meinen Listenschlüssel zu generieren.
"skills-list":"Akrobatik,Arcana,Fingerfertigkeit,Überleben"
Um diese Liste für die tschechische Sprache neu zu ordnen, würde der Listenschlüssel-Wert wie folgt aussehen:
"skills-list":"Akrobatik,Fingerfertigkeit,Arcana,Überleben"
Beispiel:
<div data-i18n-list="skills-list"> // Ordne deinen Listencontainer mit einem Namen zu und verweise auf den Schlüssel, den er zur Festlegung der Reihenfolge verwenden wird <div> // Beachte, dass die Elemente in einem Unterkontainer sind, diese Spalten bleiben nach der Neueinordnung erhalten <div data-i18n-list-item="acrobatics"> // Benenne deine Listenobjekte, das sind die Blöcke, die neu angeordnet werden <span data-i18n="acrobatics-u">AKROBATIK</span> <input type="text" name="attr_npc_acrobatics" placeholder="0"> </div> <div data-i18n-list-item="arcana"> <span data-i18n="arcana-u">ARKANA</span> <input type="text" name="attr_npc_arcana" placeholder="0"> </div> </div> <div> <div data-i18n-list-item="sleight-of-hand"> <span data-i18n="sleight-of-hand-u">TASCHENSCHNITT</span> <input type="text" name="attr_npc_sleight_of_hand" placeholder="0"> </div> <div data-i18n-list-item="survival"> <span data-i18n="survival-u">ÜBERLEBEN</span> <input type="text" name="attr_npc_survival" placeholder="0"> </div> </div> </div>
Das gleiche Beispiel jedoch wird die Liste entlang der Spalten und dann entlang der Zeilen statt entlang der Zeilen und dann entlang der Spalten gehen:
<div data-i18n-list="skills-list"> <div> <div data-i18n-list-item="acrobatics" data-i18n-list-item-num="1"> <span data-i18n="acrobatics-u">AKROBATIK</span> <input type="text" name="attr_npc_acrobatics" placeholder="0"> </div> <div data-i18n-list-item="sleight-of-hand" data-i18n-list-item-num="3"> <span data-i18n="sleight-of-hand-u">FINGERFERTIGKEIT</span> <input type="text" name="attr_npc_sleight_of_hand" placeholder="0"> </div> </div> <div> <div data-i18n-list-item="arcana" data-i18n-list-item-num="2"> <span data-i18n="arcana-u">ARKANA</span> <input type="text" name="attr_npc_arcana" placeholder="0"> </div> <div data-i18n-list-item="survival" data-i18n-list-item-num="4"> <span data-i18n="survival-u">ÜBERLEBEN</span> <input type="text" name="attr_npc_survival" placeholder="0"> </div> </div> </div>
Schritt Zwei, Generiere die Übersetzungsdatei
Wenn Sie Ihre Tabelle formatiert haben, wie oben beschrieben, können Sie ganz einfach Ihre Übersetzungsdatei erstellen. Nachdem Sie Ihre Tabelle im Editor geladen haben,wechseln Sie in das Spiel,und öffnen Sie dort die Entwicklertools für Ihren Browser und gehen Sie zur Konsole. Ganz unten in der Konsole, wo Sie Code eingeben können, geben Sie "i18nOutput" ein. (es wird wahrscheinlich zu automatischen Vervollständigen beginnen, sobald Sie anfangen zu tippen) Drücken Sie die Eingabetaste, um dieses Objekt abzurufen, und es gibt eine JSON-Zeichenfolge aus, die alle von Ihnen verwendeten Schlüssel mit dem entsprechenden Text aus dem Element / Platzhalter enthält. Sie sollten in der Lage sein, diesen Text anschließend in Ihr bevorzugtes JSON-Format zu kopieren (optional, aber empfohlen) und dann in den Tab "Übersetzung" im Bereich "Spiel-Einstellungen Benutzerdefinierte Tabelle" einzufügen.
Wenn Sie die Übersetzungsdatei translation.json manuell erstellen möchten, können Sie das folgende Format verwenden:
{ "Schlüssel": "Zeichenfolge", "Schlüssel-2": "Eine andere Zeichenfolge." }
Wenn Sie Ihre formatierte Tabelle und das Übersetzung JSON für Ihre benutzerdefinierte Tabelle gespeichert haben, sollte es genauso aussehen wie zuvor, bevor Sie alles übersetzt haben, vorausgesetzt, dass alles korrekt gemacht wurde.
Wenn Sie einen roten Text wie [Übersetzungs-Schlüssel] sehen, handelt es sich um einen Schlüssel, den Sie dem System mitteilen, den Sie jedoch nicht in das Übersetzungs JSON eingefügt haben. Wenn du das von unserem System generierte JSON verwendest, solltest du keine dieser Fehlermeldungen sehen.
Sobald du eine funktionierende Übersetzungsdatei hast, kannst du diese zusammen mit dem Rest deines Charakterbogen-Codes in den Hauptordner deines Charakterbogens als "translation.json" hochladen. Dies wird automatisch von unserem System erkannt und auf Crowdin hochgeladen, wo es dann übersetzt werden kann.
Änderungen an deiner Übersetzung
Wenn du nachträglich Änderungen an deiner Übersetzung vornehmen möchtest, kannst du deine translation.json-Datei bearbeiten und die Änderungen werden beim nächsten Update der Übersetzungen übernommen. Bestimmte Änderungen führen jedoch nicht dazu, dass Übersetzungswerte überschrieben werden, selbst wenn sie noch nicht übersetzt wurden. Mit anderen Worten, manchmal werden Änderungen am translation.json nicht in deinem Charakterbogen angezeigt.
Änderungen, die kein Update auslösen, umfassen Änderungen, bei denen der einzige Unterschied Leerzeichen oder Sonderzeichen sind, sowie Änderungen, bei denen nur Zeichen entfernt, aber keine neuen Zeichen hinzugefügt oder geändert werden.
Deine Änderungen an Roll20 übermitteln
SieheAnfängerleitfaden für GitHub
Siehe auch
- ACSI - Automated Character Sheet Internationalizer. Eine Linux-Tool, das Zeit spart, während Sie Sprachtags einfügen und erstellen.