33
多言語対応について

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

Embed Size (px)

Citation preview

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

多言語対応について

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

目次

1. 一般的な多言語化について

2. 今回の案件の仕様・分量

3. iOS・Androidの違い

4. シェル作成・フォーマット化

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

一般的な多言語化

● 下記のような内容を言語に合わせた内容に変えること

○ 文字列リソース

○ 画像リソース

○ コンテンツ内容

○ アプリ名

日本 英語

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

すごく大変

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

けど場合による

● どこまで対応する?○ 翻訳はGoogle翻訳?外部に頼む?

○ RTL言語対応する? (Right-to-left writing言語、右から左に読む )

○ 通貨の表記や時刻表記も対応する? (円はドル? 2016/07/29はJuly 29 2016?)

○ アプリ内で切替させる?

○ 文字切れは許容する?

○ 可変レイアウトなら入りきらなかった場合にスクロールは許容する?

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

けど場合による

● どこまで対応する?○ 翻訳はGoogle翻訳?外部に頼む?

○ RTL言語対応する? (Right-to-left writing言語、右から左に読む )

○ 通貨の表記や時刻表記も対応する? (円はドル? 2016/07/29はJuly 29 2016?)

○ アプリ内で切替させる?

○ 文字切れは許容する?

○ 可変レイアウトなら入りきらなかった場合にスクロールは許容する?

工数と予算次第で上記を最初に詰めておく

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

● OSの言語設定○ OSによって優先される言語設定が違う

○ キーボードはOS準拠?言語設定とキーボードも変えられる

○ システム言語にできないけど追加できる言語が存在する (今回対応したタガログ語とか )

○ システム言語が対応言語じゃない時の挙動も OSによって結構違う

● 日付設定

○ 生年月日入力はOS標準のDatePicker?独自?

○ OS標準のDatePickerのFormatは変えられない

めんどくさいことが伝わりそうな豆知識

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

● OS標準のダイアログ○ 標準のダイアログでも文字は切れる

○ AndroidのAlertDialogはカスタムレイアウトである程度対応可能

○ iOS7対応ならUIAlertViewとUIAlertControllerそれぞれ書かないといけない

● 画面の反映

○ アプリ内で設定切替後、即時反映は難しい

○ viewWillAppear、onResumeあたりで全部setTextし直す?notification使う?

○ iOSはnotification、Androidは全部Fragmentのreplaceで読み込み直しで対応した

めんどくさいことが伝わりそうな豆知識

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

自分の担当案件の場合

● 9言語

(RTL:右から読む言語はなし。アラビア語などが RTL言語)

● 文言:全て先方が用意 (外注)

● 文字切れは一切許容しない

● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語 )

● 基本的に画面のスクロールは許容する

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

● 9言語

(RTL:右から読む言語はなし。アラビア語などが RTL言語)

● 文言:全て先方が用意 (外注)

● 文字切れは一切許容しない

● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語 )

● 基本的に画面のスクロールは許容する

今回の案件の場合

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

● 9言語

(RTL:右から読む言語はなし。アラビア語などが RTL言語)

● 文言:全て先方が用意 (外注)

● 文字切れは一切許容しない → 今回大変だったとこ(レイアウトが)

● アプリ内で切替させる、設定がされていない場合は OS設定準拠(9言語以外は英語 )

● 基本的に画面のスクロールは許容する

今回の案件の場合

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

● 512個の文言リスト

○ 通常文言:270個

○ エラー文言:215個

○ その他アプリ内文言:27個

・画面数は約70

・文言はアプリ開発と並行で都度更新。先方は毎回違うフォーマットのエクセルで送ってくるけどこちらは一括で上記三種類のスプレッドシートで管理

・不足文言を頼んでも通常一週間程度かかる

他言語化のボリューム

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

案件の文言リストこんなので管理

都合によりカット

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

案件の文言リスト

・やってて思った

文言も履歴管理必要

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

・文言の変遷

 「「ログオンID」と「ログオンパスワード」を正しく入力してください。ログイン時は〜」

→「「ログオンID」と「ログオンパスワード」を正しく入力してください。ログオン時は〜」

→文言リストはxx/xxに更新

→iOSはxx/xxに文言更新を反映

→Androidはxx/xxに文言更新を反映

文言確認する人 「今のアプリってどこまで反映されてるんだっけ」

実装者 「えーっと…」になる

案件の文言リスト

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

実装時にやること

● 共通部分 ○ 言語ファイルを各言語毎に用意 (Localizable.strings, values.xml)

○ だいたい日本語より他言語の方が長い (3倍を目安)ので、テキスト全部可変レイアウト

○ スクロールしてはいけない画面は先に洗い出し、文言側を調整してもらう

○ 日付や時刻、通貨単位など動的な値だけど多言語化するようなものを洗い出す

(開発者が文言担当じゃないと、 MM月dd日 の文言を●月●日とかで送ってくる )

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

各OS毎の実装

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

● 文字列リソース:Localizable.strings ○ “日本語文字列 ” = “English string”;という文字列をLocalizable.stringsに定義しておくと

「“日本語文字列 ”」部分が置き換えられる

○ 通常はNSLocalizedString()に「」の文字列を渡して置き換えるが、

今回はアプリ内設定で言語を切替なので Localizable_ja.strings, Localizable_en.stringsなど

言語毎にファイルを定義し、

NSLocalizedString("日本語文字列 ",tableName: "Localizable_en",comment: "")

で読み込むstringsファイルを切り替えている

iOSにおける多言語化

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

● 文字列リソース:Localizable.strings

こんなファイルになる

※“日本語文字列 ” = “English string”;の左は”ID1234”等にした方がいい

※意味を持たせると後で変更があった時整合性取れなくなる

※同じ日本語も他言語は複数パターンなどありうる

iOSにおける多言語化

都合によりカット

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

● Localizable_xx.strings の読み込み

○ String+Localize.swift

iOSにおける多言語化

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

● 画像リソースの場合○ 例えば、

“img1_ja” = “img1_en”;

という文字列をLocalizable_en.stringsに定義

imageView.image = UIImage(named: "img1_ja".localize())

で読み込み

iOSにおける多言語化日本語

img1_ja.png英語

img1_en.png

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

● 文字列リソース:values.xml ○ プロジェクト内リソース (res)ディレクトリにvaluesディレクトリを言語毎に作成

○ <string name=”キー名”>各言語文字列</string>が各行に定義

○ コード中でgetString(R.string.キー名)とすることでOS標準の言語を取得

Androidにおける多言語化

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

● 文字列リソース:values.xml

9言語分のディレクトリに

各言語のファイルができる  →

Androidにおける多言語化

都合によりカット

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

● 画像リソース○ 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における多言語化

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

● 画像リソース

※すげーたくさんの

 drawableディレクトリできる

 実際は27よりちょっと少ない

Androidにおける多言語化

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

文言整形

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

多言語化用ファイル同士の紐付け

文言リスト

各OSの

言語ファイルの

形式へ変換する

都合によりカット

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

多言語化用ファイル同士の紐付け

● 各言語毎の文言リスト書き出し

○ それぞれのフォーマット用に変換するシェルを書いた

○ 実際、手作業の方がよかったんじゃないか?ぐらいの時間かかった

○ 現在はある程度フォーマットが固まってきたので、今後の更新は楽

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

多言語化用ファイル同士の紐付け

・xxxx_ja.txt, xxxx_en.txtをそれぞれ変換

・実際のシェル:70行くらい

・Node.js(ただ慣れてる言語なので使用)

・iOS・Androidそれぞれ、

 通常・エラー・アプリ内文言の種別毎に

 シェル分けている

都合によりカット

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

・変換作業はまりどころ:

実際は改行が含まれてたり、本来表示しな

い文字が含まれている状態で文言リストが

くる

変換シェルでエスケープ

変換しきれない(どこが問題だか分からな

いもの)は手作業で直す

多言語化用ファイル同士の紐付け

都合によりカット

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

・実際にあった変換ミス・修正漏れ

● 改行が含まれてて変換が全部一行ずつずれる

● エクセルの取り消し線で削除したつもりになってるのが削除されず変換される

● 文言の中に※印でコメントが書かれ、それが削除されず変換される

● 先方のエクセル→弊社内文言リストへの反映漏れ

● 弊社内文言→変換シェルへの読み込みで変換漏れ

● iOS:Localizable_xx.stringsの文字列でない文字列がコード中、 storyboard中に残りっぱなし

● Android:コード直書きの修正漏れ

● 口頭で修正依頼→伝達されてからタスクリストに入れるの忘れたりとかで修正漏れ

多分他にもあったと思います

多言語化用ファイル同士の紐付け

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

・フォーマット化

ベストなやり方が分からず手探りだったので想定より大変なタスクになりました。

おそらく先方との文言のやりとりの中でこちらからもっとプログラムに入れ込みやすいフォーマットを提示できて

いればもう少し楽にできていたのではないかと思います。

例えば、

・文言は全て一ファイルで管理

・改行は全て改行コード

・表示する文言以外は文言リストに入れない

など。

多言語化用ファイル同士の紐付け

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

以上

今後各位の多言語化プロジェクトに立ち合った時の参考になれば幸いです。