cocos3.x终极多语言解决方案(h5)

我测试了一下你发的demo,发现只加载了zh资源啊 :sweat_smile:

打包成web以后就不正常,是因为打包后prefab的数据结构加密了,无法处理对应的资源关系

写个插件 监听打包前的事件,把内部的东西先清理掉,拉后刷新看看

不能清理预制件中的内容,因为要做国际化

动态加载都不行?相当于开发前可以把ui拼凑起来搞定,发布的时候全部清理掉,相当于一个空场景了,或者空节点了,使用动态的方式加载

你的意思是开发的时候有预制件,然后打包的时候删除预制件,将预制件的内容生成一份脚本去给主程序跑,大佬有示例吗,我觉得这种方式主要麻烦在解析整个预制件和生成加载代码上面

现在到是没时间去搞具体示意,一个简单例子看能满足不.比如scene中的脚本,去检测什么环境,然后在代码中获取当前bundle,然后bundle.load资源,加到你场景上,至于多语言就简单些了,就一个json文本包含ch和en,根据不同的环境切换就行了

你说的这些已经实现了,主要的问题就是预制件的问题,默认资源不需要加载,换句话说就是将预制件原本的静态资源做成动态资源,目前讨论下来的方案就是:
1、不使用编辑器拖拽,直接写代码实现布局,也就是不使用预制件
2、在打包时将预制件内容解析成动态脚本执行,难点是做一个所有节点解析和加载貌似很麻烦
3、修改引擎代码将Prefab打包后的uuid不进行加密,这样就能修改对应的语言uuid,这个方案难点是找不到代码去修改0-0

听这个意思是 ch和en 等的布局都不一样?

或者是 ch就做一个xx_ch.prefab,里面就只是ch用的东西和布局.脚本用一套

你跑一下我发的demo,然后打包再跑一下,你就知道我说的问题是啥了,加载资源加载了两倍的资源,静态资源+语言资源

你知道怎么在编辑器环境下,动态加载图片资源吗,如果可以的话也许还有救 :rofl:

全局获取一个区域设置,设置loadSprite/loadPrefab源码,在加载之后查询多语言组件,根据组件参数修改sprite。可以把语言包打包,根据区域进行解包。

大佬可以给个简单示例吗

其实问题在于开发时拖拽绑定了静态资源嘛,不绑不就好了。
我有一计!请看代码:
I18nSprite.zip (925 字节)
我这边预览和打包都测试过了,问题不大 :sunglasses:

静态资源也不能进bundle包

这个描述就很简单了,就是initinstant(prefab初始化函数)的外面套个函数,加载sprite的外面套个函数。查询节点组件,获取组件信息,修改节点的多语言内容,默认区域不进行修改,根据文件名进行匹配。

或者可以直接用语言包覆盖文件,还不用改文件名

更优化的方式,添加一个多语言节点,节点设置多语言Node列表,修改Node信息

看了你的文件,大概有了一些思路,得加一个组件来绑定动态资源地址,确实能解决问题,只是多了一步,目前没有比这个好的解决办法,这个多语言我的思路是越简单越好,尽量不要影响原有的开发逻辑和更多额外的东西,只需要一键引入然后就不用管了