Вопрос

Как я могу преобразовать веб-сайт, чтобы он мог работать с несколькими языками (пример :английский, французский, испанский)?

Мне не нравится файл ресурсов, потому что я чувствую себя ограниченным, а создавать список довольно долго.У вас есть какие-нибудь предложения?

Обновить

На данный момент лучший способ, который мы нашли, - это использовать 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 &amp;&amp; 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 / создать-сайт-для-многоязыковой-поддержки /

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top