ローカリゼーションをサポートしたい 1 つのアプリケーションに取り組んでいます。ローカリゼーションを実装するためにサテライト アセンブリの概念を実装しましたが、問題は、選択した言語に基づいて実行時にすべてのコントロールのテキストをロード/レンダリングするため、アプリケーションのロードが非常に遅くなることです。
今私の質問は次のとおりです。ロード時間中に遅延/ちらつきなしにすべてのメインフォームコントロールを更新できるより良いアプローチはありますか?
c#.net Winforms を使用してアプリケーションを開発しています。
私のプロジェクトの構造:
これが私が試したものです[サンプルコード]:
注 : このサンプル アプリケーションには非常に少数のコントロールしか含まれていませんが、実際のアプリケーションにはロード中に遅延/ちらつきが発生するコントロールが多すぎるため、これは正常に機能します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
using System.Globalization;
using System.Threading;
namespace Localization
{
public partial class Form1 : Form
{
#region constants
const String DEFAULT_CULTURE = "en-US";
#endregion
ResourceManager resourceManager = null;
public Form1()
{
InitializeComponent();
resourceManager = new ResourceManager("Localization.Resources", Assembly.GetExecutingAssembly());
}
private void cmbSelectLanguages_SelectedIndexChanged(object sender, EventArgs e)
{
String languageCode = "";
switch (cmbSelectLanguages.SelectedItem.ToString())
{
case "German": languageCode = "de-DE";
break;
case "French": languageCode = "fr-FR";
break;
case "English": languageCode = DEFAULT_CULTURE;
break;
default: languageCode = DEFAULT_CULTURE;
break;
}
SetCulture(languageCode);
SetControlsText();
}
private void SetCulture(String languageCode)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCode);
}
private void Form1_Load(object sender, EventArgs e)
{
//set the default languge to US-English while loading the form
SetCulture(DEFAULT_CULTURE);
SetControlsText();
}
private void SetControlsText()
{
lblCulture.Text = " " + System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
lblUserName.Text = resourceManager.GetString("lblUsername");
lblPassword.Text = resourceManager.GetString("lblPassword");
btnLogin.Text = resourceManager.GetString("lblLogin");
btnCancel.Text = resourceManager.GetString("lblCancel");
lblChooseLanguage.Text = resourceManager.GetString("lblChooseLanguage");
lblLoginTitle.Text = resourceManager.GetString("lblUserLogin");
pic.Image = (Image)resourceManager.GetObject("Login");
}
private void btnCancel_Click(object sender, EventArgs e)
{
}
private void btnLogin_Click(object sender, EventArgs e)
{
}
}
}