俺のstrings.xmlの管理方法

strings.xmlは規模が大きくなるにつれて行数も多くなり、管理が難しくなりがちです。
しかし、GoogleのサンプルやOSSのリポジトリはそこまで大規模ではないため、strings.xmlのnameの命名やファイルの分割など、どのようにすべきなのか掴みにくい部分でもあります。

そこで、今回は自分なりのstrings.xmlの管理方法の指針をまとめておこうと思います。

**と思ったのですが、実は間に合わず書きかけの状態です。。。**
本当にすみません。明日中にはきちんと整理してまとめておきます。

# 翻訳の必要のないものはファイルを分ける
strings.xmlは、複数のファイルに分割することができます。
翻訳の必要のないstringsは、ファイルを分けて管理するとよいです。
例えば、以下のように役割ごとに分けることができます。

## strings_no_translate.xml
アプリ名など、翻訳の必要のないテキストをまとめます。これは、[Twidere-Android](https://github.com/TwidereProject/Twidere-Android/blob/master/twidere/src/main/res/values/strings_no_translate.xml)を参考にしています。

```strings_no_translate.xml
<string name="app_name" translatable="false">Twidere</string>
```

## fonts.xml
フォントを指定する場合、フォントのテキストをまとめておきます。

## api_keys.xml
FacebookSDKなどを使う場合、stringsでapi_keyを管理します。


## transition_names.xml
ActivityTransitionのsharedElementを使う場合、transitionNameをまとめておきます。
これは、[android-topeka](https://github.com/googlesamples/android-topeka/blob/master/app/src/main/res/values/transition_names.xml)を参考にしています。


```transition_names.xml
<string name="transition_avatar">AvatarTransition</string>
```

sharedElementについてはこちらがわかりやすいです。
[Android　Activity Transitions を実装する](http://y-anz-m.blogspot.jp/2014/12/androidactivity-transitions.html)

個人的には、翻訳が必要なものは過度にファイルを分割しない方が管理しやすくていいと思います。


# nameの命名規則

## 基本は機能単位のprefix
機能単位でprefixをつけるようにしています。
画面単位でもいいのですが、さすがに細分化されすぎてしまうので機能ごとに分けています。
他の画面で似たような文言があっても、無理に使い回しはしません。経験上、その方が後々変更しやすいです。
これは、[android-best-practices](https://github.com/futurice/android-best-practices#resources)を参考にしていますが、私はドットではなくアンダースコアで区切るようにしています。


## 共通のテキスト
明らかによく使うテキストは、共通のものとして上の方においておきます。
例えば、以下のようなテキストです。

```
<!-- Commons -->
<string name="open">Open</string>
<string name="close">Close</string>
<string name="ok">OK</string>
<string name="cancel">Cancel</string>
<string name="next">Next</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="retry">Retry</string>
<string name="back">Back</string>
<string name="edit">Edit</string>
<string name="write">Write</string>
<string name="save">Save</string>
<string name="select">Select</string>
<string name="logout">Logout</string>
<string name="resend">Resend</string>
<string name="send">Send</string>
<string name="loading">Loading</string>
<string name="sending">Sending</string>
```

# 記述ルール
わりとよくある記述ルール

## CDATAの使用
長いテキストは、CDATAを使います。

```
<string name="cdata_test">
    <![CDATA[
        Hello, I'm konifar. I'm japanese.
        I like Japanese animation movie.
    ]]>
</string>
```

## 置換文字
`%1$d` などの置換文字をつかいます。
http://developer.android.com/intl/ja/guide/topics/resources/string-resource.html#FormattingAndStyling

## 複数形
zero, one, otherなど、複数形はpluralsを使ってまとめます。
http://developer.android.com/intl/ja/guide/topics/resources/string-resource.html#FormattingAndStyling
http://stackoverflow.com/questions/3656371/dynamic-string-using-string-xml

## スタイルとフォーマット
http://developer.android.com/intl/ja/guide/topics/resources/string-resource.html#FormattingAndStyling

## ellipsis
`...` は使わず、TextViewやEditTextのellipsisで表現します。


## コメント
strings には、commentやdescriptionがつけられますが、基本的には使用しません。
ほとんどの場合、nameから推測し、コードを読むだけで十分だからです。
ただし、外部に翻訳を依頼する場合には意識的につけるようにした方がいいかもしれません。

https://www.getlocalization.com/docs/file-formats/android-strings-xml/

```
<string name="menu_stop" comment="After item Start in Menu">Stop</string>
```

# メンテナンス
* 文字置換はわりと安心して使える。
* チェックはtranslationエディタでやる。
* ソートしたいけど、name順にソートしたいけどできるのか？
http://stackoverflow.com/questions/22946302/how-to-alphabetically-sort-code-in-xml-file-inside-intellij-idea-13-for-android
http://blog.jetbrains.com/idea/2013/10/rearrange-attributes-in-android-xml-files-with-intellij-idea-13/



# 参考リポジトリ
* [u2020](https://github.com/JakeWharton/u2020/blob/master/src/main/res/values/strings.xml)
* [Qiitanium](https://github.com/ogaclejapan/Qiitanium/blob/master/qiitanium/src/main/res/values/strings.xml)
* [Android-Helium](https://github.com/gfx/Android-Helium/blob/master/app/src/main/res/values/strings.xml)
* [Twidere-Android](https://github.com/TwidereProject/Twidere-Android/blob/master/twidere/src/main/res/values/strings.xml)
* [android-topeka](https://github.com/googlesamples/android-topeka)
* [iosched](https://github.com/google/iosched/blob/master/android/src/main/res/values/strings.xml)
* [astrid](https://github.com/todoroo/astrid/tree/master/astrid/res)
* [android-best-practices](https://github.com/futurice/android-best-practices)