iOS版グローバル対応の罠と技

510 Views

December 17, 14

スライド概要

potatotips #12で発表した資料の加筆修正版です。

Androidバージョン
http://www.slideshare.net/tomoakiimai2/us-localization

profile-image

SwiftとLEGOとBluetooth LEが好きなプログラマ

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

iOS版 グローバル対応の罠と技 株式会社メルカリ 大庭 慎一郎

2.

大庭 慎一郎 フリマアプリ「メルカリ」 iOSエンジニア ooba / bricklife

3.

メルカリ 2013年7月 JP版リリース 2014年8月 US版リリース

4.

グローバル対応

5.

グローバル対応の方針 • まずはUS、そのあとヨーロッパなども視野に • 海外取引禁止。国ごとにDBやサーバをわける • 言語、通貨、日時、決済、配送の違いを吸収

6.

やったこと • 別バイナリ化 • パッケージ直接編集 • ターゲットとxcconfig • 日時と通貨の書式 • リージョン管理 • テキスト入力設定 • 翻訳(AGi18n) • 翻訳(Transifex)

7.

1バイナリ vs 別バイナリ

8.

別バイナリを採用 • 起動直後からその国ごとの設定で動けるように • 端末のIPアドレスや地域設定は参考にしない • US版には日本語リソースを含めない(その逆も) • 配布するストアも絞る • 1プロジェクトでターゲットを増やして対応

9.

ターゲット • 国 環境の数だけターゲットを作成 • ターゲットの数だけxcconfigを作成

10.

xcconfig

11.

あとで国を切り替えできる ようにしたくなるかも…

12.

リージョンクラスの導入 • APIやHTMLのURL、決済方法や配送方法、通貨や日 時のフォーマッタ、各種IDなどを透過的に管理 • 「どの国か?」ではなく「コンビニ決済を使えるか?」 など意味的に判断することでifの泥沼化を回避 • 実装上はリージョンを動的に切り替えられるようにし ておいて、ビルド時に1つのリージョンだけ有効に [[Region currentRegion] canUseCvs]

13.

翻訳

14.

翻訳 • 日本語で作っていたものを英語に翻訳 • なるべく標準の仕組みで翻訳したい • 当初ターゲットがiOS 5だったので方法が限られる AGi18nとTransifexが活躍

15.

AGi18n • https://github.com/angelolloqui/AGi18n • ツールとライブラリのセット • xib、storyboard、mから翻訳対象をかき集めて一 つのLocalizable.stringにしてくれる • UILabelやUIButtonなどのawakeFromNibをフッ クして翻訳を反映してくれる

16.

Transifex • https://www.transifex.com/ • AGi18nで一つになったLocalizable.stringをこれ で管理・翻訳する • jaのLocalizable.stringをTransifexにpush • Transifex上で翻訳後enのLocalizable.stringをpull • 翻訳担当者がWeb上で翻訳するだけ

17.

Transifexの罠 • あるブランチでpushした翻訳対象が、他のブラン チからのpushで消えたりする • masterでpush&pullすることにして解決 • 現在はLocalizable.stringだけ別リポジトリで管理 することにした 詳しくは弊社Androidエンジニアの資料を参照 http://sssslide.com/www.slideshare.net/tomoakiimai2/us-localization

18.

バンドルするリソースは、 JP版は日本語だけ、 US版は英語だけにしたい

19.

Why? • アプリのサイズを小さくしたい • USだけにしかない画面を日本語化したくない • ユーザ同士安心してやりとりしてもらうため、 その国の公用語を使える人だけに使ってもらい たい

20.

でも… ローカライズされたリソース単位での バンドル制御はできない

21.

パッケージを直接操作 • 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

22.

書式

23.

書式は罠がいっぱい

24.

日時の書式 • 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

25.

通貨の書式 • 一方、通貨の書式は罠だらけ • 通貨単位の位置、小数点、桁区切り、マイナス表記 • QAに「iOS 8でマイナス表記が仕様どおりじゃない」 とバグ扱いされたりします 参考 http://homepage1.nifty.com/tabotabo/ccc/syosu.htm

26.

通貨の書式 • 例えば、地域をアメリカ合衆国にして、言語を英語 とイタリア語で切り替えた場合 • 桁区切りがピリオドで、小数点がカンマで、通貨単 位が後ろにくる…!

27.

通貨の書式 • Decimal Padの小数点も変わるよ!

28.

USではセントを小数点以下 の数値として入力させたい • 内部的にはセントで扱っている($1.00=100) • しかし、小数点がピリオドであることを前提に入力 された文字列を解析すると、書式設定によっては正 しく解析できない • 初期ver.でこれをやってしまいお問い合わせ多数orz

29.

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

30.

英語圏のテキスト入力の設定 • 自動大文字入力はたいていONにしている • 自動修正もたいていONにしてる • スペルチェックもたいていONにしている • 日本語圏だと全部OFFにしがち

31.

テキスト入力系UIの設定を きちんとしよう • 自動大文字修正や自動修正、スペルチェックは入力 UIごとにON/OFFできる • 場所によって単語や文章の先頭が大文字になるよう にしよう(Words or Sentences) • メールアドレスやパスワードは全部OFFにしよう • 動作検証中は設定で自動修正系を全部ONにしよう

32.

自動修正系の設定

33.

そのほか • 複数形対応 • 大文字、センタリング、斜体のセンス • コミュニケーション • などなど

34.

おわり 何かあれば気軽に @ooba まで エンジニア募集中!