4

私はプロジェクトを構築しており、非常にカスタマイズ可能にする必要があります。4つの言語をサポートするように構築しようとしています。また、ユーザーには、ラベルのテキストまたはボタンのテキストを変更できる管理パネルが表示されます。ユーザーにその管理パネルに移動して、電話をかけずにボタンのテキストを変更してもらいたい:)

私は、.resx ファイルという古くて良いスタイルのローカリゼーションを使用しました。以下にサンプルコードがあります。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        if (comboBox1.SelectedItem.ToString().Equals("en-GB"))
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-GB");
            label1.Text= FormLabels.test1;
            label2.Text = FormLabels.test2;
        }
        else if (comboBox1.SelectedItem.ToString().Equals("de-DE"))
        {
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de-DE");
            label1.Text = FormLabels.test1;
            label2.Text = FormLabels.test2;
        }
     }

ユーザーが「FormLabels.en-GB.resx」ファイルのボタンのテキストを変更できるようにした場合。変更を確認するには、プロジェクトを再コンパイルする必要があります。

ユーザーが再コンパイルしてボタンのテキストを変更できるソリューションを見つける必要があります。どうやってやるの?

4

2 に答える 2

3

私が考えることができる唯一のことは、外部ファイルにローカライズすることです。次のような xml ファイルを作成します。

例: languagesSupported.xml

    <Languages>
        <language name="English" file="en.dat" />
        <language name="French" file="fr.dat" />
        <language name="Japanese" file="jp.dat" />
    </Languages>

このように、後で実際に言語を追加できます。

各ファイルで、次のようなことを行う必要があります。

(例: en.dat)

    <Language name="English">
        <Localized name="hello" value="Hello">
        <Localized name="goodbye" value="Goodbye">
    </Language>

(例: fr.dat)

    <Language name="French">
        <Localized name="hello" value="Bonjour">
        <Localized name="goodbye" value="Au revoir">
    </Language>

あなたのコードでは、次のようなことをします:

    private Dictionary<string, Dictionary<string, string>> _localizations = new Dictionary<string, Dictionary<string, string>>();

    private string _currentLocalization = "English";

    private bool LoadLocalizations()
    {
        try
        {
            if (File.Exists("languagesSupported.xml") == false)
            {
                return false;
            }

            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load("languagesSupported.xml");
            XmlNodeList nodeList = xmldoc.SelectNodes("languages/language");

            if (nodeList.Count > 0)
            {
                foreach (XmlNode node in nodeList)
                {
                    LoadLocalization(node.Attributes["name"].Value, node.Attributes["file"].Value);
                }
            }

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    private bool LoadLocalization(string pLang, string pFile)
    {
        try
        {
            if (File.Exists(pFile) == false)
            {
                return false;
            }

            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(pFile);
            XmlNodeList nodeList = xmldoc.SelectNodes("language/localized");

            _localizations.Add(pLang, new Dictionary<string,string>());

            if (nodeList.Count > 0)
            {
                foreach (XmlNode node in nodeList)
                {
                    _localizations[pLang].Add(node.Attributes["name"].Value, node.Attributes["value"].Value);
                }
            }

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    private void SetLocalization()
    {
        labelHello.text = _localizations[_currentLocalization]["hello"];
        labelGoodbye.text = _localizations[_currentLocalization]["goodbye"];
    }

その後、ユーザーが言語を変更するたびに、_currentLocalization を更新して SetLocalization(); を呼び出すだけです。

_localizations のキーを使用して、言語のドロップダウン リストに入力することもできます。

そうすれば、ローカリゼーションを完全に動的にすることができます。

本当に CultureInfo を使用したい場合は、カルチャを言語名にマップするだけです。

于 2013-07-31T13:53:20.723 に答える