C # Настройка CultureInfo на основе параметра QueryString и файла resx - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть веб-приложение, которое просто отображает форму контроля пользователя.Я сгенерировал свои resx файлы, связанные с пользовательским элементом управления, перейдя к дизайну пользовательского элемента управления и затем щелкнув Инструменты> Создать локальный ресурс

Выполнение этого создалонеобходимый resx файл:

App_LocalResources
  ContactUsForm.ascx.resx

Затем я просто скопировал и вставил существующий файл resx и переименовал его, чтобы у меня было следующее:

App_LocalResources
  ContactUsForm.ascx.fr-FR.resx
  ContactUsForm.ascx.resx

В качестве теста я изменил пару элементов управления dotnet в новом файле ресурсов fr-FR , просто чтобы проверить, все ли работает должным образом и не работает.

Я использую следующий код для установки конкретной информации о культуре на основе параметра строки запроса:

protected void Page_Init(object sender, EventArgs e)
{
    string cultureName = Request.QueryString["lang"];
    if (!string.IsNullOrEmpty(cultureName))
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureName);
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
    }
}

Затем я могу просто перейти на страницу, содержащую пользовательский элемент управления, выполнив следующие действия:

http://localhost/Default.aspx?lang=fr-FR

Я могу подтвердить, что информация о культуре задана, выполнив следующий код:

CultureInfo currentCultureUI = Thread.CurrentThread.CurrentUICulture;
CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture;

Я могу подтвердить, что заданная культура действительно fr-FR однакотекст не заменяется в соответствии с изменениями в файле ContactUsForm.ascx.fr-FR.resx .

Я не могу заставить работать так, как ожидалось.Что я делаю не так и есть ли другой способ добиться желаемого результата?

Заранее спасибо.

ОБНОВЛЕНИЕ:

Если я это сделаюследующее в коде работает нормально:

lHeadingResource1.Text = GetLocalResourceObject("lHeadingResource1.Text").ToString();

На самом деле читает правильную строку из файла ContactUsForm.ascx.fr-FR.resx .

Iтакже может подтвердить, что мои элементы управления также имеют все необходимые ссылки meta:resourcekey.

Просто странно, что если я не установлю его в коде, по умолчанию он вернется к культуре по умолчанию и не использует FR-FR указано выше.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Попробуйте это Вы должны реализовать свою логику с InitializeCulture ()

<%@ Page Language="C#" uiculture="auto" %>
<%@ Import Namespace="System.Threading" %>
<%@ Import Namespace="System.Globalization" %>
<script runat="server">

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

            Thread.CurrentThread.CurrentCulture = 
                CultureInfo.CreateSpecificCulture(selectedLanguage);
            Thread.CurrentThread.CurrentUICulture = new 
                CultureInfo(selectedLanguage);
        }
        base.InitializeCulture();
    }
</script>

Подробнее см. Ниже http://msdn.microsoft.com/en-us/library/bz9tc508(v=vs.80).aspx

1 голос
/ 13 февраля 2012

Вы должны установить культуру, переопределив метод InitializeCulture страницы.

protected override void InitializeCulture()
{
    if (Request.Form["DropDownList1"] != null)
    {
        //define the language
        UICulture = Request.Form["DropDownList1"];
        //define the formatting (requires a specific culture)
        Culture = Request.Form["DropDownList1"];
    }
    base.InitializeCulture();
}

На странице здесь http://blogs.spanlogic.com/clyap/post/2009/05/29/Programmatically-change-Culture-of-User-Control-(ascx).aspx предлагается использовать FrameworkInitialize внутри пользовательского элемента управления. Я этого не проверял.

    protected override void FrameworkInitialize()
    {
        base.FrameworkInitialize();
    }
...