fmt:
im Vergleich zu Tinyformat.
Wird daran gearbeitet?
Ich habe den anfänglichen Port lokal funktionieren lassen, hatte aber keine Zeit, ihn zu polieren und richtig zu testen (z mit xgettext als Build-Ziel usw.)
Es enthüllte auch eine Reihe von "schlechten" Übersetzungsrichtlinien - z. B. Zusammenfügen übersetzter Textfragmente, anstatt jeweils die falsche Zeichenfolge zu erstellen (z. %s Ding ist %d aus "), Objekt, Anzahl), format(tr(aus "%d Gesamt"), Zahl));
Was für Übersetzer zu den völlig nutzlosen Strings führen würde:
"%s %s"
"%s Ding ist %d"
"von %d insgesamt"
wenn es wirklich als ein einzelner Aufruf übersetzt werden sollte, sollte die extrahierte Zeichenfolge sein:
"%s Ding ist %d von %d insgesamt" (oder "{0} Ding ist {1} von {2} total" in der fmtlib-Methode)
Soweit ich weiß, muss es zwei unterschiedliche Formatierungs-Subsysteme geben:
{fmt}
basierte Protokollierung (da es IMO wenig Vorteile bringt, potenziell sich ständig ändernde Protokollnachrichten zu übersetzen, und würde das Routing über boost::locale
Leistung beeinträchtigen.boost::locale::format
für lokalisierbare UI-Strings (da Pluralformen unterstützt werden).Ich würde vorschlagen, sie in kleinen Schritten zu implementieren: zuerst zu {fmt}
wechseln und dann mit lokalisierbaren Strings umgehen.
Ich bin mir nicht sicher, ob boost::locale für uns in Zukunft wirklich so nützlich sein wird - es ist großartig für statische Anwendungen mit statischen Übersetzungsdatenbanken, aber ich habe Schwierigkeiten herauszufinden, wo ich mich in seine Nachrichtendatenbank einklinken kann, um neue Nachrichten hinzuzufügen Modifikationen.
Ich denke, es ist nur möglich, eine komplett neue Datenbank in einer neuen Übersetzungsdomäne hinzuzufügen, und dann geraten wir in Probleme, herauszufinden, mit welcher Domäne wir einen String übersetzen sollten, ohne etwas wie /all/mod-Domänen der Reihe nach zu versuchen, bis wir einen Treffer finden
Mein derzeitiger Plan ist es also, jede der Aufgaben zu trennen - ähnlich wie Sie es erwähnt haben:
Ich habe so ziemlich alle oben genannten Stages lokal in verschiedenen Bundesstaaten - es macht wahrscheinlich Sinn für mich, sie in einen brauchbaren Zustand zu bringen, und jetzt habe ich ein bisschen Zeit an diesem langen Wochenende, das wird wohl meine nächste Aufgabe sein :)
Sobald das alles erledigt ist, können wir uns Gedanken darüber machen, wie Mods funktionieren würden, die neue Strings hinzufügen
Konvertieren Sie alle /translated/-Strings vom %printf-Stil in den {fmt}/boost::locale-Stil (ich denke, sie sind funktional gleich, da wir derzeit keine Pleuralanmerkungen oder ähnliches haben)
Eigentlich sehen sie nur ähnlich aus -- boost::locale
bietet eine 1-basierte Indexierung und eine stark unterschiedliche Formatierungsgrammatik. Wenn nicht für Pluralformen, würde ich {fmt}
da ich seine Unterstützung für benannte Argumente als gute Hilfe für Übersetzer finde, die wertvollen Kontext hinzufügen, z.
Delay = {seconds}
Range = {meters:2.1}m.
Obwohl ich Unterstützung für Pluralformen viel wertvoller finde.
Ja, ich erinnere mich an die Indizierung, die mich anfangs umgeworfen hat :)
TBH für die Zukunft Ich denke, das boost::locale-Format ist gut, ich bin sicher, wir können die Mod-Kontextprobleme in Zukunft beheben.
Oder zumindest dann, wenn wir das "nächste" Problem finden, werden alle übersetzten Strings in einem viel vernünftigeren Format vorliegen und nicht mit nicht übersetztem formatiertem Text vermischt.
Außerdem sollte ehrlich gesagt die gesamte USstring-Klasse eine Reihe von Helfern um einen std::basic_string . sein
Ich bin versucht, einfach alles durch einen std::string zu ersetzen (IE std::basic_string
Die IT "funktioniert" derzeit "zufällig", da ich dazu neige, auf Plattformen zu testen, die bereits utf8 in ihren System-APIs verwenden - aber ich vermute, es wird derzeit kaputt gehen, wenn wir heute versuchen, etwas zu tun, wie zum Beispiel einen Dateinamen mit einem Nicht-ASCII-Pfad unter Windows zu öffnen