using System.Collections.Generic; using System.Globalization; using System.IO; 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) { using (TextFieldParser csvParser = new TextFieldParser(new StringReader(res))) { csvParser.SetDelimiters(","); // search language index string[] localeNames = csvParser.ReadFields(); int enIndex = 0; int targetIndex = -1; 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; } Logging.Info($"Using {localeNames[targetIndex]} translation for {locale}"); } // Still not found, exit if (targetIndex == -1 || enIndex == targetIndex) { Logging.Info($"Translation for {locale} not found"); return; } // read translation lines while (!csvParser.EndOfData) { string[] translations = csvParser.ReadFields(); 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[source] = translation; } } } static I18N() { 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) { return string.Format(_strings.TryGetValue(key, out var value) ? value : key, args); } public static void TranslateForm(Form c) { if (c == null) return; c.Text = GetString(c.Text); foreach (var item in ViewUtils.GetChildControls(c)) { if (item == null) continue; item.Text = GetString(item.Text); } TranslateMenu(c.Menu); } public static void TranslateMenu(Menu m) { if (m == null) return; foreach (var item in ViewUtils.GetMenuItems(m)) { if (item == null) continue; item.Text = GetString(item.Text); } } } }