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

Локализации iOS-приложений (Я.Субботник, Минск, 2 июня 2012 г.)

Локализации iOS-приложений (Я.Субботник, Минск, 2 июня 2012 г.)

Andrey Subbotin

June 04, 2012
Tweet

More Decks by Andrey Subbotin

Other Decks in Technology

Transcript

  1. 52,4% не покупают продукт на чужом языке. 60% — для

    Франции, Японии и России. 89,3% — если английский знают плохо. 3
  2. 4

  3. 8 Локализация L10n Понятный язык интерфейса. Дата и время в

    привычном формате. Корректная сортировка списков. Поддержка местных единиц измерения. Правильное форматирование чисел.
  4. NSLog(NSLocalizedString(@"Some sample text", @"A text string to be output to

    the logs.")); 13 2012-03-06 08:10:05.433 L10nSample[15433:f803] Some sample text 2012-03-06 08:11:02.117 L10nSample[15438:f903] Некий примерный текст
  5. en.lproj/Localizable.strings /* A text string to be output to the

    logs. */ "Some sample text" = "Some sample text"; /* A text string to be output to the logs. */ "Some sample text" = "Некий примерный текст"; 17 ru.lproj/Localizable.strings
  6. /* Class = "IBUIButton"; normalTitle = "Welcome!"; ObjectID = "8";

    */ "8.normalTitle" = "Welcome!"; 20 en.lproj/ViewController.strings
  7. Переводчики Понимают английский. Не всегда понимают русский. Не используют Xcode

    и не редактируют XIB. Не знают контекста перевода без вашей помощи. 27
  8. 31 генерирует .strings из кода и XIB’ов загружает .strings в

    Tanker забирает из Tanker’а свежие переводы обновляет XIB файлы аккуратно все коммитит в git PROFIT!!
  9. Babelyoda::Specification.new do |s| s.name = 'YandexMaps' s.development_language = :en s.localization_languages

    = [:ru, :uk, :tr] s.engine = Babelyoda::Tanker.new do |t| t.token = ENV['TANKER_TOKEN'] t.project_id = 'myak_iphone' t.endpoint = ENV['TANKER_HOST'] end s.scm = Babelyoda::Git.new s.source_files = FileList['{Classes,Shared}/**/*.{m,mm,h}'] s.resources_folder = 'Resources' s.xib_files = FileList['Resources/**/en.lproj/*.xib'] s.strings_files = FileList['Resources/**/en.lproj/*.strings'] end 34
  10. $ rake -T rake babelyoda rake babelyoda:create_keysets rake babelyoda:drop_empty_strings rake

    babelyoda:drop_orphan_keys rake babelyoda:drop_orphan_keysets rake babelyoda:extract rake babelyoda:extract_strings rake babelyoda:extract_xib_strings rake babelyoda:fetch_strings rake babelyoda:initBabelfile rake babelyoda:localize_xibs rake babelyoda:pull rake babelyoda:push rake babelyoda:remote:drop_keysets rake babelyoda:remote:list rake babelyoda:verify 36
  11. #!/bin/bash function verify { if [ $CONFIGURATION == 'AppStore' ]

    ; then rvm rvmrc trust . && rvm rvmrc load . && bundle \ && bundle exec rake babelyoda:verify return $? fi return 0 } git submodule update --init --recursive && verify 37 yxbuildkit-prebuild.sh
  12. NSLog( NSLocalizedString(@"I scanned %g %@.", @”Text to show the number

    of directories scanned”), dirScanCount, dirScanCount == 1 ? NSLocalizedString(@"directory", @”Single directory”) : NSLocalizedString(@"directories", @”Plural directories”) ); 45
  13. NSLog( dirScanCount == 1 ? NSLocalizedString("I scanned %g directory.", @”Blah”)

    : NSLocalizedString("I scanned %g directories.", @”Blah”), dirScanCount ); 50
  14. NSString *forms[4] = {0}; forms[0] = NSLocalizedString(@"%d change", @"Blah"); forms[1]

    = NSLocalizedString(@"%d changes", @"Blah"); forms[2] = NSLocalizedString(@"%d changes", @"Blah"); forms[3] = NSLocalizedString(@"%d changes", @"Blah"); int form = YXPluralFormForN(self.transfersCount); NSString *pluralTransfers = forms[i]; 52
  15. int YXPluralFormForRU(NSInteger n) { // One - 1, 21, 31,

    ... // Some - 2-4, 22-24, 32-34 ... // Many - 5-20, 25-30, ... NSInteger n10 = n % 10; if ((n10 == 1) && ((n == 1) || (n > 20))) { return 0; } else if ((n10 > 1) && (n10 < 5) && ((n > 20) || (n < 10))) { return 1; } else { return 2; } } 53
  16. NSString *forms[4] = {0}; forms[0] = NSLocalizedString(@"NumberChanges0", @"Blah"); forms[1] =

    NSLocalizedString(@"NumberChanges1", @"Blah"); forms[2] = NSLocalizedString(@"NumberChanges2", @"Blah"); forms[3] = NSLocalizedString(@"NumberChanges3", @"Blah"); int form = YXPluralFormForN(self.transfersCount); NSString *pluralTransfers = forms[i]; 56
  17. /* The number of changes shown in the route description

    */ "%[one]d changes" = "%d changes"; "%[some]d changes" = "%d changes"; "%[many]d changes" = "%d changes"; "%[none]d changes" = "%d changes"; 61 Localizable.strings /* The number of changes shown in the route description */ "%[one]d changes" = "%d остановка"; "%[some]d changes" = "%d остановки"; "%[many]d changes" = "%d остановок"; "%[none]d changes" = "";
  18. 68 Склеивание строк NSString *part1 = NSLocalizedString(@"People in the room",

    @"Part 1"); NSString *part2 = NSLocalizedString(@"%d", @"Part 2"); NSString *halfResult = [NSString stringWithFormat:@"%@: %@", part1, part2]; NSString *result = [NSString stringWithFormat:halfResult, 5]; ΁΍΁ɿ̑ਓ