From 8325459cdc5e6ee06c3edcc85e52c43f8be201e5 Mon Sep 17 00:00:00 2001 From: Student Main Date: Tue, 3 Dec 2019 13:07:55 +0800 Subject: [PATCH] read translation from disk --- shadowsocks-csharp/Controller/I18N.cs | 59 ++++++++++++++++++++++----- shadowsocks-csharp/Data/i18n.csv | 10 ++++- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index e5b009dc..47094451 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -5,11 +5,15 @@ using Shadowsocks.Properties; using Shadowsocks.Util; using System.Windows.Forms; using Microsoft.VisualBasic.FileIO; +using System.Text; + namespace Shadowsocks.Controller { public static class I18N { + private static readonly string I18N_FILE = "i18n.csv"; + private static Dictionary _strings = new Dictionary(); private static void Init(string res, string locale) @@ -18,38 +22,71 @@ namespace Shadowsocks.Controller { csvParser.SetDelimiters(","); + // search language index string[] localeNames = csvParser.ReadFields(); int enIndex = 0; - int targetIndex = 0; + int targetIndex = -1; - for (int i = 1; i < localeNames.Length; i++) + for (int i = 0; i < localeNames.Length; i++) { if (localeNames[i] == "en") - { - - } - + enIndex = i; if (localeNames[i] == locale) - { targetIndex = i; - } } + // Fallback to same language with different region + if (targetIndex == -1) + { + string localeNoRegion = locale.Split('-')[0]; + for (int i = 0; i < localeNames.Length; i++) + { + if (localeNames[i].Split('-')[0] == localeNoRegion) + { + targetIndex = i; + } + } + } + // Still not found, exit + if (targetIndex == -1) + { + Logging.Info($"Translation for {locale} not found"); + return; + } + + // read translation lines while (!csvParser.EndOfData) { string[] translations = csvParser.ReadFields(); - if (string.IsNullOrWhiteSpace(translations[0])) continue; + string source = translations[enIndex]; + string translation = translations[targetIndex]; + + // source string or translation empty + if (string.IsNullOrWhiteSpace(source) || string.IsNullOrWhiteSpace(translation)) continue; + // line start with comment if (translations[0].TrimStart(' ')[0] == '#') continue; - _strings[translations[enIndex]] = translations[targetIndex]; + + _strings[source] = translation; } } } static I18N() { - Init(Resources.i18n_csv, CultureInfo.CurrentCulture.IetfLanguageTag); + string i18n; + if (!File.Exists(I18N_FILE)) + { + i18n = Resources.i18n_csv; + File.WriteAllText(I18N_FILE, i18n, Encoding.UTF8); + } + else + { + i18n = File.ReadAllText(I18N_FILE, Encoding.UTF8); + } + Logging.Info("Current language is: " + CultureInfo.CurrentCulture.Name); + Init(i18n, CultureInfo.CurrentCulture.Name); } public static string GetString(string key, params object[] args) diff --git a/shadowsocks-csharp/Data/i18n.csv b/shadowsocks-csharp/Data/i18n.csv index 1320a7fd..b02e6053 100644 --- a/shadowsocks-csharp/Data/i18n.csv +++ b/shadowsocks-csharp/Data/i18n.csv @@ -1,5 +1,11 @@ -en,zh-CN,zh-TW,ja -,,, +en,zh-CN,zh-TW,ja +#Restart program to apply translation,,, +#This is comment line,,, +#Always keep language name at head of file,,, +#Language name is output in log,,, +#You can find it by search Current language is:,,, +#Please use UTF-8 encoding,,, + Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks ,,, System Proxy,系统代理,系統代理,システムプロキシ