寻求MVVMCross iOS/Android端动态切换语言的可行方案
实现Xamarin Forms 无需重启的动态语言切换
兄弟,我之前也踩过这个坑!普通的Resx本地化方案确实做不到动态切换,得自己搞一套绑定机制才行,给你分享个我亲测有效的思路:
- 自定义本地化服务:创建一个
ILocalizationService接口,里面包含获取本地化文本的方法,以及一个LanguageChanged事件,用来通知UI更新。 - 替换默认的Resx访问方式:不要直接用自动生成的Resx类,而是通过服务去读取对应语言的Resx资源,切换语言时更新当前语言标识,然后触发
LanguageChanged事件。 - 绑定到UI元素:用自定义的
MarkupExtension(比如TranslateExtension),在绑定的时候订阅LanguageChanged事件,事件触发时重新获取文本并更新UI。
核心代码示例
本地化服务实现
public interface ILocalizationService { event EventHandler LanguageChanged; string GetString(string key); void SetLanguage(string cultureCode); } public class LocalizationService : ILocalizationService { private CultureInfo _currentCulture; public event EventHandler LanguageChanged; public LocalizationService() { _currentCulture = CultureInfo.CurrentUICulture; } public string GetString(string key) { return Resources.ResourceManager.GetString(key, _currentCulture); } public void SetLanguage(string cultureCode) { _currentCulture = new CultureInfo(cultureCode); LanguageChanged?.Invoke(this, EventArgs.Empty); } }
自定义绑定扩展
[ContentProperty("Text")] public class TranslateExtension : IMarkupExtension<BindingBase> { public string Text { get; set; } public BindingBase ProvideValue(IServiceProvider serviceProvider) { var binding = new Binding { Path = $"[{Text}]", Source = DependencyService.Get<ILocalizationService>(), Mode = BindingMode.OneWay }; return binding; } object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) { return ProvideValue(serviceProvider); } }
服务注册与使用
在App.xaml.cs构造函数中注册服务:
DependencyService.Register<ILocalizationService, LocalizationService>();
在XAML中使用扩展绑定文本:
<Label Text="{local:Translate HelloWorld}" />
切换语言时调用:
DependencyService.Get<ILocalizationService>().SetLanguage("zh-CN");
如果用MVVM框架(比如Prism、MvvmCross),还可以把本地化服务集成到ViewModel里,用更优雅的方式通知UI更新,核心思路都是一样的:让文本绑定到一个能响应语言变化的数据源。
内容的提问来源于stack exchange,提问作者Kumar Aditya
相关产品推荐
相关产品推荐

