Android、PhraseApp、およびファイル-または貧しいAndroid回線について一言

Androidプラットフォームで作業する場合、多くの場合、文字列定数string.xmlを入力する必要があります。 すべては何もありませんが、Androidがこれらのファイルのコンテンツに課すルールは非常に限られています。 たとえば、アポストロフィ文字はスラッシュでエスケープする必要があるなど、明白なものもありますが、XML形式のデバイスとAndroid機能の両​​方に関連付けられているものもあります。 これらの機能については、以下の記事で説明します。



したがって、テキストファイル、iOS PLIST、またはExcelドキュメントの形式で顧客から受け取った一連の行があるとします。 私の場合、これらはPhraseAppからプロジェクトにインポートされた文字列でした。 名前フィールドは、ロケールとPhraseAppルールセットの開発者によって指定された名前に基づいて自動的に入力されます。 制限がそれほど多くない他のプラットフォームでは、エクスポートが成功し、マルチプラットフォーム環境での開発とローカリゼーションが大幅に高速化されることに注意してください。 残念ながら、AndroidStudioを使用して行エラーを検索することは、多くのバージョンと同じくらい不便です。スタジオはXMLでエラー行番号を表示しないため、Eclipseは疲れた開発者を支援できます。 したがって、落とし穴をより詳しく知ることができます。



名前のスペース





<string name="confirm exit">Are you sure?</string>
      
      





確認と終了の間のスペースが無効です。アンダースコアに置き換えてください



 <string name="confirm_exit">Are you sure?</string>
      
      







名前のドット





一般に、名前のドットは有効です;環境はオプションを受け入れて幸せです



 <string name="gender.male">Male</string>
      
      





しかし、悪魔は、ご存知のとおり、詳細にあり、名前にドットを含む文字列または複数の配列を収集しようとすると、次のようなエラーが発生します

アイテムの親の取得エラー:指定された名前「年齢」に一致するリソースが見つかりませんでした。



  <string-array name="age.array"> <item>0-13</item> <item>14-18</item> <item>19-21</item> <item>22+</item> </string-array>
      
      





すべての文字列配列と複数形について、名前のポイントを同じ下線に変更します



  <string-array name="age_array">
      
      







名前のJavaキーワード





これは完全に明らかではありませんが、名前にJavaキーワードを使用することはできません。 次の行では、プロジェクトをまとめることはできません。



 <string name="else">Else</string>
      
      





方法は同じです-_elseの先頭にあるアンダースコアをelseに指定すると、プロジェクトが再構築されます。



フォーマットされた出力





出力をフォーマットすると、ソースコードが読みやすくなりますが、ここで問題が発生します。 たとえば、fromとtoの時間など、2行以上の値を1行で同時に出力します。 エラーが発生します

非定位置形式で指定された複数の置換。 formated = "false"属性を追加するつもりでしたか?



  <string name="time_to_time">Time from %s to %s</string>
      
      





書式設定された属性= "false"を追加すると状況は修正されますが、複数形と文字列配列が残っているため、例を複雑にして収集しようとしています。



  <plurals name="api_arror"> <item quantity="one">Error %s occured</item> <item quantity="other">%s errors ocurreds in %s</item> </plurals>
      
      





一度に2つのエラーが発生します

非定位置形式で指定された複数の置換。 formated = "false"属性を追加するつもりでしたか?

タグが見つかりました</ item> </ plurals>が「属性ですか?」



書式設定された= "false"属性を追加しても、すでに何も修正されませんが、Googleは、パラメーターがシリアル番号で設定される必要があることをお勧めします。 原則は単純で、パラメーターには1から始まる番号が付けられ、ドル記号が使用されます。 最初のパラメーターでは、置換は%1 $ sになり、2番目のパラメーターでは次の%(i + 1)$ sになります。 正しい記録



  <plurals name="api_arror"> <item quantity="one">Error %s occured</item> <item quantity="other">%1$s errors ocurreds in %2$s</item> </plurals>
      
      







PhraseAppに戻ると、現在のバージョンのプラグインを使用する場合、Androidの特定の要件を考慮せずに行が作成された場合、上記のエラーはすべて不注意な開発者を待っています。 これらのエラーは、リソースが更新されるたびに修正する必要があります。 これは明らかに非効率的です。 オートメーションは頼みます。 残念ながら、私はsedの正しいスクリプトを書くことに成功しませんでした。 さらに、Windowsユーザーはこのsedを探して起動パスに追加することを望んでいません。



別の方法として、Javaで文字列を操作するための別のバイクを紹介します。 プロジェクトはオープンで、 GitHubにあります 。 すべてのコードはOOPを無視して1つのファイルに収められており、string.xmlの作業はDOMまたはSAXなしで額に沿って行われます。 ユーティリティには3つの操作モードがあります:ディレクトリを入力に渡すことにより、strings.xmlという名前のファイル内のすべてのサブディレクトリのすべての行を処理します。2つのファイルを入力します。 開始するには、アセンブルされたユーティリティをEclipseまたはAndroidStudioのルートに配置し、パラメーターをドットとして実行します。



java -jar AndroidCleanFixXml.jar。



PhraseAppユーザーの場合、ユーティリティのソースコードの編集が失敗する場合があります。 多くの場合、ロケールを詰め込んでいる人は、%{location}-%{duration}の形式でフォーマットされた出力用のテンプレートを作成します。 一般にどのタイプのデータが置換されるかを理解することは不可能であるため、コードには3つの静的定数PHRASE_FLOAT、PHRASE_DECIMAL、およびPHRASE_STRINGがあります。 ローカライズファイルで見つかったすべての置換は、定数に手動で追加する必要があります。



操作中に一時ファイルは作成されません。そのため、使用する前に、バックアップを覚えておくか、リポジトリにコミットしてください。 それを楽しんで、githubで問題を書いてください、私は可能な限りそれを修正しようとします。



All Articles