I18n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;

namespace I18n
{
    public class I18nTool
    {
        private readonly Dictionary<string, Dictionary<string, string>> _translations;

        public I18nTool(string filePath)
        {
            _translations = new Dictionary<string, Dictionary<string, string>>();

            var xmlDocument = new XmlDocument();
            xmlDocument.Load(filePath);

            foreach (XmlNode languageNode in xmlDocument.SelectNodes("/languages/language"))
            {
                var language = languageNode.Attributes["name"].Value;
                var translationDict = new Dictionary<string, string>();

                foreach (XmlNode translationNode in languageNode.SelectNodes("translation"))
                {
                    var key = translationNode.Attributes["key"].Value;
                    var value = translationNode.InnerText;
                    translationDict[key] = value;
                }

                _translations[language] = translationDict;
            }
        }

        public string Translate(string key, string language = null)
        {
            if (language == null)
            {
                language = CultureInfo.CurrentUICulture.Name;
            }

            if (_translations.TryGetValue(language, out var translationDict) &&
                translationDict.TryGetValue(key, out var value))
            {
                return value;
            }

            return key;
        }
    }
}

// <languages>
//   <language name="en-US">
//     <translation key="hello">Hello</translation>
//     <translation key="world">World</translation>
//   </language>
//   <language name="zh-CN">
//     <translation key="hello">你好</translation>
//     <translation key="world">世界</translation>
//   </language>
// </languages>