Можно ли обновить строки локализованной раскадровки?


226

Я локализовал часть своего приложения, создав раскадровку base.lproj и 3 строковых файла. Это было месяц назад, и после этого я добавил новый контроллер представления в приложение, но кнопки и метки этого контроллера не отображаются в строковых файлах.

Можно ли обновить эти 3 прикрепленных файла строки раскадровки или я должен добавить новые переводы строк программно с использованием NSLocalizableString и Localizable.strings?


Ответы:


264

Есть два варианта:

Опция 1

Xcode может «перезагрузить» файл путем преобразования файла в тип файла [Interface Builder Cocoa Touch Storyboard] или в тип файла [Localizable Strings] .

  1. Выберите базовый файл раскадровки в Навигаторе проекта
  2. Найдите раздел « Локализация » в Инспекторе файлов.
  3. Если ваш файл в настоящее время является [Localizable Strings], измените его на [Interface Builder Cocoa Touch Storyboard] или наоборот.
  4. Xcode должен был преобразовать вашу раскадровку в текущую версию, сохраняя при этом ваши старые усилия по локализации. Здесь вы можете изменить файл обратно на исходный тип файла, если хотите.

Вариант 2

Используйте ibtool, чтобы извлечь строки из вашей раскадровки.

  1. Откройте приложение «Терминал»

  2. Найдите свой каталог Base.lproj

  3. Используйте эту строку для извлечения строк:

    ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

  4. После того как ibtool извлечет строки в file_name.strings, вы можете скопировать и вставить их в исходный файл .strings

Посетите для получения дополнительной информации: https://conyac.cc/business/columns/localization_guide_ios


1
Я попробовал вариант 1, но изменение типа файла с [Localizable Strings] на [Interface Builder Cocoa Touch Storyboard] всегда приводит к падению Xcode 5.0.1. Причиной может быть то, что - поскольку я не знал о вышеописанных возможностях - я ранее вручную редактировал файлы локализации раскадровки.
— Рейнхард Маннер

16
Вариант 1 работает. Но вам нужно изменить «Localizable ..» на «interface ...», а затем снова вернуться!
— Жоау Нуньес

3
Вариант 1 не работает для меня, используя XCode 6.0.1. При попытке конвертировать мой файл .strings в .interfacebuilder XCode спрашивает, нужно ли конвертировать файлы. Файлы создаются в файловой системе, однако строковые файлы остаются и содержат старые значения.
— Прыгающий бит

53
Для меня вариант 1 заменил все уже переведенные строки на английские. Мне пришлось добавить перевод еще раз.
— Михаил Великов

5
Вариант 1 кажется очень нестабильным в Xcode 7. Иногда он работает, иногда нет. Иногда это случайно заменяет некоторые из моих уже переведенных строк английскими версиями.
— Адам Джонс

76

Проверьте BartyCrouch , он отлично решит вашу проблему. Также он с открытым исходным кодом , активно поддерживается и может быть легко установлен и интегрирован в ваш проект.


Установите BartyCrouch через Homebrew :

brew install bartycrouch

Или установите его через Mint :

mint install Flinesoft/BartyCrouch

Поэтапно обновить раскадровки / файлы XIBs Строки:

$ bartycrouch update

Это сделает именно то, что вы искали.


Для того , чтобы сохранить свои раскадровки / XIBs Струна файлов обновляется с течением времени я настоятельно рекомендую добавить скрипт сборки (инструкции о том , как добавить скрипт сборки здесь ):

if which bartycrouch > /dev/null; then
    bartycrouch update -x
    bartycrouch lint -x
else
    echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi

В дополнение к постепенному обновлению файлов Storyboards / XIBs Strings это также гарантирует, что ваши Localizable.stringsфайлы будут обновляться с использованием недавно добавленных ключей в коде NSLocalizedStringи отображать предупреждения для дублированных ключей или пустых значений.

Обязательно закажите BartyCrouch на GitHub или эту подробную статью для получения дополнительной информации.


1
Вот Это Да! Этот инструмент просто потрясающий. Это требует больше голосов!
— ph1lb4

1
Прекрасный инструмент - больше не нужно вручную копировать / вставлять новые метки-тексты в * .strings-файлы (... и забывать перевод любой новой метки, как и раньше) ... Большое спасибо!
— IKK

есть ли подобный модуль для проектов OBJC?
— rickrvo

2
Это ответ, который мы ищем. Это должен быть принятый ответ.
— Хуанхо

3
Я не понимаю, почему через 6 лет после того, как этот вопрос задан, и это неоднозначное решение все еще требуется, чтобы заставить это работать в XCode. Apple должна была поработать над этим.
— Huggie

57

Вы можете вручную добавить ключ в свой файл локализации. Вы можете найти ключевой объект, выбрав его в редакторе раскадровки. Давайте посмотрим на Object-IDличность инспектора. Это выглядит как"nwc-b2-19c"

На вашей локализации обновите или добавьте перевод. Например :

"nwc-b2-19c.title" = "Translated title";

8
думаю, что это менее рискованный подход
— Николя Манзини

Но некоторые из Object-ID не отображаются в файле .string. Потому что они не связаны. Так что же тогда я могу сделать?
— Михир Оза

Есть ли способ выбрать его через имя, а не только автоматически сгенерированный идентификатор?
— cocoseis

Для UILabel это: "YeB-ap-Wkw.text" = "Текст моих меток";
— ioopl

30

Этот не для всех, но он не требует дополнительных инструментов в терминале, и это легко для небольших ручных изменений. (Не учитывайте это, когда хотите автоматизировать свой процесс.)

Шаг 0: Настройка языка раскадровки

  • База (с английскими текстами)
  • Английский (файл локализуемых строк не существует, поскольку базовый файл английский)
  • другие языки (файлы локализуемых строк)

базовая конфигурация

Этот шаг выполняется только один раз.

Теперь, когда я добавляю что-то в раскадровку, я делаю следующее

Шаг 1: добавьте файл локализуемых английских строк

Добавить английский

просто отметьте английскую позицию.

Это создает совершенно новый английский локализуемый файл строк со всеми строками

Шаг 2: скопируйте новые позиции в другие языковые файлы

и перевести их

Шаг 3: снять отметку с английского, удалить соответствующий файл локализуемых строк

файл нужен только для получения новых позиций

Это простой и быстрый процесс, все делается в редакторе раскадровки.

Редактировать:

Этот процесс очень хорошо работает с небольшими раскадровками. Например, у меня есть проект на основе вкладок и раскадровка для каждой вкладки.

Ищите «справочник раскадровки», чтобы найти учебники.

Хороший пример: ссылка на раскадровку в Xcode, где мы должны ее использовать?

Таким образом, каждая небольшая раскадровка имеет только несколько строк для локализации.


здорово! Вы также нашли идею, как удалить удаленные элементы?
— Тобе

@Tobe Если вы разделите свою раскадровку, как я предлагаю выше, очень легко обнаружить строки, которые больше не используются.
— Герд Кастан

15

Наконец, моим решением было (элементарно, но эффективно) скопировать предыдущие переводы и вставить их в новый файл, созданный снятием флажка и установкой флажка «Локализация».

Это было бы полезно в некоторых случаях, таких как мой, когда вам нужно изменить только один или два текста.


Сохранит ли это идентификатор и все такое время? Я сделал один тест, и он, казалось, сработал, но это может быть катастрофой, если идентификатор изменился.
— Ullstrm

Я так думаю, я делал это много раз без проблем.
— jpl850

1
Идентификаторы назначаются, когда вы удаляете элементы пользовательского интерфейса. Они не зависят от локализации, так как они назначаются раскадровкой. Так что не будет никакого влияния на идентификаторы.
— iBug

Спасибо iBug за объяснение =)
— jpl850

14

Я думаю, что лучше всего использовать встроенные локализации экспорта / импорта:

  1. В Project Navigator выберите папку вашего проекта
  2. Выберите «Редактор»> «Экспорт для локализации»,
  3. Все переводы остались на своих местах и ​​XCode автоматически добавляет пропущенные строки. Кроме того, перед импортом вы можете отредактировать .xliff в XLIFF Editor (например, онлайн - http://xliff.brightec.co.uk ), а затем вам не нужно делать это в XCode.
  4. затем Editor> Import Localizations и выберите сохраненный файл .xliff.

PS Если вы не хотите редактировать в XLIFF Editor и пропустили шаг 3, XCode не может сохранить новые строки. В этом случае откройте .xliff в XLIFF Editor, повторно сохраните без изменений и импортируйте новый файл.


1
+1 Простой и правильный способ работы с локализацией. Кроме того, это предпочтительный способ быть Apple
— Jurasic

1
Используя Xcode 7.3.1, в уже локализованном примере проекта я изменил метку (с «текста» на «основной текст») и добавил новую метку. Я экспортировал для локализации, коснулся файла .xliff (без изменений) и снова импортировал его. В файле Main.strings строка комментария для измененной метки была обновлена /* Class = "UILabel"; text = "a basic text"; ObjectID = "HFW-aN-MTb"; */, но новая метка НЕ ​​создается в файле Main.strings. Затем я отредактировал файл .xliff, чтобы добавить перевод для новой метки. Я импортировал это снова. Новая метка теперь вставлена ​​в файл Main.strings.
— duthen

+1 но есть ошибка, которую я обнаружил. При добавлении новых элементов они не находятся в экспортированном файле (как говорит duthen). Но когда я делаю экспорт сразу после (без изменений в раскадровке), все удивительно включенные элементы. Так что сделайте экспорт дважды. Второй будет включать все новые элементы. Спасибо, Apple!
— Виктор Кучера

6

Когда вы щелкаете в раскадровке, например, в Main.storyboard ... Справа вы видите меню локализации (см. Прикрепленное изображение). Если вы снимите флажок и еще раз проверьте язык, файл будет сгенерирован снова. Поэтому я обычно копирую содержимое, снова генерирую файл и затем вставляю содержимое, которое я скопировал и уже перевел.

Это способ, которым я использую для обновления словаря.

введите описание изображения здесь


С Xcode 10, если вы используете git, это подчеркивает различия!
— Рикардо Руис Ромеро

Да, это возможно ... теперь мой файл больше, чем на эту дату, и я снова объединяю его с версией репозитория.
— J. Fdez

5

Я получил огромную раскадровку с множеством строк. Два языка основаны на английском и другом арабском. Задача состояла в том, чтобы добавить некоторые поля и метки в раскадровку и добавить для них локализацию без каких-либо сценариев и NSLocalizableStrings.

Для меня помогло следующее:

Первое : убедитесь, что у вас есть git, чтобы предотвратить непредвиденные изменения.

  1. Перейти к целевому экрану в xcode и нажать Editor-> Export For Localization.... Сохраните файл ar.xliff где-нибудь.
  2. Скачать XLIFF Edtior .
  3. Откройте файл ar.xliff и внесите изменения.
  4. Импортируйте этот файл в xcode. Готово! Вы обновили файл строк раскадровки.

Чтобы это работало, сначала выберите проект или цель в редакторе проекта Xcode.
— Чак Борис

4

Существует приложение командной строки от Apple под названием AppleGlot, которое поддерживает пошаговую локализацию. Я еще не пробовал, но выглядит точно так же, как инструмент, который вы искали (некоторое время назад).


appleglotИнструмент работает с конечными пучками приложений. Это совершенно другой подход для приложений перевода.
— Фловдис

1
Что-то не так с «другим подходом», или что вызывает понижение?
— Тило

Нужно искать AppleGlot по этой ссылке сейчас.
— NSDeveloper

4

Вот скрипт для извлечения строк из раскадровок и xibs и объединения их с существующими переводами.

Для автоматического запуска сценария при создании проекта поместите сценарий в корневой каталог проекта и добавьте этап « Выполнить сценарий» со следующей строкой к целевым этапам сборки в настройках проекта.

./mergegenstrings.py PathToSourceDir

Или вы можете запустить скрипт на Терминале вручную, когда захотите.

Сценарий работает так, ibtoolкак ответил Та Леанг. Он также работает genstringsдля извлечения и слияния строк, отмеченных NSLocalizedStringв вашем исходном коде. Сценарий основан на сценарии в этом посте , который объединяет строки после запуска genstrings.


Можете ли вы предоставить больше информации о том, как использовать это?
— user023

1
Я добавил комментарий к сути. Надеюсь, поможет. gist.github.com/yoichitgy/29bdd71c3556c2055cc0
— Йоичи Тагая

Спасибо, отлично работает для меня. Если у кого-то есть проблемы с разрешениями, это может быть полезно: stackoverflow.com/questions/9850936/…
— iCode

Этот скрипт отлично работает для файлов раскадровки Main.strings, но, похоже, перезаписывает мои переводы Localizable.strings в Xcode 7.
— Адам Джонс

3

Самый простой и очень менее рискованный подход - просто скопируйте идентификатор объекта из раскадровки и добавьте новый ключ для ключа в локализованном файле, как показано ниже:

1: Скопируйте идентификатор объекта, как показано ниже, из раскадровки для компонента:

введите описание изображения здесь

2: Добавить новый ключ в локализованный файл, как показано ниже:

"DjF-dn-0ay.text" = "Borrar datos y restablecer";

Примечание. Это очень менее рискованный подход, если вы хотите обновить только несколько компонентов, в противном случае вы можете воссоздать локализованный файл для раскадровки.


Спасибо за Ваш ответ!!!!!. У меня есть вопрос: в моих проектах я не создал розетку для некоторых ярлыков, кнопок ... Если я использую objectID для этих кнопок и ярлыков, достаточно ли этого?
— Харикартик К

3

Xlifftool доступен как приложение для Mac и хорошо работает. Он показывает все переводимые строки и объекты из info.plist, локализуемые строки и раскадровку.

Получить его здесь для Mac: https://itunes.apple.com/lv/app/xlifftool/id1074282695?mt=12

Шаг 1: в Xcode выберите папку вашего проекта в навигаторе проекта. Затем выберите Редактор / Экспорт для локализации ...

Ваши переводимые строки будут включены в файл xliff на языке, который вы выбрали для локализации в Xcode.

Шаг 2: Откройте этот файл с помощью xlifftool и переведите или обновите ваши переводы, которые были сделаны ранее.

Шаг 3: Затем загрузите обратно в свой проект с помощью редактора / Импорт локализаций ...


Другой альтернативой для macOS является Loca Studio . Как и в Xlifftool, приложение может открыть результат редактора действий Xcode -> Экспорт для локализации. Он имеет более продвинутые функции фильтрации и поиска, а также автоматические проверки качества. (полное раскрытие: я ведущий разработчик).
— guru_meditator

0

Это мой простой способ обновить новый текст из раскадровки или XIB в строку локализации

1 - используйте этот скрипт http://tredje.se/dev/trouble/?x=entry:entry150917-204052

2- выберите строку локализации, которую вы хотите обновить, и переключите строку языка с «Строка локализации» на «Раскадровка интерфейса разработчика»

3- переключи обратно :)

Готово.

введите описание изображения здесь


Он изменяет файл на раскадровку Interface Builder, но через 1 или 2 секунды снова возвращает его обратно в локализуемые строки и не добавляет в локализуемые строки новый текст для просмотра
— Mujahid Latif

@MujahidLatif Я использую этот стручок прямо сейчас, это очень полезно для меня , и это может обновить раскадровки локализаций и Localization.String как будет github.com/Flinesoft/BartyCrouch
— Фади Abuzant

0

Вариант 1
XCode может «перезагрузить» файл путем преобразования файла либо в [Interface Builder Cocoa Touch Storyboard]тип файла, либо в тип [Localizable Strings]файла.

Выберите базовый файл раскадровки в Навигаторе проекта. Найдите раздел « Локализация » в Инспекторе файлов . Если ваш файл в настоящее время является [Localizable Strings], измените его [Interface Builder Cocoa Touch Storyboard]или наоборот.
Xcode должен был преобразовать вашу раскадровку в текущую версию, сохраняя при этом ваши старые усилия по локализации. Здесь вы можете изменить файл обратно на исходный тип файла, если хотите.

Вариант 2
Используйте ibtoolдля извлечения строк в вашей раскадровке.

Откройте приложение Terminal.
Найдите свой Base.lprojкаталог.
Используйте эту строку для извлечения строк:

ibtool MainStoryboard.storyboard --generate-strings-file file_name.strings

После того, как ibtool извлечет строки file_name.strings, вы можете скопировать и вставить их в исходный .stringsфайл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.