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


    之前造了一个多语言国际化的轮子,第一个版本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("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,方便更多语言的项目可以对接使用,助力项目实现国际化。

  • 相关阅读:
    珠海金山面试复盘
    2024.6.13刷题记录
    【POI】word读取常见问题(涉及格式:doc、docx、rtf)
    ASP.NETCore6开启文件服务允许通过url访问附件(图片)
    socket网络编程-socket()、bind()、setsockopt()、recvfrom()、sendto()函数
    【白板推导系列笔记】线性回归-正则化-岭回归-频率角度
    金融用户实践|分布式存储支持数据仓库业务系统性能验证
    数据结构2月25日
    个人教学网站设计
    ShardingSphere实现读写分离
  • 原文地址:https://www.cnblogs.com/fanshaoO/p/18044824