Skip to content

Instantly share code, notes, and snippets.

@nishimotz
Last active December 14, 2015 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nishimotz/3f0c947fb383f8868f3d to your computer and use it in GitHub Desktop.
Save nishimotz/3f0c947fb383f8868f3d to your computer and use it in GitHub Desktop.
NVDA Developer Guide 日本語版のための作業場。原文と行番号を一致させて t2t 形式で書く。 原文はこちら https://github.com/nvdajp/nvdajp/blob/release-2013.1jp/developerGuide.t2t
NVDA NVDA_VERSION 開発者ガイド
%!includeconf: user_docs/userGuide.t2tconf
% Remove double spacing from the beginning of each line as txt2tags seems to indent preformatted text by two spaces
%!PostProc(html): '^ ' ''
= Table of Contents =[toc]
%%toc
+ はじめに +
これはNVDAの開発者のための解説です。翻訳や拡張コンポーネントの開発に関する情報も含まれます。
++ Python言語について ++
NVDAとNVDAの拡張コンポーネントは主にPythonプログラミング言語で開発されています。
このガイドではPython言語について説明しません。しかしこのガイドの例の多くはPythonで記述されているので、Pythonの文法の知識は有用です。
Python言語や関連情報については http://www.python.org を参照してください。
+ 翻訳 +
複数の言語やロケールをサポートするために、NVDAを翻訳してロケール固有のデータを提供する必要があります。
このセクションでは、NVDA独自のファイル形式で、翻訳が必要なものについて説明します。
NVDAのユーザー・インターフェースやマニュアルなどの翻訳対象ファイルは、標準のファイル形式を採用しています。
NVDAの翻訳作業については http://www.nvda-project.org/wiki/TranslatingNVDA を参照してください。
++ 文字説明 ++
ある文字と別の文字を区別することが、非常に困難または不可能な場合があります。
例えば、2つの文字が実際には異なる文字なのに発音が同じ場合です。
このような場合に、文字説明は、1つの文字を特定できるために必要な説明を提供します。
ロケールごとの文字説明は、ロケールのディレクトリの中の characterDescriptions.dic という名前のファイルです。
これはUTF-8エンコードのテキストファイルです。
空白行と半角 "#" 文字で始まる行は無視されます。
その他の行は、1つの文字、タブ文字、タブ文字で区切られた1つまたは複数の文字説明、という形式です。
以下は例です:
```
# これはコメント
a アルファー
b ブラボー
```
詳細な例は locale\en\characterDescriptions.dic を参照してください。
++ 記号読み上げ ++
特に文字単位のナビゲーションでは、句読点などの記号が、単語と同じように読み上げられると便利です。
残念なことに、音声合成エンジンによって、記号の読み上げは異なっており、読み上げかたを制御できないものも多くあります。
NVDAが記号読み上げの辞書を提供しているのはこのような理由です。
ロケールごとの記号読み上げ辞書は、ロケールのディレクトリの中の symbols.dic という名前のファイルです。
これはUTF-8エンコードのテキストファイルです。
空白行と半角 "#" 文字で始まる行は無視されます。
すべてのロケールは自動的に英語のシンボル情報を継承します。ただしすべての情報はロケールごとの定義で上書きできます。
ファイルには、2つのセクションが含まれています。
+++ 複合シンボル定義 (complexSymbols) +++
この最初のセクションは省略可能です。これは複合シンボルのための正規表現パターンを定義します。
複合シンボルとは、単純な1つの文字や複数の文字の連続ではなく、より複雑なマッチングを必要とするものです。
1つの例は、英語の文末のピリオド (.) です。
このピリオド (.) はいろいろな目的で使用される文字です。そのため、文の末尾のピリオドかどうかの判定には複雑なマッチングが必要です。
複合シンボルのセクションは下記の行で始まります:
```
complexSymbols:
```
このセクションの中の行は、シンボルを区別するためのテキスト識別子、タブ文字、シンボルを判定する正規表現パターン、という形式で記述します。
以下は例です:
```
. sentence ending (?<=[^\s.])\.(?=[\"')\s]|$)
```
繰り返しますが、英語のシンボル定義は自動的に他のロケールに継承されます。ですから、英語で定義されたシンボル定義は他のロケールで再定義しなおす必要はありません。
+++ シンボルの定義 +++
2番目のセクションは、それぞれの記号をいつどのように発音するか定義します。
このセクションは下記の行で開始します:
```
symbols:
```
それ以降の行は、タブ文字で区切られた複数のフィールドから構成されます。
識別子(identifier)と読み(replacement)だけは省略できません。
省略されたフィールドには既定値が適用されます。
フィールドは以下の通りです:
- identifier: 記号の識別子。
通常は記号のキャラクター1文字または複数の文字です。
ただし、複合シンボルの識別子をここに記載できます。
ファイルに入力できない特別なキャラクターのために、下記の特殊文字を定義しています:
- \0: ヌル (null)
- \t: タブ (tab)
- \n: 改行 (line feed)
- \r: 復帰 (carriage return)
- \f: 改ページ (form feed)
- \#: # キャラクター (行頭の # はコメント行を示すため)
- replacement: その記号の読みを表す文字列。
- level: どの記号レベルで読み上げるかを指定します。
ユーザーはどの記号を読み上げるかを、記号読み上げレベルとして設定できます。
このフィールドは "none"(読まない), "some"(一部読み上げ), "most"(ほとんど読み上げ), "all"(すべて読み上げ), "char"(文字) のいずれかで指定します。ただし "-" を指定すると既定値になります。
"char" が指定されると、文字単位の移動のときだけ読み上げます。
既定値は(訳注:英語用の定義から)継承されますが、継承する値がない場合は "all" になります。
- preserve: 正しい読み付与をさせるために、記号をそのまま音声合成エンジンに送るかどうかを指定します。
例えば、ポーズや抑揚に影響する記号(英語でのカンマなど)はそのまま送るべきです。
This field should be one of the following:
- never: その記号をエンジンに送りません。
- always: その記号を必ずエンジンに送ります。
- norep: その記号が読みに置換されなかったときに(その記号で指定されたレベルよりも、ユーザーがセットした読み上げレベルが低いときに)エンジンに送ります。
- -: 既定値を使います。
-
既定値は(訳注:英語用の定義から)継承されますが、継承する値がない場合は "never" になります。
-
最後に、行末のタブ(訳注:およびシャープ記号)に続けてコメントとして、その記号の表示用の名前 (display name)を書くことができます。
これは記号読み辞書の編集でユーザーに表示されます。また、英語の複合シンボルに対して名前の翻訳を定義できるので、翻訳者に役立つでしょう。
以下に例を挙げます:
```
( left paren most
```
記号読み上げレベルが most (ほとんど) 以上、つまり "most" または "all" (すべて) のときに、記号 "(" を "left paren" と読みます。
```
, comma all always
```
記号読み上げレベルが "all" (すべて) のときに、記号 "," を "comma" と読み、この記号そのものは常に音声エンジンに送られます。従って、音声エンジンは適切にポーズを入れることができます。
```
. sentence ending point # . fin de phrase
```
この行はフランス語の symbols.dic で使われています。
識別子 ". sentence ending" の複合シンボルの読みを "point" と指定しています。
level と preserve は省略されているので、この記号の英語での定義から継承されます。
フランス語のユーザーのための表示用の名前が定義されています。
英語から他の言語に継承される定義の詳細は locale\en\symbols.dic を確認してください。
このファイルは記号の定義の例としても有用です。
+ プラグイン +
++ 概要 ++
プラグインはNVDAの振る舞いを、全体にわたって、あるいは特定のアプリケーションの中でだけ、カスタマイズするためのものです。
下記のことができます:
- 特定のイベントへの応答、例えばフォーカスの変更やオブジェクトのプロパティの変更。例えばあるコントロールが名前(Name)を変更したときなど。
- 特定のキーが押されたりその他の入力が行われたときに実行されるコマンドの実装。
- 特定のコントロールに対する、振る舞いのカスタマイズ、および、追加の機能の実装。
- テキスト情報および複合ドキュメントのサポートのカスタマイズおよび追加。
-
この章ではプラグイン開発の入門を行います。
開発者はソースコードの説明で詳細な情報を得るようにしてください。
++ プラグインの分類 ++
プラグインには2つの種類があります:
- アプリケーションモジュール(App Modules): 特定のアプリケーションのための処理です。
アプリケーションモジュールは、特定のアプリケーションに関するすべてのイベントを、たとえアクティブでなくても、受け取ります。
アプリケーションがアクティブなときには、アプリケーションモジュールによってコマンドと結びつけられたユーザーからのキー入力やその他の入力は、すべて実行されます。
- グローバルプラグイン(Global Plugins): NVDAにおけるグローバルな処理、つまりすべてのアプリケーションに適応される処理です。
グローバルプラグインは、オペレーティングシステムのすべてのコントロールのすべての処理を受け取ります。
オペレーティングシステムでいかなるアプリケーションが動作していても、グローバルプラグインで定義されたコマンドは、ユーザーの操作によって実行されます。
-
例えばあるアプリケーションをNVDAでもっとアクセシブルにしたいなら、アプリケーションモジュールを作成することが適切でしょう。
一方で、NVDA全体で動作する拡張機能(例えば何かアプリケーションを実行しているときに、現在の無線ネットワークの電波の強度を確認したい、など)の作成には、グローバルプラグインが適しています。
アプリケーションモジュールとグローバルプラグインは、形式的にはよく似ています。
いずれもPythonのソースファイル(拡張子は.py)で、イベント、スクリプト、バインディングを含む特別なクラスを定義し、コントロール、テキスト情報、複合ドキュメントにアクセスするためのカスタムクラスを定義します。
しかし、両者には違いもあります。
以下のセクションでは、アプリケーションモジュールとグローバルプラグインを区別して説明します。
その後、両者をより一般的な観点で説明します。
++ App Module の基本 ++
App Module(アプリケーションモジュール)は拡張子 .py で、ファイル名は対応させたいアプリケーションのメイン実行ファイルと同じ名前でなくてはなりません。
例えば「メモ帳」に対応する App Module は notepad.py というファイル名です。なぜなら、メモ帳のメイン実行ファイルは notepad.exe という名前だからです。
App Module ファイルは NVDA ユーザー設定ディレクトリの appModules サブディレクトリの中に置いてください。
ユーザー設定ディレクトリの場所についてはNVDAユーザーガイドを参照してください。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment