515 Views
December 17, 14
スライド概要
potatotips #12で発表した資料の加筆修正版です。
Androidバージョン
http://www.slideshare.net/tomoakiimai2/us-localization
SwiftとLEGOとBluetooth LEが好きなプログラマ
iOS版 グローバル対応の罠と技 株式会社メルカリ 大庭 慎一郎
大庭 慎一郎 フリマアプリ「メルカリ」 iOSエンジニア ooba / bricklife
メルカリ 2013年7月 JP版リリース 2014年8月 US版リリース
グローバル対応
グローバル対応の方針 • まずはUS、そのあとヨーロッパなども視野に • 海外取引禁止。国ごとにDBやサーバをわける • 言語、通貨、日時、決済、配送の違いを吸収
やったこと • 別バイナリ化 • パッケージ直接編集 • ターゲットとxcconfig • 日時と通貨の書式 • リージョン管理 • テキスト入力設定 • 翻訳(AGi18n) • 翻訳(Transifex)
1バイナリ vs 別バイナリ
別バイナリを採用 • 起動直後からその国ごとの設定で動けるように • 端末のIPアドレスや地域設定は参考にしない • US版には日本語リソースを含めない(その逆も) • 配布するストアも絞る • 1プロジェクトでターゲットを増やして対応
ターゲット • 国 環境の数だけターゲットを作成 • ターゲットの数だけxcconfigを作成
xcconfig
あとで国を切り替えできる ようにしたくなるかも…
リージョンクラスの導入 • APIやHTMLのURL、決済方法や配送方法、通貨や日 時のフォーマッタ、各種IDなどを透過的に管理 • 「どの国か?」ではなく「コンビニ決済を使えるか?」 など意味的に判断することでifの泥沼化を回避 • 実装上はリージョンを動的に切り替えられるようにし ておいて、ビルド時に1つのリージョンだけ有効に [[Region currentRegion] canUseCvs]
翻訳
翻訳 • 日本語で作っていたものを英語に翻訳 • なるべく標準の仕組みで翻訳したい • 当初ターゲットがiOS 5だったので方法が限られる AGi18nとTransifexが活躍
AGi18n • https://github.com/angelolloqui/AGi18n • ツールとライブラリのセット • xib、storyboard、mから翻訳対象をかき集めて一 つのLocalizable.stringにしてくれる • UILabelやUIButtonなどのawakeFromNibをフッ クして翻訳を反映してくれる
Transifex • https://www.transifex.com/ • AGi18nで一つになったLocalizable.stringをこれ で管理・翻訳する • jaのLocalizable.stringをTransifexにpush • Transifex上で翻訳後enのLocalizable.stringをpull • 翻訳担当者がWeb上で翻訳するだけ
Transifexの罠 • あるブランチでpushした翻訳対象が、他のブラン チからのpushで消えたりする • masterでpush&pullすることにして解決 • 現在はLocalizable.stringだけ別リポジトリで管理 することにした 詳しくは弊社Androidエンジニアの資料を参照 http://sssslide.com/www.slideshare.net/tomoakiimai2/us-localization
バンドルするリソースは、 JP版は日本語だけ、 US版は英語だけにしたい
Why? • アプリのサイズを小さくしたい • USだけにしかない画面を日本語化したくない • ユーザ同士安心してやりとりしてもらうため、 その国の公用語を使える人だけに使ってもらい たい
でも… ローカライズされたリソース単位での バンドル制御はできない
パッケージを直接操作 • Build PhasesでCopy Bundle Resourcesのあと に必要のないリソースを消してしまえばいい • 例えばRun Scriptで以下を実行 rm -Rf "$TARGET_BUILD_DIR/$EXECUTABLE_FOLDER_PATH/en.lproj" 参考 https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/ XcodeBuildSettingRef/1-Build̲Setting̲Reference/build̲setting̲ref.html
書式
書式は罠がいっぱい
日時の書式 • 24時間表記のON/OFFや西暦/和暦でややハマる • でもそんなに大変じゃない フォーマット 出力 JP yyyy/MM/dd HH:mm 2014/12/31 14:50 US MM/dd/yyyy KK:mm aa 12/31/2014 02:50 PM
通貨の書式 • 一方、通貨の書式は罠だらけ • 通貨単位の位置、小数点、桁区切り、マイナス表記 • QAに「iOS 8でマイナス表記が仕様どおりじゃない」 とバグ扱いされたりします 参考 http://homepage1.nifty.com/tabotabo/ccc/syosu.htm
通貨の書式 • 例えば、地域をアメリカ合衆国にして、言語を英語 とイタリア語で切り替えた場合 • 桁区切りがピリオドで、小数点がカンマで、通貨単 位が後ろにくる…!
通貨の書式 • Decimal Padの小数点も変わるよ!
USではセントを小数点以下 の数値として入力させたい • 内部的にはセントで扱っている($1.00=100) • しかし、小数点がピリオドであることを前提に入力 された文字列を解析すると、書式設定によっては正 しく解析できない • 初期ver.でこれをやってしまいお問い合わせ多数orz
NSNumberFormatterが 助けてくれます • 現在の書式で使われている小数点や桁区切りの文字 を教えてくれる @property (copy) NSString *decimalSeparator; @property (copy) NSString *currencyDecimalSeparator; @property (copy) NSString *groupingSeparator; 参考 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/ NSNumberFormatter̲Class/index.html#//apple̲ref/occ/instp/NSNumberFormatter/ currencyDecimalSeparator
英語圏のテキスト入力の設定 • 自動大文字入力はたいていONにしている • 自動修正もたいていONにしてる • スペルチェックもたいていONにしている • 日本語圏だと全部OFFにしがち
テキスト入力系UIの設定を きちんとしよう • 自動大文字修正や自動修正、スペルチェックは入力 UIごとにON/OFFできる • 場所によって単語や文章の先頭が大文字になるよう にしよう(Words or Sentences) • メールアドレスやパスワードは全部OFFにしよう • 動作検証中は設定で自動修正系を全部ONにしよう
自動修正系の設定
そのほか • 複数形対応 • 大文字、センタリング、斜体のセンス • コミュニケーション • などなど
おわり 何かあれば気軽に @ooba まで エンジニア募集中!