【问题标题】:Xamarin Forms Localization in code behindXamarin Forms Localization in code behind
【发布时间】:2017-09-28 20:04:24
【问题描述】:

我已从 here 实施并按照说明进行操作。 它仅适用于带有

的xaml
<Label Text="{i18n:Translate SelectLanguage}"  />

但我在后面的代码中需要它:

 Label selectLabel = new Label
        {
            Text = "{i18n:Translate SelectLanguage}",
            TextColor = Color.Black
        };

该标签的输出是:{i18n:Translate SelectLanguage}。 有什么解决办法吗?

更新: 根据要求,我添加了我的代码(代码隐藏和 xaml 页面)。如果您需要更多信息,请告诉我。 我刚刚将xamarin上传到最新版本,但我仍然遇到同样的问题。

我的 xaml 页面:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MyProj.Forms.Pages.TestPages.ChangeLanguagePage"
         xmlns:i18n="clr-namespace:MyProj.Forms.Helpers"
         Title="{i18n:Translate ChangeLanguage}">>
<ContentPage.Content>
    <StackLayout Padding="20" VerticalOptions="CenterAndExpand">
        <Label   Text="{i18n:Translate SelectLanguage}"  />
        <Picker x:Name="picker" />
        <Button Text="{i18n:Translate Save}" Clicked="OnUpdateLangugeClicked" BackgroundColor="Black" TextColor="White"/>
    </StackLayout>
</ContentPage.Content>
</ContentPage>

我的后台代码:

    [XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ChangeLanguagePage : ContentPage
{
    Picker picker;
    public ChangeLanguagePage()
    {
        InitializeComponent();
        StackLayout main = new StackLayout();

        Label selectLabel = new Label
        {
            //Text = "Select Language",
            Text = "{i18n:Translate SelectLanguage}",
            TextColor = Color.Black
        };

        picker = new Picker();

        Button btn = new Button
        {
            Text = "SAVE",
            TextColor = Color.White,
            BackgroundColor = Color.Black
        };
        btn.Clicked += Btn_Clicked;
        picker.Items.Add("English");
        picker.Items.Add("Spanish");
        picker.Items.Add("Portuguese");
        picker.Items.Add("French");
        picker.SelectedItem = CrossMultilingual.Current.CurrentCultureInfo.EnglishName;

        main.Children.Add(selectLabel);
        main.Children.Add(picker);
        main.Children.Add(btn);

        Content = main;
    }

    private void Btn_Clicked(object sender, EventArgs e)
    {
        CrossMultilingual.Current.CurrentCultureInfo = CrossMultilingual.Current.NeutralCultureInfoList.ToList().First(element => element.EnglishName.Contains(picker.SelectedItem.ToString()));
        AppResources.Culture = CrossMultilingual.Current.CurrentCultureInfo;
        App.Current.MainPage = new NavigationPage(new HomePage());
    }

    void OnUpdateLangugeClicked(object sender, System.EventArgs e)
    {

        CrossMultilingual.Current.CurrentCultureInfo = CrossMultilingual.Current.NeutralCultureInfoList.ToList().First(element => element.EnglishName.Contains(picker.SelectedItem.ToString()));
        AppResources.Culture = CrossMultilingual.Current.CurrentCultureInfo;
        App.Current.MainPage = new NavigationPage(new HomePage());

    }
}

【问题讨论】:

  • 应该是一样的
  • 应该,但不是:)
  • 尝试使用string.format
  • @MikeDarwish 你能给我一行代码吗?像` string fullString = "{i18n:Translate SelectLanguage}"; string.Format({0}, fullString)`
  • 能否请您添加 xaml 和后面代码的输出,我需要检查它们之间的差异

标签: c# xamarin.forms localization multilingual code-behind


【解决方案1】:

没有等效代码,服务只能通过 XAML 获得

但是你可以很容易地替换它。

const string ResourceId = "$rootnamespace$.AppResources";
var resmgr = new ResourceManager(ResourceId,typeof(TranslateExtension).GetTypeInfo().Assembly));        
var ci = CrossMultilingual.Current.CurrentCultureInfo;
Label selectLabel = new Label
{
  Text = resmgr.GetString("SelectLanguage",ci),
  TextColor = Color.Black
};

记得用你的项目命名空间替换$rootnamespace$

https://github.com/CrossGeeks/MultilingualPlugin/blob/master/content/TranslateExtension.txt.pp

【讨论】:

  • 谢谢,但是变量 resmgr 没有 Value 属性?能否请您提供参考资料以确保确定?
  • 抱歉,我忘记删除了 Lazy 包装器。
  • 就是这样!所以,基本上我需要把它放在每个类中,或者放在 ContentPage 子类中,以便在所有页面上工作?
  • 我建议您转移到一个类并只处理 ResourceManager 的一个引用(可能在静态字段中)以减少内存使用。
【解决方案2】:
Text = Resx.LocalizedString.SelectLanguage,

我很惊讶其他人说你说的很好,应该可以工作。

我不知道。反正在代码中使用的时候可以这样使用。

【讨论】:

  • 其实这个问题并不清楚..我删除了我的答案
  • 啊,我又看了一个问题,我猜这不是他要找的。​​span>
猜你喜欢
  • 2019-04-16
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多