Openapoc: tinyfmtをfmtに置き換えます(https://github.com/fmtlib/fmt)

作成日 2019年09月16日  ·  9コメント  ·  ソース: OpenApoc/OpenApoc

fmt:

  • 位置引数を使用して変換を容易にします(たとえば、文字列format( "Do {0} to {1}"、thing1、thing2)を "Do {1} to {0}"として "変換"して、センチメント
  • 現在ドラフトc ++ 20標準に含まれているため、まもなく標準ライブラリに含まれる可能性が非常に高くなります(依存関係が少なく、使用範囲が広く、プログラマーの露出が適切です)。
  • コンパイル時間の短縮
  • 実行時間の短縮

tinyformatと比較して。

Enhancement Feature Request

全てのコメント9件

これは取り組んでいますか?

最初のポートはローカルで機能していますが、それを磨いて適切にテストする時間がありませんでした(たとえば、すべての翻訳文字列を更新する必要があるため、コードから文字列を自動的に抽出するための良い点としてこれを使用していましたビルドターゲットとして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つの異なるフォーマットサブシステムが必要です。

  1. {fmt}ベースのロギング(IMOは、絶えず変化する可能性のあるログメッセージを変換するメリットがほとんどなく、 boost::locale介してそれらをルーティングするパフォーマンスに少し影響を与えるためです。
  2. ローカライズ可能なUI文字列の場合はboost::locale::format (複数形をサポートしているため)。

私はそれらを小さなステップで実装することを提案します:最初に{fmt}切り替えてから、ローカライズ可能な文字列を処理します。

boost :: localeが実際に今後私たちにとってそれほど役立つかどうかはわかりません-静的翻訳データベースを備えた静的アプリケーションには最適ですが、メッセージデータベースにフックして新しいメッセージを追加できる場所を見つけるのに苦労しましたmods。

新しい翻訳ドメインに完全に新しいデータベースを追加することしかできないと思います。そうすると、/ all / modドメインを順番に試すようなことをせずに、文字列を翻訳するドメインを見つけようとして問題が発生します。一致するものを見つける

したがって、私の現在の計画は、各タスクを分離しようとすることです-あなたが言ったことと同様です:

  • すべてのログと内部文字列に{fmt}を使用します(IDなどを構築するためにいくつかの場所で使用されます-明示的に翻訳したくないもの)
    -これには、%printfスタイルから{fmt}への大幅な文字列の変更が含まれますが、理想的には翻訳に影響を与えません。
  • xgettextを使用して.pot生成を自動的に接続します
    -これにより、「悪い」翻訳作業の多くが浮き彫りになる可能性があります-openapocの文字列の構成が場所によって大きく異なるにもかかわらず、OG.exeで抽出された文字列を「ゴールデン」翻訳メッセージソースとして使用しなくなったようです。
  • 「悪い」翻訳文字列の構成(上記の例のように)、翻訳されるべきではない文字列(ログ、内部ID文字列など)、または翻訳されるべきであるが翻訳されない文字列(IEだけで直接)のソースを確認します:: format()を使用)
    -生成された.potで明らかなように、これは前の手順で簡単になります。
  • すべての/ translated /文字列を%printfスタイルから{fmt} / boost :: localeスタイルに変換します(現在、胸膜アノテーションなどがないため、機能的には同じだと思います)
    -これにより、現在のほとんどすべての翻訳作業が無効になります-したがって、ステージ間で翻訳の更新を行う価値はないでしょう。

私は上記のステージのほとんどすべてをさまざまな状態でローカルに持っています-それらを使用可能な状態にしようとすることはおそらく理にかなっています、そして今私はこの長い週末に少し時間がありますそれが私の次のタスクになると思います:)

それがすべて完了すると、新しい文字列を追加する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の周りのヘルパーのセットである必要があります-しかし、それはc ++ 20まで確実に存在しないように見えます。

すべてをstd :: string(IE std :: basic_string)に置き換えたいと思っています。)、しかし、「既知のutf8」と「バイトの配列」の型安全性は失われますが、とにかく実際にそれを使用しているかどうかはわかりません。 インターフェイスには注意が必要ですが、今日は注意していません。実際の変換を行わずに.cStr()/。str()を「getout」として呼び出すだけです。

すでにシステムAPIでutf8を使用しているプラ​​ットフォームでテストする傾向があるため、ITは現在「発生」していますが、WindowsでASCII以外のパスを使用してファイル名を開くなど、今日何かを行おうとすると、現在は機能しないと思われます。

このページは役に立ちましたか?
0 / 5 - 0 評価