Pesadelo com localização sob recursos globais
-
26-09-2019 - |
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:
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?
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
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