項目需要實現國際化?不妨來試試它

之前造了一個多語言國際化的輪子,第一個版本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則返回所有語言資源

響應結構如下:

[
  {
    "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<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自己對接自己了~

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,方便更多語言的項目可以對接使用,助力項目實現國際化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章