经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 职业生涯 » 查看文章
项目需要实现国际化?不妨来试试它
来源:cnblogs  作者:饭勺oO  时间:2024/3/1 8:42:58  对本文有异议

之前造了一个多语言国际化的轮子,第一个版本UI的体验感不是太好,用blazor重新实现了一个UI,体验感应该还算不错。

LinguaNex

LinguaNex是一个多语言连接中心,主打一个一处配置多语言,多处使用的想法。让项目方便快捷实现国际化(多语言)。

可配关联项目,主项目关联其他项目即可获取其他项目的多语言资源,相同Key则优先取主项目中的资源(即覆盖)。

批量导入已存在项目多语言资源。(目前只支持上传JSON文件)

自动翻译,翻译效果根据不同翻译Provider效果不一致。(目前支持百度翻译,有道翻译,腾讯翻译,阿里翻译,AI翻译)

导出多语言文件,目前支持Json,xml,toml,ts以及properties文件
GitHub地址:https://github.com/fanslead/LinguaNex

运行环境

  • .NET 8
  • Redis
  • RabbitMQ(可选).
  • EF Core SQLLite(可自行替换数据库)

测试环境

http://47.119.20.111

http://47.119.20.111/swagger/index.html

用途

通过API/SDK拉取多语言资源加载,可选WebSocket对接实现即时更新多语言资源。

  • API后端项目响应内容,如错误码对应的Message国际化多语言处理。
  • Web项目国际化多语言集成,可导出多语言文件编译,或对接API/SDK即时获取加载数据。
  • APP项目与Web基本一致。

先看看效果图

项目页面

点击Tag可以复制Id
image

关联项目页面

image

下载多语言文件

image

地区资源页面

image

新增地区

image

添加资源

image

上传资源文件

image

编辑资源

image

如何接入

目前除了.NET SDK正常使用外,其他SDK暂时不清楚有没有什么BUG~~

OpenApi接入

请求地址:/api/OpenApi/Resources/{ProjectId}?cultureName=&all=

  • ProjectId表示项目ID
  • cultureName 可选参数,不传则默认当前请求环境语言资源。
  • all 可选参数,默认false,cultureName为空时,true则返回所有语言资源

响应结构如下:

  1. [
  2. {
  3. "cultureName": "zh-Hans",
  4. "resources": {
  5. "Hello": "你好"
  6. }
  7. },
  8. {
  9. "cultureName": "en",
  10. "resources": {
  11. "Hello": "Hello"
  12. }
  13. }
  14. ]

SignalR接入(c#例子)

  1. var connection = new HubConnectionBuilder()
  2. .WithUrl($"{linguaNexApiUrl}/hubs/LinguaNex?project={project}", Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets)
  3. .AddJsonProtocol()
  4. .WithAutomaticReconnect()
  5. .Build();
  6. connection.On<LinguaNexResources>("CreateOrUpdateResource", obj =>
  7. {
  8. if (_resourcesCache.TryGetValue(obj.CultureName, out var value))
  9. {
  10. foreach (var resource in obj.Resources)
  11. {
  12. value[resource.Key] = resource.Value;
  13. }
  14. _resourcesCache[obj.CultureName] = value;
  15. }else
  16. {
  17. _resourcesCache[obj.CultureName] = new ConcurrentDictionary<string, string>(obj.Resources);
  18. }
  19. });
  20. connection.StartAsync();
  21. //拉取资源 参数跟OpenApi接口一致
  22. connection.InvokeAsync<List<LinguaNexResources>>("GetResources", projectId, cultureName,all);

.NET SDK 接入

目前本项目后端已用SDK自己对接自己了~

  1. builder.Services.AddLinguaNexLocalization(options =>
  2. {
  3. options.LinguaNexApiUrl = builder.Configuration["LinguaNex:ApiUrl"];
  4. options.Project = builder.Configuration["LinguaNex:Project"];
  5. options.UseWebSocket = true;
  6. });
  7. builder.Services.AddLocalization();
  8. app.UseRequestLocalization();

Java SDK 接入

  1. public static void main(String[] args) {
  2. ResourceBundleMessageSource source = new RemoteSourceBundle();
  3. GlobalProp.initFromYaml(null);
  4. Locale locale = new Locale("zh-Hans");
  5. BundleTest test = new BundleTest();
  6. System.out.println(source.getMessage("40004", null, locale));
  7. }

JS SDK 接入

  1. const { initLinguaNex, setLocale, getLocale, getAllLocale, L } = linguanex
  2. initLinguaNex({
  3. baseUrl: 'http://47.119.20.111',
  4. locales: ["zh-CN", "en"],
  5. defaultLocale: 'zh-CN',
  6. project: 'C96755D0-C22C-4DAD-9620-AF64C4C3D9D7'
  7. })
  8. .then(() => {
  9. console.log(L('Hello'));
  10. setLocale('aa')
  11. .then(() => {
  12. console.log(L('Hello'));
  13. console.log(getAllLocale());
  14. })
  15. console.log(getLocale("zh-CN"));
  16. })

Last

欢迎大佬们体验并提提优化建议,或者PR~
希望可以实现更多SDK,方便更多语言的项目可以对接使用,助力项目实现国际化。

原文链接:https://www.cnblogs.com/fanshaoO/p/18044824

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号