## プロジェクト概要
Web上でマニュアルの編集、多言語展開、組版・HTML出力まで行える、DITAベースの多言語マニュアル制作システムを開発しました。独立後に作成したプロトタイプを既存顧客のマニュアル制作会社に提案したことをきっかけに、共同開発を開始しました。
主な機能は、構造ルールに沿ったXML編集、一次・二次翻訳言語の管理、原文の変更内容の同期、翻訳が必要な段落のXML出力と翻訳結果の取り込み、言語別の画像・用語管理、PDF・HTML出力です。
現在は合計6社で利用されており、4社では初期開発の機能を、残る2社ではドキュメントの特性や制作ワークフローに合わせて改修した機能を利用しています。メーカーのマニュアル担当者や製品開発者が直接編集し、システムから組版・HTML出力を実行する運用にも対応しています。
## 開発体制
- 私:機能企画、システム・DB設計、エディタのフロントエンド実装、バックエンド実装、システムデータをDITA形式に変換してDITA-OTを実行するサービスの開発
- 制作会社のシステム開発担当者:機能企画、マニュアルのXML設計、DITA-OTプラグイン開発
- フロントエンドエンジニア:エディタ以外のUI設計、フロントエンド実装
私は、DITA XMLの構造を踏まえ、エディタ・バックエンド・DITA変換サービスの設計・実装を一貫して担当しました。
## 使用技術
- フロントエンド:HTML、JavaScript、jQuery
- バックエンド:asp.net 4.5.2(最終的に4.8に更新) dotnet frameworks 4.5.2 ともにC#で実装
‐ ORM : Dapper
- Database : PostgreSQL
- 検索用ストア : Elasticsearch
- 組版 : DITA-OT, Adobe Framemaker,Adobe Indesign (マニュアルによって変更)
## 技術的な課題と設計上の工夫
### 翻訳・校正中のデータを維持するトピック管理
翻訳元言語の変更が、翻訳・校正中のマニュアルに影響しないようにする必要がありました。
翻訳言語のマニュアルを作成する際は、翻訳元のマップ(目次構成)を複製し、各トピック(本文データ)は翻訳元と同じものを参照する設計にしました。トピックの編集時には既存データを上書きせず、新しいトピックを作成し、編集対象のマニュアルだけ参照を切り替えます。翻訳言語側で独自に編集する場合も、同様にそのマニュアル専用のトピックを作成します。
翻訳元の変更を取り込むため、初校・再校などの区切りで実行する同期処理を開発しました。前回同期時点と最新のマップ・トピックを比較して変更部分を翻訳言語側に反映し、変更のない部分は既存の翻訳結果を維持します。
これにより、原文の編集と翻訳・校正を並行して進めながら、作業の区切りで原文の変更を取り込めるようにしました。
### 翻訳ソースIDによる差分翻訳
他言語のマニュアルは、XMLで翻訳出力し、翻訳したXMLをインポートすることで、翻訳データを登録できます。翻訳出力は、変更したところだけが翻訳出力されます。従来の制作フローでは、すべての文書を翻訳出力し、翻訳支援ツールにて過去に実施した翻訳は、その時の翻訳データを翻訳メモリから取得してあてはめることによって、必要な部分だけを翻訳するようになっていました。
この翻訳メモリから過去の翻訳を割り当てる場合も翻訳会社としては、翻訳よりは安いながら、費用が発生していました。この差分翻訳機能により翻訳費用を抑制することができます。
- 編集を行った際に、XML上の段落要素内のテキストやインライン要素をDBに翻訳ソースとして登録し、XML側には翻訳ソースIDを記録します。
- エディタで段落内のテキストやインライン要素を変更すると、変更ログを記録し、保存時にその段落の翻訳ソースIDを更新します。多言語側への同期時には、参照するIDも更新します。翻訳出力では、対象言語の翻訳結果が登録されていないIDの段落だけを抽出することで、変更のない段落の既存訳を維持し、翻訳が必要な段落に対象を絞りました。
### 用語の多言語管理
- マニュアルで使う固有名詞や専門用語など、翻訳を固定したい部分を変数としてXMLに設置できます。対訳の付いた変数と用語リストを登録することで、各言語の変数の用語を設置して組版することができます。
### XML構造の制御と再利用しやすい編集UI
編集言語のマニュアルをWebインターフェイスで編集する。ドラッグ&ドロップでDITAトピックの構造ルールに沿ったXMLの編集ができます。
- エディタで扱えるXML構造を、DITA-OTで出力スタイルを定義した範囲に限定しました。これにより、編集時点で、出力スタイルが適用されない構造やマニュアルとして不適切な構造の作成を防ぎました。
- 目次の編集とトピック内の記述の変更するUIを分離しました。目次の編集画面には、編集対象の目次を表示した右側に別の目次を表示する機能をつけました。表示したほかの文章の目次から、目次項目を選び、左側の目次ツリーにドラッグ&ドロップで移動して、インサートできるようにしました。
- トピックの編集画面には、目次ツリーのレイアウトに沿って、トピックを連続して並べて表示するようにしました。こちらにも、右側に別の文章を表示して、どの構造をドラッグ&ドロップで編集対象のトピックにインサートできるようにしました。
### 言語別イラストの参照
マニュアルで表示するイラスト、参照設定するファイルを登録することができる。ファイルシステムとしてフォルダを作成してファイル登録できます。
- マニュアルで使用されるイラストは、例えば画面の説明イラストのように言語が違った場合に、差し替えが必要なものがあります。そのため、各言語のフォルダを作成してそこに配置されたイラストは、組版の際に差し替える処理を実装しました。例えば、日本語=>英語=>フランス語という翻訳順の時、フランス語のフォルダのイラストを参照して、不足分を英語のフォルダから取得、さらに足りないものを日本語のフォルダから取得といった処理になっています。
## 顧客別の機能拡張
このシステムは、マニュアルのドキュメントとしての機能やお客様と制作ワークフローに合わせるために改修して運用している場合があります。
### 制作会社とメーカー間のデータ移行
製品の製造メーカーが、複数の制作会社にマニュアルの制作を発注している状況で、制作会社・メーカーようにそれぞれシステムを構築して、マニュアル完成したら、完成データを納品しメーカーのシステムにインポートするという形で運用するとのことでした。プロジェクトを編集言語、他言語の関係を崩さないようにデータエクスポートする機能と、そのデータを別のシステムでインポートして運用できるようにするインポート機能を開発しました。
これにより、いろんな制作会社にマニュアルの変更内容に応じて発注したり、翻訳のための小変更であればメーカーで対応したりできるようになりました。
### 製品別マニュアルの生成とマスター更新
住宅設備メーカーのマニュアルで、OEM含め多種のマニュアルを制作しているメーカー向けにシステムを改修しました。様々なマニュアルの記載を1つのマスターマニュアルとして記載して、各記載のXML要素に製品の種別を登録し、新規マニュアルを作成する際に製品の種別を定義することで、必要な記載を抽出してマニュアルを生成する機能を実装しました。この機能で作成されたマニュアルデータに対して、追加・変更を加えることで製品マニュアルが完成します。また、部品の変更などによりマスターマニュアルの記載が更新された際には、その内容を製品マニュアルに反映する機能も実装したことで、マスターの反映をマニュアル更新の際に自動で反映できるようにしました。この機能を実現するために、製品マニュアルの編集は、構造の追加・削除のみを実施し、その操作を要素の属性として記録するように機能を制限しました。これにより、マスターのトピックと製品のトピックがどちらも変更されたとしても、マスターのトピックに対して、操作の属性にしたがって、要素の追加、削除処理をすることで、マスターの反映ができるようになりました。