网站网站开发违法吗,个人网上银行登录官网,商务型网站怎么运作,discuz手机模板文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言
为了面向更大的市场#xff0c;国际化是肯定… 文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言
为了面向更大的市场国际化是肯定的。我想如果我开发游戏至少要支持两种语言英语和中文简体。
国际化
翻译Api选择 国内Api也有三种选择百度有道和小牛。我这里就选小牛了比较便宜。
小牛测试 小牛翻译平台 使用PostMan测试成功
语言选择 首先作为中文为母语所以我至少支持三种语言。简中繁中和英语。下面附上小牛的对应参数表
语言参数简中zh繁中cht英语en德语de法语fr西班牙语es意大利语it葡萄牙语pt俄语ru日语ja韩语ko
吐槽一下写了这么多我都快认不清这个【语】字是什么意思了。
原文选择我这里选择英语作为原文因为这样可以顺便学一下英语。
代码逻辑
这里使用了MiniExcel Json化方式
实体对象
public class TranslateModel
{public TranslateModel() { }public TranslateModel(string scene,string key,string en) {Scene scene;Key key;EN en;}public string Scene { get; set; }public string Key { get; set; }/// summary/// 英语/// /summarypublic string EN { get; set; }/// summary/// 简体中文/// /summarypublic string ZH { get; set; }/// summary/// 繁体中文/// /summarypublic string CHT { get; set; }/// summary/// 德语/// /summarypublic string DE { get; set; }/// summary/// 法语/// /summarypublic string FR { get; set; }/// summary/// 西班牙语/// /summarypublic string ES { get; set; }/// summary/// 意大利语/// /summarypublic string IT { get; set; }/// summary/// 葡萄牙语/// /summarypublic string PT { get; set; }/// summary/// 俄语/// /summarypublic string RU { get; set; }/// summary/// 日语/// /summarypublic string JA { get; set; }/// summary/// 韩语/// /summarypublic string KO { get; set; }
}翻译帮助类
public class TranslateHelper
{/// summary
/// 存放读取的数据
/// /summary
public IEnumerableTranslateModel Translates { get; private set; }/// summary/// 模板路径/// /summarypublic readonly string TemplateUrl Assests/translate_template.xlsx;/// summary/// 读取路径/// /summarypublic readonly string ReadUrl Assests/translate_read.xlsx;/// summary/// 翻译导出路径/// /summarypublic readonly string WriteUrl Assests/translate_read.xlsx;public TranslateHelper(){}}导出模板
/// summary
/// 导出模板如果文件存在则跳过
/// /summary
public void CreateTemplate()
{if (!File.Exists(TemplateUrl)){var config new OpenXmlConfiguration(){TableStyles TableStyles.None};var saveTemplate new ListTranslateModel();saveTemplate.Add(new TranslateModel(Main, Hello, Hello World!));MiniExcel.SaveAs(TemplateUrl, saveTemplate,configuration: config);}
}读取文件 翻译
这里用一下我的封装 C# HttpClient Get Post简单封装 先来一个Hello world!翻译 public class TranslateHelper
{public enum Language { zh, cht, en, de, fr, es, it, pt, ru, ja, ko }/// summary/// 存放读取的数据/// /summarypublic IEnumerableTranslateModel Translates { get; private set; }/// summary/// 模板路径/// /summarypublic const string TemplateUrl Assests/translate_template.xlsx;/// summary/// 读取路径/// /summarypublic const string ReadUrl Assests/translate_read.xlsx;/// summary/// 翻译导出路径/// /summarypublic const string WriteUrl Assests/translate_read.xlsx;public const string API_KEY 你的key;public const string APPID 你的ip;public const string API_URL https://api.niutrans.com/NiuTransServer/translation;public TranslateHelper(){}/// summary/// 导出模板如果文件存在则跳过/// /summarypublic void CreateTemplate(){if (!File.Exists(TemplateUrl)){var config new OpenXmlConfiguration(){TableStyles TableStyles.None};var saveTemplate new ListTranslateModel();saveTemplate.Add(new TranslateModel(Main, Hello, Hello World!));MiniExcel.SaveAs(TemplateUrl, saveTemplate, configuration: config);}}public void Read(){Translates MiniExcel.QueryTranslateModel(ReadUrl);}public async Taskstring TranslateFromEN(string en, Language language){//这个是我自己封装的你也可以用微软官方的原生httpclientvar httpHelper new MyHttpHelper(API_URL);var data new{src_text en,from en,to language.ToString(),apikey API_KEY,};var res await httpHelper.JsonHttpPostDictionarystring,string(, data, null);var str res[tgt_text];return str;}}测试 static void Main(string[] args){var helper new TranslateHelper();helper.CreateTemplate();Console.WriteLine(开始!);Task.Run(async () {var res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.zh);Console.WriteLine(res);});Console.WriteLine(结束!);Console.ReadKey();}多语言测试
Task.Run(async ()
{var res ;res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.zh);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.cht);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.de);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.fr);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.es);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.it);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.pt);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.ru);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.ja);Console.WriteLine(res);res await helper.TranslateFromEN(Hello world!, TranslateHelper.Language.ko);Console.WriteLine(res);
});综合翻译
/// summary
/// 读取并写入机翻结果
/// /summary
/// returns/returns
public async Task ReadAndWrite()
{if(!File.Exists(ReadUrl)){Console.WriteLine($[{ReadUrl}]文件不存在读取失败);return;}else{Translates MiniExcel.QueryTranslateModel(ReadUrl).ToArray();}if (File.Exists(WriteUrl)){Console.WriteLine($[{WriteUrl}]文件已存在跳过翻译);return ;}else{for(var i 0;i Translates.Count();i){Console.WriteLine($翻译进度[{i}/{Translates.Count()}]);Translates[i] await TranslateAllFromEN(Translates[i]);}//将数据保留MiniExcel.SaveAs(WriteUrl, Translates);}}/// summary
/// 从EN翻译全部
/// /summary
/// returns/returns
public async TaskTranslateModel TranslateAllFromEN(TranslateModel translateModel)
{if (translateModel.EN ! null translateModel.EN ! ){var en translateModel.EN;translateModel.ZH await TranslateFromEN(en, Language.zh);translateModel.CHT await TranslateFromEN(en, Language.cht);translateModel.DE await TranslateFromEN(en, Language.de);translateModel.FR await TranslateFromEN(en, Language.fr);translateModel.ES await TranslateFromEN(en, Language.es);translateModel.IT await TranslateFromEN(en, Language.it);translateModel.PT await TranslateFromEN(en, Language.pt);translateModel.RU await TranslateFromEN(en, Language.ru);translateModel.JA await TranslateFromEN(en, Language.ja);translateModel.KO await TranslateFromEN(en, Language.ko);Console.WriteLine(JsonConvert.SerializeObject(translateModel));}else{Console.WriteLine($Scene[{translateModel.Scene}],Key[{translateModel.Key}]的EN为空);}return translateModel;}/// summary
/// EN单独翻译
/// /summary
/// param nameen/param
/// param namelanguage/param
/// returns/returns
public async Taskstring TranslateFromEN(string en, Language language)
{//防止请求过快,小牛API并发有限制await Task.Delay(100);//Console.WriteLine(language.ToString());var httpHelper new MyHttpHelper(API_URL);var data new{src_text en,from en,to language.ToString(),apikey API_KEY,};var res await httpHelper.JsonHttpPostDictionarystring,string(, data, null);var str res[tgt_text];return str;
}文件准备 测试代码
Task.Run(async ()
{await helper.ReadAndWrite();});测试结果 完整代码
实体类
public class TranslateModel
{public TranslateModel() { }public TranslateModel(string scene,string key,string en) {Scene scene;Key key;EN en;}public string Scene { get; set; }public string Key { get; set; }/// summary/// 英语/// /summarypublic string EN { get; set; }/// summary/// 简体中文/// /summarypublic string ZH { get; set; }/// summary/// 繁体中文/// /summarypublic string CHT { get; set; }/// summary/// 德语/// /summarypublic string DE { get; set; }/// summary/// 法语/// /summarypublic string FR { get; set; }/// summary/// 西班牙语/// /summarypublic string ES { get; set; }/// summary/// 意大利语/// /summarypublic string IT { get; set; }/// summary/// 葡萄牙语/// /summarypublic string PT { get; set; }/// summary/// 俄语/// /summarypublic string RU { get; set; }/// summary/// 日语/// /summarypublic string JA { get; set; }/// summary/// 韩语/// /summarypublic string KO { get; set; }
}翻译帮助类
public class TranslateHelper
{public enum Language { zh, cht, en, de, fr, es, it, pt, ru, ja, ko }/// summary/// 存放读取的数据/// /summarypublic TranslateModel[] Translates { get; private set; }/// summary/// 模板路径/// /summarypublic const string TemplateUrl Assests/translate_template.xlsx;/// summary/// 读取路径/// /summarypublic const string ReadUrl Assests/translate_read.xlsx;/// summary/// 翻译导出路径/// /summarypublic const string WriteUrl Assests/translate_write.xlsx;public const string API_KEY 你的key;public const string APPID 你的appid;public const string API_URL https://api.niutrans.com/NiuTransServer/translation;public TranslateHelper(){}/// summary/// 导出模板如果文件存在则跳过/// /summarypublic void CreateTemplate(){if (!File.Exists(TemplateUrl)){var config new OpenXmlConfiguration(){TableStyles TableStyles.None};var saveTemplate new ListTranslateModel();saveTemplate.Add(new TranslateModel(Main, Hello, Hello World!));MiniExcel.SaveAs(TemplateUrl, saveTemplate, configuration: config);}else{Console.WriteLine($[{TemplateUrl}]文件已存在跳过创建);}}/// summary/// 读取并写入机翻结果/// /summary/// returns/returnspublic async Task ReadAndWrite(){if(!File.Exists(ReadUrl)){Console.WriteLine($[{ReadUrl}]文件不存在读取失败);return;}else{Translates MiniExcel.QueryTranslateModel(ReadUrl).ToArray();}if (File.Exists(WriteUrl)){Console.WriteLine($[{WriteUrl}]文件已存在跳过翻译);return ;}else{for(var i 0;i Translates.Count();i){Console.WriteLine($翻译进度[{i1}/{Translates.Count()}]);Translates[i] await TranslateAllFromEN(Translates[i]);}var config new OpenXmlConfiguration(){TableStyles TableStyles.None};//将数据保留MiniExcel.SaveAs(WriteUrl, Translates,configuration:config);}}/// summary/// 从EN翻译全部/// /summary/// returns/returnspublic async TaskTranslateModel TranslateAllFromEN(TranslateModel translateModel){if (translateModel.EN ! null translateModel.EN ! ){var en translateModel.EN;translateModel.ZH await TranslateFromEN(en, Language.zh);translateModel.CHT await TranslateFromEN(en, Language.cht);translateModel.DE await TranslateFromEN(en, Language.de);translateModel.FR await TranslateFromEN(en, Language.fr);translateModel.ES await TranslateFromEN(en, Language.es);translateModel.IT await TranslateFromEN(en, Language.it);translateModel.PT await TranslateFromEN(en, Language.pt);translateModel.RU await TranslateFromEN(en, Language.ru);translateModel.JA await TranslateFromEN(en, Language.ja);translateModel.KO await TranslateFromEN(en, Language.ko);Console.WriteLine(JsonConvert.SerializeObject(translateModel));}else{Console.WriteLine($Scene[{translateModel.Scene}],Key[{translateModel.Key}]的EN为空);}return translateModel;}/// summary/// EN单独翻译/// /summary/// param nameen/param/// param namelanguage/param/// returns/returnspublic async Taskstring TranslateFromEN(string en, Language language){//防止请求过快,小牛API并发有限制await Task.Delay(100);//Console.WriteLine(language.ToString());var httpHelper new MyHttpHelper(API_URL);var data new{src_text en,from en,to language.ToString(),apikey API_KEY,};var res await httpHelper.JsonHttpPostDictionarystring,string(, data, null);var str res[tgt_text];return str;}}网络帮助类
public class MyHttpHelper
{private string baseUrl;/// summary/// 基础Api/// /summarypublic string BaseUrl{get{return baseUrl;}set{baseUrl value;MyHttpClient new HttpClient(){BaseAddress new Uri(baseUrl)};}}public HttpClient MyHttpClient { get; set; }public MyHttpHelper(){}public MyHttpHelper(string baseUrl){BaseUrl baseUrl;}/// summary/// 序列化返回值/// /summary/// typeparam nameT/typeparam/// param nameapi/param/// param namestrParams/param/// returns/returnspublic async TaskT JsonHttpGetT(string api, Dictionarystring, string strParams){var res await MyHttpGet(api, strParams);return await res.Content.ReadFromJsonAsyncT();}/// summary/// 序列化返回值/// /summary/// typeparam nameT/typeparam/// param nameapi/param/// param namevalue/param/// param namestrParams/param/// returns/returnspublic async TaskT JsonHttpPostT(string api, object value, Dictionarystring, string strParams){var res await MyHttpPost(api, value, strParams);return await res.Content.ReadFromJsonAsyncT();}/// summary/// 序列化请求/// /summary/// param nameapi/param/// param nameparam/param/// returns/returnspublic async TaskHttpResponseMessage MyHttpGet(string api, Dictionarystring, string param){string paramStr DictionaryToParams(param);return await MyHttpClient.GetAsync(api paramStr);}/// summary/// 自定义的转发功能/// /summary/// param nameapi/param/// param namedataname/param/// param namevalue/param/// returns/returnspublic TaskHttpResponseMessage MyHttpPost(string api, object value, Dictionarystring, string strParams){return MyHttpClient.PostAsync(api DictionaryToParams(strParams), new StringContent(JsonConvert.SerializeObject(value), Encoding.UTF8, application/json));}/// summary/// 字典转参数/// /summary/// param nameparam/param/// returns/returnspublic string DictionaryToParams(Dictionarystring, string param){var res ;if (param ! null){var list param.ToList();if (list.Count ! 0){for (var i 0; i list.Count; i){if (i ! 0){res ;}res ${list[i].Key}{list[i].Value};}res ? res;}}return res;}
}最终效果
翻译前 翻译中 翻译后 总结
多语言发布这样可以让我们的游戏在更多的国家用户使用。虽然我暂时没有这个需求但是说不定也有别的项目需要多语言的本地化接入。