#c# #asp.net #vb.net #localization
#c# #asp.net #vb.net #локализация
Вопрос:
Я создаю веб-сайт, который будет иметь испанскую и итальянскую версии.
В прошлом при создании сайта, который должен быть доступен на разных языках, я создавал таблицу SQL следующим образом:
dbo.News
--------
ID int
EnglishTitle nvarchar(200)
SpanishTitle nvarchar(200)
ItalianTitle nvarchar(200)
EnglishContent nvarchar(max)
SpanishContent nvarchar(max)
ItalianContent nvarchar(max)
Затем, в зависимости от строки запроса (domain.com/NewsArticle.aspx?id=123amp;l=es ) Я бы сделал что-то вроде:
Select Case Request.QueryString("l")
Case "en"
TitleLtl.Text = "SELECT EnglishTitle..."
Case "es"
TitleLtl.Text = "SELECT SpanishTitle..."
Case "it"
TitleLtl.Text = "SELECT ItalianTitle..."
End Select
Тем не менее, я обнаружил, что это действительно отнимает много времени (особенно, если клиент позже запрашивает другой языковой вариант в качестве второго этапа).
Какова наилучшая практика для выполнения чего-то подобного, позволяющая использовать дополнительные языки?
Я открыт для VB.NET и решения на C#, Ура!
Ответ №1:
Просто прочитайте несколько статей, начните отсюда:
ASP.NET Глобализация и локализация
существует множество функций .NET и ASP.NET чтобы помочь вам локализовать и глобализировать ваш сайт без таких трудоемких и самодельных решений, как ваше выше…
Комментарии:
1. 1 Мне потребовалось некоторое время, чтобы разобраться в глобализации / локализации, но это блестяще! Это сэкономит мне так много времени в долгосрочной перспективе!
Ответ №2:
Из вашего вопроса похоже, что вас больше интересует отображение контента в разных, а не в чем-то вроде метки.
Если это так, вы всегда можете посмотреть на модель подкласса, поэтому ваш dbo.Таблица новостей будет иметь дополнительный столбец (дискриминатор) и будет иметь только один заголовок и столбцы содержимого
Ваша модель класса будет иметь News в качестве родительского класса и EnglishNews, SpanishNews и т.д. в качестве подклассов.
если вы ищете итальянскую версию новостной статьи, вы должны получить объект ItalianNews с соответствующим идентификатором новости (идентификатор новости будет одинаковым для каждого языка, на котором есть одна и та же история).
NHibernate позволяет легко создавать подклассы и извлекать объекты, поэтому, хотя добавление другого языка потребует некоторого кодирования, вам не придется перестраивать свою базу данных и сильно изменять свой код.
Надеюсь, это поможет.
Ответ №3:
Как насчет чего-то подобного?
dbo.News
--------
ID int
Label varchar(200)
DateAdded smalldatetime
(и любые другие общие поля)
dbo.NewsCultures
----------------
ID int -- FK to the dbo.News PK
LocaleID smallint
Title nvarchar(200)
Content nvarchar(MAX)
Где LocaleID будет сопоставляться с идентификатором .net LCID — например, 1033 для американского английского.
С точки зрения, не связанной с базой данных, уже есть несколько ответов, которые включают ссылки на некоторые хорошие ресурсы.
Ответ №4:
Попробуйте что-то более похожее на это:
text_code int
language char(2)
text varchar(max)
Где text_code — это некоторый идентификатор того, какой фрагмент текста вам нужен, например, 1 = заголовок, 2 = содержимое и т.д. Или вы могли бы использовать мнемонический код, я не думаю, что это сильно повредит производительности, если он короткий.
Затем в любом месте, где вам нужен текст, вы должны знать код для нужного вам фрагмента текста, и вы знаете язык. Используйте их для выбора записи. Тогда вам не нужна большая инструкция case.
т. е. ваш код тогда выглядит примерно так:
command.query="select text from local_text where text_code=@text_code and language=@language"
command.Parameters.AddWithValue("@text_code", 17) ' Probably use symbols there
command.Parameters.AddWithValue("@language", language)
dim text as string=command.executeScalar()
Здесь нет оператора CASE, поскольку вы получаете только один язык из запроса.