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


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.