Локализуйте представление в раскадровке, используя "Определенные пользователем атрибуты времени выполнения"
В настоящее время у меня есть полуавтоматический способ локализовать свои взгляды. Однако сегодня я нашел интересный раздел в IB, который, кажется, предлагает мне локализовать свои взгляды из Интерфейсного Разработчика.
Таким образом, в IB вы можете определить атрибуты времени выполнения для выбранного объекта в Identity Inspector. Так что для моего UILabel
Я могу установить text
путь моего ярлыка к строке Hello World
,
Тем не менее, когда я выбираю Type = Localized String
а потом название ключа в моем Localized.strings
Я не получаю переведенную строку, а просто значение (отсюда ключ), которое я ввел в IB.
Я не понимаю, как этот механизм должен работать. Я хотел бы иметь возможность переводить мои взгляды, как это, какие-нибудь идеи?
3 ответа
"Определенные пользователем атрибуты среды выполнения" плохо документированы. Что я могу вспомнить из прочитанной мною книги, так это то, что UDRA впервые была реализована для программирования на MacOSX, поэтому тип "Локализованная строка" может быть функцией, которая пока не полностью поддерживается в iOS.
Самое смешное, что он переводит строки в превью раскадровки (xCode 4.5.1), но позже в скомпилированном приложении для iOS он просто вводит строку ключа.
Одно из решений, о котором я сейчас думаю, - это создать небольшой вспомогательный класс, который проверяет заголовки / текстовые строки представлений на viewDidLoad для ключевого слова, такого как "ключ", например "XYControllerTitleKey", а затем создает для этого NSLocalizedString-Method.,
ОБНОВЛЕНИЕ: кажется, что в то же время есть способ использовать UDRA:
Раскадровка /XIB и лучшие практики локализации
И учебник в результате ( ссылка)
Назначение типа "Локализованная строка" - дать вам возможность определить значение атрибута среды выполнения, которое будет участвовать в процессе локализации (с использованием базовой локализации). Это удобно, если, например, вы определяете пользовательский элемент управления, включаете его в раскадровку и хотите назначить локализуемую строку одному из его свойств. Однако это работает только на Mac OS, а не на iOS.
Вы можете легко подтвердить это, выполнив следующий эксперимент: поместите UILabel / NSTextField в вашу раскадровку и установите свойство "text" / "stringValue", используя определенный пользователем атрибут времени выполнения. Если вы используете "String" в качестве типа атрибута и генерируете соответствующий файл строк, вы не увидите его нигде в файле. Напротив, если вы измените тип на "Localized String" и сгенерируете файл строк, вы найдете запись, подобную этой:
/* Class = "IBUILabel"; wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Localized value"; ObjectID = "wij-Kq-q92"; */
"wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Localized value";
Затем вы можете локализовать это значение в соответствующем файле языковых строк. Опять же, это работает на Mac OS, но не на iOS.
Для меня, используя iOS 6, если вы генерируете свои строки из вашей базовой локализованной раскадровки (с помощью XCode, генерируйте их или используя ibtool --generate-strings-file
Вы получите автоматически сгенерированные строки, которые выглядят следующим образом MainStoryBoard.strings
, например):
/* Class = "IBUITextField"; b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Event Name"; ObjectID = "b4a-O4-bNZ"; */
"b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Event Name";
К сожалению, было бы неплохо идентифицировать их по ключевому пути, но, по крайней мере, у вас есть место, где должны быть локализованы пользовательские строки.