Pergunta

Eu tenho dois arquivos de recursos em App_GlobalResources

MyApp.resx
MyApp.sv.resx

Para quem não sabe: Todas as línguas vão fallback para MyApp.resx exceto a uicultura sueca usará o MyApp.sv.resx

E eu tenho uma página simples que mostra 3 <asp:Label> em bruxa o Text A propriedade é chamada de diferente como:

    <i>using Resource.Write:</i><br />
    <asp:Label ID="Label1" runat="server" />
    <hr />

    <i>using HttpContext.GetGlobalResourceObject:</i><br />
    <asp:Label ID="Label2" runat="server" />
    <hr />

    <i>using Text Resources:</i><br />
    <asp:Label ID="Label3" runat="server" 
               Text="<%$ Resources:MyApp, btnRemoveMonitoring %>" />

    <p style="margin-top:50px;">
    <i>Current UI Culture:</i><br />
        <asp:Literal ID="litCulture" runat="server" />
    </p>

Label3 é o único chamado na página, os 2 primeiros são definidos como:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        Label1.Text = Resources.AdwizaPAR.btnRemoveMonitoring;
        Label2.Text = HttpContext.GetGlobalResourceObject("MyApp", "btnRemoveMonitoring").ToString();

        litCulture.Text = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
    }
}

Se eu usar o linguagem do navegador tudo funciona bem, mas quero substituir essa configuração e carregar a tradução correta com base em outras entradas, então preciso substituir o UICulture E para isso eu uso:

protected void Page_Init(object sender, EventArgs e)
{
    Page.Culture = "en-US";
    Page.UICulture = "en-US";
}

Bruxa é a mesma que:

protected void Page_Init(object sender, EventArgs e)
{
    System.Globalization.CultureInfo cinfo = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
    System.Threading.Thread.CurrentThread.CurrentCulture = cinfo;
    System.Threading.Thread.CurrentThread.CurrentUICulture = cinfo;
}

Com tudo isso, o que estou recebendo é o seguinte:

alt text

Em outras palavras Estou recebendo a localização correta apenas se usar code-behind Para definir o texto correto, todos inline A localização simplesmente usa o idioma do navegador.

o que estou perdendo?

Foi útil?

Solução

Nightmare acabou ...

Page_Init não muda o acesso aos recursos globais, precisamos override a inicialização da culatra

protected override void InitializeCulture()
{
    //*** make sure to call base class implementation
    base.InitializeCulture();

    //*** pull language preference from profile
    string LanguagePreference = "en-US"; // get from whatever property you want

    //*** set the cultures
    if (LanguagePreference != null)
    {
        this.UICulture = LanguagePreference;
        this.Culture = LanguagePreference;
    }
}

Agora tudo funciona corretamente

alt text

Outras dicas

Se não quiser alterar cada página, você pode definir a cultura em global.asax

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim lang As String = "en-us"
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top