Локализация ASP.NET с исключительным и множественным

16
задан 17 December 2008 в 22:57
поделиться

6 ответов

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, заполнитель включен в переводимый ресурс. Если все, что я имею, "был удален" без ключа к разгадке существительного референта, я могу только поразить свою собаку путем проклятия вслух, и в конце я все еще должен произвести грамматику мусора.

35
ответ дан 30 November 2019 в 16:10
поделиться

AFAIK, нет ничего встроенного к платформе, чтобы сделать это..

Вот пример одного обобщенного решения для проблемы:

http://dotnetperls.com/plural

1
ответ дан 30 November 2019 в 16:10
поделиться

Нет ничего, встроил, мы закончили тем, что кодировали что-то вроде этого: Другое решение может быть:

заполнители использования как {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";
}
0
ответ дан 30 November 2019 в 16:10
поделиться

Логика не должна быть в Вашем представлении, но это находится, конечно, не в ресурсе, моделируют платформу DotNet. Ваш - достаточно простой случай, что можно, вероятно, сойти с рук создание простой строки формата для исключительного, и один для множественного числа. "У Вас есть 1 автомобиль". / "Вы имеете {0} автомобили". Тогда необходимо записать метод, который различает между множественным и исключительным случаем.

Насколько я знаю, нет языка, который требует чего-то более сложного, чем исключительный/множественный, но могут быть некоторые, где выражение эквивалента "Вас имеет 0 автомобилей", не звучит правильным. Существует также много языков, где нет никакого различия между исключительным и множественным, но это просто требует небольшого дублирования в строках ресурса. (редактирование для добавления: пол и иногда изменение окончаний в зависимости от количества единиц на многих языках, но это должно быть прекрасным, пока Вы различаете исключительные и множественные предложения, а не просто слова).

Microsoft главным образом разочаровалась в семантически умной локализации, потому что трудно обобщить даже что-то как плюрализация к 30 + языки. Поэтому Вы видите такое скучное представление числовых количеств в большинстве приложений, которые переводятся во многие языки вроде "Автомобилей: {0}". Это звучит как Ламе, но удивительно, прошлый раз, когда я проверил, исследования удобства использования, на самом деле не способствовал подробному представлению естественного языка в большинстве случаев.

-1
ответ дан 30 November 2019 в 16:10
поделиться

moodforaday писал:

Это относится ко всем, а не только к числам. Например, такой фрагмент, как «% s был удален», также нельзя перевести, поскольку форма глагола будет зависеть от пола существительного, что здесь недоступно. Лучшее, что я могу сделать для польского, - это эквивалент «Deleted:% s», но я могу делать это только до тех пор, пока заполнитель% s включен в переводимый ресурс. Если все, что у меня есть, это «было удалено» без указания на референт существительное, я могу только напугать свою собаку громкими проклятиями и, в конце концов, мне все равно придется составить мусорную грамматику.

Я хотел бы здесь отметить, никогда не включает существительное в качестве параметра. Многие европейские языки видоизменяют существительное в зависимости от его пола и, в случае немецкого языка, от того, является ли оно субъектом, объектом или косвенным объектом. Просто используйте отдельные сообщения. Вместо «% s был удален.» Используйте отдельную строку перевода для каждого типа: «Транзакция удалена». «Пользователь удален». и т. д.

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

Решение для обработки множественного числа на разных языках можно найти здесь: http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html

Хотя вы не можете использовать указанное выше программное обеспечение в коммерческих приложениях (на него распространяется GPL), вы можно использовать те же концепции. Их выражения множественного числа идеально подходят для лямбда-выражений в .NET. Существует ограниченное количество выражений множественного числа, которые охватывают большое количество языков. Вы можете сопоставить конкретный язык лямбда-выражению, которое вычисляет, какую форму множественного числа использовать в зависимости от языка. Затем найдите соответствующую форму множественного числа в файле resx .NET.

2
ответ дан 30 November 2019 в 16:10
поделиться

anvilis писал:

Я хотел бы здесь отметить, что никогда не включайте существительное в качестве параметра. Многие европейские языки видоизменяют существительное в зависимости от его пола и, в случае немецкого языка, от того, является ли оно субъектом, объектом или косвенным объектом. Просто используйте отдельные сообщения. Вместо «% s был удален.» Используйте отдельную строку перевода для каждого типа: «Транзакция была удалена». «Пользователь удален». и т. д.

Мне всегда было любопытно, как правильный способ сделать вещи похожими на приведенные выше, но которые включают строку, которая не может быть включена как часть перевода, например «% s сказал:» или "% s написал:" (который сейчас можно увидеть на фейсбуке). В этом случае% s, скорее всего, является именем пользователя, а глагол зависит, например, от пола пользователя.

(извините за то, что написал это как ответ вместо использования комментария - я не могу найти ссылку для комментария)

1
ответ дан 30 November 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: