本帖最后由 阿淼 于 2018-9-11 08:57 编辑



Dialect
在服务端做本地化也可以如此轻松


Aquarink 工作室出品




我一开始还打算发布一个插件后来发现这个模块实在是太小太小了于是就直接发源码好了

甚至连 Github 我都不想发 :\



- Dialect 是什么? -


Dialect 的意思是“方言”,实际上是用于本地化的。

由于 Forge 已经提供了本地化,所以客户端不再需要。

它可以让你的服务端插件依照玩家的设置支持多种语言,不再需要在设置中设置一种固定的语言啦!

如果你想让你的插件走向国际化,试试这个模块吧!




- 怎么使用 Dialect?-


它没有依赖 Spigot 的任何库,所以你需要自己麻烦麻烦了噢


1. 语言文件

每一行都是一个翻译项。
  1. key=value
复制代码
例如
  1. title.container.treasure=藏宝箱
复制代码
它和 Forge 的语言文件是基本一致的。
虽然你不一定把它存成zh_CN.lang,但是我们推荐你这么做。


2. Dialect 对象
你可以创建多个对象,但是这样对于单个插件并没有什么X用。
  1. DialectManager dialect = new DialectManager();
复制代码
你可以将它放在你的 JavaPlugin 中作为一个成员变量,然后在需要的时候获得它

  1. public static DialectManager getDialect() { return instance.dialect; }
复制代码


3. 加载语言

创建了 Dialect 对象还需要加载语言噢

这里有三种加载方式


通过文件加载
  1. dialect.addDialect(/* 你的语言名字,例如zh_CN */ "zh_CN", /* 你的文件 */ new File("lang\zh_CN.lang", plugin.getDataFolder()));
复制代码

通过保存为字节数组的方式加载
  1. dialect.addDialect("zh_CN", ByteBuffer.wrap(bytes));
复制代码

当然还有通过 Map 直接加载
  1. Map<String, String> lang = new HashMap<>();
复制代码


4. 重载语言

重载一个语言需要先把原来的语言移除后再加载,否则将无法移除一些被移除的翻译
  1. dialect.removeDialect("zh_CN");
复制代码


5. 看看哪些翻译没有被支持?

通过调用
  1. dialect.getUnsupportedKeys("zh_CN");
复制代码
就可以知道那些翻译别的语言支持但是中文不支持啦!


6. Spigot Integration!

当然,我们的 Dialect 是要和服务端结合的!
当我们要给玩家发送一段消息时
  1. player.sendMessage(dialect.getLocalizedTextOrDefault(player.getLocale(), "message.hello", "Hello! "));
复制代码
我们可以通过
  1. player.getLocale(); // 老版本为 player.spigot().getLocale();
复制代码
获得玩家的语言设置!


7. 非阻塞设计


如果我们直接加载一个语言文件,
会导致 IO 阻塞 Minecraft 服务器的主线程,导致顿卡。
我们可以用另外一个线程来加载它!
  1. <div align="center"><p style="line-height: 30px; text-indent: 2em;"></p><div align="center" style="text-align: left; ">Bukkit.getScheduler.runTaskAsynchronously(() -> {</div><div align="center" style="text-align: left; ">    try {</div><div align="center" style="text-align: left; ">        dialect.addDialect("zh_CN", new File("lang\zh_CN", plugin.getDataFolder()));</div><div align="center" style="text-align: left; ">    } catch(IOException ex) {</div><div align="center" style="text-align: left; ">        doSomething();</div><div align="center" style="text-align: left; ">    }</div><div align="center" style="text-align: left; ">});</div></div>
复制代码



当然,从另外一个线程为 Dialect 加入一个语言是不安全的,所以我们要创建一个线程安全的版本!
  1. DialectManager dialect = new ConcurrentDialectManager();
复制代码
这下就安全了!




- 我可以在哪里找到 Dialect 的源码? -


我懒得传 GitHub 了,在这里下吧emmm

dialect-src.zip (3.65 KB, 下载次数: 3)



让你的插件走向国际化吧!


附:


什么是线程安全(侵删):https://www.cnblogs.com/shynshyn/p/7966409.html


上一个发布的项目:SecureCustomPacket,让你的 SimpleMessage 安全起来


下一个将发布的项目:Realtime,让玩家的进度不再被 TPS 拖累


重磅项目预告:MineIO,面向对象的储存与通信库




版权归 Aquarink 所有。

插代码会乱码的问题希望有关部门能管管。