Xamarin Forms运行时翻译Syncfusion导航抽屉菜单项的实现问题
你在XAML中用到的helpers:Translate标记扩展本质是对多语言资源读取逻辑的封装,后台代码直接调用其对应的资源读取方法即可实现相同翻译效果,具体实现步骤如下:
步骤1:确认Translate辅助类的静态方法
常规TranslateExtension实现中都会配套提供静态的翻译字符串获取方法,如果你的辅助类还没有该方法,补充对应逻辑即可:
[ContentProperty("Text")] public class TranslateExtension : IMarkupExtension { public string Text { get; set; } // XAML标记扩展原有逻辑 public object ProvideValue(IServiceProvider serviceProvider) { return GetString(Text); } // 新增供后台代码调用的静态方法 public static string GetString(string resourceKey) { if (string.IsNullOrWhiteSpace(resourceKey)) return string.Empty; // 和XAML调用共用同一套资源读取逻辑 var translatedText = Lang.ResourceManager.GetString(resourceKey, CultureInfo.CurrentUICulture); // 找不到对应资源时返回key本身方便排查问题 return translatedText ?? resourceKey; } }
步骤2:修改后台代码的菜单初始化逻辑
原有代码中将翻译字符串定义为静态字段会导致语言切换时无法更新,改为在初始化菜单时实时获取翻译值即可:
public partial class DrawerPage : ContentPage { public DrawerPage() { InitializeComponent(); drawerNavItems(); } private void drawerNavItems() { List<MenuItem> itemList = new List<MenuItem>(); // 调用Translate辅助类方法获取翻译文本 string mapText = TranslateExtension.GetString("Map"); string settingsText = TranslateExtension.GetString("Settings"); // 图标资源无需多语言保持原有调用即可 string mapIcon = IconFont.ResourceManager.GetString("LocationOn"); string settingsIcon = IconFont.ResourceManager.GetString("Settings"); itemList.Add(new MenuItem { Icon = mapIcon, Name = mapText }); itemList.Add(new MenuItem { Icon = settingsIcon, Name = settingsText }); listView.ItemsSource = itemList; } }
可选:支持运行时切换语言实时更新
如果你的应用需要支持运行时切换语言后菜单文字自动更新,只需给MenuItem类实现INotifyPropertyChanged接口,语言切换事件触发时重新调用TranslateExtension.GetString获取最新翻译值赋值给Name属性,同时触发属性变更通知即可。
内容的提问来源于stack exchange,提问作者Jaser
相关产品推荐
相关产品推荐

