Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to make your app international

How to make your app international

In Japanese

Yusei Nishiyama

November 18, 2016
Tweet

More Decks by Yusei Nishiyama

Other Decks in Programming

Transcript

  1. J04ΞϓϦέʔγϣϯͷ
    ւ֎ల։
    ΫοΫύουגࣜձࣾւ֎ࣄۀ෦
    ੢ࢁ༐ੈ!ZVTFJOJTIJZBNB

    View Slide

  2. 8IPBN*
    w :VTFJ/JTIJZBNB !ZVTFJOJTIJZBNB

    w J04EFWFMPQFSZFBST
    w *OUFSOBUJPOBMHSPVQ

    View Slide

  3. એ఻
    དྷ೥࢝ʹٕज़ධ࿦ࣾͷ8%#
    13&44QMVTγϦʔζ͔Β
    ʰ4XJGU࣮ફೖ໳ʱΛग़൛͠·͢

    View Slide

  4. "HFOEB
    wϨγϐͱݴޠ
    wϢʔβʔͷݴޠͷܾఆ
    w35-ରԠ
    wϫʔΫϑϩʔ
    wϩʔΧϥΠζͷ5JQT

    View Slide

  5. Ϩγϐͱݴޠ

    View Slide

  6. ૝ఆ͍ͯ͠ͳ͍Ϣʔεέʔε
    wϢʔβʔ͕ࣗ෼ͷࠃҎ֎ͷ

    ϨγϐΛӾཡ͢Δ
    wࣗಈ຋༁ͰཧղͰ͖ͳ͍ݴޠͷ

    Ϩγϐ΋ӾཡͰ͖ΔΑ͏ʹ͢Δ

    View Slide

  7. ίϯςϯπͷύʔιφϥΠζ
    wϢʔβʔ͕ཧղͰ͖ΔݴޠͰϨγϐ͕

    هड़͞Ε͍ͯΕ͹ྑ͍Θ͚Ͱ͸ͳ͍
    w৯ࡐʹϦʔνͰ͖Δ؀ڥʹ͍ͳ͚Ε͹

    ϨγϐΛ࠶ݱͰ͖ͳ͍
    wΞΧ΢ϯτͱݴޠ͸ର
    wਓͷϢʔβʔ͕ෳ਺ͷݴޠΛލ͍Ͱ࢖༻͢
    Δ͜ͱΛ૝ఆ͍ͯ͠ͳ͍

    View Slide

  8. Ϣʔβʔͷݴޠͷܾఆ

    View Slide

  9. σόΠεͷݴޠઃఆ͸

    ৴༻Ͱ͖Δʁ
    wӳޠઃఆ͕໨ཱͭ
    w୺຤ͷྲྀ௨ܦ࿏͸༷ʑ
    wݴޠɺϩέʔϧͷม͑ํ
    Λ஌͍ͬͯΔͱ͸ݶΒͳ͍

    View Slide

  10. ໌ࣔతͳݴޠબ୒
    wݴޠ͝ͱʹίϯςϯπ͕

    ҟͳΔ
    wཧղͰ͖ΔݴޠͰ͸ͳ͘ɺ
    ͲͷݴޠʮݍʯͷϨγϐΛ
    Ӿཡ͍͔ͨ͠Λબ୒͢Δ

    View Slide

  11. Ϣʔβʔͷݴޠͷ༧ଌ
    w4*.ͷ৘ใ
    wσόΠεͷݴޠ
    wϩέʔϧ

    View Slide

  12. struct CountryCodePredictor {
    static func inferredISOCountryCode() -> String? {
    return countryCodeFromNetwork() ?? countryCodeFromLocale() ?? nil
    }
    private static func countryCodeFromNetwork() -> String? {
    return NetworkInfoUtils.isoCountryCode()
    }
    private static func countryCodeFromLocale() -> String? {
    let locale = NSLocale.currentLocale()
    return locale.objectForKey(NSLocaleCountryCode) as? String
    }
    }
    class NetworkInfoUtils {
    // Check MCC
    class func isoCountryCode() -> String? {
    let networkInfo = CTTelephonyNetworkInfo()
    let carrier = networkInfo.subscriberCellularProvider
    if let carrier = carrier {
    return carrier.isoCountryCode // ISO 3166-1
    } else {
    return nil
    }
    }
    }

    View Slide

  13. ίϯςϯπͷݴޠͱ

    6*ͷݴޠ
    wίϯςϯπͷݴޠͱ6*ͷݴޠΛ
    Ұக͍ͤͨ͞
    wσόΠεͷݴޠઃఆ͸৴༻

    Ͱ͖ͳ͍ લड़

    View Slide

  14. 6*ͷݴޠΛಈతʹ੾Γସ͑Δ

    View Slide

  15. ϦιʔεϑΝΠϧ΁

    ௚઀ΞΫηε͢Δ
    private func LocalizedString(key: String,
    tableName: String? = nil,
    bundle: NSBundle = NSBundle.mainBundle(),
    value: String = "",
    language: Language) -> String {
    if let
    path = NSBundle.mainBundle().pathForResource(language.ISO639_1, ofType: "lproj"),
    bundle = NSBundle(path: path) {
    return bundle.localizedStringForKey(key, value: value, table: tableName)
    } else {
    ʢলུʣ
    }
    }

    View Slide

  16. ஫ҙ఺
    wϦιʔεϑΝΠϧ΁ͷύεͷ

    ૊Έཱͯ͸ඇਪ঑
    wγεςϜ͕දࣔ͢Δจݴ͸

    σόΠεͷݴޠʹґଘͨ͠··

    View Slide

  17. 35-ରԠ

    View Slide

  18. "VUP-BZPVUͷ৔߹

    View Slide

  19. "VUP-BZPVUʹ

    པΒͳ͍35-ʜ
    w-FBEJOHɺ5SBJMJOHͷํ޲͸

    ʮσόΠεͷݴޠઃఆʯͰܾ·Δ
    wΞϓϦ಺ͰݴޠઃఆΛ࣋ͬͯ͠·ͬͯ

    ͍ΔͷͰɺ͜ΕʹཔΔ͜ͱ͕Ͱ͖ͳ͍
    w୺຤ͷݴޠઃఆ͕ӳޠͰɺϢʔβʔ͕

    બ୒ͨ͠ݴޠ͕"SBCJDͱ͍͏͜ͱ͕

    ͋ΓಘΔ

    View Slide

  20. 7JFXͷ൓స

    transform = CGAffineTransformMakeScale(-1, 1)


    View Slide

  21. 3PPUWJFXͷ൓స
    override func viewDidLoad() {
    super.viewDidLoad()
    view.flipIfNeeded()
    }

    View Slide

  22. ํ޲Λ࣋ͬͨཁૉͷ൓స
    private var titleLabel: Label = {
    let label = Label.newAutoLayoutView()
    label.textColor = UIColor.cgu_greenColor()
    label.flipIfNeeded()
    return label
    }()

    View Slide

  23. ໰୊఺
    wख࡞ۀ
    wϛε͕ൃੜ͠΍͍͢
    wଞͷํ๏ʢϝιουஔ׵ͳͲʣ
    ΋ߟ͕͑ͨɺίϯτϩʔϧ͕

    ೉͘͠ɺ෭࡞༻͕ා͍

    View Slide

  24. ϫʔΫϑϩʔ

    View Slide

  25. wӳޠͷจݴ͚ͩΛ௥Ճ
    w຋༁࡞ۀ͕ϒϩοΫʹͳΒͳ͍Α͏ʹ͜ͷ
    ஈ֊Ͱ͸ଞͷݴޠʹ͸ରԠ͠ͳ͍
    w຋༁Λޙճ͠ʹ͢ΔͨΊ(JU)VCqPXͰ͸
    ৗʹNBTUFSΛϦϦʔεՄೳʹͰ͖ͳ͍
    export
    upload
    translate
    download
    import
    develop
    feature
    RC

    View Slide

  26. export
    upload
    translate
    download
    import
    develop
    feature
    RC
    desc "Export xliff file of base locale."
    task :export do
    sh "xcodebuild -exportLocalizations -localizationPath . -project Global.xcodeproj"
    sh "mv #{BASE_LOCALE}#{EXT} #{SOURCE_FILE}"
    end
    desc "Upload xliff file of base locale to OneSky platform."
    task :upload do
    resp = project.upload_file(file: "#{SOURCE_FILE}", file_format: 'XLIFF', is_keeping_all_strings: false)
    p resp.code
    end
    wYMJGGܗࣜͷϑΝΠϧʹϕʔεݴޠ ӳޠ
    ͷ

    จݴΛΤΫεϙʔτ
    w0OF4LZ ޙड़
    ʹΞοϓϩʔυ

    View Slide

  27. export
    upload
    translate
    download
    import
    develop
    feature
    RC
    w0OF4LZΛར༻
    w֤ࠃͷϝϯόʔ͕຋༁࡞ۀ
    w୯ͳΔ௚༁Ͱͳ͘αʔϏεͷ

    ࢥ૝Λ൓өͨ͠ҙ༁

    View Slide

  28. 0OF4LZ

    View Slide

  29. export
    upload
    translate
    download
    import
    develop
    feature
    RC
    desc "Download translations from OneSky platform."
    task :download => TMP_DIR do
    ACTIVE_LOCALES.each { |locale|
    file_name = file_name(locale)
    resp = project.export_translation(source_file_name: SOURCE_FILE, locale: locale, export_file_name: file_name)
    File.open(file_name, 'w') { |file| file.write(resp) }
    }
    end
    desc "Import translated xliffs."
    task :import do
    ACTIVE_LOCALES.each { |locale|
    sh "xcodebuild -importLocalizations -localizationPath #{file_name(locale)} -project Global.xcodeproj"
    }
    end
    w֤ݴޠຖͷYMJGGܗࣜͷϑΝΠϧΛ0OF4LZ͔Β
    μ΢ϯϩʔυ
    wμ΢ϯϩʔυͨ͠ϑΝΠϧΛ9DPEFʹΠϯϙʔτ

    View Slide

  30. ະղܾͷ໰୊
    wจݴͷίϯςΩετͷڞ༗͕೉͍͠
    wಉ͡จݴͰ΋ϓϥοτϑΥʔϜ͝ͱ
    ʹ຋༁͢Δඞཁ͕͋Δ
    w຋༁ϛε͕໨ཱͭ

    View Slide

  31. ϩʔΧϥΠζͷ5JQT

    View Slide

  32. /4-PDBMJ[FE4USJOHͷ
    Ωʔ஋
    wίϯςΩετ͕Θ͔Δ໋໊
    wಉ͡จݴͰ΋ෳ਺ͷՕॴͰ

    ࢖͍·Θ͞ͳ͍
    "new" = "new"; "home.feed.new" = "new";

    View Slide

  33. ม਺ͷॱং
    ม਺ͷॱং͕ݴޠؒͰಉ͡ͱ͸

    ݶΒͳ͍
    "Copy %@’s %@" = "%@ von %@ kopieren";
    "Copy %@’s %@" = "%[email protected] von %[email protected] kopieren";


    "Copy %@’s %@" = "Copying %@’s %@";

    View Slide

  34. %PVCMF-FOHUI
    1TFVEPMBOHVBHF

    View Slide

  35. 3JHIUUP-FGU
    1TFVEPMBOHVBHF

    View Slide

  36. /44IPX/PO-PDBMJ[FE4USJOHT

    View Slide

  37. ετΞͰͷ"SBCJDରԠ
    wJ5VOFT$POOFDU͸"SBCJDʹ

    ରԠ͍ͯ͠ͳ͍
    wӳޠͷϝλσʔλʹซه͢Δͷ͕

    Ұൠతͳ໛༷

    View Slide

  38. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide