using System; using System.Collections.Generic; using System.IO; using Zhaizj.Framework.Web; namespace Zhaizj.Framework { /// /// 语言包工具,用于加载多国语言。 /// /// /// 默认语言包文件存放在 /framework/lang/ 中,比如 /framework/lang/zh-cn/ 。只要在 /framework/lang/ 中新增一个语言包文件夹,则系统将其作为语言包列表自动加载。可添加的语言包名称包括:en-us,en-gb,zh-cn,zh-tw,ja,ko,fr,de,it /// public class lang { // 这个一定要放在第一行,以保证第一个加载 private static Dictionary> langLocaleAll = getLangLocale(); //-------------------------------------------------------------------- /// /// 获取当前语言字符(比如 zh-cn,或 en-us) /// /// public static String getLangString() { String defaultLang = "zh-cn"; String langCookie = CurrentRequest.getLangCookie(); if (strUtil.HasText( langCookie ) && langLocaleAll.ContainsKey( langCookie )) return langCookie; if (CurrentRequest.getUserLanguages() == null) return defaultLang; String[] reqLangs = CurrentRequest.getUserLanguages(); if (reqLangs.Length == 0) return defaultLang; if (langLocaleAll.ContainsKey( reqLangs[0] )) return reqLangs[0]; return defaultLang; } /// /// 获取某 key 的语言值 /// /// /// public static String get( String key ) { try { String langStr = getLangString(); return getCoreLang( langStr ).getLangMap() [key]; } catch (KeyNotFoundException) { throw new KeyNotFoundException( "language's key not found: " + key ); } } /// /// 获取在 core.config 中定义的核心语言包 /// /// public static LanguageSetting getCoreLang() { return getCoreLang( getLangString() ); } private static LanguageSetting getCoreLang( String langStr ) { Dictionary langlist = langLocaleAll[langStr]; return langlist["core"]; } /// /// 根据类型 t 获取语言列表 /// /// /// public static LanguageSetting getByApp( Type t ) { Dictionary langlist = langLocaleAll[getLangString()]; LanguageSetting result; langlist.TryGetValue( t.FullName, out result ); return result; } //-------------------------------------------------------------------- private static Dictionary> getLangLocale() { String dirRoot = PathHelper.Map( getLangRootPath() ); String[] dirPaths = Directory.GetDirectories( dirRoot ); Dictionary> results = new Dictionary>(); foreach (String path in dirPaths) { String langName = Path.GetFileName( path ); results.Add( langName.ToLower(), getLangList( path ) ); } return results; } private static Dictionary getLangList( String path ) { String[] files = Directory.GetFiles( path ); Dictionary results = new Dictionary(); foreach (String file in files) { if (Path.GetExtension( file ) != ".config") continue; String fileName = Path.GetFileNameWithoutExtension( file ); Dictionary _lang = cfgHelper.Read( file, '=' ); LanguageSetting lbl = new LanguageSetting( fileName, _lang ); results.Add( fileName, lbl ); } return results; } //-------------------------------------------------------------------- private static String getLangRootPath() { return cfgHelper.FrameworkRoot + "lang/"; } //------------------------------------------------------------------ /// /// 获取所有支持的语言包 /// /// public static List> GetSupportedLang() { List> list = new List>(); foreach (String key in langLocaleAll.Keys) { Dictionary pair = new Dictionary(); pair.Add( "Name", GetLangInfo( key ) ); pair.Add( "Value", key ); list.Add( pair ); } return list; } private static String GetLangInfo( String langStr ) { if (langMap.ContainsKey( langStr )) return langMap[langStr]; return langStr; } private static Dictionary langMap = getLangInfo(); private static Dictionary getLangInfo() { Dictionary map = new Dictionary(); map.Add( "en-us", "English (US)" ); map.Add( "en-gb", "English (British)" ); map.Add( "zh-cn", "中文(简体)" ); // skipLang map.Add( "zh-tw", "正體中文(繁體)" ); // skipLang map.Add( "ja", "日本語" );// skipLang map.Add( "ko", "한국어" ); map.Add( "fr", "Français" ); map.Add( "de", "Deutsch" ); map.Add( "it", "Italiano" ); return map; } } }