Третий вариант выглядит великолепно. Приведено отображение спящего режима, но не схема базы данных - если это то, чего вам не хватает, то я обрисую это здесь:
dictionary
----------
ID: int - identity
name: nvarchar(255)
phrase
------
dictionary_id:int (fkey dictionary.ID)
culture_id:int (LCID)
phrase:nvarchar(255) - this is the default size - seems too small
Согласно этой записи в блоге , 255 - это длина строки по умолчанию для значений String. Чтобы преодолеть короткую длину строки в тексте фразы, вы можете изменить тег <element>
на
<element column="phrase" type="String" length="4001"></element>
Чтобы использовать это в модели вашего домена, вы добавляете свойство PhraseDictionary
к вашей сущности, где вы хотите перевести текст. Например. свойство title или свойство decription.
Я думаю, что в статье описан отличный подход, и я хотел бы перейти
за.
РЕДАКТИРОВАТЬ: в ответ на комментарии, сделать длину меньше, чем 4001, если вы знаете, что абсолютный максимальный размер меньше, чем это, так как обычно это будет быстрее. Кроме того, NHibernate будет лениво извлекать коллекцию, но может извлекать все элементы одновременно. Вы можете профилировать, чтобы определить, влияет ли это на производительность. (Если у вас есть только несколько языков, то я сомневаюсь, что вы увидите разницу.) Если у вас много языков (скажем, 50+), возможно, стоит создать пользовательские свойства для извлечения локализованного текста. Они будут выдавать запросы для извлечения необходимого текста. Что еще более важно, вы можете получить весь текст для данного объекта в одном запросе, а не каждое локализованное текстовое свойство как отдельный запрос.
Обратите внимание, что эти дополнительные усилия необходимы только в том случае, если профилирование дает основания для беспокойства по поводу производительности. Скорее всего, реализация в статье как есть будет функционировать более чем адекватно.