Frage

Ich möchte ein Programm lokalisieren ich bereits geschrieben .. Es ist ziemlich groß (fast 50k Linien) und im Idealfall möchte ich ein System, das mich (der Programmierer) zu tun, die geringste Menge an Arbeit möglich und ohne größere Änderungen an der erlaubt Programm -. wenn möglich gar keine

schaute ich auf gettext () und hat es gut gefallen, aber es ist mir unklar, wie es Strings wie diese übersetzen würde:

const char *Colors[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};

das ist sehr gemeinsam in meinem Programm .. Hier "Red" mit gettext zu ersetzen ( "Rot") würde natürlich nicht funktionieren.

Also ich dachte, ich wäre so etwas wie, Output (gettext (Farben [Id])), aber wie kann ich dann eine Liste von Strings zu lokalisieren bekommen? Ich bezweifle, jedes Programm intelligent genug, um in der Lage sein, „Rot“ zu bekommen, „Blue“, „Yellow“ von dem in einer zu localize Liste statisch.

Da es ist im Grunde ein Server gibt es keine Notwendigkeit für die Fähigkeit ist, die Sprache zu ändern, ohne neu zu kompilieren (ich es für jede unterstützte Sprache ohne große Probleme oder Ärger kompilieren können), dachte ich über C ++ 0x den constexpr, was wäre, perfekt! Es würde in Arrays arbeiten / etc, und ich würde eine Liste von Strings leicht erhält bei der Kompilierung zu lokalisieren .. Schade, dass kein Compiler es noch umgesetzt werden.

Ändern all Fäden zu einer ID ist keine Option, da es eine enorme Menge an Arbeit meinerseits erfordern würde, und vor allem eine neue ID für jeden neuen String zu schaffen würde wie die Hölle ärgerlich. Das gleiche gilt für die Umwandlung alle Arrays wie die oben auf etwas anderes.

Also, irgendwelche Ideen? : /

War es hilfreich?

Lösung 2

Nach viel Herumspielen mit gettext () und xgettext Ich glaube, ich die Möglichkeit, mich gefunden (sorry OneByOne aber ich wusste nicht, wie Ihr Ansatz .. Es müssen Hunderte von Arrays so sein und ich würde alles importieren müssen in Haupt von ihnen (), das ist eine Menge von extern und eine Menge zusätzlicher Arbeit. /)

Wie auch immer, das ist, wie ich denke, es ist theoretisch getan werden kann (ich habe noch nicht versucht, wirklich zu übersetzen, aber ich sehe nicht, warum es nicht funktionieren würde)

Zwei # definieren suchen:

#define _ gettext
#define __(x) x

Dann nutzen Sie _, um tatsächlich zu übersetzen und __ einfach Strings als markieren „übersetzt werden“:

const char *Colors[] = {
 { __("Red") },
 { __("Blue") },
 { __("Yellow") },
 ....
};

void PrintColor(int id) {
    cout << _("The color is: ") << _(Colors[id]);
}

Dann benutzen Sie:

xgettext -k_ -k__ *.cpp

Und Sie erhalten die folgende .po-Datei:

#: test.cpp:2
msgid "Red"
msgstr ""

#: test.cpp:3
msgid "Blue"
msgstr ""

#: test.cpp:4
msgid "Yellow"
msgstr ""

#: test.cpp:9
msgid "The color is: "
msgstr ""

So verwenden Sie __ (oder ein anderer Name, spielt keine Rolle) als „Dummy-Funktion“ lassen Sie xgettext weiß, dass der String übersetzt werden muss, und _ tatsächlich rufen gettext ().

Wenn Sie rufen _ mit einem String dann wird die Zeichenkette markiert zu-übersetzt auch, wenn Sie es mit einem variablen, Array nennen, was immer dann erscheint es einfach durch xgettext ignoriert zu werden.

Great! Alles was ich jetzt tun müssen, ist durch 5 Billionen Dateien gehen und fügen Sie unterstreicht herum, als ob ich ein Affe war: /

Andere Tipps

Für Ihr spezifisches Beispiel, ich könnte versuchen, so etwas wie:

// presumably globals
const char *Colors_en[] = {
 { "Red" },
 { "Blue" },
 { "Yellow" },
 ....
};
const char *Colors[] = {0};

// in main()
gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

gettextarray fordert jeden Eingang gettext und schreibt einen Ausgang. Ich denke, es ist nur als Aufruf implementiert werden könnte, um std :: transformieren. Und Sie können die Größe Parameter mit einem bisschen Vorlage Tricks vermeiden.

Eine andere Möglichkeit ist, an dem Punkt zu nennen gettext, wo jede der Farb Saiten über verwendet werden soll (angezeigt oder in eine Zeichenfolge für die Anzeige angehängt). Das bedeutet mehr Code zu ändern, aber nicht erfordert, dass main (), um jeden Satz von Saiten im Programm vor übersetzt etwas zu tun, das sie verwenden könnte.

Wenn Sie wollen die Arbeit in Haupt nicht tun, können Sie es im Code tun könnte, die die Saiten verwendet, so etwas wie folgt aus:

if (Colors[0] == 0)
  gettextarray(Colors_en, Colors, sizeof(Colors_en) / sizeof(char*));

Oder wenn Ihre Anwendung ist multithreaded, betrachten pthread_once oder das Äquivalent in der Thread-API Sie verwenden.

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