全局通栏广告

爱盲论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2439|回复: 2
打印 上一主题 下一主题

分享:写一个HelloWorld的NVDA插件-2022.1

[复制链接]

6

主题

31

帖子

184

积分

注册会员

Rank: 2

积分
184
跳转到指定楼层
楼主
发表于 2020-2-21 19:13:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主 我是高山说:
本帖最后由 我是高山 于 2022-3-6 18:15 编辑

写在前面的话:论坛自动在行首加了一个空格,所以代码部分自己斟酌,附件有代码有插件模板AddonTemplate-master,
-------
写一个HelloWorld的NVDA插件-2022.1
搭建NVDA插件开发环境

要为NVDA创建插件,请确保您的系统满足以下要求:
• NVDA:
◦ 您的计算机上提供了NVDA版本(便携式或已安装的版本都可以使用,但是我们强烈建议您在开发计算机上安装NVDA的副本)。我安装 的是2019.3.1
◦ 更好的是:我们建议安装最新的master(alpha)或beta开发版本,以与核心API更改保持同步。您可以从https://community.nvda-project.org/wiki/Snapshots下载最新的快照。##我不下载.
• python (蟒蛇:)
• 於 2019.3 後的 NVDA 已改用 python 3.7 開發且python 2 於 2020 年 1 月 停止支援了,故要入門就直接學 python3 吧
◦ 适用于Windows的Python 3.7系列,版本3.7.5 32位(适用于Windows):
https://www.python.org/downloads/release/python-375/
点击 :Windows x86 executable installer链接下载,
安装 的时候:Add Python 3.7 to PATH复选框已选中Alt+p
• 用于生成插件程序 包的SCons 3 3.0.1版或更高版本:
http://www.scons.org/
点击 download,在SCons Package下面点击.zip后缀的链接下载,
解压scons-版本号.zip,
CMD命令行切到刚才解压得到的文件夹,
输入python setup.py install
默认安装 到:Python37-32安装 目录\Lib\site-packages\
看看python安装目录\Scripts有没添加到环境变量,
输入scons -v,可以看到版本,

• Markdown 2.0.1或更高版本,用于生成附加文档:
可以在CMD命令行输入,
pip install markdown
• Windows的GNU Gettext包,用于消息本地化支持。需要msgfmt.exe, xgettext.exe两个文件,下载后不要安装 !!
这两个文件可以到NVDA的github代码仓库下载,,
NVDA代码仓库:https://github.com/nvaccess/nvda
两个文件在 miscDeps \ tools文件夹中,

• 如果要开发对程序,语音合成器或盲文显示器的支持,请安装所需的软件和硬件。
• 可选项目:
◦ 如果您希望将插件上传到Bitbucket或Github之类的存储库(可选,),请使用Git 1.7.9或更高版本。您可以使用各种Git客户端,例如Git Bash,Cygwin's Git和TortoiseGit。
◦ NVDA社区插件模板,便于附加文件和文件夹的包装和管理(可选)的。我下载。
https://github.com/nvdaaddons/AddonTemplate/archive/master.zip
也 可以用 git 克隆 :git clone https://github.com/nvdaaddons/AddonTemplate

参考资料:
NVDA addon 開發小教學 - NVDA中文站 改变,从这里开始 - Google Chrome
https://www.nvdacn.com/archives/NVDA-addon-development.html
生成Pot文件时出错。 - Google Chrome
https://nvda-addons.groups.io/g/nvda-addons/topic/7916852?p=,,,20,0,0,0::Created,,scons+pot,20,2,0,7916852,ct=1&ct=1


写一个nvda的HelloWorld插件

这是我记录和整理的笔记,方便日后查看,

先创建一个文件夹:HelloWorld

解压 AddonTemplate-master.zip
可以看看readme.me的内容,
将 site_scons 文件夹和以下文件复制到HelloWorld文件夹中: buildVars.py , manifest.ini.tpl , manifest-translated.ini.tpl  , sconstruct ,.gitignore 和.gitattributes
style.css.也 就是除了,COPYING.txt,readme.md外,,
可以直接把解压 出来的AddonTemplate-文件夹重命名为HelloWorld,再把不要的文件删除,
在HelloWorld文件夹中创建addon 文件夹。在 addon 文件夹中为附加模块创建所需的文件夹globalPlugins文件夹,
在HelloWord文件夹里的 buildVars.py 文件中,修改插件信息(名称,摘要,描述,版本,作者和url)** addon_info **变量。,.py文件可以用记事本或者notepad++打开
省略内容……
addon_info = {
        # for previously unpublished addons, please follow the community guidelines at:
        # https://bitbucket.org/nvdaaddont ... ster/guidelines.txt
        # add-on Name, internal for nvda
        "addon_name" : "HelloWorld",
        # Add-on summary, usually the user visible name of the addon.
        # Translators: Summary for this add-on to be shown on installation and add-on information.
        "addon_summary" : _("HelloWorld"),
        # Add-on description
        # Translators: Long description to be shown for this add-on on add-on information from add-ons manager
        "addon_description" : _("""say Hello to the world.
this is my first addon"""),
        # version
        "addon_version" : "1.0",
        # Author(s)
        "addon_author" : u"ZhangSan <XXX@YYY.com>",
        # URL for the add-on documentation support
        "addon_url" : "www......",
        # Documentation file name
        "addon_docFileName" : "readme.html",
        # Minimum NVDA version supported (e.g. "2018.3.0", minor version is optional)
        "addon_minimumNVDAVersion" : "2019.3",
        # Last NVDA version supported/tested (e.g. "2018.4.0", ideally more recent than minimum version)
        "addon_lastTestedNVDAVersion" : "2019.3",
        # Add-on update channel (default is None, denoting stable releases, and for development releases, use "dev"; do not change unless you know what you are doing)
        "addon_updateChannel" : None,
}
省略内容……

看看上面的代码
        "addon_name" : "HelloWorld",,插件在nvda内部的名字,
        "addon_summary" : _("HelloWorld"),显示 给用户的名称,
        "addon_description" : _("""say Hello to the world.,插件的摘要,
        "addon_url" : "www......",,插件的地址,
        "addon_docFileName" : "readme.html",插件的帮助文档

在globalPlugins目录创建一个HelloWorld.py文件,
可以先创建一个.txt文件,然后重命名为 .py文件,
再用记事本或者notepad++方式打开,输入下面内容
import globalPluginHandler
import ui

class GlobalPlugin(globalPluginHandler.GlobalPlugin):
        scriptCategory='a global plugin'

        def script_toBeep(self,gesture):
                ui.message("Hello world!")

        script_toBeep.__doc__="say hello word"
        # script_toBeep.category="a global plugin"

        __gestures={
                "kb:nvda+a":"toBeep"
        }

下面整一个记事本插件,
在addon文件夹里创建appModules文件夹,这个是应用插件的文件夹,globalPlugins文件夹是全局插件文件夹,
在appModules文件夹里创建txt,再重命名为notepad.py,
在notepad.py里输入下面代码,
import appModuleHandler
import ui

from scriptHandler import script

class AppModule(appModuleHandler.AppModule):
        scriptCategory='notepad addon'

        @script(
                description='say hello notepad',
                # category='notepad addon',
                gesture='kb:nvda+z'
        )
        def script_demo(self, gesture):
                ui.message('hello notepad')

编写帮助文档
在HelloWorld文件夹里创建一个readme.txt文件 ,重命名为readme.md
在里面编写帮助内容:
#HelloWorld
这是一个和世界打招呼的插件
##快捷键:
nvda+a::Hello world!
nvda+z:hello notepad,记事本界面,

打包插件,
打开cmd命令行,切到HelloWorld目录,输入scons回车,
不出意外,你会在HelloWorld文件夹里发现:HelloWorld-1.0.nvda-addon

安装 插件
打开HelloWorld-1.0.nvda-addon,
点击 :关于插件(A)...按钮Alt+a,可以看到插件的信息,
插件信息对话框HelloWorld (HelloWorld)
版本: 1.0
作者: ZhangSan <XXX@YYY.com>
描述: say Hello to the world.
this is my first addon

网址: www......
NVDA版本最低要求: 2019.3
最近测试的 NVDA 版本
确认按钮
安装 重启nvda后,按nvda+a 你会听到Hello world!
切换到记事本界面,按nvda +z,NVDA朗读hello notepad,
在插件管理器会看到HelloWorld插件,可以点击 插件帮助查看帮助,
还可以看看NVDA菜单的选项的输入手势,


语言本地化
是本地化还是国际化呢?如果插件不给外国人用,直接用中文得了!
具体如下:
把msgfmt.exe,xgettext.exe两个文件拷贝到HelloWorld文件夹里,或者直接放在python.exe所在的文件夹,
编辑buildVars.py对应位置的内容,
#包含要翻译的文本的文件
i18nSources = pythonSources + ["buildVars.py", "addon\*\*.py"]

编辑HelloWorld.py的内容
import globalPluginHandler
import ui
import addonHandler

_=lambda x:x
addonHandler.initTranslation()

class GlobalPlugin(globalPluginHandler.GlobalPlugin):
        scriptCategory=_('a global plugin')

        def script_toBeep(self,gesture):
                ui.message(_("Hello world!"))

        script_toBeep.__doc__=_("say hello word")
        # script_toBeep.category=_("a global plugin")

        __gestures={
                "kb:nvda+a":"toBeep"
        }


修改notepad.py内容:
import appModuleHandler
import ui
import addonHandler

_=lambda x:x
addonHandler.initTranslation()

from scriptHandler import script

class AppModule(appModuleHandler.AppModule):
        scriptCategory=_('notepad addon')

        @script(
                description=_('say hello notepad'),
                # category=_('notepad addon'),
                gesture='kb:nvda+z'
        )
        def script_demo(self, gesture):
                ui.message(_('hello notepad'))


在cmd命令行切到HelloWorld目录,输入scons pot回车,
这时会生成一个HelloWorld.pot文件,把这个文件相应内容翻译,
当然是翻译成中文先!!,修改这个文件里对应的内容,
"Language: zh_CN\n"
...省略内容,
"Content-Type: text/plain; charset=utf-8\n"

#: buildVars.py:17
msgid "HelloWorld"
msgstr "你好世界"

#. Add-on description
#. Translators: Long description to be shown for this add-on on add-on information from add-ons manager
#: buildVars.py:20
msgid ""
"say Hello to the world.\n"
"this is my first addon"
msgstr ""
"和世界打个招呼,\n"
"这是我的第一个插件。"

#: addon\appModules\notepad.py:11
msgid "notepad addon"
msgstr "记事本插件"

#: addon\appModules\notepad.py:14
msgid "say hello notepad"
msgstr "说你好记事本"

#: addon\appModules\notepad.py:19
msgid "hello notepad"
msgstr "你好记事本"

#: addon\globalPlugins\HelloWord.py:9
msgid "a global plugin"
msgstr "一个全局插件"

#: addon\globalPlugins\HelloWord.py:12
msgid "Hello world!"
msgstr "你好世界!"

#: addon\globalPlugins\HelloWord.py:14
msgid "say hello word"
msgstr "说你好世界!"

在addon文件夹下创建文件夹
locale\zh_CN\LC_MESSAGES
再把HelloWorld.pot拷贝到这个文件夹里,并重命名为nvda.po,
在cmd命令行切换到HelloWorld目录输入scons回车打包插件,
安装 这个新生成的插件,按nvda+a nvda会说你好!世界!
在记事本界面,按nvda+z,NVDA会朗读:你好记事本!
在插件管理器看到的插件名称也 是中文的,
还可以看看NVDA菜单的选项的输入手势,
如果 在.pot填写相应的阿拉伯语,
然后把.po放到addon\locale\ar\LC_MESSAGES\里,打包安装 插件后,如果 nvda选择了阿拉伯语,插件里相应的中文内容会翻译成为阿拉伯语!

帮助文档语言本地化
我们打开HelloWord\addon\doc\en,
看到两个文件:
readme.html
readme.md
他们对应的是HelloWord文件夹里的readme.md,所以HelloWord文件夹里的readme.md应该是英文版的,

可以在addon\doc下创建zh_CN文件夹,在里面创建中文内容的readme.md
打包插件的时候会生成一个readme.html,
还可以
在en下创建英文内容的readme.md
在 fr下创建法语内容的readme.md
nvda使用哪种 语言,点击 插件帮助会显示 哪种 语言的内容!这个我没试,!

修改插件内容后,要重新打包,安装,重启NVDA,
是比较麻烦了!我发现,修改插件内容后可以把C:\Users\XXX\AppData\Roaming\nvda\addons\HelloWord里的内容删除掉,
然后把HelloWord\addon里的内容复制到C:\Users\XXX\AppData\Roaming\nvda\addons\HelloWord里,
重启NVDA,测试插件,最后再打包生成插件,
我不知道这样操作会不会有什么问题,
有时候你觉得你没有什么错误的地方,可是插件还是有问题,你可以把插件卸载掉,把插件安装包删除掉,再打包安装,
比较好的开发流程是什么样呢?

更多资料:
NVDA附加开发指南
https://github.com/nvdaaddons/De ... n-Development-Guide
nvda插件开发论坛
https://nvda-addons.groups.io/g/nvda-addons


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

7

主题

166

帖子

1967

积分

高级会员

Rank: 4

积分
1967
沙发
发表于 2020-2-21 20:18:10 | 只看该作者
沙发 其瑞说:
感谢分享
本帖来自安卓秘书
回复 支持 反对

使用道具 举报

247

主题

6625

帖子

1万

积分

金牌会员

Rank: 5Rank: 5

积分
16367
QQ
板凳
发表于 2020-2-21 21:49:56 | 只看该作者
板凳 zmy说:
感谢分享。
本帖来自安卓秘书
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋| 爱盲论坛  

GMT+8, 2024-11-22 08:27 , Processed in 0.064550 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表