feature: multi-language supported

This commit is contained in:
2020-05-05 13:36:57 +08:00
parent adfac39596
commit 1bbfdb6477
12 changed files with 298 additions and 25 deletions

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<Follow>已关注</Follow>
</root>

View File

@ -0,0 +1,43 @@
namespace Pixiview.Resources
{
public class PlatformCulture
{
public string PlatformString { get; private set; }
public string LanguageCode { get; private set; }
public string LocaleCode { get; private set; }
public string Language
{
get { return string.IsNullOrEmpty(LocaleCode) ? LanguageCode : LanguageCode + "-" + LocaleCode; }
}
public PlatformCulture() : this(null) { }
public PlatformCulture(string cultureString)
{
if (string.IsNullOrEmpty(cultureString))
{
//throw new ArgumentNullException(nameof(cultureString), "Expected culture identieifer");
cultureString = "en";
}
PlatformString = cultureString.Replace('_', '-');
var index = PlatformString.IndexOf('-');
if (index > 0)
{
var parts = PlatformString.Split('-');
LanguageCode = parts[0];
LocaleCode = parts[parts.Length - 1];
}
else
{
LanguageCode = PlatformString;
LocaleCode = "";
}
}
public override string ToString()
{
return PlatformString;
}
}
}

View File

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Xml.Linq;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace Pixiview.Resources
{
public class ResourceHelper
{
static readonly Dictionary<string, LanguageResource> dict = new Dictionary<string, LanguageResource>();
public static string GetResource(string name, params object[] args)
{
if (!dict.TryGetValue(App.CurrentCulture.PlatformString, out LanguageResource lang))
{
lang = new LanguageResource(App.CurrentCulture);
dict.Add(App.CurrentCulture.PlatformString, lang);
}
if (args == null || args.Length == 0)
{
return lang[name];
}
return string.Format(lang[name], args);
}
private class LanguageResource
{
private readonly Dictionary<string, string> strings;
public string this[string key]
{
get
{
if (strings != null && strings.TryGetValue(key, out string val))
{
return val;
}
return key;
}
}
public LanguageResource(PlatformCulture lang)
{
try
{
var assembly = IntrospectionExtensions.GetTypeInfo(typeof(LanguageResource)).Assembly;
var names = assembly.GetManifestResourceNames();
var name = names.FirstOrDefault(n
=> string.Equals(n, $"Pixiview.Resources.Languages.{lang.Language}.xml", StringComparison.OrdinalIgnoreCase)
|| string.Equals(n, $"Pixiview.Resources.Languages.{lang.LanguageCode}.xml", StringComparison.OrdinalIgnoreCase));
if (name == null)
{
name = "Pixiview.Resources.Languages.zh-CN.xml";
}
XDocument xml;
using (var stream = assembly.GetManifestResourceStream(name))
{
xml = XDocument.Load(stream);
}
strings = new Dictionary<string, string>();
foreach (var ele in xml.Root.Elements())
{
strings[ele.Name.LocalName] = ele.Value;
}
}
catch
{
// load failed
}
}
}
}
[ContentProperty(nameof(Text))]
public class TextExtension : IMarkupExtension
{
public string Text { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (Text == null)
{
return string.Empty;
}
return ResourceHelper.GetResource(Text);
}
}
}