2008-12-11 4 views
4

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

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

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

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

Что было бы лучшим способом справиться с этим сценарием?

+0

Используете ли вы журнал файлов или журнал событий? – Treb 2008-12-11 16:12:14

ответ

4
  • Идентификаторы событий журнала, а не сообщения.
  • Соберите данные, связанные с конкретным событием, вместе с идентификатором события.
  • Когда пользователь просматривает журнал, локализуйте сообщение о событии на основе уникального идентификатора.

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

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

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

Клиент не закончат компенсацию.
Сумма: XX

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

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

1

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

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

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

  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!" 

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

Смежные вопросы