stable

您所在的位置:网站首页 unity开发app应用源码 stable

stable

#stable| 来源: 网络整理| 查看: 265

AUTOMATIC1111的stable-diffusion-webui是近期很流行的stable-diffusion界面应用,它集合stable-diffusion各项常用功能,还通过扩展的形式支持controlnet、lora等技术。分析它的源码,也在一定程度上有助于理解stable-diffusion的算法。下图是stable-diffusion-webui的界面,可见功能强大。

源码分析将从以下8个方面进行,出于时间精力限制,分析不会很详细,仅仅是对其代码的脉络结构做分析,以便在需要修改时能够找对地方。同时,也作为一个学习总结。本篇是第5篇,关于多语言本地化的实现。

Gradio的基本用法txt2img的实现模型加载的过程启动流程多语言的实现方式脚本的实现方式扩展的实现方式Lora功能的实现方式多语言的实现方式功能说明

stable-diffusion-webui支持多语言,如下图所示,安装多语言插件后,便可以在设置中切换语言,图中展示了将界面翻译成中文的效果。

以中文翻译的“stable-diffusion-webui-localization-zh_CN”插件为例,安装后它位于extensions/stable-diffusion-webui-localization-zh_CN目录下,它最核心的部分是localizations目录下的zh_CN.json文件。

zh_CN.json的内容如下图所示,它是一个字典结构,保存着英文对中文的翻译内容。在设置中选用不同的语言,实质上就是使用不同的json文件。

前端实现

本地化翻译主要是前端功能,我们先定位到webui工程中的javascript/localization.js,从如下代码可知,当页面加载完成(DOMContentLoaded事件)完成后,程序会调用processNode方法。

而processNode会对传入的组件做递归,也即是遍历界面上所有组件,然后调用processTextNode方法。其中的的node.nodeType==3判断该节点是否为文本节点,而textNodesUnder(..).forEach既是遍历子节点文本节点的方法。

补充:关于nodeType的节点类型如果节点是一个元素节点,nodeType 属性返回 1;如果节点是属性节点, nodeType 属性返回 2;如果节点是一个文本节点,nodeType 属性返回 3;如果节点是一个注释节点,nodeType 属性返回 8。

processTextNode方法如下所示,它先判断文本是否可翻译(canBeTranslated),然后获取翻译文本(getTranslation),如果存在翻译则替换文本内容(node.textContent = tl)。

对于是否可被翻译的判断,canBeTranslated方法实现如下,它先判断该组件是否存在文本、判断组件是否为顶层组件、判断父组件的类型例如输入框TEXTAREA就不进行翻译等等。

而获取翻译文本的getTranslation方法如下,它即是获取localization字典里的值,而localization字典与翻译插件的json文件对应。

前端代码中有如下一句注释,指明localization字典由后端传入,那么我们接下来看看后端相关功能的实现,看看怎样去构建localization字典。

后端实现

下图是module/ui.py中的一段代码,从中可见,程序根据本地化的设置(shared.opts.localization)获取json文件的内容,保存到inline变量中,再通过标签的方式注入到前端页面。

上图中的localization_js方法实现如下,它读取配置文件,然后设置变量localization(var localization = xxxx),进而使前端可以获取该值。

PS:《百万在线:大型游戏服务端开发》是一本非常好的游戏服务端技术书籍,对于进入游戏行业担任服务端开发工程师岗位非常有帮助,它涵盖了这个岗位所需的主要技能。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3