Androidアプリを国際化する
インターネットの世界は広大です。
開発されたAndroidアプリは、
ネットの力を使うことで全世界の人々が使えるのですから、
自分の作ったアプリを使ってくれる可能性があるユーザーの数は、計り知れません。
とはいえ、日本語のUIでアプリを作ってしまっては、
そのアプリを使えるユーザーは、日本語を使えるユーザーに限定されてしまいます。
Androidアプリを国際化する、なんていう仰々しいタイトルを打っていますが、
要はアプリを多言語対応すればよいのです。
多言語といっても、独語や仏語に対応する必要はなく、
とりあえず英語に対応していれば、(おそらく)何とかなります。
日本ほど、国民が英語にアレルギーを持っている国は、珍しいのではないでしょうか。
(そういう自分も英語苦手ですが…)
多言語対応するには?
Eclipseでプロジェクトを作成した時に勝手にできる、
hello worldをサンプルに話を進めます。
デフォルトの、"Hello world!"は英語として扱い、
これを日本語化することで、二言語対応を実現します。
英語の時は、"Hello world!"、日本語の時は"こんにちは!"と表示されるようにします。
Main Activityで、hello worldを描画しているのは下記の部分です。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
このファイルは、下記の場所に格納されています。
/res/layout/activity_main.xml
中身をのぞいてみます。
下記のようになっています。
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" />
ここで表示する文字列の参照先となっているファイルは、下記の場所にあります。
/res/values/strings.xml
このxmlファイルに、"hello world"という文字列が格納されていることが確認できます。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello_world">Hello world!</string> </resources>
では、どのように日本語対応を追加するのでしょうか。
このファイルにある"Hello world!"を"こんにちは!"に書き換えてしまっては、
英語の対応ができません。
Androidでは、OSの言語設定によって、アプリで表示される言語を変える仕組みが用意されています。
OSの言語が日本語なら、アプリで日本語用に用意した文字列が勝手に表示される、という感じです(便利!)
このような状態を作るためには、日本語用のリソースを別に用意し、
OSの言語設定によってどちらを表示させるかを変えればよいのです。
日本語対応を行うには、まず文字列リソースを作成するxmlファイルを作成します。
ここでは、ディレクトリ名が重要です。
/res/values-ja/strings.xml
このように、「values-ja」というディレクトリに、strings.xmlを作成します。
「values-ja」というディレクトリ名は、
日本語対応のルールとして、Androidで定められています
「ja」の部分には、ISO_639-1のコードを指定します。
このファイルに、下記のように記載することで、
OSの言語設定が日本語の場合に、"Hello world!"の部分を、"こんにちは!"と表示してくれるようになります。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello_world">こんにちは!</string> </resources>
つまりこれは、OSの言語設定が日本語の場合、
勝手に"value-ja"のリソースを使ってくれるということになります。
概念としては下記の図のような感じでしょうか。
各言語において、各表示項目の文字列を設定しておくことで、
OSの言語設定によって読出し先を変え、多言語対応を実現しています。
アプリ動作のためのソースコードを変える必要はないので、
非常にわかりやすい仕組みになっていると思います。
ブランチを使用したソフトウェア開発
お久しぶりになってしまいました。
私事でいろいろと環境の変化があったのですが、このブログもコツコツ続けていこうと思います。
さて、本日はブランチを使用したソフトウェア開発について触れたいと思います。
以前、メール堂々と「Brunch」と書いていたのを同僚に気付かれ、恥ずかしい思いをした思い出があります。
今回は、「遅い朝食(Brunch)」ではなく、「枝(Branch)」のほうの話題です。
ブランチとは
私は、現在gitを使用してAndroidのアプリ開発を行っています。
gitに関しては以前の記事で少し触れています。
Dropboxとgitを使ったソースコード管理 - 週末プログラマーのチラシの裏
gitのようなバージョン管理ツールを使用していく上で、欠かせないのがブランチの存在です。
ブランチとは、その名の通り、枝を意味しています。
下の図は、よく見るようなブランチの概念図ですが、わかりやすいので作ってみました。
枝(branch)は、この場合、Masterという幹(trunk)から派生しています。
ブランチ名について
上記のブランチ図の中で、各ブランチは、ブランチ名の通り下記のような目的でブランチされています。
- calendar カレンダーの実装を行う目的で作成されたブランチ
- alarm アラームの実装を行う目的で作成されたブランチ
- database データベースの実装を行う目的で作成されたブランチ
ここで使用されている名前は、主に実装対象の機能名などをつけています。
また、それぞれブランチ名にtopics/、tests/という名称がつけられていますが、この名称は、共同開発者とのルールの取り決めを行って決めています。
私たちの作成したルールでは、下記のようにシーン別にわけることにしています。
- topics/ 機能実装を行うブランチ
- tests/ お試しで実装を行ってみるためのブランチ
この後ろに、実装する機能名などをブランチ名としてつけることで、ブランチを作成した目的がある程度ブランチ名から理解ができる形になっています。
ブランチを活用する目的
ブランチを作成する目的ですが、例えば、上記のブランチ図にあるalarm機能、database機能、calendar機能を作成するときに、Master上ですべての機能実装を続けていくことにはリスクが生じます。
ある機能が要因で、開発対象物が動かなくなり、すべての機能の開発が停止してしまうというような事態が生じるかもしれませんし、複数人で同時に開発を行っている環境であれば、なおさらそのリスクが発生する確率が高まります。
こういったリスクを回避するために、ブランチを分けて開発することは、とても有効な手段となります。
各ブランチで開発を行い、実装が終了すると、ブランチをMasterへマージするという作業を行います。
この作業によって、Masterというtrunk(幹)に機能を入れていきます。
これを繰り返し、Masterに対してマージを重ねていくことで、機能が実装されていくことになります。
ブランチの運用ルール
私たちは下記のような簡単なルールを作成して、ブランチを使用した開発を行っています。
- 機能実装はtopics、テスト実装はtestsとする
- ブランチ名は直感的にわかりやすいものでOK
- 機能実装担当は各ブランチでテストを実行後、Masterにマージして再度テストをする
- 他の実装者がMasterにて動作確認を行い、問題なければ実装完了とする
こういった簡単なルールを作って活動することで、Masterブランチの品質確保や、不具合の早期発生を行うことができます。
今回はブランチの概念について記しましたが、次回はもう少しブランチについて掘り下げてみたいと思います。
はてなブログでシンタックスハイライトを使用する
私がこのブログをはてなで開設した理由の一つは、シンタックスハイライトが使用できることにメリットを感じたためなのですが、そのシンタックスハイライトの使用方法でハマったので、備忘録として記事にしておきます。
早速、こちらのページを参照してチャレンジしてみたのですが、下記のようにシンタックスハイライトを使用してもプレビュー時に反映されていませんでした。
>|java| プログラムの内容 ||<
これで書式は間違っていないハズ…ということで、「まさか、はてなダイアリーのみ対応ではてなブログは非対応?」と思いいろいろ調べてみたのですが、どうも違う様子。
そんなこんなで試行錯誤を繰り返していたとき、ふとブログの設定画面を開いてみたところ、やっと原因がわかりました。
原因は、はてなブログの編集方法を見たままモードにしていたからでした。
ブログの《設定》から、「編集モード」の設定を《はてな記法モード》に設定したところ、下記のようにシンタックスハイライトが有効になりました。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
こんな単純なことに気づくのに、結構時間がかかりました…
Dropboxとgitを使ったソースコード管理
現在、Androidのアプリを作成を通じてJAVAの学習を進めていますが、そんな中、作成中のソースコードを知人と共有したいと思うことがありました。
ソースコードを共有するには様々な方法があると思いますが、真っ先に思い浮かんだのは、巷で流行っている(?)GitHubの利用でした。
ただ、GitHubを無料で使用した場合では、知人”のみ”にソースコードを公開することができません。
公開範囲が全世界の方々になってしまうのは、少し抵抗感があります。
・知人と手軽に、かつ限られた公開範囲でソースコードを共有する
というこのお題ですが、Dropboxとgitを使用した仕組みを導入してみましたので、やり方を記録しておきます。
◆ 環境
OS:Windows7 64bit
クライアントとしてGUIでgit操作が可能な、Tortoisegitを使用します。
◆ 必要なソフトのインストールなど
・msysgitをインストール
※ 今回使用したVersion:Git-1.8.4-preview20130916
Windowsでgitを使用するために必要です。
下記よりダウンロードしてインストールすればOK。
・Tortoisegitをインストール
※ 今回使用したVersion:TortoiseGit-1.8.6.0-64bit
こちらも下記よりダウンロードしてインストール。
http://sourceforge.jp/projects/tortoisegit/
GUIでのインストールなので簡単です。
・Dropboxをインストール
※ 今回使用したVersion:Dropbox 2.4.7
これまた下記よりダウンロードしてインストール。
また、Dropboxのアカウントを作成します。
今回のケースでは、ソースコードを共有する人と同じid/passwordを使用します。
◆ Dropbox上でリモートリポジトリを作成する
ここが結構ポイントで、ハマりました…
例として、下記のフォルダをリモートリポジトリにするとします。
C:/Users/user_name/Dropbox/Private
まず、このフォルダに「test.git」を作成します。
その後、「test.git」内でリポジトリを初期化します。
「test.git」内で右クリック→《Git リポジトリをここに作成》を選択し、「Bareを生成」にチェックを入れて《OK》を押下すれば完了です。
(ここで「Bareを生成」にチェックを入れないと、後々ローカルからリモートリポジトリへプッシュする際に、エラーが発生してプッシュできません)
◆ Dropboxからローカルへリポジトリをクローンする
ローカルで使用するフォルダを下記とします。
C:\workspace
このフォルダ内で右クリックし、《Gitクローン》を選択します。
URLに、先ほど共有リポジトリを作成したフォルダを指定します。
今回の場合は下記になります。
C:/Users/user_name/Dropbox/Private/test.git
ディレクトリに、ローカルで使用するディレクトリを指定します。
C:\workspace\test
OKを押下すれば、ローカルにクローンされます。
◆ ファイルを追加し、コミット&プッシュしてみる
ローカル環境で適当なファイルを作成し、追加&コミット&プッシュしてみます。
まず、ローカルの作業ディレクトリに「test.txt」を作成します。
作成したら、追加とコミットを行います。
作成した「test.txt」上で右クリックし、
《Tortoisegit》 → 《追加》を選択 → 表示されたダイアログにて「test.txt」が選択されていることを確認後、《OK》を押下します。
次に、「test」フォルダ内にて右クリックをし、
《Git コミット -> master》を選択します。
メッセージ欄には、変更履歴を記載します。
gitでは、下記のように記載するのがお作法のようです。
-----------------------------------
1行目:変更点の概要
2行目:空行
3行目:変更点の詳細
-----------------------------------
メッセージを追加したら、《OK》を押下してコミットは終了です。
コミットが終了したら、リモートリポジトリへプッシュします。
「test」フォルダ内で右クリックを行い、
《Tortoisegit》 → 《プッシュ(リモートへ反映)》を選択します。
もともとDropboxからクローンしてきたプロジェクトであれば、
デフォルト設定のまま《OK》を選択すると、プッシュは完了します。
プッシュが完了すれば、Dropboxのアカウントを共有した人が、同じソースコードをローカルにクローンすることができます。
◆ まとめ
・Gitサーバーへ接続するために必要な設定を、Dropboxを使用することで簡素化
・通常、Gitを使用する際に必要なコマンドライン操作が不要 (Tortoisegitの使用)
DropboxとTortoisegitを使用すれば、難しい設定をすることなく、気軽にソースコードを限られた範囲内で共有することができます。
非常に簡単にソースコードを共有できる&管理できる方法ですね。
◆ 参考にさせていただいたサイト
サルでもわかるGit入門
http://www.backlog.jp/git-guide/
Git+Dropboxでのチーム開発入門
http://www.slideshare.net/himaratsu/git-14042522
Raspberry piにXBMCを入れて、DMR的に使ってみる
(「はじめに」の次のエントリーがいきなりプログラミングの話ではないのですが…)
読書などをしている際に、ちょっと音楽聴きたいなと思うことがあります。
私はCDコンポの類を持っていないため、手軽に音楽を鳴らせないのがちょっと不便だなと思っていました。
これを解決するための策としては
・PCを立ち上げて音楽を聞く
→ そこまでするのはちょっと…
・スマートフォンで音楽を聞く
→ イヤホンはちょっとなぁ、スピーカーも音悪いし
スマートフォンはiPhone4、ArrowsZ、Xperia Z1があるので、
これを活用した音楽再生はできる
・Bluetoothのスピーカーを買う
→ いろいろと家電量販店を回ったけど、決心つかず…
・アンプを活用する
→ 自分はONKYOのアンプを使用しているので、
アンプにiPhoneつなげれば聞けるじゃん!と思って調べてみたところ、
iPhoneのドックお高い…
Bluetooth対応スピーカーやDMR機能付きのアンプがあれば、
iPhoneからお手軽に音楽を再生できるのに、、、
と家電量販店を回り、絶望に明け暮れていたわけですが、
ふと、Raspberry piの存在を思い出しました。
んで、ググってみたところ、DMRになるじゃないですか。Raspberry pi。
DMRになれば、AMPにHDMIに接続するだけで、手元のスマホから手軽に音楽が聴ける…
ということで、さっそくやってみました。
参考にしたのはこちら
30分でRaspberry PiからXBMCメディアセンターを作る方法
http://www.lifehacker.jp/2013/02/130202raspberry_pi_xbmc.html
Raspbmc入りのOSをインストールするだけ。
(自分は今のところ他の用途で使用するつもりがないので、迷わずこれでした)
上記ページの設定を少し参考に弄り、
あとは《システム》→《設定》から、
AirPlay《XBMCのAirPlayコンテンツ受信を許可する》をON
で終わりです。
うちでは、音楽ファイルを全てNASに格納しているので、
NASをDMSとして、DMCでXBMC(DMR)に音楽を飛ばす、という形ですね。
で、試してみた結果。
* ○○ができない、というのは私が単純にやり方や操作を知らないだけかもしれません…
* その場合はご指摘いただければと思います…
・iPhone4(iOS7) + AirPlay
この音楽再生のケースでは、NASを使っていません。
iPhone4内にあるコンテンツを再生させていますが、重い…とにかく重い…
音がとびとびになってNG。
そもそも、iPhone4にiOS7の時点で動作カクカクしてますしね。。。
・iPhone4(iOS7) + Dixim DMC + NAS
遠い昔、無料期間中にDLしておいたDixim DMCが役に立つ日が来るとは!
NASのコンテンツブラウズも問題なく、使用感はいいです。
シークも問題なく動作し、XBMCの音量も制御可能。
ただ、Playlistに加えた次の曲へ自動で遷移してくれません。
これでは他のことに集中しながら音楽が流せませんね…
また、Playlistが複数保存できません。
・iPhone4(iOS7) + Media:Connect + NAS
再生、シーク、次曲への自動遷移、音量調整どれも可能です。
ただ、広告がデカい。
ブラウズの際には、ブラウズで使用する画面領域が半分もありません。
無料版なので仕方ないですが…
また、コチラもPlaylistが複数保存できないです。
Androidアプリも使用してみることに。
NASのコンテンツブラウズは全く問題なし。
Xperia Z1を使用しているせいか、非常にブラウズ画面が見やすい。
シークOK、XBMCの音量の制御も可能ですが、消音か音を出すか、の2段階の様子。
また、たまに消音にした後、音量を操作しても、無音のまま復帰できないことがありました。
一つ革新的だったのが、Playlistが保存できること!
ただ、Playlistに加えた次の曲へ自動で遷移してくれなかった…(致命的)
・Xperia Z1 + Walkmanアプリ (* 2.0.A.0.40+7.15.A.0.0)
* インストール済のWalkmanアプリが2種類あったので、どちらもVersionを載せています
これがある意味本命だったのだけれど、、、
Xperia Z1に保存しているコンテンツを、WalkmanアプリでThrowするというもの。
PlaylistもWalkmanアプリで作ればそれを使えるし、一番手軽です。
しかし…
コンテンツの再生はできますが、次のコンテンツに遷移するたびに「他のセッションが開始された為、メディアコンテンツを表示できませんでした」と言われ、シークができない+シークバーも動かない、という状態になってしまい、再生中にいきなり再生が止まります。
また、次コンテンツへの遷移を繰り返していると、「ロードしています」から帰ってこない状態に陥ってしまい、まともに使えませんでした…
と、記事を書いていたらWalkmanアプリのUpdateが!
ということで早速試してみましたが、動作は変わりませんでした…
(Update後のVersionは、2.0.A.0.40+8.0.A.0.4)
・PC + iTunes + AirPlay
PCを立ち上げるのもなぁ…と書いておいてアレですが、
一応試してみたので結果を記載。
結論から言うと、全く問題ありません。
iTunesで作成したPlaylistが使えるので、不満なし。
PCの使用用途によって、音声の出力先をPC用スピーカーとAMPに切り替えていたので、今後はその手間が省けそうです。
ということで、しばらくはiPhoneアプリのDixim DMCにお世話になることになりそうです。
Walkmanアプリが対応してくれれば一番なのですが…
はじめに
ソフトウェアを開発をしてみたい、ソースコードを書いて何か作りたい、
そんな思いから、プログラムの勉強をはじめました。
当ブログでは、そんなプログラミングをしたことがない人間が、
勉強していくうえで困ったことやわからなかったことを中心に、
記録を残していければなと思っています。
プログラムとして学習する言語は、JAVAとなります。
具体的には、Androidアプリの作成を通して、
プログラムが動くさまを実際に確認しながら、
勉強が進めていければと思っています。
直近としては、
「2014年内にAndroidアプリを作成し、Playストアに公開する」
という目標を掲げ、進めていこうと思います。
また、自分自身で勉強している際に、よくネットで検索をするのですが、
他の方のブログが貴重な情報源になることが多く、
私もブログも、少しでも誰かのお役にたてればと思っています。