Мы разрабатываем большое приложение, состоящее из множества маленьких пакетов. Каждый пакет имеет свой собственный набор файлов ресурсов для локализации.
Каков наилучший подход к организации и именованию строк локализации?
Вот мои мысли до сих пор:
Обработка дубликатов
Один и тот же текст (скажем, «почтовый индекс») может встречаться несколько раз в пределах одного пакета. Программный инстинкт (СУХОЙ) говорит мне создать единый строковый ресурс, общий для всех вхождений .
С другой стороны, переводчик может захотеть выбрать длинный перевод («Postleitzahl») в некоторых местах и более короткий («PLZ») в местах с меньшим количеством места. Или мы можем решить добавить двоеточие в некоторых случаях («почтовый индекс:»), но не в других. Или мы можем потребовать другую прописную букву ("почтовый индекс") в некоторых местах. Все эти аргументы указывают на создание одного ресурса за использование, даже если их содержимое идентично .
Именование
Если мы стремимся устранить дубликаты, имеет смысл называть ресурсы по содержимому , возможно, намекая на тип использования через префикс. Таким образом, мы можем иметь labelOK
= "OK" , messageFileTooLarge
= "Файл превышает максимальный размер файла." и labelZipCode
= "Почтовый индекс" .
Именование по содержимому имеет преимущество, заключающееся в естественной обработке аргументов форматирования: ресурс messageFileHas_0_MBWhileMaximumIs_1_MB
явно принимает два аргумента форматирования: фактический размер файла и максимальный размер файла.
Однако, если мы допустим дублирование, присвоение имен только содержимым не имеет смысла. Чтобы получить уникальные имена ресурсов, мы должны как-то включить место использования в имя ресурса. Это работает для графических элементов управления, хотя идентификаторы имеют тенденцию становиться немного длиннее: fileSelectionConfirmationButtonText
= "OK" , customerDetailsTableColumnZipCode
= "Почтовый индекс" . Однако для невизуальных файлов кода это становится сложнее. Как вы называете конкретное использование строки, если не знаете, где она в конечном итоге будет отображаться? По коду файла и названию функции? Кажется довольно неуклюжим и хрупким для меня.
В целом, я склоняюсь к разрешению дубликатов, но я изо всех сил пытаюсь найти последовательную схему именования, которая поддерживает это.
Изменить: Этот вопрос имеет два аспекта: как организовать ресурсы (DRY против дубликатов) и как их назвать . Пока ответы сосредоточены на первом аспекте. Буду признателен за отзыв о соглашениях об именах!
источник
Ответы:
Я принимаю дублирование всякий раз, когда вы не можете быть абсолютно уверены, что значение одинаково во всех случаях, когда используется определенная строка.
Даже если две надписи всегда содержат одну и ту же строку на английском языке (или на вашем родном языке), они не обязательно будут одинаковыми на всех языках. Принятие дублирования может дать вам (или, скорее, переводчикам) гибкость, необходимую для решения таких ситуаций.
В качестве примера: рассмотрим метку «Condition», которая, в зависимости от контекста, может переводиться как «Zustand» или «Bedingung» на немецком языке (среди множества других возможных переводов).
источник
Примите несколько дубликатов.
Вы можете избежать нескольких многократных переводов, создавая дополнительные элементы управления. Например, a
CancelButton
и an,OKButton
которые уже содержат их текст, а теперь Cancel / Abbrechen OK / OK должны быть переведены только один раз. Но это почти особый случай.источник
Вот как мы справляемся с этим в моей компании:
Соглашение о присвоении имен: мы присваиваем названия меткам, ставя перед ними префикс их класса / section / form / etc. Например
loadFile_loadButton
,loadFile_fileNameLabel
,loadFile_cancel
все ярлыки , принадлежащие к диалогу Load File. Хотя это подчеркнутое соглашение об именах не является наиболее распространенным, мы предпочитаем его более стандартным соглашениям, потому что оно улучшает удобочитаемость и «группируемость»: обратите внимание, насколько легко увидеть, к какому элементу относятся метки и что представляет каждая метка, по сравнению с метками по имениloadFileLoadButton
,loadFileNameLabel
иloadFileCancel
. Вы можете подумать, что разница невелика, но если у вас есть тысячи этикеток, сложный эффект того стоит.Комментарии заголовка. В дополнение к префиксу имен меток, мы также добавляем комментарии заголовка к файлам ресурсов, чтобы четко определить группы меток. Таким образом, кто-то, желающий изменить или добавить определенные метки, относящиеся к одному конкретному классу / разделу / форме / и т. Д., Может найти все метки, относящиеся к этому конкретному элементу, только в одном месте под одним заголовком и может легко приступить к добавлению или изменению меток. зная, что они не прервут переводы для каких-либо других элементов (ИМХО, это также очень сильный аргумент о том, почему вам нужно разрешить дублирование).
«Оправданные» дубликаты желательны: как упомянуто выше, эти методы определенно приведут к дублированию меток, но мы не видим проблем с этим (подробнее о том, как с этим обращаться в Инструментах торговли).
Как указали другие, один ярлык на одном языке может быть переведен двумя или более различными способами на другие языки в зависимости от представляемого ими контекста. Если вы «объединяете» метки, переводчику будет очень трудно придумать одну метку, которая соответствует всем контекстам, в которых он найден. Итак, как мы видим, использование «обоснованных» дубликатов помогает улучшить качество локализации, если они не ссылаются на одну и ту же вещь в одном и том же контексте (это означает «оправданный»).
Инструменты торговли: чтобы быть максимально эффективными при выполнении ваших переводов, вы можете создать свой собственный инструмент, который ищет похожие ярлыки, существующие в ваших комплектах, и предлагает их переводы в качестве значений по умолчанию для новых ярлыков, или вы можете даже используйте существующие службы, подобные этой , которые предоставляют инструменты, подобные той, которую я только что упомянул, что делает перевод новых этикеток быстрым (даже более того, если они повторяются несколько раз, поскольку инструмент по умолчанию предложит вам несколько вариантов перевода для новых этикеток). ).
Подводя итог: оправданное дублирование и сгруппированные ярлыки контекстным способом действительно помогают переводчикам выполнять свою работу. Долгое время. Подумайте об этом: наличие контекста помогает переводчику выбрать правильный перевод. А разрешение «оправданных» дубликатов устраняет конфликт необходимости выбора одного перевода, который плохо соответствует некоторым контекстам (но в любом случае является наилучшим в целом).
Надеюсь, это поможет!
источник
Когда я делал это в прошлом, мы пошли по пути файла ресурсов, содержащего полные предложения. Если одно и то же предложение использовалось многократно, но если в предложении были только отдельные слова, эти слова были бы дублированы.
Мы были привязаны к фреймворку, в котором файл ресурсов просто содержал список английских фраз с последующим переводом (с некоторыми индексированными данными в конце для быстрого поиска).
Для небольших запросов данных или кнопок, таких как имя поля «Почтовый индекс» или кнопка «ОК», будет храниться строка «Почтовый индекс» с последующим переводом, и она будет использоваться там, где требуется полная строка. Но (если мы не разбили строку вручную), она не использовалась бы для обозначения «почтового индекса» в предложении.
Используя пример с почтовым индексом, если вы попытаетесь перевести его самостоятельно и заменить его во всех предложениях, которые его используют, вы получите очень плохой перевод.
Например, «почтовый индекс должен быть введен» может потребоваться перевести буквальный эквивалент «введенный почтовый индекс должен быть» на другой язык. Если вы порежете предложение, вы не получите такого обращения слов, которое требуется на другом языке.
Вот почему некоторые плохо сделанные переводы на английский выглядят настолько нелепо, что человек, делающий это, просто переводит отдельные слова, а не целое предложение.
Мы всегда находили, что лучше всего переводить предложения в целом, не разбивая их. У нас были заполнители для данных, которые нужно было вставить (например, «Part Number @ 1 является избыточным»), и переводчик мог переместить заполнитель в положение, в котором он хотел получить хороший перевод.
Однако мы обнаружили, что разрешить местам, в которых используется одно и то же предложение, или одно и то же приглашение к данным, или одна и та же метка кнопки и т. Д., Было удобно делиться переводами. Это никогда не возникало как проблема и экономило время / стоимость для переводчика.
источник
Ваше мышление о наименовании хорошо.
Цели
Реализация
источник