Почему люди используют простой английский в качестве заполнителей для перевода?
Это может быть глупый вопрос, но здесь идет.
Я видел несколько проектов, использующих некоторую библиотеку переводов (например, gettext), работающую с простыми английскими заполнителями. Так, например:
_("Please enter your name");
вместо абстрактных заполнителей (что всегда было моим инстинктивным предпочтением)
_("error_please_enter_name");
Я видел различные рекомендации по SO для работы с первым методом, но я не понимаю, почему. Что я не понимаю, что вы делаете, если вам нужно изменить английскую формулировку? Потому что, если фактический текст используется в качестве ключа для всех существующих переводов, вам также придется отредактировать все переводы и изменить каждый ключ. Или нет?
Разве это не ужасно громоздко? Почему это отраслевой стандарт?
Это определенно не правильная нормализация, чтобы сделать это таким образом. Есть ли у этого метода огромные преимущества, которых я не вижу?
8 ответов
Да, вы должны изменить существующие файлы перевода, и это хорошо.
Если вы измените английскую формулировку, переводы, вероятно, тоже должны измениться. Даже если они этого не делают, вам нужен кто-то, кто говорит на другом языке, чтобы проверить.
Вы готовите новую версию, и частью процесса обеспечения качества является проверка переводов. Если английская формулировка изменилась, и никто не проверил перевод, он высунется, как больной большой палец, и это будет исправлено.
- Основной язык уже существует: вам не нужно переводить его.
- Переводчики имеют лучший контекст с реальным предложением, чем расплывчатые заполнители.
- Заполнители - это всего лишь ключи, все еще можно изменить исходный язык, создав для него перевод. Потому что, когда перевод не существует, он использует заполнитель в качестве переведенного текста.
Некоторое время мы использовали абстрактные заполнители, и было довольно досадно писать все дважды при создании новой функции. Когда в качестве заполнителя используется английский, вы просто пишете код на английском языке, у вас есть значимый вывод с самого начала, и вам не нужно думать о присвоении имен заполнителям.
Так что моей причиной будет меньше работы для разработчиков.
Мне нравится ваш второй подход. При переводе текстов у вас всегда возникает проблема омонимов. Как "open" может означать состояние окна, но также и глагол для выполнения действия. На других языках эти омонимы могут не существовать. Вот почему вы должны иметь возможность добавить смысл своим заполнителям. Лучший подход - поместить это значение в вашу текстовую библиотеку. Если это невозможно на платформе, которую вы используете, возможно, было бы неплохо определить "язык разработки". Этот язык добавит значение в текстовые записи, такие как: "action_open" и "state_open". Вы, конечно, должны приложить дополнительные усилия при переводе этого языка на простой английский (или язык, для которого вы разрабатываете). Я включил эту философию в некоторые крупные проекты, и в долгосрочной перспективе это экономит время (и головные боли).
На мой взгляд, лучший способ сохранить значение отдельно, поэтому, если вы разрабатываете свою собственную библиотеку переводов или поддерживает поддерживаемую вами, вы можете сделать что-то вроде этого:
_(i18n("Please enter your name", "error_please_enter_name"));
Куда:
i18n(text, meaning)
Интересный вопрос. Я предполагаю, что основная причина в том, что вам не нужно заботиться о файлах перевода или локализации во время разработки, так как основной язык находится в самом коде.
Существует запасная иерархия, от самой конкретной локали до нелокализованной версии в исходном коде.
Таким образом, у французов во Франции может быть следующий запасной маршрут:
- а как
- фр
- Нелокализованный. Исходный код.
В результате, наличие правильных английских предложений в исходном коде гарантирует, что если конкретный перевод не предусмотрен на шаге (1) или (2), вы по крайней мере получите правильное понятное предложение, чем случайный мусор программиста, такой как "error_file_not_found".
Кроме того, что вы делаете, если это строка формата: "Извините, но% s не существует"? Еще хуже: "Записано% s записей в% s, общий размер: %d"?
Довольно старый вопрос, но еще одна причина, которую я еще не видел в ответах:
Вы могли бы получить больше заполнителей, чем необходимо, таким образом, больше работы для переводчиков и возможные противоречивые переводы. Тем не менее, хорошие редакторы, такие как Poedit или Gtranslator, могут помочь с этим.
Придерживайтесь вашего примера: текст "Пожалуйста, введите ваше имя" может появиться в другом контексте в другом шаблоне (о котором разработчик, скорее всего, не знает и не должен этого знать). Например, его можно использовать не как ошибку, а как подсказку, похожую на заполнитель поля ввода.
Если вы используете
_("Please enter your name");
это может быть использовано повторно, разработчик может не знать о существующем ключе для сообщения об ошибке и просто использовать тот же текст интуитивно.
Однако, если вы использовали
_("error_please_enter_name");
в предыдущем шаблоне разработчики не обязательно знали бы об этом и составляли бы второй ключ (скорее всего, в соответствии с предопределенной схемой формулировок, чтобы не оказаться в полном хаосе), например
_("prompt_please_enter_name");
который затем должен быть переведен снова.
Так что я думаю, что это не очень хорошо масштабируется. Предварительно согласованная схема формулировки суффиксов / префиксов, например, для контекстов, никогда не может быть настолько точной, как сам текст, я думаю (либо слишком многословным, либо слишком общим, заранее вы не знаете, а потом трудно изменить) и требует больше работы разработчик, который не стоит ИМХО.
Кто-нибудь согласен / не согласен?
Ну, это, вероятно, просто, что легче читать, и так легче переводить. Я считаю, что ваш путь лучше всего подходит для масштабируемости, но он просто требует дополнительных усилий, которые некоторые разработчики могут не посчитать стоящими... а для некоторых проектов это, вероятно, не так.