Вот как это сделать на уровне базы данных.
Когда мне нужно было это сделать, я разбил каждую таблицу кода на две таблицы. Один из них содержит данные, не зависящие от культуры: внутренний идентификатор кода, сам код, если код был культурно-инвариантным, и, возможно, другие столбцы (например, категории сортировки/группировки). В другом - данные о конкретных культурах: описания, коды, специфичные для культуры, в случае необходимости и т. Д.
(Коды, предназначенные для конкретной культуры, являются гнездом шершни, не пинайте его, если вам это не нужно. Может быть немного сложно понять, что US
и EU
- это тот же код в разных но есть страны, где политически неприятно заставить франкоязычных пользователей использовать US
в качестве аббревиатуры от États-Unis
. Ну, a страна.)
Наличие таблицы кодирования с учетом культуры позволяет установить ограничения между ними и основные таблицы, которые ее используют. Построение культуры конкретных запросов довольно просто:
SELECT m.*, c.Code, ISNULL(s.Description, lf.Message)
FROM MainTable m
JOIN FooCodeData c ON m.CodeID = c.ID
LEFT JOIN CultureSpecificFooCodeData s ON s.CodeID = c.ID AND s.Culture = @Culture
JOIN LookupFailure lf ON lf.Culture = @Culture
Обратите внимание, что если ваши коды культурной специфики, вы не должны даже присоединиться FooCodeData
в этом запросе, выбирая s.Code
вместо этого.
Обратите внимание также на одну неотъемлемую слабость этого подхода, как показано LEFT JOIN
и ISNULL
в этом запросе: вы не можете создать ограничение, гарантирующее, что для каждой комбинации кода/культуры существует определенная для конкретной культуры строка. Это то, что LookupFailure
предназначено для: он получает специальное сообщение о культуре, которое указывает, что для кода не была введена запись кода для конкретной культуры.