如何根据语言变化制作应用

时间:2019-03-27 07:59:19

标签: mvvm unicode xamarin.forms

我开发了可以支持两种语言的应用程序。如果我需要这个应用程序以支持多种语言,那就超越了。假设有十种语言如何满足此要求

现在我要做的是用我用过的两种语言艰难地捆绑它,然后检索它。如果我要用十种语言来做,那听起来不好,有什么聪明的方法可以做到这一点。

作为示例;

我在视图模型中使用MVVM模式。我使用该属性,并以其简单的方式进行操作

public string GetPageTitle => AppResources.VitalSignsViewPage_Title;

我的资源文件有两个数据集,如果语言发生了变化,它将使用写数据集,这就是我现在正在做的事情,对于许多语言,有没有适当的明智方法可以实现这一点。

1 个答案:

答案 0 :(得分:2)

  

有一些解决方案可以实现这一目标。我向您推荐基本   解决方案,

     

这是语言服务的界面(如果您选择   使用依赖注入):

public interface ILanguageService
{
    string GetString(string text);
    void ChangeLanguage(bool isALang);
    bool IsALanguage();
}

您可以创建本地化服务:

namespace Service.Language
{
    public sealed class LanguageService : ILanguageService
    {
        List<LanguageRow> LanguageList;
        private bool IsFirstLang;

        public LanguageService()
        {
            LanguageList = JsonHelper.ReadJSON<List<LanguageRow>>("Service.Language.MultiLanguage.json", typeof(LanguageService));
            IsFirstLang = true;
        }

        public void ChangeLanguage(bool IsFirstLang)
        {
            IsFirstLang =  !IsFirstLang;
        }

        public bool IsALangueage()
        {
            return IsFirstLang;
        }

        public string GetString(string text)
        {
            string result;
            try
            {
                var row = LanguageList.FirstOrDefault(i => i.Code.Equals(text));
                result = IsFirstLang? row.Values[0] : row.Values[1];
            }
            catch
            {
                result = text;
            }
            return result;
        }
    }
}

这是json序列化的模型:

public class LanguageRow
{
    public LanguageRow()
    {
        Values = new List<string>();
    }

    public string Code { get; set; }
    public List<string> Values { get; set; }
}

最后,这是json文件:(EN-FR)

[
  {
    "Code": "VitalSignsViewPage_Title",
    "Values": [ "Page Title", "Titre de la page" ]
  },
  {
    "Code": "VitalSignsViewPage_SubTitle",
    "Values": [ "Sub Title", "Sous-titre" ]
  },
  {
    "Code": "VitalSignsViewPage_SubSubTitle",
    "Values": [ "Sub Sub Title", "Sous sous-titre" ]
  }
]
  

您可以访问类似的翻译:

ILanguageService _langService = new LangService()
_langService.GetString(AppResources.VitalSignsViewPage_Title);