سؤال

أحاول كتابة تطبيق متعدد اللغات في Silverlight 4.0 وأنا في النقطة التي يمكنني من خلالها البدء في استبدال النص الثابت بنص ديناميكي من ملف SampleData Xaml. هذا ما لدي:

قاعدة البيانات الخاصة بي

<SampleData:something xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.MyDatabase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <SampleData:something.mysystemCollection>
    <SampleData:mysystem ID="1" English="Menu" German="Menü" French="Menu" Spanish="Menú" Swedish="Meny" Italian="Menu" Dutch="Menu" />
  </SampleData:something.mysystemCollection>
</SampleData:something>

usercontrol الخاص بي

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
    x:Class="Something.MyUC" d:DesignWidth="1000" d:DesignHeight="600">
    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyDatabase}}">
        <Grid Height="50" Margin="8,20,8,0" VerticalAlignment="Top" d:DataContext="{Binding mysystemCollection[1]}" x:Name="gTitle">
            <TextBlock x:Name="Title" Text="{Binding English}" TextWrapping="Wrap" Foreground="#FF00A33D" TextAlignment="Center" FontSize="22"/>
        </Grid>
    </Grid>
</UserControl>

كما ترون ، لدي 7 لغات أريد التعامل معها. الآن هذا يحمل النسخة الإنجليزية من نصي على ما يرام. لقد قضيت الجزء الأفضل من اليوم في محاولة لمعرفة كيفية تغيير الربط في الكود الخاص بي لتبديل هذا عندما أحتاج (دعنا نقول عندما أقوم بتغيير اللغة عن طريق المنسدلة).

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

المحلول

أنت تدور حول هذا بالطريقة الخاطئة. أفضل الممارسات للتوطين في Silverlight هي استخدام ملفات الموارد التي تحمل الكلمات الرئيسية المترجمة. إليك بعض المعلومات الإضافية حول هذا:

http://msdn.microsoft.com/en-us/library/cc838238٪28vs.95٪29.aspx

تعديل:

فيما يلي مثال حيث أستخدم فئة المساعد لعقد الأوتار المترجمة. يمكن بعد ذلك تحميل هذه الترجمات من أي مكان تقريبًا. ملفات الموارد الثابتة ، XML ، قاعدة البيانات أو أي شيء آخر. لقد صنعت هذا على عجل ، لذلك ليس مستقرًا للغاية. ويتحول فقط بين اللغة الإنجليزية والسويدية.

XAML:

<UserControl x:Class="SilverlightApplication13.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:SilverlightApplication13"
             mc:Ignorable="d"
             d:DesignWidth="640"
             d:DesignHeight="480">

    <UserControl.Resources>
        <local:TranslationHelper x:Key="TranslationHelper"></local:TranslationHelper>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">
        <StackPanel>

            <TextBlock Margin="10"
                       Text="{Binding Home, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Contact, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Links, Source={StaticResource TranslationHelper}}"></TextBlock>

            <Button Content="English"
                    HorizontalAlignment="Left"
                    Click="BtnEnglish_Click"
                    Margin="10"></Button>

            <Button Content="Swedish"
                    HorizontalAlignment="Left"
                    Click="BtnSwedish_Click"
                    Margin="10"></Button>
        </StackPanel>
    </Grid>
</UserControl>

Code-Behind + TranslationHelper Class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.ComponentModel;

namespace SilverlightApplication13
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            //Default
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnEnglish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnSwedish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("sv-SE");
        }
    }

    public class TranslationHelper : INotifyPropertyChanged
    {
        private string _Contact;

        /// <summary>
        /// Contact Property
        /// </summary>
        public string Contact
        {
            get { return _Contact; }
            set
            {
                _Contact = value;
                OnPropertyChanged("Contact");
            }
        }

        private string _Links;

        /// <summary>
        /// Links Property
        /// </summary>
        public string Links
        {
            get { return _Links; }
            set
            {
                _Links = value;
                OnPropertyChanged("Links");
            }
        }

        private string _Home;

        /// <summary>
        /// Home Property
        /// </summary>
        public string Home
        {
            get { return _Home; }
            set
            {
                _Home = value;
                OnPropertyChanged("Home");
            }
        }



        public TranslationHelper()
        {
            //Default
            SetLanguage("en-US");
        }

        public void SetLanguage(string cultureName)
        {
            //Hard coded values, need to be loaded from db or elsewhere

            switch (cultureName)
            {
                case "sv-SE":
                    Contact = "Kontakt";
                    Links = "Länkar";
                    Home = "Hem";
                    break;

                case "en-US":
                    Contact = "Contact";
                    Links = "Links";
                    Home = "Home";
                    break;

                default:
                    break;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

نصائح أخرى

يبدو أنك تبحث عن رمز مثل هذا:

Title.SetBinding(TextProperty, new Binding { Path = new PropertyPath(language) });

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

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