Frage

In der aktuellen C ++ Standard (C ++ 03) gibt es zu wenige Daten über Textlokalisierung und das macht die C ++ Entwickler des Leben härter als üblich, wenn mit lokalisierten Texten arbeiten (sicherlich der C ++ 0x-Standard wird hier später helfen ).

Unter der Annahme, das folgende Szenario (die von echten PC-Mac-Spiele-Entwicklung Fällen ist):

  1. in Reaktion (Echtzeit) Anwendung : Die Anwendung hat nicht reagierende Zeiten zu minimieren, um „nicht erkennbar“, so eine hohe Ausführungsgeschwindigkeit ist wichtig,
  2. .
  3. lokalisierte Texte :. Angezeigten Texte in mehr als zwei Sprachen lokalisiert werden, die möglicherweise mehr - Sie eine feste Anzahl von Sprachen, die nicht erwarten, sollte einfach erweiterbar sein
  4. Sprache zur Laufzeit definiert : Die Texte sollen nicht in der Anwendung kompiliert werden (noch mit einer Anwendung pro Sprache), erhalten Sie die gewählte Sprache Informationen bei Programmstart - die eine Art von Text Belastung impliziert .
  5. Cross-Plattform : Die Anwendung ist mit Cross-Plattform im Auge codiert wird (Windows - Linux / Ubuntu - Mac / OSX), so dass das lokalisierten Textsystem zu Cross-Plattform sein.
  6. Stand-alone-Anwendung : Die Anwendung bietet alles, was notwendig ist, um sie auszuführen; es wird keine Umwelt-Bibliothek verwenden oder den Benutzer auffordern, etwas anderes als das Betriebssystem (wie die meisten Spiele zum Beispiel) zu installieren.

Was sind die besten Praktiken lokalisieren Texte in C ++ in dieser Art von Anwendung zu verwalten?

Ich sah in diesem letzten Jahr, und die einzigen Dinge, die ich bin sicher, dass von uns, dass Sie std::wstring oder std::basic_string<ABigEnoughType>, um die Texte zu manipulieren in der Anwendung verwendet werden soll. Ich hielt meine Forschung, weil ich mehr auf dem „Textanzeige“ Problem arbeite (im Fall von Echtzeit-3D), aber ich denke, es gibt einige bewährten Methoden lokalisieren Texte in roher C zu verwalten ++ darüber hinaus nur, dass und „verwenden Unicode“ .

Also, alle Best Practices, Anregungen und Informationen (Cross-Plattform macht es schwer, glaube ich) sind willkommen!

War es hilfreich?

Lösung

In einer kleinen Video Game Company, Black Lantern Studios, ich der Lead-Entwickler für ein Spiel war genannt Lionel DS Züge. Wir lokalisiert in Englisch, Spanisch, Französisch und Deutsch. Wir wussten, dass alle Sprachen vorne, so einschließlich sie bei der Kompilierung die einzige Option war. (Sie sind auf einen ROM gebrannt, Sie sehen)

kann ich Ihnen Informationen über einige der Dinge, die wir gemacht haben. Unsere Saiten wurden in ein Array beim Start auf der Sprachauswahl des Spielers basierend geladen. Jede einzelne Sprache ging in eine separate Datei mit allen Strings in der gleichen Reihenfolge. String 1 war immer der Titel des Spiels, string 2 immer die erste Menüoption, und so weiter. Ich verkeilte die Arrays aus einem enum, als integer Indizierung ist sehr schnell, und in den Spielen, Geschwindigkeit ist alles. (Die Lösung in eines der anderen Antworten verknüpft verwendet string Lookups, die ich dazu neigen würde, zu vermeiden.) Wenn die Saiten Anzeige wir eine printf() Typ Funktion Marker mit Werten zu ersetzen. " Zug 3 verläßt Stadt 1. "

Jetzt für einige der Gefahren.

1) zwischen den Sprachen, Ausdruck Reihenfolge ist völlig anders. " Zug 3 verläßt Stadt 1. " auf Deutsch übersetzt und wieder endet als " Von City 1, Bahn 3 zu verlassen ". Wenn Sie so etwas wie printf() verwenden und Ihre Zeichenfolge " Zug% d Stadt% d zu verlassen. " Die deutschen enden wird sagen: „ Von City 3, Bahn 1 zu verlassen. “das ist völlig falsch. Wir lösten dies, indem die Übersetzung zwingt das gleiche Wort zu behalten, aber wir am Ende mit einigen ziemlich gebrochenem Deutsch nach oben. Würde ich es wieder tun, würde ich eine Funktion schreiben, die die Zeichenfolge und eine Null-basierten Array der Werte setzen in es dauert. Dann würde ich Marker verwenden, wie %0 und %1, im Grunde den Array-Index in den String einzubetten. Update: @ Jonathan Leffler wies darauf hin, dass ein POSIX-konformes printf() unterstützt %2$s Typ Markern, wo der 2$ Teil der printf() anweist, dass die Markierung mit den zweiten zusätzlichen Parametern zu füllen. Das wäre sehr nützlich, so lange, wie es schnell genug ist. Eine kundenspezifische Lösung kann noch schneller sein, so dass Sie sicherstellen möchten, und beide testen.

2) Sprachen sind sehr unterschiedlich in der Länge. Was war 30 Zeichen in Englisch kam in Deutsch manchmal, um so viel wie 110 Zeichen. Das bedeutete, es würde oft nicht die Bildschirme passen wir es waren setzend. Dies ist wahrscheinlich weniger ein Problem für PC / Mac-Spiele, aber wenn man keine Arbeit tun, wo der Text in einem definierten Feld passen müssen, sollten Sie dies berücksichtigen. Um dieses Problem zu lösen, zogen wir so viele Adjektive aus unserem Text wie möglich für andere Sprachen. Dies verkürzt den Satz, sondern bewahrt die Bedeutung, wenn ein bisschen den Geschmack zu verlieren. Ich entwarf später eine Anwendung, die wir die Übersetzer verwenden könnte, welche die Schriftart und die Box-Größe enthalten würde und erlauben, ihre eigenen Modifikationen machen den Text passen in die Box zu bekommen. Nicht sicher, ob sie jemals umgesetzt. Sie könnten auch erwägen Scrolling Textbereiche, die, wenn Sie dieses Problem haben.

3) Soweit Cross-Plattform geht, schrieben wir ziemlich reines C ++ für unser Lokalisierungssystem. Wir schrieben benutzerdefinierte Binärdateien codiert zu laden, und ein benutzerdefiniertes Programm aus einer CSV-Sprach Text in eine .h mit der ENUM-und-Datei Sprache Karte und eine .lang für jede Sprache zu konvertieren. Die Plattform-spezifische Sache haben wir waren die Schriften und die printf() Funktion, aber Sie werden etwas für haben, wo immer Sie entwickeln, oder könnten Sie Ihre eigenen schreiben, wenn nötig.

Andere Tipps

GNU Gettext macht alles.

ich stark mit der akzeptierten Antwort nicht einverstanden ist. Erstens, zu beschleunigen zeigt das Teil statische Array-Lookups über die Verwendung der Text-Lookups lediglich, dass die Person, die tun Optimierung ist sehr unerfahren - Berechnung des Layouts für den Text und Darstellung der Text 2-4 Größenordnungen mehr Zeit als ein Hash-Lookup verwendet. Wenn jemand wollte ihre eigene Sprache Bibliothek implementieren es sollte nie auf statische Arrays basieren.

Aber das ist nicht wirklich relevant, weil Ihre eigene Sprache Bibliothek zu schreiben in Ihrem eigenen Spiel zu verwenden ist noch schlimmer als sinnlos vorzeitige Optimierung. Es gibt einige sehr gute Gründe für die niemals Ihre eigene Lokalisierungs Bibliothek schreiben:

  1. die Zeit Planung eine Lokalisierungsbibliothek zu verwenden ist viel einfacher, dann die Zeit, um eine Lokalisierung Bibliothek zu schreiben, zu planen. Lokalisierung Bibliotheken vorhanden sind, sie arbeiten, und viele Menschen haben verwendet sie.

  2. Der Ort ist heikel, so werden Sie Dinge falsch. Jede Sprache wird eine neue Marotte, was bedeutet, wenn Sie eine neue Sprache zu Ihrer eigenen homegrown Lokalisierung Bibliothek hinzufügen müssen Sie den Code ändern, wieder für die Macken zu berücksichtigen. Wissen Sie, dass einige Sprachen mehr als 2 Pluralformen haben, abhängig von der Anzahl der Elemente in Frage? Mehr als 2 Geschlechter (mehr als 10, auch)? Außerdem variieren die Anzahl und Datumsformate viel zwischen den verschiedenen in vielen Sprachen.

  3. Wenn Ihre Bewerbung erfolgreich wird, werden Sie die Unterstützung für weitere Sprachen hinzufügen möchten. Sprachen niemand in Ihrem Team spricht fließend. Einstellung jemand eine Übersetzung schreiben wird deutlich günstiger , wenn sie wissen bereits die Werkzeuge, die sie arbeiten.

Eine sehr gut bekannt und vollständige Lokalisierung Bibliothek ist GNU Gettext , die verwendet die GPL, und sollte daher für die kommerzielle Arbeit vermieden werden. Stattdessen können Sie die Boost-Bibliothek verwenden boost.locale , die arbeitet mit Gettext-Dateien und ist kostenlos für kommerzielle und nicht-kommerzielle Projekte jeglicher Art zu nutzen und verändern.

Es wird keine zusätzlichen Funktionen in dem C ++ 0x-Standard sein, soweit ich das beurteilen kann. Ich vermute, dass der Ausschuss dies eine Angelegenheit für Bibliotheken von Drittanbietern hält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top