Подтвердить что ты не робот

Как изменить CurrentCulture во время выполнения?

Мне нужно изменить культуры во время выполнения в соответствии с файлами ресурсов для каждой культуры.

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

resorces1.aspx.resx // default 
resorces1.aspx.he-IL.resx // hebrew culture 

Я могу загрузить страницу либо с резервным ресурсом, либо на pageload дать значение UICulture = "he-IL", и он загружается штрафом с требуемыми ресурсами.

Проблема в том, что мне нужно внести эти изменения во время выполнения.

1.. после того, как я изменил значение на событие нажатия кнопки

    btn_change_Click(....)
    {
        UICulture = "he-IL" ;
    }

Он по-прежнему возвращается к инициализированному значению "en-US"

Как я могу внести изменения в UICulture во время выполнения?

2.. как я могу ссылаться на резервный файл ресурсов, если, например, я не знаю его "en-US"?

4b9b3361

Ответ 1

Изменение текущей культуры пользовательского интерфейса:

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("he-IL");

или лучше, извлечение кэшированного экземпляра только для чтения культуры he-IL:

System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he-IL");

Во время выполнения ASP.NET использует файл ресурсов, который наилучшим образом соответствует настройке свойства CurrentUICulture. Культура пользовательского интерфейса для потока задается в соответствии с культурой пользовательского интерфейса страницы. Например, если текущая культура пользовательского интерфейса является испанской, ASP.NET использует скомпилированную версию файла WebResources.es.resx. Если соответствие текущей культуре пользовательского интерфейса отсутствует, ASP.NET использует резерв ресурсов.. Он начинается с поиска ресурсов для определенной культуры. Если они недоступны, они ищут ресурсы для нейтральной культуры. Если они не найдены, ASP.NET загружает файл ресурсов по умолчанию. В этом примере файл ресурсов по умолчанию - WebResource.resx.

Ответ 2

max установил меня по правильному пути, ничего, с чем я не сталкивался раньше, но это помогло мне внести незначительную корректировку в документацию msdn по этому вопросу:

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

    string defaultLanguage = Thread.CurrentThread.CurrentUICulture.ToString();                         
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected override void InitializeCulture()
    {
        if (Request.Form["ListBox1"] != null)
        {
            String selectedLanguage = Request.Form["ListBox1"];
            UICulture = selectedLanguage;
            Culture = selectedLanguage;

            Thread.CurrentThread.CurrentCulture = new CultureInfo(selectedLanguage);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedLanguage);
        }
        else
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo(defaultLanguage);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(defaultLanguage);
        }            
        base.InitializeCulture();
    }   

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

Ответ 3

Мне не удалось получить "резервную копию", как описано здесь для работы. Я использую файлы глобальных ресурсов для языка, а когда ярлык отсутствует в выбранном пользователем файле культуры, он по умолчанию не возвращается к метке в культуре по умолчанию? Я закончил создание метода для выполнения резервной копии. Я искал лучшие способы изменить культуру (когда ярлык не найден) и наткнулся на этот пост, поэтому я подумал, что я и некоторый контент.

В моем полезном классе:  public String getLabelResource (String sLabelID, String sLangCd)       {

        cLogger oLogger = new cLogger();

        try
        {
            Object sLabel;
            sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID);
            if (sLabel.ToString() == "") //label was not found in selected lang
            {
                //default to US language resource label
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
                sLabel = HttpContext.GetGlobalResourceObject("{filename}", sLabelID);
                //switch global lang back to selected
                Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(sLangCd);
            }
            return sLabel.ToString();

        }
        catch (Exception ex)
        {
            oLogger.LogWrite("cUtils.cs", "getLabelResource", ex.Message, false);
            return String.Empty;
        }
    }