fmt:
tinyformatと比較して。
これは取り組んでいますか?
最初のポートはローカルで機能していますが、それを磨いて適切にテストする時間がありませんでした(たとえば、すべての翻訳文字列を更新する必要があるため、コードから文字列を自動的に抽出するための良い点としてこれを使用していましたビルドターゲットとしてxgettextなどを使用)
また、いくつかの「悪い」翻訳ポリシーも明らかになりました。たとえば、一度に間違った文字列を実行する代わりに、翻訳されたテキストフラグメントをつなぎ合わせます(たとえば、 "format(tr("%s、%s ")、format(tr(" %sは、 ")、object、count)、format(tr("%d total ")、number));から%dです。
これは、翻訳者にとって完全に役に立たない文字列になります。
"%NS"
「%sのものは%dです」
「合計%dのうち」
実際に単一の呼び出しとして変換する必要がある場合、抽出される文字列は次のようになります。
「%sの事柄は%dの合計のうち%dです」(またはfmtlibの方法では「{0}の事柄は{2}の合計のうち{1}です」)
私が収集できるものから、2つの異なるフォーマットサブシステムが必要です。
{fmt}
ベースのロギング(IMOは、絶えず変化する可能性のあるログメッセージを変換するメリットがほとんどなく、 boost::locale
介してそれらをルーティングするパフォーマンスに少し影響を与えるためです。boost::locale::format
(複数形をサポートしているため)。私はそれらを小さなステップで実装することを提案します:最初に{fmt}
切り替えてから、ローカライズ可能な文字列を処理します。
boost :: localeが実際に今後私たちにとってそれほど役立つかどうかはわかりません-静的翻訳データベースを備えた静的アプリケーションには最適ですが、メッセージデータベースにフックして新しいメッセージを追加できる場所を見つけるのに苦労しましたmods。
新しい翻訳ドメインに完全に新しいデータベースを追加することしかできないと思います。そうすると、/ all / modドメインを順番に試すようなことをせずに、文字列を翻訳するドメインを見つけようとして問題が発生します。一致するものを見つける
したがって、私の現在の計画は、各タスクを分離しようとすることです-あなたが言ったことと同様です:
私は上記のステージのほとんどすべてをさまざまな状態でローカルに持っています-それらを使用可能な状態にしようとすることはおそらく理にかなっています、そして今私はこの長い週末に少し時間がありますそれが私の次のタスクになると思います:)
それがすべて完了すると、新しい文字列を追加するmodがどのように機能するかについて心配し始めることができます
すべての/ translated /文字列を%printfスタイルから{fmt} / boost :: localeスタイルに変換します(現在、胸膜アノテーションなどがないため、機能的には同じだと思います)
実際には、それらは似ているだけです- boost::locale
は、1ベースのインデックス付けと大きく異なるフォーマット文法を備えています。 複数形でない場合は、 {fmt}
を使用します。これは、名前付き引数のサポートが、貴重なコンテキストを追加する翻訳者にとって良い助けになるためです。
Delay = {seconds}
Range = {meters:2.1}m.
複数形のサポートの方がはるかに価値があると思いますが。
ええ、私は最初に私を投げたインデックス作成を覚えています:)
TBHは今後、boost :: locale形式が適切だと思います。今後、modコンテキストの問題を修正できると確信しています。
または、少なくとも「次の」問題が見つかった場合、翻訳されたすべての文字列ははるかに適切な形式になり、翻訳されていない形式のテキストと混ざり合うことはありません。
また、正直なところ、UStringクラス全体はstd :: basic_stringの周りのヘルパーのセットである必要があります
すべてをstd :: string(IE std :: basic_string)に置き換えたいと思っています。
すでにシステムAPIでutf8を使用しているプラットフォームでテストする傾向があるため、ITは現在「発生」していますが、WindowsでASCII以外のパスを使用してファイル名を開くなど、今日何かを行おうとすると、現在は機能しないと思われます。