JasonTrue записал:
Насколько я знаю, нет языка, который требует чего-то более сложного, чем исключительный/множественный
, Такие языки действительно существуют. На моем собственном польском языке, например, существует три формы: для 1, для 2-4 и для нуля и чисел, больше, чем 4. Тогда после достижения 20 формы для 21, 22-24 и 25 + снова отличаются (те же грамматические формы что касается цифр 0-9). И да, "у Вас есть 0 вещей", звучит неловким, потому что Вы вряд ли будете видеть используемый в реальной жизни.
, Если возможно, используйте формы, которые помещают цифру в конец:
a: Number of cars: %d
Это означает, что форма существительного "автомобиль" не зависит от цифры, и 0 является столь же естественным как любое другое число.
, Если вышеупомянутое не приемлемо, по крайней мере, всегда, делайте полное предложение переводимым ресурсом. Таким образом, действительно используйте
b: You have 1 car.
c: You have %d cars.
, Но никогда не разделяет такие единицы на меньшие фрагменты такой как [1 119]
d: You have
e: car(s)
(Тогда где-то в другом месте, у Вас есть нелокализуемый ресурс такой как %s
%d
%s
)
, различие - то, что, в то время как я не могу перевести (c) непосредственно, так как форма существительного изменится, я вижу проблему , и я могу изменить предложение для формирования (a) в переводе.
, С другой стороны, когда я сталкиваюсь с (d) и (e) фрагментами, нет никакого способа удостовериться, что получающееся предложение будет грамматично. Снова: использование фрагментирует гарантии , что на некоторых языках перевод будет чем-либо от грамматически неловкого к полностью поврежденному.
Это применяется через плату, не только к цифрам. Например, фрагмент такой как %s was deleted
также непереводим, так как форма глагола будет зависеть от пола существительного, которое недоступно здесь. Лучшим, который я могу сделать для польского языка, является эквивалент Deleted: %s
, но я могу только сделать это пока %s
, заполнитель включен в переводимый ресурс. Если все, что я имею, "был удален" без ключа к разгадке существительного референта, я могу только поразить свою собаку путем проклятия вслух, и в конце я все еще должен произвести грамматику мусора.
AFAIK, нет ничего встроенного к платформе, чтобы сделать это..
Вот пример одного обобщенного решения для проблемы:
Нет ничего, встроил, мы закончили тем, что кодировали что-то вроде этого: Другое решение может быть:
заполнители использования как {CAR} в строках файла ресурсов Поддерживают отдельные записи ресурса для исключительных и множественных слов для "автомобиля": автомобиль CAR_SINGULAR
автомобили CAR_PLURALРазрабатывает класс с этой логикой:
class MyResource
{
private List<string> literals = new List<string>();
public MyResource() { literals.Add("{CAR}") }
public static string GetLocalizedString(string key,bool isPlural)
{
string val = rm.GetString(key);
if(isPlural)
{
val = ReplaceLiteralWithPlural(val);
}
else
{
val = ReplaceLiteralWithSingular(val);
}
}
}
string ReplaceLiteralWithPlural(string val)
{
StringBuilder text = new StringBuilder(val)
foreach(string literal in literals)
{
text = text.Replace(literal,GetPluralKey(literal));
}
}
string GetPluralKey(string literal)
{
return literal + "_PLURAL";
}
Логика не должна быть в Вашем представлении, но это находится, конечно, не в ресурсе, моделируют платформу DotNet. Ваш - достаточно простой случай, что можно, вероятно, сойти с рук создание простой строки формата для исключительного, и один для множественного числа. "У Вас есть 1 автомобиль". / "Вы имеете {0} автомобили". Тогда необходимо записать метод, который различает между множественным и исключительным случаем.
Насколько я знаю, нет языка, который требует чего-то более сложного, чем исключительный/множественный, но могут быть некоторые, где выражение эквивалента "Вас имеет 0 автомобилей", не звучит правильным. Существует также много языков, где нет никакого различия между исключительным и множественным, но это просто требует небольшого дублирования в строках ресурса. (редактирование для добавления: пол и иногда изменение окончаний в зависимости от количества единиц на многих языках, но это должно быть прекрасным, пока Вы различаете исключительные и множественные предложения, а не просто слова).
Microsoft главным образом разочаровалась в семантически умной локализации, потому что трудно обобщить даже что-то как плюрализация к 30 + языки. Поэтому Вы видите такое скучное представление числовых количеств в большинстве приложений, которые переводятся во многие языки вроде "Автомобилей: {0}". Это звучит как Ламе, но удивительно, прошлый раз, когда я проверил, исследования удобства использования, на самом деле не способствовал подробному представлению естественного языка в большинстве случаев.
moodforaday писал:
Это относится ко всем, а не только к числам. Например, такой фрагмент, как «% s был удален», также нельзя перевести, поскольку форма глагола будет зависеть от пола существительного, что здесь недоступно. Лучшее, что я могу сделать для польского, - это эквивалент «Deleted:% s», но я могу делать это только до тех пор, пока заполнитель% s включен в переводимый ресурс. Если все, что у меня есть, это «было удалено» без указания на референт существительное, я могу только напугать свою собаку громкими проклятиями и, в конце концов, мне все равно придется составить мусорную грамматику.
Я хотел бы здесь отметить, никогда не включает существительное в качестве параметра. Многие европейские языки видоизменяют существительное в зависимости от его пола и, в случае немецкого языка, от того, является ли оно субъектом, объектом или косвенным объектом. Просто используйте отдельные сообщения. Вместо «% s был удален.» Используйте отдельную строку перевода для каждого типа: «Транзакция удалена». «Пользователь удален». и т. д.
Таким образом, каждая строка может быть переведена должным образом.
Решение для обработки множественного числа на разных языках можно найти здесь: http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
Хотя вы не можете использовать указанное выше программное обеспечение в коммерческих приложениях (на него распространяется GPL), вы можно использовать те же концепции. Их выражения множественного числа идеально подходят для лямбда-выражений в .NET. Существует ограниченное количество выражений множественного числа, которые охватывают большое количество языков. Вы можете сопоставить конкретный язык лямбда-выражению, которое вычисляет, какую форму множественного числа использовать в зависимости от языка. Затем найдите соответствующую форму множественного числа в файле resx .NET.
anvilis писал:
Я хотел бы здесь отметить, что никогда не включайте существительное в качестве параметра. Многие европейские языки видоизменяют существительное в зависимости от его пола и, в случае немецкого языка, от того, является ли оно субъектом, объектом или косвенным объектом. Просто используйте отдельные сообщения. Вместо «% s был удален.» Используйте отдельную строку перевода для каждого типа: «Транзакция была удалена». «Пользователь удален». и т. д.
Мне всегда было любопытно, как правильный способ сделать вещи похожими на приведенные выше, но которые включают строку, которая не может быть включена как часть перевода, например «% s сказал:» или "% s написал:" (который сейчас можно увидеть на фейсбуке). В этом случае% s, скорее всего, является именем пользователя, а глагол зависит, например, от пола пользователя.
(извините за то, что написал это как ответ вместо использования комментария - я не могу найти ссылку для комментария)