Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アプリが国際化する時
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
punchdrunker
September 15, 2017
Technology
590
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アプリが国際化する時
punchdrunker
September 15, 2017
More Decks by punchdrunker
See All by punchdrunker
Kotlin2.0以降の新機能
punchdrunker
0
58
DnD in Compose
punchdrunker
0
340
what's new in Material Design で気になったトピック
punchdrunker
1
650
7カ国語に対応したサービスでの翻訳管理システムの改善事例
punchdrunker
1
1.5k
Java Bytecode Vertical Tasting
punchdrunker
2
1.6k
getting started with dark theme
punchdrunker
2
1.1k
Practical Activity Transition in Android
punchdrunker
0
1.3k
今時のProgress indicator / Replacing ProgressDialog with ProgressBar
punchdrunker
0
740
レビュー評価4.7の秘密 / The Secret To A Better Reputation
punchdrunker
2
2.1k
Other Decks in Technology
See All in Technology
NetBoxを利用した作業効率化の試み_NetDevNight4
tnoha
0
420
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
150
LLMリーダーボードアップデートに向けたAgentic Math_SWEのトレースについて
nejumi
0
190
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
380
書籍セキュアAPIについて
riiimparm
0
400
ガバメントクラウドでのランサムウェア対策
techniczna
1
510
大 AI 時代におけるC# の事情 ~ぶっちゃけトークを交えながら~
nenonaninu
1
620
MIRU 2026 チュートリアル
keisuke198619
0
420
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
720
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
730
それでも、技術なブログを書く理由 #kichijojipm / Why I Still Write Tech Blogs Even Now
shinkufencer
0
1.5k
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
180
Featured
See All Featured
Color Theory Basics | Prateek | Gurzu
gurzu
0
400
Raft: Consensus for Rubyists
vanstee
141
7.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
270
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
430
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.1k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
RailsConf 2023
tenderlove
30
1.5k
Transcript
ΞϓϦ͕ࠃࡍԽ͢Δ࣌ by punchdrunker shibuya.apk#18
punchdrunker ࣣඌ و࢙ Web੍࡞ձࣾۈΛܦͯ2011ϛΫγΟೖࣾɻ 2011 - 2016 : SNS mixiͷΞϓϦ։ൃɺϚωδϝϯτ
2016 - ݱࡏ : ՈΞϧόϜ ΈͯͶͷ։ൃશൠ (iOS / Android / Rails)
INDEX 1. ΈͯͶʹ͍ͭͯ 2. ΧϧνϟϥΠζ 3. ଟݴޠԽ 4. ҬԽ 5.
ͦͷଞ 0 ͓͢͠Δ͜ͱ
ABOUT 1 ΈͯͶʹ͍ͭͯ
ABOUT 1 ΈͯͶʹ͍ͭͯ
ABOUT 1 ΈͯͶʹ͍ͭͯ ੈքதͷՈͷ“͜͜ΖͷΠϯϑϥ”Λͭ͘Δ ࢠҭͯΛͬͱָ͘͠͠ɺݽಠͳࢠҭͯΛͳ͘͢ ͦͷࢠͷਓੜΛ·Δ͝ͱͤΔՈΞϧόϜΛ
ABOUT 2015αʔϏε։࢝ 180ສϢʔβʔ ૯Ξοϓϩʔυຕ ԯສຕ ύύɺϚϚ͕͍ͨ͘ͳΔΑ͏ͳ ελΠϦογϡ͞ & ͍͡͡ɺ͋Ͱ ͑Δ؆୯͞
Google Play StoreͷϢʔβʔධՁ ˑ4.672 ධՁ૯19,310 1 ΈͯͶʹ͍ͭͯ
ABOUT ΈͯͶϑΥτϒοΫ 2016αʔϏε։࢝ ݄ؒ30,000Λൢച ϫϯίΠϯͰങ͑ΔΧδϡΞϧ͞ ͍͠ύύɾϚϚʹ͚ͨࣗಈ࡞͕ಛ 1 ΈͯͶʹ͍ͭͯ
ABOUT ࠃࡍԽ 20177݄ΑΓӳޠදࣔʹରԠ ϑΥτϒοΫͷւ֎ൃૹࠓޙରԠ༧ఆ 1 ΈͯͶʹ͍ͭͯ
CULTURIZATION 2 จԽͷҧ͍
CULTURIZATION 2 จԽͷҧ͍ ಉੑࠗ
CULTURIZATION 2 จԽͷҧ͍ ΞϓϦͷ໊લ ΞϝϦΧਓɺmitene͕ಡΊͳ͍ൃੜ ථձٞΛܦͯɺ໊લΛܾΊΔͷʹ2िؒ͘Βֻ͍ ͔ͬͨɻ ϚΠςΟʔϯ ϊΡ Ποπϛɾςɾω
Ξʔϋʔ
MULTILINGUALIZATION 3 ଟݴޠԽ
ӳ2ϲࠃޠ ຊޠҎ֎ӳޠѻ͍ɻ ॳظϦϦʔεͰͷϩέʔϧ͔Βࣗಈผ͍ͯ͠ ͕ͨɺϢʔβʔ͔ΒͷཁͰઃఆՄೳʹ͢ΔରԠΛ ϦϦʔεɻ ӳޠ͕ͩɺΞϓϦຊޠͰ͍͍ͨਓ͕Ұ ఆ͍Δɻ MULTILINGUALIZATION 3 ଟݴޠԽ
ෳܗ 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 ଟݴޠԽ
ෳܗ 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 ଟݴޠԽ
ෳܗ 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 ଟݴޠԽ
ςετ RobolectricͷΞϊςʔγϣϯͰϦιʔεͷछྨΛࢦఆͰ͖Δͷ Ͱɺจࣈྻͷςετָͩͬͨ @Test @Config(qualifiers = “en-port”) // ӳޠ&ॎը໘ public
void testFormatter() { …. assertEquals(“Newborn”, formatter.getAge(context, 0)) } ͋͘·ͰϦιʔεͷम০ࢠΛݻఆ͢ΔͨΊͷͰɺLocaleͷ͕ ϞοΫ͞ΕΔΘ͚Ͱͳ͍ɻ LocaleΛऔಘ͢ΔΑ͏ͳॲཧͷ߹ผ్mock͢Δඞཁ͕͋ Δɻ MULTILINGUALIZATION 3 ଟݴޠԽ
LOCALIZATION 4 ҬԽ
LOCALIZATION 4 ҬԽ ωοτϫʔΫڥͷҧ͍ τϨϯυϥΠϯͰൺֱ͢ΔͱɺΞοϓϩʔυ͕࣌ؒඵͷͰɺ ຊʙ.#ɺถࠃʙ.#લޙ
LOCALIZATION 4 ҬԽ ಈըߘ طଘͷߏ౦ژϦʔδϣϯͷΈͩͬͨͷͰɺւ֎ͷϦʔδϣ ϯʹόέοτΛ࡞ɻ ߘ࣌ʹͲͷόέοτ͕͍͔ۙΛAPIʹฉ͍͔ͯΒɺΞο ϓϩʔυ͢ΔΑ͏ʹͨ͠ɻ ߘޙΤϯίʔυॲཧΛߦ͍ɺΫϩεϦʔδϣϯ ϨϓϦ
έʔγϣϯͰ౦ژʹ͢ɻ ࣌transfer accelerationΛΒͣʹ࣮ͨ͠ͷͰɺ࠷ॳ ͔ΒAWSͷਓʹܰ͘૬ஊ͓͚ͯ͠Α͔ͬͨɻ
LOCALIZATION 4 ҬԽ ͓Βͤ௨ ϢʔβʔͷߦಈىҼͷͷϦΞϧλΠϜͷ··ɻ ͓Βͤܥͷ࣌ؒΛௐ͢Δҝʹ௨Λ༧͢ΔΑ͏ʹ͠ ͨɻ ʮn݄ͷϑΥτϒοΫ͕Ͱ͖·ͨ͠ʯͷΑ͏ͳ௨ϐʔΫ λΠϜͷ࣌ؒલʹૹΓ͍ͨɻ ϦϦʔεલͰmigration࣌ͷσʔλΛϛε͓ͬͯΒ͕ͤ
ۭදࣔʹͳΔͱ͜Ζͩͬͨɻ
MISC 5 ͦͷଞ
ετΞͷݴޠ MISC 5 ͦͷଞ App StoreGoogle Playɺӳޠ൛ͷϦϦʔεΛҰऴ͑ ͔ͯΒͰͳ͍ͱɺprimary language(σϑΥϧτݴޠ)Λઃఆ Ͱ͖ͳ͔ͬͨɻ
ϝδϟʔΞοϓσʔτ࣌ʹσϑΥϧτӳޠͰύʔϯοΈͨ ͍ͳ͜ͱΛΓ͔ͨͬͨΒɺखલͷόʔδϣϯͰӳޠͷܝࡌ ใΛೖΕͯϦϦʔε͓ͯ͘͠ඞཁ͕͋Δɻ
THANK YOU!
ຊͷϏʔϧ
KIRIN HEARTLAND ϐϧεφʔελΠϧ ΨϒΨϒҿΊΔ 1
SANKTGALLEN PINEAPPLE ALE ϑϧʔπϏʔϧ εΠεΠҿΊΔ 2
BREWDOG ELVIS JUICE ΄΅άϨʔϓϑϧʔπδϡʔε ΰΫΰΫҿΊΔ 3
YOHHO BREWING YONA YONA ALE ΞϝϦΧϯ ϖʔϧΤʔϧ ίϯϏχͰങ͑Δ ఆ൪ΤʔϧϏʔϧ 4
SHIGA KOGEN BEER IPA ΠϯσΟΞϯϖʔϧΤʔϧ ຊΛද͢ΔIPA 5
SHIGA KOGEN BEER PORTER ϩϒετϙʔλʔ ࠇϏʔϧ͕ۤखͳਓʹҿΜͰΒ ͍͍ͨ 6