项目需要实现国际化?不妨来试试它

之前造了一个多语言国际化的轮子,第一个版本UI的体验感不是太好,用balzor重新实现了一个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

关联项目页面

下载多语言文件

地区资源页面

新增地区

添加资源

上传资源文件

编辑资源

如何接入

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

OpenApi接入

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

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

响应结构如下:

[
  {
    "cultureName": "zh-Hans",
    "resources": {
      "Hello": "你好"
    }
  },
  {
    "cultureName": "en",
    "resources": {
      "Hello": "Hello"
    }
  }
]

SignalR接入(c#例子)

c# 复制代码
var connection = new HubConnectionBuilder()
    .WithUrl($"{linguaNexApiUrl}/hubs/LinguaNex?project={project}", Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets)
    .AddJsonProtocol()
    .WithAutomaticReconnect()
    .Build();

connection.On<LinguaNexResources>("CreateOrUpdateResource", obj => 
{
    if (_resourcesCache.TryGetValue(obj.CultureName, out var value))
    {
        foreach (var resource in obj.Resources)
        {
            value[resource.Key] = resource.Value;
        }
        _resourcesCache[obj.CultureName] = value;
    }else
    {
        _resourcesCache[obj.CultureName] = new ConcurrentDictionary<string, string>(obj.Resources);
    }
});

connection.StartAsync();

//拉取资源 参数跟OpenApi接口一致
connection.InvokeAsync<List<LinguaNexResources>>("GetResources", projectId, cultureName,all);

.NET SDK 接入

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

c# 复制代码
builder.Services.AddLinguaNexLocalization(options =>
{
    options.LinguaNexApiUrl = builder.Configuration["LinguaNex:ApiUrl"];
    options.Project = builder.Configuration["LinguaNex:Project"];
    options.UseWebSocket = true;
});
builder.Services.AddLocalization();

app.UseRequestLocalization();

Java SDK 接入

java 复制代码
public static void main(String[] args) {
        ResourceBundleMessageSource source = new RemoteSourceBundle();
        GlobalProp.initFromYaml(null);
        Locale locale = new Locale("zh-Hans");
        BundleTest test = new BundleTest();
        System.out.println(source.getMessage("40004", null, locale));
    }

JS SDK 接入

js 复制代码
const { initLinguaNex, setLocale, getLocale, getAllLocale, L } = linguanex
initLinguaNex({
    baseUrl: 'http://47.119.20.111',
    locales: ["zh-CN", "en"],
    defaultLocale: 'zh-CN',
    project: 'C96755D0-C22C-4DAD-9620-AF64C4C3D9D7'
})
.then(() => {
    console.log(L('Hello'));
    setLocale('aa')
    .then(() => {
        console.log(L('Hello'));
        console.log(getAllLocale());
    })
    console.log(getLocale("zh-CN"));
})

Last

欢迎大佬们体验并提提优化建议,或者PR~

希望可以实现更多SDK,方便更多语言的项目可以对接使用,助力项目实现国际化。

相关推荐
贾光辉7 小时前
在.NET Core中使用异步多线程高效率的处理大量数据的最佳实践
.net core
波多尔斯基3 天前
CompilerGenerated与GeneratedCode区别
c#·.net·mvvm·.net core
贾光辉4 天前
使用 .NET Core 实现一个自定义日志记录器
.net core·ef core
棉晗榜5 天前
.net core在linux导出excel,System.Drawing.Common is not supported on this platform
linux·excel·asp.net core·miniexcel
棉晗榜5 天前
asp.net core发布配置端口号,支持linux
asp.net core
亦世凡华、6 天前
从零开始:如何在.NET Core Web API中完美配置Swagger文档
开发语言·c#·swagger·.net core·web api
coredx7 天前
如何优雅地让 ASP.NET Core 支持异步模型验证
asp.net core
贾光辉12 天前
深入理解 Task.Delay 的定时精度及其影响因素
.net core
hez201014 天前
0. RyuJIT Tutorials - RyuJIT 的历史和架构
.net·.net core·clr·compiler
小乖兽技术15 天前
ASP.NET Core Web 项目的部署:选择 IIS 还是 Kestrel?
后端·kestrel·iis·asp.net·asp.net core