Локализация системы сгенерированных сообщений о состоянии

Я работаю в среде .NET, где система иногда создает записи в журнале для клиента. Затем сообщения добавляются в журнал клиента, который можно просмотреть позже.

Например, если клиент подписывается на новую услугу или у клиента произошла неудачная попытка оплаты, эти сообщения добавляются в журнал клиента.

На данный момент все сообщения жестко закодированы в код, например, «Клиент не смог завершить оплату XX».

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

Как лучше всего справиться с этим сценарием?

11.12.2008 16:06:39
Вы используете журнал файлов или журнал событий?
Treb 11.12.2008 16:12:14
В настоящее время мы записываем необработанные текстовые строки в базу данных SQL.
mbp 11.12.2008 16:14:45
2 ОТВЕТА
РЕШЕНИЕ
  • Регистрируйте идентификаторы событий, а не сообщения.
  • Захват специфических данных события вместе с идентификатором события.
  • Когда пользователь просматривает журнал, локализуйте сообщение о событии на основе уникального идентификатора.

Проблема, с которой вы столкнетесь, заключается в том, что вы пытаетесь вставить динамические данные в сообщения диалоговым способом. Например, если вам нужно написать «Не найдено ни одного сообщения» или «Одно сообщение найдено» против «Найдены X сообщения», это проблематично - в английском языке мы имеем разные множественные числа для нуля, одного и более чем одного ... но это не обязательно так на других языках. Такие вещи, как числа или даты, менее проблематичны для вставки в форму String.Format, но вам не нужно пытаться динамически генерировать реальный язык локализованным способом.

Я бы рекомендовал следовать шаблону, такому как журнал событий Windows, где вы выводите идентификатор события, локализованное сообщение на основе идентификатора события, а затем захватывать определенные «поля», где вы локализуете имя поля и формат отображения поле, например, «Сумма: 2,00 $» или что-то еще. Возможно, это не самый красивый способ, но если у вас нет лингвиста, занятого полный рабочий день и посвященного этому, и вы намерены учесть все мелкие нюансы каждого языка, я бы выбрал более простой формат вывода журнала ,

В данном примере вы должны отделить сообщение журнала от данных, например:

Клиент не смог завершить платеж.
Сумма: XX

Вы регистрируете идентификатор сообщения, например, «13579» может быть уникальным идентификатором события, когда клиент не может завершить платеж. Наконец, вы можете сохранить значение в отдельном поле.

Как выяснить, сколько полей выделить для какого-либо события или как хранить данные ... это упражнение, которое лучше всего оставить читателю.

4
11.12.2008 22:18:18

Вы можете определить локализованные строки в вашей базе данных и просто записать идентификатор сообщения журнала в таблицу журналов. Таблица сообщений журнала также будет содержать поле для указания языка.

Если вы ведете много журналирования, это также уменьшит размер вашего журнала (даже если это, вероятно, не актуально, учитывая объем памяти, доступный на современных компьютерах ;-)

Этот метод имеет две проблемы:

  1. Вам необходимо синхронизировать регистрацию в вашем приложении с таблицей сообщений журнала.
  2. Вы не можете регистрировать любые динамические данные, например, имя клиента.

С первым пунктом можно разобраться, используя перечисление с описательными именами, например

enum LogMessages
{
    OutOfDiskSpace = 1;
    OutOfMemory = 2;
    OutOfCoffee = 3;
}

В вашем приложении вы бы назвали void LogToDatabase(LogMessages)так:

// forgot to buy coffee again!
Log(OutOfCoffee);

Вторая проблема требует больше работы. Вы можете определить свои строки так, чтобы вы могли использовать string.Format():

 string.format("{0} forgot to buy coffee again. Lazy geek!", "I");
// yields: "I forgot to buy coffee again. Lazy geek!"

Для этого вы должны сохранить данные вариации («Я», «Вы», «Мой младший брат» ...) в своей журнальной таблице вместе с идентификатором сообщения журнала. (Или вы нормализуете это немного больше и поместите его в третью таблицу, но это вполне может быть преждевременной нормализацией ;-).

1
11.12.2008 17:08:58