助力項目快捷實現國際化,造個多語言輪子

前段時間跟同事吹水聊天時,吐槽一個話題,就是公司項目都需要做多語言,前端後端都需要做。

而且是需要支持8國語言翻譯,每次弄起來都特麻煩,每加一個Key就需要去翻譯其他7個語言出來添加,每新增一個項目就需要弄一遍多語言資源,重複且枯燥費時的體力活。

項目想法

本項目主打一個一處配置多語言,多處使用的想法。助力項目方便快捷實現國際化(多語言)。
主要解決的問題:

  • 自動翻譯多語言資源。
  • 通用資源無需重複添加(關聯項目即可)
  • 新增地區時自動同步且翻譯已存在的資源。
  • 友好的界面配置。
  • 修改資源時可實時同步到資源客戶端(使用SignalR接入)
  • 多語言資源批量打包導出。

目前主要功能如下(目前還只是雛形,不算完善):

  • 可配關聯項目,主項目關聯其他項目即可獲取其他項目的多語言資源,相同Key則優先取主項目中的資源(即覆蓋)

  • 批量導入已存在項目多語言資源(目前只支持JSON格式)

  • 多語言配置導出(目前支持json,toml,messages.properties, xml, ts格式)

  • 可配置自動翻譯其他語言的資源(目前接入百度翻譯和有道翻譯API,冷門地區語言翻譯暫不支持,翻譯不準確時可手動修改)

  • API/SignalR接入

  • 界面管理

  • .NET SDK 接入 (其他語言待開發)

測試環境歡迎體驗並給點意見或提提ISSUE,當然歡迎PR一起完善項目。

http://47.119.20.111/Projects

http://47.119.20.111/swagger/index.html

項目地址:
https://github.com/fanslead/LinguaNex

應用場景

通過API/SDK拉取多語言資源加載,可選WebSocket對接實現即時更新多語言資源。

  • API後端項目響應內容,如錯誤碼對應的Message國際化多語言處理。
  • Web項目國際化多語言集成,可導出多語言文件編譯,或對接API/SDK即時獲取加載數據。
  • APP項目與Web基本一致。
  • 騷操作:實現一個短Key完成長文章多語言顯示。

效果圖

image

imageimage
image

image

image

image

image

項目設計

項目整體的功能很簡單。就是多語言資源的管理以及項目接入這幾個點。

業務流程:
添加resource:

添加culture:

運行環境

  • .NET 8
  • Redis
  • RabbitMQ(可選)
  • EF Core SQLLite(可自行替換數據庫)

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接入

需要引用LinguaNex.Localization.Net包。
在依賴注入中添加如下代碼即可:

builder.Services.AddLinguaNexLocalization(options =>
{
    options.LinguaNexApiUrl = builder.Configuration["LinguaNex:ApiUrl"];
    options.Project = builder.Configuration["LinguaNex:Project"];
    options.UseWebSocket = true;
});

.NET SDK是通過實現IStringLocalizer接口對接的。所以可以無縫銜接已有多語言的項目切換。
本項目自身已使用SDK對接自己。
測試效果

antd design pro使用API接入

由於目前還沒時間完事前端界面的多語言配置。但是之前試過使用antd design pro接入過ABP的後端多語言的配置。
接入流程是一致的。這裏提供下參考代碼:

import { addLocale, getLocale } from 'umi';
import { Locale } from 'antd/es/locale';

let locale = getLocale() as string;

let antdLocale = {} as Locale

const applicationLocalization = await getApplicationLocalization(); // 這裏可以實現接入後端API獲取資源
const resources = applicationLocalization.resources
const allText = {}

for(let key in resources) {
  if(resources[key]){
    Object.assign(allText, resources[key].texts)
  }
}
locale = getLocale() as string;
addLocale(
  locale,
  allText,
  {
    momentLocale: antdLocale.locale,
    antd: antdLocale,
  }

RoadMap

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