XLIFF-файл, ключи и длинные строки с NSLocalizedString

Я хочу перейти на xliff вместо того, чтобы переводить файлы Localizable.strings и Main.strings, но обнаружил, что использую NSLocalizedString неправильным образом (и я делал это в течение 5 лет на самом деле...).

Мне не нравится иметь переводы непосредственно внутри моего кода, поэтому я использую общий ключ и не пишу никаких комментариев:

NSLocalizedString("general.error", comment: "")

Затем я включаю строку в Localizable.strings.

"general.error" = "An error occured";

Пока все хорошо (возможно). Теперь, когда я экспортирую xliff-файлы, я вижу, что source — это просто мой общий ключ, и, очевидно, переводчик не может угадать, что писать как target для этого ключа:/

Итак, мой вопрос: единственное решение - переместить все переводы непосредственно внутрь NSLocalizedString?

NSLocalizedString("An error occured", comment: "")

или внутри комментария... (мне действительно не нравится это решение)

А что, если строка действительно длинная? кажется таким странным помещать строку из 3 строк прямо в код:/

Любое другое интересное решение там?

РЕДАКТИРОВАТЬ

Я уже пытался использовать константы, но кажется, что это решение не работает в быстром режиме. Я создал файл String.swift, в который добавил константы:

let thisIsMyLonStringID = "An here I can put the long translation";

И я могу использовать его следующим образом:

NSLocalizedString(thisIsMyLonStringID, comment: "")

Когда я экспортирую в XLIFF, эта строка недоступна в файлах xliff :(


person MatterGoal    schedule 14.06.2016    source источник


Ответы (3)


Я положил здесь ответ с моим временным решением. Кажется, это работает очень хорошо на самом деле.

Вместо использования языка Base для файла Localizable.strings я использовал English, поэтому я просто снял выбор Base в инспекторе файлов -> область локализации в Xcode, и мне был задан вопрос типа «какой язык вы бы хотели использовать в качестве основы"... Я выбрал английский язык.

Теперь я могу продолжать использовать NSLocalizedString с помощью универсального ключа и помещать переводы в Localizable.strings, когда я автоматически экспортирую в xliff, источник заполняется правильным переводом, а не ключом.

person MatterGoal    schedule 14.06.2016
comment
Я долго искал этот ответ! Единственный, который работает без очень плохого совета Использовать реальную строку в качестве ключа. - person Erik Zivkovic; 09.01.2018
comment
Работает... лучше, чем другие решения - person christijk; 21.05.2018

Вам нужно сделать вызов NSLocalizedString непосредственно в файле Strings.swift. Например:

// Strings.swift
let myString = NSLocalizedString("some very long string", comment: "")

// Usage
print(myString)

Таким образом, процесс экспорта строки сможет определить строковый литерал, который передается в NSLocalizedString.

person Eric Fikus    schedule 12.07.2017

Да, есть очень элегантное решение вашей проблемы. Проблема в том, что очень длинные строки становятся частью нашего кода, делая его трудным для чтения и запутанным.

Решение. Создайте LocalizationKeys.h

#ifndef Project_LocalizationKeys_h
#define Project_LocalizationKeys_h

static NSString *const LocalizationKeyForVeryLongString =
@"Your Very Very Long String";

#endif

В вашем коде: ViewController.m

NSLocalizedString(LocalizationKeyForVeryLongString, "");

Таким образом, приведенное выше решение отделило очень long messy strings и заменило их на elegant and readable Key Strings, более того, теперь у нас есть отдельный файл для ключевых строк, поэтому всякий раз, когда кому-то нужно изменить или выполнить поиск, напрямую обратитесь к LocalizationKeys.h

person Aamir    schedule 14.06.2016
comment
На самом деле это решение не работает для меня (хотя я использую Swift). Когда я экспортирую для xliff, все ключи, которые не являются строковыми литералами, не экспортируются. Итак, если я использую константу типа my.key вместо конечной строки "My key", xcode не экспортирует ее в xliff. - person MatterGoal; 14.06.2016
comment
Чтобы дать вам больше контекста. Я использовал общий файл Strings.swift и добавил туда несколько строк, используя этот код let myVeryLongString = "this is a very long string";, а затем я использовал NSLocalizedSrtring согласно вашему примеру... но эта строка не экспортируется в окончательный xliff... может быть Жук. - person MatterGoal; 14.06.2016