Разработка ASP.NET веб-сайт для разных языков

#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, поскольку вы получаете только один язык из запроса.