A moeda, as alterações do calendário para o idioma selecionado, mas não rotulam no ASP.NET?
-
03-07-2019 - |
Pergunta
Eu tenho uma página da web com um calendário, um rótulo para manter um valor de moeda e um rótulo para dizer olá. Quando seleciono um idioma a partir do menu suspenso, ele altera o rótulo da moeda, o calendário, mas o olá não muda. Aqui está o código despojado da página ASPX e do arquivo CS:
ASPX:
<asp:Label ID="lblLanguageSelection" runat="server"
Text="Select a language: "></asp:Label>
<asp:DropDownList ID="ddlLanguages" runat="server" AutoPostBack="true">
<asp:ListItem Value="auto">Auto</asp:ListItem>
<asp:ListItem Value="en-US">English (US)</asp:ListItem>
<asp:ListItem Value="en-GB">English (GB)</asp:ListItem>
<asp:ListItem Value="de">German</asp:ListItem>
<asp:ListItem Value="fr">French</asp:ListItem>
<asp:ListItem Value="fr-CA">French (Canada)</asp:ListItem>
<asp:ListItem Value="hi">Hindi</asp:ListItem>
<asp:ListItem Value="th">Thai</asp:ListItem>
</asp:DropDownList>
<br /><br />
<asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
<br /><br />
<asp:Label ID="lblCurrency" runat="server"></asp:Label>
<br /><br />
<asp:Label ID="lblHello" runat="server"></asp:Label>
CS:
protected void Page_Load(object sender, EventArgs e)
{
decimal currency = 65542.43M;
string hello = "Hello";
lblCurrency.Text = string.Format("{0:c}", currency);
lblHello.Text = string.Format("{0}",hello);
}
protected override void InitializeCulture()
{
string language = Request["ddlLanguages"];
if (language != null)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(language);
}
}
Solução
Se você deseja que a etiqueta esteja localizada, precisará usar arquivos de recursos localizados para as strings (que é de onde vem toda a prática "não use string literais".
Você precisará traduzir manualmente o texto que deseja estar localizado e compilá -las em um arquivo de recurso específico do idioma, que pode ser acessado através do Getting Método do Gerente de Recursos objeto em System.Resources.
// Create a resource manager to retrieve resources.
ResourceManager rm = new ResourceManager("items",
Assembly.GetExecutingAssembly());
// Retrieve the value of the string resource named "hello".
// The resource manager will retrieve the value of the
// localized resource using the caller's current culture setting.
String hello = rm.GetString("hello");
lblHello.Text = hello;
Outras dicas
Er ... o que exatamente você espera acontecer? Moeda e datas têm formatos internos com base no local. Você quer que o ASP.NET faça a tradução de idiomas para você?!? Desculpe, você está sem sorte nisso. :) Estou perdendo sua intenção?
Alguns conselhos adicionais ... Evite código como este:
string language = Request["ddlLanguages"];
Isso não é bom ... isso funciona apenas como um efeito colateral dos recursos do objeto de solicitação e quebrará rapidamente assim que você colocar esse código em um contêiner de nomenclatura, como uma página de conteúdo. Faça isso em vez disso:
string language = ddlLanguages.SelectedValue;