ASP.NET многоязычный веб-сайт?
-
06-07-2019 - |
Вопрос
Как я могу преобразовать веб-сайт, чтобы он мог работать с несколькими языками (пример :английский, французский, испанский)?
Мне не нравится файл ресурсов, потому что я чувствую себя ограниченным, а создавать список довольно долго.У вас есть какие-нибудь предложения?
Обновить
На данный момент лучший способ, который мы нашли, - это использовать XML-файл и с некоторыми значениями Xpath et get.
Решение
Неявная локализация (в меню Visual Studio - Инструменты - Создать локальные ресурсы) настолько проста, насколько это возможно. Напишите свои страницы на языке по умолчанию, выберите опцию меню, и ваши файлы ресурсов будут созданы и могут быть отправлены кому-то для перевода. Р>
Файл resx - это просто xml, поэтому, если переводческая компания хочет, вы можете легко преобразовать его в (и из) электронных таблиц. Р>
Использование баз данных вместо resx в качестве резервного хранилища несложно. У Рика Стрела есть хорошее объяснение и пример кода для провайдера локализации, управляемой базой данных, здесь - есть хороший встроенный редактор локализаций с интерфейсом для переводов Google и Babelfish.
Другие советы
Мы храним ресурсы для многоязычных сайтов в базе данных. Мы создали несколько инструментов, чтобы упростить их создание и доступ к ним. Существует специальный ExpressionBuilder, который позволяет нам использовать этот синтаксис:
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
И пользовательская метка, которая содержит текст по умолчанию и добавляет строку в базу данных, если ее еще нет. Р>
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
Таблица, содержащая строки, имеет один столбец на язык. Это позволяет очень легко создать сайт на английском языке (или на любом другом языке по умолчанию), а затем передать стол (который заполняется самостоятельно) переводчику. Также очень легко увидеть, на какие языки вам нужно перевести материал. С ресурсами, каждый раз, когда вам нужно добавить новую строку, вы должны остановить то, что вы делаете, а затем перейти к файлу ресурса для каждого языка и добавить ресурс. Р>
Вот код для языковой метки:
''' <summary>
''' Retrieves a language-specific string.
''' </summary>
Public Class LanguageLabel
Inherits Label
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private Sub Populate()
If Len(Me.Name) > 0 Then
Dim LanguageString As String = GetLanguageString(Me.Name, Me.Text)
If Len(LanguageString) > 0 Then Me.Text = LanguageString
End If
End Sub
Private Sub LanguageLabel_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
Populate()
End Sub
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
' By default a label wraps the text in a <span>, which we don't want in some situations
writer.Write(Me.Text)
End Sub
End Class
и функция полезности:
Public Function GetLanguageString(ByVal Name As String, Optional ByVal DefaultText As String = "") As String
Dim DefaultLanguage As Language = Languages.GetById(1)
Name = StripPunctuation(Name).Trim.Replace(" ", "") ' Remove punctuation, spaces from name
Dim SelectSql As String = String.Format("Select {0},{1} from LanguageStrings where Name=@Name", Languages.CurrentLanguage.Code, DefaultLanguage.Code)
Dim LanguageStringTable As DataTable = ExecuteDataset(cs, CommandType.Text, SelectSql, New SqlParameter("@Name", Name)).Tables(0)
If LanguageStringTable IsNot Nothing AndAlso LanguageStringTable.Rows.Count > 0 Then
Dim LanguageText As String = LanguageStringTable.Rows(0)(Languages.CurrentLanguage.Code).ToString
Dim DefaultLanguageText As String = LanguageStringTable.Rows(0)(DefaultLanguage.Code).ToString
If Len(LanguageText) > 0 Then
' We have a string in this language
Return LanguageText
Else
' Nothing in this language - return default language value
Return DefaultLanguageText
End If
Else
' No record with this name - create a dummy one
If DefaultText = "" Then DefaultText = Name
Dim InsertSql As String = String.Format("Insert into LanguageStrings (Name, {0}) values (@Name, @Text)", DefaultLanguage.Code)
ExecuteNonQuery(cs, CommandType.Text, InsertSql, New SqlParameter("@Name", Name), New SqlParameter("@Text", DefaultText))
Return Name
End If
End Function
Файлы ресурсов - это путь. Мы отправляем нашу продукцию на 12 языках. Мы извлекаем все строки в файлы ресурсов и отправляем их в переводческую компанию. Время от времени это боль, но это неэффективный способ сделать это. Р>
Также забавно, когда 4-буквенные английские слова переводятся в 17-буквенные фразы, и вам нужно настроить свой интерфейс.
Как долго вы находитесь в процессе проектирования? Если не слишком поздно и если позволяет бюджет, рассмотрите возможность портирования на многоязычную CMS, например Ektron CMS300.net (который имеет встроенные инструменты перевода). Если нет, то перед вами стоит огромная задача.
Другое решение, которое я использую, - это создание языковых папок, содержащих страницы aspx, содержащие весь необходимый текст на этом конкретном языке. Р>
Единственная проблема здесь в том, как вы можете внедрить как можно меньше кода в эти реплицирующие страницы. Для этого я использую шаблон контроллера, а затем источник данных объекта, чтобы получить данные и связать их с элементами управления на всех страницах. Р>
Таким образом, я достиг цели избавиться от файлов ресурсов, и я могу хранить код в одном месте, не копируя его (без необходимости). Р>
Редактировать: я бы также порекомендовал хорошую CMS-среду. Р>
Одно из веб-приложений, которые я разрабатываю, также имеет это требование NLS.
Я обнаружил, что есть по крайней мере 3 места, где у вас есть локализованные тексты:
- пользовательский интерфейс
- таблицы базы данных ("каталоги" или как вы там хотите их называть)
- внутренний код (сервисы и т.д.)
В моем решении есть одна таблица для страниц, таблиц и т.д. ("Контейнер"), по одной таблице для каждого элемента в этом контейнере (напримерметки, кнопки по идентификатору, идентификаторы записей) и одна таблица для переведенных элементов (плюс идентификатор языка).
Приложение для перевода помогает мне поддерживать переводы в актуальном состоянии и экспортирует все переводы в формате XML.
Продукт поставляется с переводами, но клиенты могут корректировать переводы, изменения вступают в силу немедленно.
Пример кода, который я сделал, используя файл ресурсов добавить global.asax
void Application_BeginRequest(Object sender, EventArgs e)
{
// Code that runs on application startup
HttpCookie cookie = HttpContext.Current.Request.Cookies["CultureInfo"];
if (cookie != null && cookie.Value != null)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
}
else
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
}
}
http://satindersinght.blogspot.in/2012/ 06 / создать-сайт-для-multilanguage.html
http://satindersinght.wordpress.com / 2012/06/14 / создать-сайт-для-многоязыковой-поддержки /