IntelliJ IDE 插件开发 | (八)国际化配置

系列文章

本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。

前言

尽管大多数情况下我们开发的插件可能都是自己或者团队内部使用,但是如果想要将开发的插件发布到 Jetbrains 的插件市场,吸引更多的用户使用和支持,那么 i18n 就必不可少了。而 IntelliJ 也给我提供了内部支持,只需要简单几行代码即可实现 i18n,下面开始分步骤进行讲解,另外本文涉及到的完整代码也已上传到GitHub

语言文件

首先我们需要在 resources 文件夹下创建我们的语言文件,这里选择先创建一个 messages 文件夹(名称无要求),然后在下面创建一个ActionBundles.properties文件(后缀为properties,名称无要求,一般会分模块创建多个语言文件便于管理,该文件用于配置默认语言即英文),之后再创建一个ActionBundles_zh.properties文件用于配置中文内容,这里的_zh则代表用于配置中文,其中_固定,zh为语言代码,例如想要配置日语则是ja,不同国家的语言代码可以在网上自行搜索,这里提供一个网址,效果如下:

image-20240405163659518

可以看到在语言配置文件创建完毕后,我们分别在内部添加了demo.greet-msg=Hello, {0}demo.greet-msg=\u4f60\u597d\uff0c{0}两个配置。其中\u4f60\u597d\uff0c你好,中文字符对应的 Unicode 编码,这里之所以使用 Unicode 编码,是因为官网推荐我们将 ASCII 码范围外的字符都使用 Unicode 编码进行表示,相关的转换网站也很多,这里提供一个。除此之外,还可以看到我们的内容中还包含{0},这个则是参数占位标记,多个参数按照0, 1, 2...的顺序依次累加即可。

工具类文件

有了以上语言文件,我们就可以创建一个工具类专用于语言解析了,这里先展示内容:

# ①
private const val BUNDLE = "messages.ActionBundles"

# ②
object MessageUtils: DynamicBundle(BUNDLE) {
    
    # ③
    fun message(@PropertyKey(resourceBundle = BUNDLE) key: String, vararg params: Any) = getMessage(key, *params)
    
}

调用方式也很简单:

# ④
MessageUtils.message("demo.greet-msg", "butterfly")

下面分开始介绍上述代码的含义:

首先是①,这里用于声明语言文件的位置,其中messagesActionBundles分别是上文我们创建的用于存储语言文件的文件夹名和文件名。

然后是②,可以看到这里我们创建的工具类继承了DynamicBundle类,并传递了我们声明的BUNDLE,有了这部分代码我们就可以得到 IntelliJ 内部的语言文件解析功能:只需要专注于语言文件的编写,而无需考虑不同语言的判断和文件选取。

之后是③,这里声明了一个message方法,而内容则是直接调用了getMessage(key, *params)这个DynamicBundle类内部提供的方法,这里之所以自己重新声明了一遍方法,则是为了使用 key 参数前@PropertyKey(resourceBundle = BUNDLE)注解的功能,通过使用PropertyKey注解,当我们调用该方法的时候获取到提示(参数 resourceBundle 的值就是上面声明的 BUNDLE),效果如下:

image-20240405170341688

同时键不存在时还会有报错提示:

image-20240405170442963

最后是④,有了以上工具类,调用方式也很简单,第一个参数为信息的键值,如果想要传递参数,则按顺序进行传递即可(第二个参数为可变参数,PropertyKey 注解会解析配置的语言信息,如果调用参数个数不一致也会有信息提示,如下图)。

image-20240405170943290

然后创建一个 Action 用于测试:

class TestAction: AnAction() {
    
    override fun actionPerformed(event: AnActionEvent) {
        NotificationUtils.info(MessageUtils.message("demo.greet-msg", "butterfly"))
    }
    
}

效果如下:

image-20240405171420739

可以看到这里虽然我们没有进行语言选择的操作,但是显示的内容为中文版本。

NotificationUtils类是自己定义的工具类,内容如下:

object NotificationUtils {

    fun info(msg: String) {
        Notifications.Bus.notify(Notification("i18n", msg, NotificationType.INFORMATION))
    }

}

手动切换语言

在部分情况下我们可能还想手动的去控制语言的选择,只需要使用Locale.setDefault(Locale.ENGLISH)即可,这里的参数为Locale.ENGLISH即英语,其它语言按需去改变即可,配置完后,我们再看效果:

image-20240405171849091

image-20240405171902232

可以发现配置生效,展示的信息为英语版本了。

如果调用Locale.setDefault()方法传递的语言在我们语言文件中不存在,则会使用默认的语言文件,即没有后缀的语言文件,即ActionBundles.properties

总结

在上篇文章的结尾说到这篇文章会介绍 PSI 的进阶内容,不过考虑到使用场景较少,所以这篇文章先介绍了关于 i18n 的相关内容,PSI 的进阶内容则留到后续篇章中再进行介绍。

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值