Как включить переменные в локализованные строки?

Я пытаюсь отобразить сообщение пользователю по строкам:

"Пользователь 5 не может быть добавлен"

Но как добавить переменные в строку, помещенную в файл .resx? Я пытаюсь найти такие вещи, как "Переменные в локализации", "Глобализация с переменными" и т.д., Но придумал сухую.

Если бы я не был локализован, я бы написал:

Console.Write("User " + userNum + " could not be added");

Как это можно сделать с помощью ресурсов?

Ответ 1

В командах, где я делал интернационализацию, мы также создали ресурс для строки формата, например USER_COULD_NOT_BE_ADDED_FORMAT, и назвали String.Format(или эквивалент вашей среды), передав это значение ресурса в качестве шаблона формата.

Затем вы сделаете Console.Write(String.Format(resourceManager.GetString("USER_COULD_NOT_BE_ADDED_FORMAT"), userNum));

Большинство локализаторов либо проходят обучение в строках формата, используемых системой, которую они локализуют, либо им предоставляется руководство в наборе локализации, который вы им предоставляете. Таким образом, это не так, например, как высокий барьер, поскольку они непосредственно изменяют код.

Обычно вам нужно добавить комментарий loc к идентификатору ресурса, чтобы объяснить позиционные параметры.

Ответ 2

Вы не можете сделать это напрямую.

Что вы можете сделать, это разместить токен - определенную строку, которая может быть заменена на string.Replace значением переменной.

Хорошим кандидатом для этого будет встроенное форматирование строк:

Console.Write(string.Format("User {0} could not be added", userNum));

Предполагая, что userNum имеет значение 5, результатом будет:

User 5 could not be added

Вы можете локализовать эту строку с помощью спецификаторов композитного формата.

Ответ 3

Используйте Composite Formatting так:

Console.Write("User {0} could not be added", userNum);

Таким образом, вы можете локализовать "User {0} could not be added".

Ответ 5

вы можете сделать это просто введите описание изображения здесь

new позволяет видеть, как

String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i])

это даст мне динамическое сообщение каждый раз

кстати, я использую ResXManager