SlideShare a Scribd company logo
1 of 33
Download to read offline
多言語対応について
目次
1. 一般的な多言語化について
2. 今回の案件の仕様・分量
3. iOS・Androidの違い
4. シェル作成・フォーマット化
一般的な多言語化
● 下記のような内容を言語に合わせた
内容に変えること
○ 文字列リソース
○ 画像リソース
○ コンテンツ内容
○ アプリ名
日本 英語
すごく大変
けど場合による
● どこまで対応する?
○ 翻訳はGoogle翻訳?外部に頼む?
○ RTL言語対応する?(Right-to-left writing言語、右から左に読む )
○ 通貨の表記や時刻表記も対応する? (円はドル? 2016/07/29はJuly 29 2016?)
○ アプリ内で切替させる?
○ 文字切れは許容する?
○ 可変レイアウトなら入りきらなかった場合にスクロールは許容する?
けど場合による
● どこまで対応する?
○ 翻訳はGoogle翻訳?外部に頼む?
○ RTL言語対応する?(Right-to-left writing言語、右から左に読む )
○ 通貨の表記や時刻表記も対応する? (円はドル? 2016/07/29はJuly 29 2016?)
○ アプリ内で切替させる?
○ 文字切れは許容する?
○ 可変レイアウトなら入りきらなかった場合にスクロールは許容する?
工数と予算次第で上記を最初に詰めておく
● OSの言語設定
○ OSによって優先される言語設定が違う
○ キーボードはOS準拠?言語設定とキーボードも変えられる
○ システム言語にできないけど追加できる言語が存在する (今回対応したタガログ語とか )
○ システム言語が対応言語じゃない時の挙動も OSによって結構違う
● 日付設定
○ 生年月日入力はOS標準のDatePicker?独自?
○ OS標準のDatePickerのFormatは変えられない
めんどくさいことが伝わりそうな豆知識
● OS標準のダイアログ
○ 標準のダイアログでも文字は切れる
○ AndroidのAlertDialogはカスタムレイアウトである程度対応可能
○ iOS7対応ならUIAlertViewとUIAlertControllerそれぞれ書かないといけない
● 画面の反映
○ アプリ内で設定切替後、即時反映は難しい
○ viewWillAppear、onResumeあたりで全部setTextし直す?notification使う?
○ iOSはnotification、Androidは全部Fragmentのreplaceで読み込み直しで対応した
めんどくさいことが伝わりそうな豆知識
自分の担当案件の場合
● 9言語
(RTL:右から読む言語はなし。アラビア語などが RTL言語)
● 文言:全て先方が用意 (外注)
● 文字切れは一切許容しない
● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語)
● 基本的に画面のスクロールは許容する
● 9言語
(RTL:右から読む言語はなし。アラビア語などが RTL言語)
● 文言:全て先方が用意 (外注)
● 文字切れは一切許容しない
● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語)
● 基本的に画面のスクロールは許容する
今回の案件の場合
● 9言語
(RTL:右から読む言語はなし。アラビア語などが RTL言語)
● 文言:全て先方が用意 (外注)
● 文字切れは一切許容しない → 今回大変だったとこ(レイアウトが)
● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語)
● 基本的に画面のスクロールは許容する
今回の案件の場合
● 512個の文言リスト
○ 通常文言:270個
○ エラー文言:215個
○ その他アプリ内文言: 27個
・画面数は約70
・文言はアプリ開発と並行で都度更新。先方は毎回違うフォーマットのエクセルで送ってくるけどこちらは一括で
上記三種類のスプレッドシートで管理
・不足文言を頼んでも通常一週間程度かかる
他言語化のボリューム
案件の文言リスト
こんなので管理
都合によりカット
案件の文言リスト
・やってて思った
文言も履歴管理必要
・文言の変遷
 「「ログオンID」と「ログオンパスワード」を正しく入力してください。ログイン時は〜」
→「「ログオンID」と「ログオンパスワード」を正しく入力してください。ログオン時は〜」
→文言リストはxx/xxに更新
→iOSはxx/xxに文言更新を反映
→Androidはxx/xxに文言更新を反映
文言確認する人 「今のアプリってどこまで反映されてるんだっけ」
実装者 「えーっと…」になる
案件の文言リスト
実装時にやること
● 共通部分
○ 言語ファイルを各言語毎に用意 (Localizable.strings, values.xml)
○ だいたい日本語より他言語の方が長い (3倍を目安)ので、テキスト全部可変レイアウト
○ スクロールしてはいけない画面は先に洗い出し、文言側を調整してもらう
○ 日付や時刻、通貨単位など 動的な値だけど多言語化するようなものを洗い出す
(開発者が文言担当じゃないと、 MM月dd日 の文言を●月●日とかで送ってくる)
各OS毎の実装
● 文字列リソース:Localizable.strings
○ “日本語文字列” = “English string”;という文字列をLocalizable.stringsに定義しておくと
「“日本語文字列”」部分が置き換えられる
○ 通常はNSLocalizedString()に「」の文字列を渡して置き換えるが、
今回はアプリ内設定で言語を切替なので Localizable_ja.strings, Localizable_en.stringsなど
言語毎にファイルを定義し、
NSLocalizedString("日本語文字列",tableName: "Localizable_en",comment: "")
で読み込むstringsファイルを切り替えている
iOSにおける多言語化
● 文字列リソース:Localizable.strings
こんなファイルになる
※“日本語文字列” = “English string”;
の左は”ID1234”等にした方がいい
※意味を持たせると後で変更があった時整
合性取れなくなる
※同じ日本語も他言語は複数パターンなど
ありうる
iOSにおける多言語化
都合によりカット
● Localizable_xx.strings の読み込み
○ String+Localize.swift
iOSにおける多言語化
● 画像リソースの場合
○ 例えば、
“img1_ja” = “img1_en”;
という文字列をLocalizable_en.stringsに定義
imageView.image = UIImage(named: "img1_ja".localize())
で読み込み
iOSにおける多言語化
日本語
img1_ja.png
英語
img1_en.png
● 文字列リソース:values.xml
○ プロジェクト内リソース (res)ディレクトリにvaluesディレクトリを言語毎に作成
○ <string name=”キー名”>各言語文字列</string>が各行に定義
○ コード中でgetString(R.string.キー名)とすることでOS標準の言語を取得
Androidにおける多言語化
● 文字列リソース:values.xml
9言語分のディレクトリに
各言語のファイルができる  →
Androidにおける多言語化
都合によりカット
● 画像リソース
○ res/drawable-xxディレクトリ(画像フォルダ)を各言語毎に用意
○ res/drawable-xxは解像度毎にも用意する必要がある
○ 9言語 x 3解像度(今回は三つ対応した ) = 27 のdrawable-xx-xxdpiに同名画像ファイル
○ 命名規則:drawable-mdpi-jaはダメ
○ 参考:Androidリソースの読み込み順序ルール
https://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch
Androidにおける多言語化
● 画像リソース
※すげーたくさんの
 drawableディレクトリできる
 実際は27よりちょっと少ない
Androidにおける多言語化
文言整形
多言語化用ファイル同士の紐付け
文言リスト
↓
各OSの
言語ファイルの
形式へ変換する
都合によりカット
多言語化用ファイル同士の紐付け
● 各言語毎の文言リスト書き出し
○ それぞれのフォーマット用に変換するシェルを書いた
○ 実際、手作業の方がよかったんじゃないか?ぐらいの時間かかった
○ 現在はある程度フォーマットが固まってきたので、今後の更新は楽
多言語化用ファイル同士の紐付け
・xxxx_ja.txt, xxxx_en.txtをそれぞれ変換
・実際のシェル:70行くらい
・Node.js(ただ慣れてる言語なので使用)
・iOS・Androidそれぞれ、
 通常・エラー・アプリ内文言の種別毎に
 シェル分けている
都合によりカット
・変換作業はまりどころ:
実際は改行が含まれてたり、本来表示しな
い文字が含まれている状態で文言リストが
くる
↓
変換シェルでエスケープ
変換しきれない(どこが問題だか分からな
いもの)は手作業で直す
多言語化用ファイル同士の紐付け
都合によりカット
・実際にあった変換ミス・修正漏れ
● 改行が含まれてて変換が全部一行ずつずれる
● エクセルの取り消し線で削除したつもりになってるのが削除されず変換される
● 文言の中に※印でコメントが書かれ、それが削除されず変換される
● 先方のエクセル→弊社内文言リストへの反映漏れ
● 弊社内文言→変換シェルへの読み込みで変換漏れ
● iOS:Localizable_xx.stringsの文字列でない文字列がコード中、 storyboard中に残りっぱなし
● Android:コード直書きの修正漏れ
● 口頭で修正依頼→伝達されてからタスクリストに入れるの忘れたりとかで修正漏れ
多分他にもあったと思います
多言語化用ファイル同士の紐付け
・フォーマット化
ベストなやり方が分からず手探りだったので想定より大変なタスクになりました。
おそらく先方との文言のやりとりの中でこちらからもっとプログラムに入れ込みやすいフォーマットを提示できて
いればもう少し楽にできていたのではないかと思います。
例えば、
・文言は全て一ファイルで管理
・改行は全て改行コード
・表示する文言以外は文言リストに入れない
など。
多言語化用ファイル同士の紐付け
以上
今後各位の多言語化プロジェクトに立ち合った時の参考になれば幸いです。

More Related Content

Similar to 多言語対応について 2016 07_25

Similar to 多言語対応について 2016 07_25 (9)

20130313_i18n_history_and_future
20130313_i18n_history_and_future20130313_i18n_history_and_future
20130313_i18n_history_and_future
 
Creative flow: ソフトウェアローカリゼーションのワークフローと今後
Creative flow: ソフトウェアローカリゼーションのワークフローと今後 Creative flow: ソフトウェアローカリゼーションのワークフローと今後
Creative flow: ソフトウェアローカリゼーションのワークフローと今後
 
ゆるふわGo言語
ゆるふわGo言語ゆるふわGo言語
ゆるふわGo言語
 
プレゼンテーション 7 (4)
プレゼンテーション 7 (4)プレゼンテーション 7 (4)
プレゼンテーション 7 (4)
 
プレゼンテーション 7
プレゼンテーション 7プレゼンテーション 7
プレゼンテーション 7
 
5分でわかるi18n
5分でわかるi18n5分でわかるi18n
5分でわかるi18n
 
webサイト「多言語化」「グローバル化」
webサイト「多言語化」「グローバル化」webサイト「多言語化」「グローバル化」
webサイト「多言語化」「グローバル化」
 
Lucene/Solr 用形態素解析システムのご紹介 ベイシス・テクノロジー
Lucene/Solr 用形態素解析システムのご紹介 ベイシス・テクノロジーLucene/Solr 用形態素解析システムのご紹介 ベイシス・テクノロジー
Lucene/Solr 用形態素解析システムのご紹介 ベイシス・テクノロジー
 
Chocomelon potatochips 8
Chocomelon potatochips 8Chocomelon potatochips 8
Chocomelon potatochips 8
 

More from Natsuki Yamanaka

More from Natsuki Yamanaka (10)

【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
【2018/09/11】PAYでのReact Nativeにおける APIクライアント実装 について
 
2015 12 03_uiテストツールについて
2015 12 03_uiテストツールについて2015 12 03_uiテストツールについて
2015 12 03_uiテストツールについて
 
アプリ申請の基礎 リジェクト周り
アプリ申請の基礎 リジェクト周りアプリ申請の基礎 リジェクト周り
アプリ申請の基礎 リジェクト周り
 
開発Tips集
開発Tips集開発Tips集
開発Tips集
 
2015 12 10_ipv6対応について
2015 12 10_ipv6対応について2015 12 10_ipv6対応について
2015 12 10_ipv6対応について
 
2015 11 05_ios9_新仕様まとめ_社内勉強会
2015 11 05_ios9_新仕様まとめ_社内勉強会2015 11 05_ios9_新仕様まとめ_社内勉強会
2015 11 05_ios9_新仕様まとめ_社内勉強会
 
社内勉強会にて 音声ファイルフォーマットについて
社内勉強会にて 音声ファイルフォーマットについて社内勉強会にて 音声ファイルフォーマットについて
社内勉強会にて 音声ファイルフォーマットについて
 
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
2015 03 26 社内勉強会_オープンソースソフトウェアライセンスについて
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTC
 
Nodeについて
NodeについてNodeについて
Nodeについて
 

多言語対応について 2016 07_25