之前造了一个多语言国际化的轮子,第一个版本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/swagger/index.html
用途#
通过API/SDK拉取多语言资源加载,可选WebSocket对接实现即时更新多语言资源。
- API后端项目响应内容,如错误码对应的Message国际化多语言处理。
- Web项目国际化多语言集成,可导出多语言文件编译,或对接API/SDK即时获取加载数据。
- APP项目与Web基本一致。
先看看效果图#
项目页面#
关联项目页面#
下载多语言文件#
地区资源页面#
新增地区#
添加资源#
上传资源文件#
编辑资源#
如何接入#
目前除了.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#例子)#
var connection = new HubConnectionBuilder()
.WithUrl($"{linguaNexApiUrl}/hubs/LinguaNex?project={project}", Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets)
.AddJsonProtocol()
.WithAutomaticReconnect()
.Build();
connection.On("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>("GetResources", projectId, cultureName,all);
.NET SDK 接入#
目前本项目后端已用SDK自己对接自己了~
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 接入#
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 接入#
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,方便更多语言的项目可以对接使用,助力项目实现国际化。