سؤال

كيف يمكنني تحويل موقع ويب ليكون قادرًا على التعامل مع لغة متعددة (مثال: اللغة الإنجليزية ، الفرنسية ، الإسبانية)؟

أنا لا أحب ملف الموارد لأنني أشعر بأنني محدود وأنه طويل جدًا لإنشاء القائمة. هل لديك أي اقتراح؟

تحديث

في الوقت الحالي ، تتمثل أفضل طريقة وجدنا في استخدام ملف XML ومع بعض القيم التي تحصل عليها XPath et.

هل كانت مفيدة؟

المحلول

التوطين الضمني (في قائمة Visual Studio - Tools - إنشاء الموارد المحلية) أمر سهل قدر الإمكان. اكتب صفحاتك بلغتك الافتراضية ، واختر خيار القائمة ، ويتم إنشاء ملفات الموارد الخاصة بك ويمكن إرسالها إلى شخص ما للترجمة.

ملف RESX هو مجرد XML ، لذلك إذا كانت شركة الترجمة ترغب في تحويلها إلى جداول بيانات (ومن خارجها) بسهولة.

استخدام قواعد البيانات بدلاً من Resx لأن متجر الدعم الخاص بك ليس بالأمر الصعب. يتمتع ريك ستراهل بتفسير جيد ومثال لمزود توطين يحركه قاعدة البيانات هنا - يوجد محرر توطين لطيف مدمج أيضًا مع واجهة لترجمات Google و Babelfish.

نصائح أخرى

نقوم بتخزين الموارد للمواقع متعددة اللغات في قاعدة بيانات. لقد أنشأنا بعض الأدوات لتسهيل إنشاء هذه الأدوات والوصول إليها. هناك مخصص تعبير يتيح لنا استخدام هذا الجملة:

 <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 لغة. نقوم بسحب جميع الأوتار إلى ملفات الموارد وشحنها إلى شركة ترجمة. إنه ألم في بعض الأحيان ، لكن هذه هي طريقة Defacto للقيام بذلك.

يصبح الأمر ممتعًا أيضًا عندما يتم ترجمة الكلمات الإنجليزية المكونة من 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/create-website-for-multilanguage.html

http://satindersinght.wordpress.com/2012/06/14/create-website-for-multilanguage-support/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top