Локализация со строкой. Формат - PullRequest
2 голосов
/ 18 октября 2019

В настоящее время я в основном занимаюсь локализацией, помещая пары ключ-значение в файл Resources.resw. Поэтому мне интересно, как мне локализовать строки, которые требуют форматирования, или произносить строки с разными порядками грамматики на разных языках. Возможно, будет легче понять, что я имею в виду с примерами ниже.

Например, так же, как предполагает эта часть в официальном документе для локализации, один язык может иметь формат даты

string.Format("Every {0} {1}", monthName, dayNumber);

, в то время как другой использует

string.Format("Every {1} {0}", monthName, dayNumber);

Каков наилучший способ локализации такой строки?

Вещи / грамматики могут быть намного сложнеечем этот пример. Предложение в официальном документе мне не нравится, потому что свидание может быть непредсказуемым. Или, может быть, вы можете перечислить дату, но это требует много работы. Или, скажем, у нас есть строка, которая принимает пользовательский ввод, например

 string.Format("Do you want to delete {name}?", name);

На другом языке это может иметь следующий порядок грамматики

string.Format("You want to delete {name} do?", name);

Невозможно локализовать все предложение какПример предлагает в документе.

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

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Если у вас есть доступ к дате, которую вы можете использовать Спецификатор формата месяца ("M", "m")

Из документации:

DateTime date1 = new DateTime(2008, 4, 10, 6, 30, 0);
Console.WriteLine(date1.ToString("m", 
                  CultureInfo.CreateSpecificCulture("en-us")));
// Displays April 10                        
Console.WriteLine(date1.ToString("m", 
                  CultureInfo.CreateSpecificCulture("ms-MY")));
// Displays 10 April

Для string.Format("Do you want to delete {name}?", name); вы можете

$"Do you want to delete the following user? '{name}'";
0 голосов
/ 18 октября 2019

Один из способов, который я только что узнал, - поместить эту пару ключ-значение в Resources.resw:

Ключ: RemoveText

Значение: Do you want to delete {0}?

После того, как вы получите локализованную строку, например,

var msg = Localize('RemoveText');

Затем

var result = string.Format('msg', name)

может дать вам ожидаемый результат.

По сути, вам нужно поставить {0}соответственно на каждом языке. Единственный недостаток в том, что {0} не должно появляться в имени.

Аналогично, если вы все еще хотите, чтобы {0} было разрешено в вашем имени, вы можете заменить {0} на другие строки, которые вы считаетенедопустимо, например '{peopleShouldNotUseThisInTheirNames}'. А затем используйте

msg.replace('{peopleShouldNotUseThisInTheirNames}', name)

, чтобы получить локализованную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...