IOS / iPhone: вложенные файлы Localizable.strings? - PullRequest
4 голосов
/ 10 октября 2011

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

Этими вариантами будут управлять несколько строк в нескольких файлах Localizable.strings.

Однако 90% строк останутся прежними.

Я бы хотел, чтобы каждый из уникальных файлов Localizable.strings импортировал «главный», чтобы мне не приходилось просматривать каждый из файлов вариантов приложения, когда я хочу изменить общий строка.

Возможно ли это?

Ответы [ 4 ]

5 голосов
/ 15 октября 2011

Две альтернативы:

  1. Используйте пользовательские функции-оболочки около NSLocalizedString, которые выполняют иерархический поиск для вас, а затем используйте механизм NSLocalizedString для случая по умолчанию.

    Ранее я писал ответ о том, как это сделать: Можно ли добавлять файлы ресурсов .strings во время выполнения?

  2. Использовать несколько файлов .strings дляязык.По по умолчанию вещи ищутся в "Localizable.strings", но функция NSLocalizedStringFromTable() позволяет вам указать собственное имя "таблицы".Так что если вы передадите «Configuration» в качестве имени таблицы, она будет искать в файле «Configuration.strings».

    Я работал над приложением, которое делало это.У нас было два разных файла .strings.Один контролировал настройки брендинга (какое имя использовать, какие изображения использовать, какие серверы использовать и т. Д.), А другой содержал все фактические переведенные строки.В пакете приложения будет только одна копия информации о брендинге, и мы выбрали правильный вариант для использования во время компиляции с некоторыми пользовательскими сценариями.Это сработало очень хорошо.

2 голосов
/ 12 октября 2011

К сожалению, Apple не поддерживает это для своих Localizable.strings файлов.

Вы можете имитировать эту функцию с помощью специального сценария Ruby или Python или просто сценария Bash, используя sed; скрипт может взять корневой файл .strings и скопировать содержимое в файл .strings каждого варианта. Это может быть даже пользовательский шаг сборки в Xcode.

1 голос
/ 15 октября 2011

OK.Вот что я сделал, чтобы решить эту проблему.

Я удалил различные файлы Localizable.strings из репозитория Git, но оставил их на своих местах (по одному в каждом из каталогов вариантов приложения).

Я взял только несколько строк, которые варьировались между каждым вариантом, и разбил их на отдельный текстовый файл, названный «MyLocalizable.strings».Я добавил каждый из них в Git и добавил их в проект, БЕЗ ОБЪЕДИНЯЯ ИХ ЦЕЛЕЙ.Я оставил файл Localizable.strings, связанный с каждой целью.

Итак, что у нас есть, так это то, что у каждой цели есть файл Localizable.strings, который связан с целью и будет скопирован в пакет.В каждом целевом каталоге есть файл с именем «MyLocalizable.strings», который содержит только несколько строк, которые варьируются от цели к цели.

Затем я взял подавляющее большинство строк - те, которые не меняются -и поместите их в другой файл с именем «MyLocalizable.strings», и поместите его в центральный (общий) каталог.Я снова добавил это в Git и в проект, БЕЗ ОБЪЕДИНЕНИЯ ЭТОГО ЦЕЛЕМ.

Затем я написал очень маленький, жалкий скрипт Perl для создания файла Localizable.strings в заданной цели из общегофайл, с приложенным к нему целевым файлом.Это перезаписывает существующий файл Localizable.strings.Это означает, что файл Localizable.strings является новым для каждого запуска скрипта.Этот скрипт был размещен в общей зоне и добавлен в проект БЕЗ ОБЪЕДИНЕНИЯ С ЦЕЛЕЙ.Сценарий имеет один аргумент, который является именем цели (и ее директории).Синтаксис этого сценария:

#!/usr/bin/perl

use strict;         # I'm anal. What can I say?
use Cwd;            # We'll be operating on the working directory.
use File::Path;

my $input1File = cwd()."/BMLT/Supporting\ Files/en.lproj/MyLocalizable.strings";
my $input2File = cwd()."/".$ARGV[0]."/en.lproj/MyLocalizable.strings";
my $outputFile = cwd()."/".$ARGV[0]."/en.lproj/Localizable.strings";

open ( MAIN_FILE, $input1File ) || die ( "Could not open main file!" );

my @file_data = <MAIN_FILE>;

close ( MAIN_FILE );

open ( PRODUCT_FILE, $input2File ) || die ( "Could not open product file!" );

push ( @file_data, <PRODUCT_FILE> );

close ( PRODUCT_FILE );

open ( FINAL_FILE, ">$outputFile" ) || die ( "Could not open destination file!" );

foreach ( @file_data ) print FINAL_FILE $_;

close ( FINAL_FILE );

Затем я добавляю шаг сборки Run Script ДО шага Copy Bundle Resources.Этот скрипт вызывает Perl-скрипт со следующим синтаксисом:

${PROJECT_DIR}/BMLT/Supporting\ Files/buildLocalizationFile.pl ${PRODUCT_NAME}

Когда сборка выполнена, файлы объединяются, и объединенный файл помещается в пакет.

1 голос
/ 10 октября 2011

Я не уверен, что вы хотите, но если вы просто хотите перевести несколько строк, вы могли бы.

Вы можете просто перевести часть этих строк, если нет перевода, ios выберет строки на языке приложения и отобразит их. Таким образом, Localizable.strings в языке приложения можно рассматривать как основной.

...