【问题标题】:Refresh UI language on the fly即时刷新 UI 语言
【发布时间】:2017-05-25 10:44:07
【问题描述】:

我正在关注这个guide 来本地化我的应用程序。我不想获得系统语言,所以我不使用ILocalize 接口和依赖服务。我有这 3 个用于英语、西班牙语和法语的 resx 文件:

  • AppResources.es.resx
  • AppResources.fr.resx
  • AppResources.resx(英文)

这是我的TestPage.xaml 代码,使用指南中的TranslateExtension 类:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:t="clr-namespace:LanguageTest.Resources;assembly=LanguageTest.Resources"
             x:Class="LanguageTest.TestPage">
    <Label Text="{t:Translate TestText}" VerticalOptions="Center" HorizontalOptions="Center" />
</ContentPage>

使用此代码我初始化语言设置:

public App ()
{
    // I can change among "en", "es" and "fr"
    AppResources.Culture = new CultureInfo("es"); 
    this.MainPage = new NavigationPage(new TestPage());
}

在这种情况下,文本以西班牙语显示。但我想在页面显示后更改语言(例如,使用LanguageSettingsPage 用户可以在应用运行时更改语言)。

public App ()
{
    AppResources.Culture = new CultureInfo("es"); 
    this.MainPage = new NavigationPage(new TestPage());
    AppResources.Culture = new CultureInfo("fr");
    // At this point the texts are diplayed in Spanish, not in French
}

如何在不重复new TestPage()的情况下刷新页面以显示法语文本?

【问题讨论】:

  • 您找到解决方案了吗?如果可以,可以分享一下吗?
  • @batmaci 不,我没有找到解决方案。选择一种语言后,我会更改 App.cs 代码中的所有文本。没有系统允许您使用绑定或类似的方式更改文本。
  • 重新显示主页你可以做MainPage = new NavigationPage(...);

标签: c# xamarin.forms


【解决方案1】:

这不是 Resx 的特定解决方案,但它可以让您根据用户需求加载任何语言。无需手动设置字符串,因为绑定将完成这项工作。查看I18NPortable 和示例。启动和运行它非常容易。

绑定样本:

<Button Text="{Binding Strings[key]}" />

即时更改语言(将更新所有绑定):

I18N.Current.Locale = "fr";

【讨论】:

  • 谢谢,我会查的。
【解决方案2】:

在 OnAppearing() 方法上保留 Text 属性的所有 Setter,然后从设置页面返回后,它将从 resx 文件中获取最新值。即使您返回页面,也会调用 OnAppearing() 方法。 但是对于同一页面要更改语言,必须再次呈现页面或重新加载该页面中元素的 Text 属性。

【讨论】:

  • 但是在这种情况下,您正在编写代码来更改视图,我想避免这种情况。
  • 如果您正在寻找,也可以在 viewmodel 中完成相同的操作。 VM 将有一个 init 方法。
  • 我认为前面的 code behind 选项比 VM 选项更好更干净。但这种解决方案不是我想要的。
【解决方案3】:

如果您只是简单地弹出页面,则不会再次评估资源。您只是在导航堆栈上显示上一页(仍在内存中)。

您需要推送一个新页面才能加载新的资源文本。

【讨论】:

  • 如何在不退出并重新进入应用的情况下为主页推送新页面?
  • 您的堆栈将维护一个主页面/主页,这将是您堆栈的第一项。对于该主页/主页,您需要更改后面代码中的资源,即不绑定。 (这是一个限制。)当您更改语言环境时,您可以弹出到 root。这也是我在我的案例中使用的方法。如果您不清楚,请告诉我。
  • 是的,您必须从后面的代码中更改文本。在 WPF 中我使用了 ObjectDataProvider,但在 Xamarin 中没有类似的东西。
  • 是的,这是我们需要在代码后面为一页更改它的唯一限制。事实上,我在 ActionScript 中使用了相同的数据绑定,无需手动更改。希望我们将来在 XF 中找到更多内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多