多语言构建的一个需求

目前使用的多语言解决方案说明

现在使用的i18n插件来自插件商店那个,其实已经满足大部分需求了
在那个插件基础上,我想实现构建剔除其他语言的功能,先看一下目录结构吧

目录规划大致是这样子的,每个语言都会对应一个js和一个资源文件夹,拿Chinese举例

  • chinese 目录: 存放该语言对应的图片
    • xx.png 该语言的图片资源文件
  • chinese.js 存放该语言对应的label文字
  • i18n.json :插件的配置文件,里面包含了运行时要设置的语言

这种方案目前解决了我的需求,多个语言公用一个项目,但是这样有一个问题,就是发布后的项目里面包含了所有的语言及其资源图片,于是我想到了再构建流程中剔除其他语言的资源,也就是说
i18n.json里面会声明要使用的语言,比如是chinese,那么构建的时候,仅仅保留

  • i18n.json文件
  • chinese.js文件
  • chinese目录

剩下的目录全部删除,不让其参与编译,也不导出,这样就解决了包体的问题

遇到的问题

问题就在构建剔除这块,参考了自定义构建流程文档,于是我选择在’before-change-files’进行处理

function onBeforeBuildFinish (options, callback) {
    let buildResults = options.buildResults;
}
  • 剔除文件夹的资源图片

  • 思路: buildResults里面列出了详细的构建资源,通过相关api,我能找到要删除文件的构建后位置,并进行删除

  • 问题:如果直接删除,构建后运行时有问题的,因为在settings.js文件里面罗列了进入游戏要加载的文件,所以,还要对settings.js进行额外的处理

  • 剔除chinese.js文件

  • 思路:很遗憾,代码会被压缩到src/project.js里面,我为了剥离处理,设置脚本为插件,即可将这部分代码从src/project.js中剥离出来

  • 问题: 现在能删除chinese.js了,但是问题还是指向了settings.js,里面同样有对其的引用,这个可能好处理,因为发现其实在 jsList 字段里面

其实最终的问题都指向了settings.js,这里面处理ok了,应该问题不大,很遗憾,又遇到了一个很严重的问题,就是在 ‘before-change-files’ 阶段,并没有产生settings.js文件,这。。。。

跪求大佬们给个指点,剔除脚本感觉好蓝瘦

求解决方案

'build-finished’呢?

1赞

不会有问题的,只要没用到这些文件

如楼上所言,请在 build-finished 阶段进行 settings 文件的更改

组件如图,都引用了图片,那么肯定会导出所有语言的图片,现在想在构建的时候剔除了其他语言的sprite-frame

请问最后解决了么这个问题 @xu_yanfeng

还没有,如果找到解决方案我会第一时间回复

搞定了么 老哥

最后我是 用一个像素点把那个图片换了, 硬办法。

也算是个办法

这个是不考虑在游戏中切换语言吗

不是的哦,这个满足的需求是:某个语言包里面,不能包含其他语言相关资源,从项目中动态剔除

干脆直接cc.loader.load,或是直接本地读取图片算了,语言只决定路径名

你的这个思路不错,但是编辑器Scene预览是个问题

要不

if(CC_DEV){
cc.loader.load
}else{
本地读取
}

你预览的就用loader 读久一点,输出后就本地读取

要是老板想要在编辑(还没预览)画面就看到
那我直播倒立吃屎

都已经潜伏到 引擎组内部了, 给他们提个介意 再搞个类似 editorOnly 的属性,bundle打包 能剔除这个资源就完了

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。