アプリの国際化の舞台裏

 アプリの国際化の舞台裏

アプリの国際化は単に表示されるテキストの翻訳にとどまるものではありません。

このセッションでは、開発者とユーザーの双方の視点から、様々な地域で使われる iOS アプリの開発を通して得られた具体的な事例を踏まえ、アプリの国際化で必要となる技術的な知識、避けては通れない問題とその対策、そして今後のアプリ開発における課題について検討します。

自分のアプリを海外のユーザーにも使ってもらいたい。アプリを翻訳したのにあまり使ってもらえない。あるいは、海外のアプリで日本語が使えないのは何故なのか。海外のアプリの挙動がおかしいけれど何故そうなるのかわからない。そんな疑問を持った方を対象とします。

このセッションでは以下のトピックについて扱う予定です

- Unicode についての知識と絵文字の貢献
- 日本語入力や複雑な文字の問題
- ユーザーインターフェイスとコンテンツの国際化
- 開発チームの国際化

このセッションでは以下のトピックは扱わない予定です

- 各 iOS や Android、ウェブなどのプラットフォームにおけるアプリの翻訳の手順
- 翻訳アプリケーションや、ツールの紹介や使い方

E4e01fb8b7105e61e3876224139503ab?s=128

Yoshimasa Niwa

August 31, 2019
Tweet

Transcript

  1. จࣈɺݴޠɺίϯςϯπɺνʔϜʹඞཁͳࣄ ΞϓϦͷࠃࡍԽͷ෣୆ཪ @niw 8/31/2019 — ౦ژిػେֶ
 Builderscon Tokyo 2019

  2. i18n

  3. ernationalizati

  4. internationalization

  5. internationalization

  6. i18n

  7. ࠃࡍԽ

  8. ໰୊ͷ܏޲ͱରࡦ ΞϓϦͷࠃࡍԽ

  9. @niw
 Yoshimasa Niwa

  10. None
  11. None
  12. None
  13. !

  14. ໨࣍ ຊ೔ͷͳ͕Ε 1.จࣈͷ࿩ 2.ݴޠͷ࿩ 3.ίϯςϯπͷ࿩ 4.νʔϜͷ࿩

  15. ΞϓϦͱจࣈͷ໰୊ จࣈͷ࿩

  16. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? ͋

  17. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? Ӭ

  18. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? "

  19. © ಺ֳ׭๪಺ֳ޿ใࣨ

  20. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸?

  21. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? ኦ #

  22. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? • ʮจࣈʯͱܾΊͨ΋ͷ͕ʮจࣈʯ • ͦΕΛܾΊΔن͕͍֨Ζ͍Ζ͋Δ

  23. Character Set ූ߸Խจࣈू߹

  24. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? ͋

  25. ΞϓϦͰ࢖͏จࣈͬͯͳΜͩΖ͏ จࣈͱ͸? 3042

  26. JIS X 0208 Unicode

  27. ͋ 3042 2422 Unicode JIS X 0208

  28. จࣈΛ࢖͏ͷʹඞཁͳࣄ จࣈΛ࢖͏ํ๏ • จࣈΛ࢖͏લʹ͸ѻ͍΍͍͢ܗʹม׵ • ͦΕͧΕͷʮจࣈʯͷ൪߸ΛόΠτྻʹ͢Δ

  29. Encoding จࣈූ߸Խํࣜ

  30. 3042 2422 e 08 UTF-8 0xE3 0x81 0x82 0x30 0x42

    UTF-16 0x82 0xA0 0xA4 0xA2 Shift-JIS EUC-JP
  31. <meta charset="utf-8">

  32. ʮจࣈʯΛਖ਼͘͠ѻ͏ จࣈͱࠃࡍԽ

  33. Unicode Character Set Unicode Λ࢖͏ Unicode Ͱ͸͍ΖΜͳจࣈΛੈքத͔ΒूΊͯ͋Γ ·͢ɻ

  34. None
  35. 65,536 ͋Ε͹े෼͡ΌͶ? 2όΠτͰදݱͰ͖Δ͠

  36. https://www.unicode.org/versions/Unicode1.0.0/ch02.pdf

  37. U+0000 ʙ
 U+FFFF Unicode Code Point BMP (Basic Multilingual Plane)

  38. UTF-16 ͋ U+3042 0x30 0x42 Unicode UTF-16 16-bit Unicode Transformation

    Format UCS-2
  39. Objective-C JavaScript

  40. $

  41. Unicode 2.0 Ͱૣʑʹഁ୼ ଍Βͳ͍ • ௥Ճͷ׽ࣈ͕͍ͬͺ͍ • ϋϯάϧେҠಈ • ֆจࣈ͸ຖ೥૿͑Δ

    • ྩ࿨΋૿͑Δ
  42. Unicode 2.0 Ͱૣʑʹഁ୼ ଍Βͳ͍ • UTF-16 ͰදݱͰ͖ͳ͘ͳΔ • Ͱ΋ࠓޙ΋จࣈ͸૿͑Δ

  43. %

  44. 2ͭ࢖ͬͯදݱ͠Α͏ Surrogate Pair

  45. U+D800 ʙ U+DBFF ͷ 1024ݸ U+DC00
 ʙ
 U+DFFF
 ͷ
 1024ݸ

    1024 × 1024 = 1,048,576 ݸ௥ՃͰ͖Δ! ↓ U+10000 ʙ U+10FFFF ʹରԠͤ͞Δ
  46. 2ͭ࢖ͬͯදݱ͠Α͏ Surrogate Pair • ͋Γ͑ͳ͍૊Έ߹Θ͕ͤՄೳʹ • ยׂΕ͕Ͱ͖ͯ͠·͏ • ؾʹͤͣʹจࣈ਺Λ਺͑Δͱ2จࣈʹ ͳͲͳͲ…

  47. $

  48. Surrogate Pair ʹ͋Δจࣈ͸͋Μ·Γ࢖Θͳ͍͔Βؔ৺͕ͳ͍ ໰୊ʹؾ͕͔ͭͳ͍ !

  49. ࣮͸͜ͷ໰୊͸ͳ͘ͳΓͭͭ͋Γ·͢ ΍ͬͨʔ &

  50. ࣮͸͜ͷ໰୊͸ͳ͘ͳΓͭͭ͋Γ·͢ ΍ͬͨʔ &

  51. ΄ͱΜͲͷֆจࣈ͸ Surrogate Pair ͕ඞཁ ֆจࣈͷ͸ͨͨ͠໾ׂ U+1F60A &

  52. ΄ͱΜͲͷֆจࣈ͸ Surrogate Pair ͕ඞཁ ֆจࣈͷ͸ͨͨ͠໾ׂ • Unicode ҎલͷϚϧνόΠτ໰୊͸ͦͷ໰୊͕ى ͜ΔݴޠΛ࢖Θͳ͍ਓʹ͸࣮࣭Өڹ͕ͳ͔ͬͨ •

    Ͱ΋ֆจࣈ͸ΈΜͳ࢖͍͍ͨ • ؔ৺͕͋Ε͹౰વ໰୊ʹؾ͕ͭ͘͠௚͢ؾʹͳΔ
  53. Surrogate Pair ͸ֆจࣈʹΑͬͯ໰୊ͷؔ৺ൣғ͕มΘͬͨ ݴޠΛ௒͑ͯ୭ʹͱͬͯ΋ؔ৺ͷߴ͍໰୊ !

  54. Unicode ࢖͓͚ͬͯ͹΋͏໰୊ͳ͠? Surrogate Pair ͷ໰୊΋ղܾͦ͠͏ͩ͠Ͷ!

  55. ZWJ, Variation Selector, Normalization, Collation, … Unicode ͸௒ෳࡶ • OSͷϑΥϯτϨϯμϦϯάγεςϜͰ΋͍ͬͺ͍

    όά͕͋Δ • ݴޠͷϥϯλΠϜͷ࣮૷Ͱ΋όά͕͋Δ
  56. iMessage ͱ͔ͰૹΔͱ௨஌ͰΫϥογϡͨ͠ શ֯εϖʔεͱֆจࣈͰΫϥογϡ ɹ' શ֯εϖʔε U+3000 Surrogate Pair ͷจࣈ

  57. iMessage ͱ͔ͰૹΔͱ௨஌ͰΫϥογϡͨ͠ Variation Selector-15 ͰΫϥογϡ ‗ _ Variation Selector-15 ͱ


    ૊Έ߹ΘͤΒΕΔจࣈ Variation Selector-15 U+FE0E Combining
 Diacritical
 Marks
  58. iMessage ͱ͔ͰૹΔͱ௨஌ͰΫϥογϡͨ͠ Devanagari ͰΫϥογϡ ◌ऀ a Devanagari Combination Character U+0900

    ͳΜͰ΋
  59. iMessage ͱ͔ͰૹΔͱ௨஌ͰΫϥογϡͨ͠ RTL ͱ Devanagari ͰΫϥογϡ Devanagari Combination Character U+0936

    RTLͷจࣈ
  60. Swift 5 ΑΓલͷΞϓϦ͸೚ҙͷจࣈྻͰΫϥογϡͰ͖Δ SR-9048 let str = "\u{0336}\u{0344}\u{0357}\u{0343}
 \u{0314}\u{0351}\u{0340}\u{0300}\u{0340}
 \u{0360}\u{0314}\u{0357}\u{0315}\u{0301}


    \u{0344}a" let set = Set([str])
  61. Unicode ͠ΜͲ͍ ͜ͷੈ͸ෳࡶɻUnicode ͸ͦͷࣸ͠ڸ

  62. ΞϓϦͷࠃࡍԽͱʮจࣈʯ ·ͱΊ • ʮจࣈʯ͸ͦ͏ܾΊ͔ͨΒจࣈɻ൪߸Ͱ۠ผ • Character Set ͱ Encoding Λཧղ͢Δ

    • ֆจࣈͷ͸ͨͨ͠໾ׂ͸େ͖͍ • Unicode ͸௒ෳࡶ
  63. ΞϓϦͱݴޠͷ໰୊ ݴޠͷ࿩

  64. จࣈྻͷ຋༁ ΞϓϦ͕දࣔ͢ΔจࣈྻΛϢʔβʔͷݴޠʹ຋༁͢Δ

  65. ࢦఆ͞ΕͨݴޠͰจࣈྻΛදࣔ ෳ਺ͷݴޠͷදࣔʹରԠ͢Δ ΋ͱʹͳΔͷݴޠ(ӳޠ)ͷจࣈྻΛΩʔʹଞͷݴޠ ΁຋༁͢Δ ӳޠ ೔ຊޠ … Cancel Ωϟϯηϧ …

    Done ׬ྃ … Back ໭Δ …
  66. https://www.dell.com/support/article/jp/ja/jpbsd1/sln306712?lang=ja

  67. ӳޠ ೔ຊޠ … State ౎ಓ෎ݝ … State ঢ়ଶ … !

  68. ࢦఆ͞ΕͨݴޠͰจࣈྻΛදࣔ ෳ਺ͷݴޠͷදࣔʹରԠ͢Δ จࣈྻ͝ͱʹIDΛ࡞ΓɺͦΕͧΕͷݴޠʹ຋༁ ID ӳޠ ೔ຊޠ … CANCEL_BUTTON_LABEL Cancel Ωϟϯηϧ

    … DONE_BUTTON_LABEL Done ׬ྃ … BACK_BUTTON_LABEL Back ໭Δ …
  69. None
  70. ! ID ӳޠ ೔ຊޠ … CANCEL_BUTTON_LABEL Cancel Ωϟϯηϧ … DISCARD_BUTTON_LABEL

    Discard औΓফ͢ … DISCARD_TWEET_TITLE Are you sure to discard this Tweet? ͜ͷπΠʔτΛഁغ͠· ͔͢? …
  71. ίϯςΩετ͕ͱͯ΋େ੾ ਖ਼͍͠຋༁͸ਖ਼͍͚͠ΕͲਖ਼͘͠ͳ͍ $

  72. ΋͠ม਺͕͋ͬͨΒ? Մมจࣈྻͷ຋༁

  73. ೔ຊޠʹ͸ͳ͍໰୊ ਺ͷ໰୊ • ୯७ͳ %d ͸ଟ෼΄ͱΜͲͷ৔߹Ͱ࢖͑ͳ͍ • ෳ਺ܗ͕ଘࡏ͢Δ • ਺ࢺ͕ଘࡏ͢Δ

  74. https://twitter.com/hoishinxii/status/1167376497306288128

  75. https://www.unicode.org/cldr/charts/34/supplemental/language_plural_rules.html

  76. https://www.unicode.org/cldr/charts/34/supplemental/language_plural_rules.html

  77. https://www.unicode.org/cldr/charts/34/supplemental/language_plural_rules.html

  78. $

  79. ෳ਺ܗ΍਺ࢺʹมԽͷͳ͍ݴޠݍͰ͸ؔ৺͕ͳ͍ ෳ਺ܗ΍਺ࢺʹछྨ͕͋Δͱؾ͕͔ͭͳ͍ !

  80. ສೳༀ͸ଘࡏ͠ͳ͍ ঢ়گʹԠͨ͡ରԠ͕ඞཁɹ • ͦͷΑ͏ͳจࣈྻ͕ඞཁͳ͍Α͏ʹมߋ͢Δ • libicu ΍ɺͦΕΛ͔ͭͬͨ OS ͷ API

    ͰؤுΔ • จࣈྻΛԿछྨ΋༻ҙͯ͠ɺՄೳੑͷ͋ΔͦΕͧ ΕͷύλʔϯʹରԠ͢Δ • ఘΊΔ
  81. จࣈྻͷೖྗ ϢʔβʔͷݴޠͰΞϓϦ͕จࣈྻΛड͚औΔ

  82. None
  83. ଞͷݴޠʹൺ΂ͯঢ়ଶͷछྨͱભҠ͕ଟ͍ ೔ຊޠೖྗ͸࠷ڧʹ೉͍͠ • ೔ຊޠೖྗରԠͷΠϯΫϦϝϯλϧݕࡧͷ࣮૷ͷ ೉͠͞ • ೔ຊޠͷ஌͕ࣝ͋Δఔ౓ͳ͍ͱ࢖͑ͳ͍ • ͦ΋ͦ΋ Input

    Method ͕ࢁ΄Ͳ͋ͬͯڍಈ͕શ෦ ҧ͏
  84. ΋͏ͳʹ΋৴͡ΒΕͳ͍ API Ͱ͢ΒόάͬͯΔ • ΄΅࣮֬ʹ iOS ΞϓϦͰ೔ຊޠ͕ೖྗͰ͖ͳ͍ͷ ͸ textView(_:shouldChangeTextIn:
 replacementText:)

    Λ࢖͍ͬͯΔ • ͜ͷAPI͸ͣͬͱόάͬͯΔɺېسͷAPI
  85. Input Method Λ࢖Θͳ͍ݴޠݍͰ͸ؔ৺͕ͳ͍ 1ͭͷೖྗ͕1จࣈʹରԠ͢Δͱ͍͏ࢥ͍ࠐΈ !

  86. ΞϓϦͷࠃࡍԽͱʮݴޠʯ ·ͱΊ • จࣈྻͷ຋༁͸ίϯςΩετϦονʹ͢Δ • ม਺͸ආ͚Δɻͱ͘ʹ਺ࣈ • จࣈྻೖྗ͸1ೖྗ1จࣈͷࢥ͍ࠐΈ͕ଘࡏ

  87. ຋༁Λ͑ͨ͜໰୊ ίϯςϯπͷ࿩

  88. த՚ϑΥϯτ໰୊ ݴޠͷ༏ઌ౓ʹ͍ͭͯ

  89. None
  90. ͻͱͭͷݴޠࢦఆ͚ͩͰ͸දݱ͕֬ఆ͠ͳ͍ Locale ͷࢦఆ • ΄ͱΜͲͷγεςϜ͸ Language Ͱ͸ͳ͘ɺ Locale Λࢦఆ͢ΔΑ͏ʹͳͬͯΔ •

    Locale ͸ݴޠʹՃ͑ͯɺ஍Ҭɺ௨՟ɺΧϨϯμʔ ͳͲݴޠίϛϡχςΟΛࢦఆͰ͖Δ • ༏ઌॱҐΛ͚ͭͯෳ਺ࢦఆͰ͖Δ • γεςϜͷσϑΥϧτͷ༏ઌॱҐ͕͋Δ
  91. ϝϦοτ΋Θ͔Δ͚ΕͲ… CJK౷߹׽ࣈ • ֤ࠃͰมΘΔࣅͨΑ͏ͳ׽ࣈʹಉ͡൪߸Λ͋ͨ͑ ͍ͯΔ • ΞϓϦଆ͔Β͸൑ผෆೳ • ݸਓతʹ͸σϝϦοτͷ΄͏͕େ͖͍ͱࢥ͍ͬͯ Δ

  92. قઅͷΠϕϯτͷҧ͍ ϋϩ΢ΟʔϯɺΫϦεϚεɺ৽೥…

  93. https://twitter.com/mayoinomoriko/status/1078446838104055808

  94. ೔ৗੜ׆Ͱܦݧ͠ͳ͍͜ͱ͸ؔ৺͕ͳ͍ Ͳ͜Ͱ΋ಉ͡ͱ͍͏ࢥ͍ࠐΈ !

  95. ࡞Γखͷ໰୊ νʔϜͷ࿩

  96. ݪҼ͸ͳΜͩͬͨͷ͔ ٕज़తͳ໰୊ʁ

  97. Surrogate Pair ʹ͋Δจࣈ͸͋Μ·Γ࢖Θͳ͍͔Βؔ৺͕ͳ͍ ໰୊ʹؾ͕͔ͭͳ͍ !

  98. ෳ਺ܗ΍਺ࢺʹมԽͷͳ͍ݴޠݍͰ͸ؔ৺͕ͳ͍ ෳ਺ܗ΍਺ࢺʹछྨ͕͋Δͱؾ͕͔ͭͳ͍ !

  99. Input Method Λ࢖Θͳ͍ݴޠݍͰ͸ؔ৺͕ͳ͍ 1ͭͷೖྗ͕1จࣈʹରԠ͢Δͱ͍͏ࢥ͍ࠐΈ !

  100. ೔ৗੜ׆Ͱܦݧ͠ͳ͍͜ͱ͸ؔ৺͕ͳ͍ Ͳ͜Ͱ΋ಉ͡ͱ͍͏ࢥ͍ࠐΈ !

  101. ؔ৺͕ͳ͍໰୊ ͍΍ͩͬͯ೔ຊޠೖྗͰ͖ͳͯ͘΋ࠔΒͳ͍͠

  102. ઓಆ୯Ґͱͯ͠ͲΜͳʹ༏लͰ΋ɺಉ͡ن֨඼Ͱߏ ੒͞ΕͨγεςϜ͸ɺͲ͔͜ʹக໋తͳܽؕΛ࣋ͭ ͜ͱʹͳΔΘ © GHOST IN THE SHELL / ߈֪ػಈୂ

  103. ୭͠΋࣋ͭੜ͖ΔͨΊͷόΠΞε ແҙࣝͷόΠΞε • ෯޿͍໰୊ʹؔ৺Λ΋ͬͯରԠ͢Δͱ৘ใաଟͰ ൑அͰ͖ͳ͘ͳΔ • ࢥ͍ࠐΈ͸ੜ͖ΔͨΊʹඞཁͰ୭Ͱ΋͍࣋ͬͯΔ • Ͱ΋ͦΕ͕͋Δͱ͍͏͜ͱ͸ೝࣝͰ͖Δ

  104. ଟ༷ੑͷॏཁੑ Diversity • ଟ༷ੑͷ͋ΔνʔϜ͸ಇ͖ʹ͘͞Λײ͡Δ͕ΑΓ Α͍੒Ռ͕ͰΔͱ͍͏ݚڀ݁Ռ • ΞϓϦͷࠃࡍԽͷ໰୊͸ɺ֤ʑ͕ؔ৺ͷͳ͍໰୊ Λղܾ͠ͳ͍ͱ͍͚ͳ͍ • ΞϓϦͷࠃࡍԽ͸ଟ༷ੑͷॏཁੑͱ͍͏࿩୊Ͱ

    ͸ɺ௚઀తʹؔ܎ͷ͋Δ໰୊ https://hbr.org/2016/09/diverse-teams-feel-less-comfortable-and-thats-why-they-perform-better
  105. ͱ͍͏͜ͱͰ ·ͱΊͰ͢

  106. ΞϓϦͷࠃࡍԽ ·ͱΊ • ٕज़Λਖ਼͘͠ཧղ͢Δ • ͜ͷੈ͸ࢥ͍ͬͯΔΑΓෳࡶ • ࢥ͍ࠐΈ͕͋Δ͜ͱΛ஌Δ • ଟ༷ੑͷ͋ΔνʔϜΛ࡞Δ

  107. ࣭͝໰͕͋Ε͹Ͳ͏ͧ Q&A