アプリが国際化する時

4f31137c606d3d1c06d0d86fc7fd4bdd?s=47 punchdrunker
September 15, 2017

 アプリが国際化する時

4f31137c606d3d1c06d0d86fc7fd4bdd?s=128

punchdrunker

September 15, 2017
Tweet

Transcript

  1. ΞϓϦ͕ࠃࡍԽ͢Δ࣌ by punchdrunker shibuya.apk#18

  2. punchdrunker ࣣඌ و࢙ Web੍࡞ձࣾۈ຿Λܦͯ2011೥ϛΫγΟೖࣾɻ 2011 - 2016 : SNS mixiͷΞϓϦ։ൃɺϚωδϝϯτ

    2016 - ݱࡏ : Ո଒ΞϧόϜ ΈͯͶͷ։ൃશൠ (iOS / Android / Rails)
  3. INDEX 1. ΈͯͶʹ͍ͭͯ 2. ΧϧνϟϥΠζ 3. ଟݴޠԽ 4. ஍ҬԽ 5.

    ͦͷଞ 0 ͓࿩͢͠Δ͜ͱ
  4. ABOUT 1 ΈͯͶʹ͍ͭͯ

  5. ABOUT 1 ΈͯͶʹ͍ͭͯ

  6. ABOUT 1 ΈͯͶʹ͍ͭͯ ੈքதͷՈ଒ͷ“͜͜ΖͷΠϯϑϥ”Λͭ͘Δ ࢠҭͯΛ΋ͬͱָ͘͠͠ɺݽಠͳࢠҭͯΛͳ͘͢ ͦͷࢠͷਓੜΛ·Δ͝ͱ࢒ͤΔՈ଒ΞϧόϜΛ

  7. ABOUT 2015೥αʔϏε։࢝ 180ສϢʔβʔ ૯Ξοϓϩʔυຕ ਺ԯສຕ ύύɺϚϚ͕࢖͍ͨ͘ͳΔΑ͏ͳ ελΠϦογϡ͞ & ͍͡͡ɺ͹͋͹Ͱ΋ ࢖͑Δ؆୯͞

    Google Play StoreͷϢʔβʔධՁ ˑ4.672 ධՁ૯਺19,310 1 ΈͯͶʹ͍ͭͯ
  8. ABOUT ΈͯͶϑΥτϒοΫ 2016೥αʔϏε։࢝ ݄ؒ໿30,000࡭Λൢച ϫϯίΠϯͰങ͑ΔΧδϡΞϧ͞ ๩͍͠ύύɾϚϚʹ޲͚ͨࣗಈ࡞੒͕ಛ௃ 1 ΈͯͶʹ͍ͭͯ

  9. ABOUT ࠃࡍԽ 2017೥7݄ΑΓӳޠදࣔʹରԠ ϑΥτϒοΫͷւ֎ൃૹ͸ࠓޙରԠ༧ఆ 1 ΈͯͶʹ͍ͭͯ

  10. CULTURIZATION 2 จԽͷҧ͍

  11. CULTURIZATION 2 จԽͷҧ͍ ಉੑࠗ

  12. CULTURIZATION 2 จԽͷҧ͍ ΞϓϦͷ໊લ ΞϝϦΧਓɺmitene͕ಡΊͳ͍໰୊ൃੜ ౤ථ΍ձٞΛܦͯɺ໊લΛܾΊΔͷʹ2िؒ͘Βֻ͍ ͔ͬͨɻ ϚΠςΟʔϯ ϊΡ Ποπϛɾςɾω

    Ξʔϋʔ
  13. MULTILINGUALIZATION 3 ଟݴޠԽ

  14. ೔ӳ2ϲࠃޠ ೔ຊޠҎ֎͸ӳޠѻ͍ɻ ॳظϦϦʔεͰ͸୺຤ͷϩέʔϧ͔Βࣗಈ൑ผ͍ͯ͠ ͕ͨɺϢʔβʔ͔Βͷཁ๬ͰઃఆՄೳʹ͢ΔରԠΛ ϦϦʔεɻ ୺຤͸ӳޠ͕ͩɺΞϓϦ͸೔ຊޠͰ࢖͍͍ͨਓ͕Ұ ఆ਺͍Δɻ MULTILINGUALIZATION 3 ଟݴޠԽ

  15. ෳ਺ܗ Android͸ඪ४ͰPluralରԠ͕؆୯ // plurals.xml <plurals name=“photo_count"> <item quantity=“one”>%1$d photo</item> <item

    quantity=“other”>%1$d photos</item> </plurals> // usage getResources() .getQuantityString(R.plurals.photo, quantity, count) // ஫ҙ: quantity͕0ͷ࣌͸”other”͕ਖ਼͍͠(15෼ϋϚͬͨ) MULTILINGUALIZATION 3 ଟݴޠԽ
  16. ෳ਺ܗ Xcode͸ඪ४ͰPluralରԠ͍ͯ͠Δ͕ɺdictionaryͳͷͰ΍΍μϧ͍ // Localizable.stringsdict <dict> <key>number_of_days</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@value@</string> <key>value</key>

    <dict> <key>NSStringFormatSpecTypeKey</key> // ܕ <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> // ୯਺ <string>%d day remaining</string> <key>other</key> // ෳ਺ <string>%d days remaining</string> </dict> </dict> </dict> MULTILINGUALIZATION 3 ଟݴޠԽ
  17. ෳ਺ܗ AndroidͬΆ͍ఆٛͰ࢖͑ΔΑ͏ʹͪΐͬͱ࣮ͨ͠૷ // Localizable.strings “photo.one”="%d photo”; “photo.other”="%d photos"; // usage

    func pluralString(key: String, quantity: Int) -> String { let suffix: String if quantity == 1 { suffix = ".one" } else { suffix = ".other" } return NSLocalizedString(key + suffix, comment: "") } // ࣮ࡍʹ͸ࣗલͷFormatter͕͋ΔͷͰɺ // ͍ͦͭʹ౉͢จࣈྻͱͯ͠ར༻ pluralString(key: “photo”, quantity: quantity) MULTILINGUALIZATION 3 ଟݴޠԽ
  18. ςετ RobolectricͷΞϊςʔγϣϯͰϦιʔεͷछྨΛࢦఆͰ͖Δͷ Ͱɺจࣈྻͷςετ͸ָͩͬͨ @Test @Config(qualifiers = “en-port”) // ӳޠ&ॎը໘ public

    void testFormatter() { …. assertEquals(“Newborn”, formatter.getAge(context, 0)) } ͋͘·ͰϦιʔεͷम০ࢠΛݻఆ͢ΔͨΊͷ΋ͰɺLocaleͷ஋͕ ϞοΫ͞ΕΔΘ͚Ͱ͸ͳ͍ɻ LocaleΛऔಘ͢ΔΑ͏ͳॲཧͷ৔߹͸ผ్mock͢Δඞཁ͕͋ Δɻ MULTILINGUALIZATION 3 ଟݴޠԽ
  19. LOCALIZATION 4 ஍ҬԽ

  20. LOCALIZATION 4 ஍ҬԽ ωοτϫʔΫ؀ڥͷҧ͍ τϨϯυϥΠϯͰൺֱ͢ΔͱɺΞοϓϩʔυ͕࣌ؒඵͷ஍఺Ͱɺ ೔ຊ͸ʙ.#ɺถࠃ͸ʙ.#લޙ

  21. LOCALIZATION 4 ஍ҬԽ ಈը౤ߘ طଘͷߏ੒͸౦ژϦʔδϣϯͷΈͩͬͨͷͰɺւ֎ͷϦʔδϣ ϯʹ΋όέοτΛ࡞੒ɻ ౤ߘ࣌ʹͲͷόέοτ͕͍͔ۙΛAPIʹฉ͍͔ͯΒɺ௚Ξο ϓϩʔυ͢ΔΑ͏ʹͨ͠ɻ ౤ߘޙ͸ΤϯίʔυॲཧΛߦ͍ɺΫϩεϦʔδϣϯ ϨϓϦ

    έʔγϣϯͰ౦ژʹ໭͢ɻ ౰࣌͸transfer accelerationΛ஌Βͣʹ࣮૷ͨ͠ͷͰɺ࠷ॳ ͔ΒAWSͷਓʹܰ͘૬ஊ͓͚ͯ͠͹Α͔ͬͨɻ
  22. LOCALIZATION 4 ஍ҬԽ ͓஌Βͤ௨஌ ϢʔβʔͷߦಈىҼͷ΋ͷ͸ϦΞϧλΠϜͷ··ɻ ͓஌Βͤܥͷ࣌ؒΛௐ੔͢Δҝʹ௨஌Λ༧໿͢ΔΑ͏ʹ͠ ͨɻ ʮn݄ͷϑΥτϒοΫ͕Ͱ͖·ͨ͠ʯͷΑ͏ͳ௨஌͸ϐʔΫ λΠϜͷ਺࣌ؒલʹૹΓ͍ͨɻ ϦϦʔε௚લͰmigration࣌ͷσʔλΛϛε͓ͬͯ஌Β͕ͤ

    ۭදࣔʹͳΔͱ͜Ζͩͬͨɻ
  23. MISC 5 ͦͷଞ

  24. ετΞͷݴޠ MISC 5 ͦͷଞ App Store΋Google Play΋ɺӳޠ൛ͷϦϦʔεΛҰ౓ऴ͑ ͔ͯΒͰͳ͍ͱɺprimary language(σϑΥϧτݴޠ)Λઃఆ Ͱ͖ͳ͔ͬͨɻ

    ϝδϟʔΞοϓσʔτ࣌ʹσϑΥϧτ͸ӳޠͰύʔϯοΈͨ ͍ͳ͜ͱΛ΍Γ͔ͨͬͨΒɺखલͷόʔδϣϯͰӳޠͷܝࡌ ৘ใΛೖΕͯϦϦʔε͓ͯ͘͠ඞཁ͕͋Δɻ
  25. THANK YOU!

  26. ຊ೔ͷϏʔϧ

  27. KIRIN HEARTLAND ϐϧεφʔελΠϧ ΨϒΨϒҿΊΔ 1

  28. SANKTGALLEN PINEAPPLE ALE ϑϧʔπϏʔϧ εΠεΠҿΊΔ 2

  29. BREWDOG ELVIS JUICE ΄΅άϨʔϓϑϧʔπδϡʔε ΰΫΰΫҿΊΔ 3

  30. YOHHO BREWING YONA YONA ALE ΞϝϦΧϯ ϖʔϧΤʔϧ ίϯϏχͰ΋ങ͑Δ ఆ൪ΤʔϧϏʔϧ 4

  31. SHIGA KOGEN BEER IPA ΠϯσΟΞϯϖʔϧΤʔϧ ೔ຊΛ୅ද͢ΔIPA 5

  32. SHIGA KOGEN BEER PORTER ϩϒετϙʔλʔ ࠇϏʔϧ͕ۤखͳਓʹ΋ҿΜͰ΋Β ͍͍ͨ 6