# 提出手順 — オフライン文書翻訳（依頼主の作業）

開発側でできるところ（MSIX・掲載文・スクリーンショット・プライバシーポリシー案・実物の論文での確認）は済んでいる（DEVLOG「M3 リリース準備」）。
ここに書いたのは、Partner Center のアカウント・依頼主の実際の文書・法的な判断が要るため、依頼主にしかできない作業。
**名前はまだ予約していない**（手順 1 が最初）。identity・store_id は仮の値のままなので、予約後に手順 2 で差し替えて MSIX を作り直す。
**8 本の中で品質リスクが最大のアプリ**。掲載文は「下訳」「得意・不得意」を正直に書いてある。手順 3（自分の文書での確認）を飛ばさないこと。

## 0. 手元にあるもの
| もの | 場所 |
|---|---|
| MSIX（未署名・Store が署名する。**identity は仮**） | `apps/doc-translator/dist/DocTranslator_1.0.0.0_x64.msix`。2026-11-10 の M3 後追い版（翻訳が止まる件の修正後）：195,873,150 バイト、SHA256 `4FB6719D25BCAD16700392970882E63F1771283ABE5A27806683B141B99D2311`（確かめ方：PowerShell で `Get-FileHash apps\doc-translator\dist\DocTranslator_1.0.0.0_x64.msix`。手順 2 で作り直すと値は変わるので、そのときは DEVLOG に新しい値を書く） |
| 掲載文（日本語・英語） | `store/listing-ja.md`・`store/listing-en.md` |
| スクリーンショット 5 枚（1600×900、文書は自作サンプルだけ） | `store/screenshots/01〜05.png`（作り直し：`tools/store_shots.py`。手順 2 の下） |
| プライバシーポリシー案 | `store/privacy-policy.md` |
| 実物の論文での確認結果（速さ・崩れ・要確認） | DEVLOG「M3 リリース準備」の「実物の論文」 |

## 1. 名前を予約する（Partner Center）
1. Partner Center → アプリとゲーム → 新しい製品 → MSIX または PWA アプリ。
2. 名前：**オフライン文書翻訳**（2026-11-09 に空きを確認。`docs/ms-store-apps/name-availability-2026-11-09.md`。その後は再確認していない）。取られていたら別名を決め、下の差し替えをその名前で行う。
   競合「Doc Translator – Offline AI Translation」（仕様 §3）と紛らわしくならないかも一度見る。
3. 英語の掲載名を別に持つなら、同じ製品に「Offline Document Translator」も予約する（任意。予約しない場合は英語の掲載にも日本語の名前を使う）。
4. 製品 → 製品 ID（Product identity）の画面で次をメモする：
   - Package/Identity/Name（例 `imoninja.1234ABCD5678`）
   - Package/Identity/Publisher（`CN=ECF78C6D-…` — transcriber と同じはず）
   - Package Family Name（PFN、例 `imoninja.1234ABCD5678_gytd433ssh6vj`）
   - Store ID（12 文字、例 `9ABCDEFGHIJK`）

## 2. 予約した値に差し替える（開発側に頼んでもよい・5 分）
| ファイル | 項目 | 今の値（仮） | 入れる値 |
|---|---|---|---|
| `apps/doc-translator/msix.json` | `identity.name` | `imoninja.DocTranslatorDev` | Package/Identity/Name |
| 同 | `identity.publisher` | `CN=ECF78C6D-7A8E-415A-BEC7-4C853385A7DE` | Package/Identity/Publisher（同じなら変更なし） |
| 同 | `display_name` | `オフライン文書翻訳` | 予約した名前（完全に同じ文字） |
| 同 | `_note` | 「仮」の説明 | 「予約済み（日付）」に |
| `apps/doc-translator/main.py` | `INFO.store_id` | `""`（空＝購入ボタンで案内文を出す） | Store ID |
| 同 | `INFO.name["ja"]` / `["en"]` | `オフライン文書翻訳` / `Offline Document Translator` | 予約した名前（英語名を予約しなかったら en はそのままでよい） |
| `store/listing-ja.md`・`listing-en.md`・`privacy-policy.md` | 製品名 | オフライン文書翻訳 | 予約した名前（変わったときだけ） |
| `store/privacy-policy.md` | §2 の保存先 | `%LOCALAPPDATA%\Packages\<本アプリ>\LocalState` | そのままでもよい（PFN を書くなら `<本アプリ>` を PFN に） |
| `apps/doc-translator/DEVLOG.md` | — | — | 差し替えたこと・新しい SHA256 を一行 |

名前を変えた場合は、スクリーンショットのヘッダーにアプリ名が写っているので撮り直す（アプリのフォルダで。約 3 分）：
```
set LOCALAPPDATA=%TEMP%\dt-shots
set QT_QPA_PLATFORM=offscreen
set IMOSHELL_LICENSE=purchased
.venv\Scripts\python tools\store_shots.py %TEMP%\dt-work store\screenshots
```
差し替えたら MSIX を作り直す（アプリのフォルダで）：
```
powershell -ExecutionPolicy Bypass -File ..\..\common\build\build.ps1
```
→ `dist\DocTranslator_1.0.0.0_x64.msix`。古い開発版（`imoninja.DocTranslatorDev`）が入っていたら先に外す：`Get-AppxPackage -Name imoninja.DocTranslatorDev | Remove-AppxPackage`。
作り直したら `build\licenses\index.json` で「license text not included」が 0 件か見る（DEVLOG の確認方法。版を変えていなければ変わらない）。

## 3. 自分の文書で確かめる（提出前に必ず・1〜2 時間。仕様 §10 のリリース基準）
仕様のリリース基準は「**英語論文 10 ページを実用的な時間で翻訳し、対訳で読めること**」。開発側は自作のサンプルと、公開ライセンスの論文 2 本（ACL の CC BY 4.0 論文）で確かめた（DEVLOG「M3 リリース準備」）。
**依頼主が実際に読む種類の文書（分野の論文・仕様書・契約書）で一度通し、「下訳として役に立つか」を判断する。** 役に立たないと感じたら提出しない判断もありうる（掲載文に書いた得意・不得意が実感と合うかを特に見る）。

1. 開発者モードで入れる：アプリのフォルダで `powershell -ExecutionPolicy Bypass -File ..\..\common\build\build.ps1 -DevInstall`（スタートメニューに「オフライン文書翻訳」が出る）。
   開発版の試用は累計 10 ページなので、足りなければ開発版を `set IMOSHELL_LICENSE=purchased` → `.venv\Scripts\python main.py` で起動する（処理は同じ）。
2. 試す文書（社外秘のものでもよい。どこにも送られない）：
   - A：英語の論文 10 ページ前後（2 段組み・数式・表・図のあるもの）→ 英→日
   - B：日本語の報告書・仕様書（表のあるもの）の PDF か Word → 日→英
   - C：日本語の契約書（Word）→ 日→英。翻訳する画面の案内から「契約書の定番」を用語集に入れ、訳し直す
   - D（任意）：縦書きの PDF（社内報・公文書など）
3. それぞれ：翻訳 → 「対訳・確認」で読む → 要確認の一覧を順に見る → 書き出し（PDF / Word と対訳表）→ 書き出したファイルを開いて見る。
4. 下の記録用紙を埋めて DEVLOG に貼るか開発側に渡す（文書そのものは渡さなくてよい。問題の出た 1〜2 文だけでよい）。
5. 終わったら登録を外す：`Get-AppxPackage -Name imoninja.DocTranslatorDev | Remove-AppxPackage`（設定・用語集・試用の記録も消える。書き出したファイルは残る）。

```
日付：      PC：（CPU・メモリ）
[A 論文]  ページ数：   翻訳にかかった時間：   分   秒（翻訳する画面の完了表示）   要確認：   件
          下訳として：役に立つ ／ 直せば使える ／ 使えない
          目立った誤り（例：専門用語の取り違え・数式の崩れ・引用の欠落）：
          書き出した PDF：読める ／ 一部崩れ（どこ）／ 読めない      対訳表（Word）：読める ／ 読めない
[B 報告書] 同上（表のセル・見出しの誤訳の多さ）
[C 契約書] 用語集を入れた後の「甲」「乙」：Party A/B になった ／ ならない   定義句（「以下「甲」という。」）の欠落：あり ／ なし
[D 縦書き] 読み込めた ／ 読み込めない   段の順番：正しい ／ 乱れた   書き出した PDF：読める ／ 小さすぎる
[固まった・落ちた操作]：
[総合]  リリース基準（論文 10 ページを実用的な時間で・対訳で読める）：満たす ／ 満たさない
        掲載文の「得意・苦手」は実感と合っているか：合う ／ 直したい（どこ）
```

## 4. プライバシーポリシーを公開する
1. `store/privacy-policy.md` の「最終更新日」を入れ、内容を確認する。
2. transcriber・receipt-prep と同じ置き場所に置き、URL を控える。

## 5. 翻訳モデル（ElanMT、CC BY-SA 4.0）の表示と提供（提出前に一度読む。法的な最終確認ではない）
同梱の翻訳モデルは ElanMT（ELAN MITSUA Project / Abstract Engine、CC BY-SA 4.0）を CTranslate2 形式に変換・int8 量子化したもの（`tools/convert_models.py`）。
変換・量子化は CC BY-SA 4.0 の「翻案（Adapted Material）」に当たると見なして、次の義務を満たす作りにしてある。

| CC BY-SA 4.0 の条件 | どう満たしているか（確認した場所） |
|---|---|
| 3(a)(1)(A) 作者の表示・ライセンスの表示・免責の表示・元の素材へのリンク | アプリの「ヘルプ」→「バージョン情報」の「AI モデル」の欄（常に見える表示文）：作者「ELAN MITSUA Project / Abstract Engine」、元モデルの URL（Hugging Face の Mitsua/elan-mt-bt-ja-en・en-ja）、CC BY-SA 4.0 とそのリンク、「訳文は誤り・偏りを含むことがある（元のモデルカードの免責）」。本文に LICENSE-NOTE.txt。モデルのフォルダーに元のモデルカード `MODEL_CARD.md`（Disclaimer の節を含む）を無変更で同梱 |
| 3(a)(1)(B) 変更したことの表示 | 同じ表示文と `LICENSE-NOTE.txt`：CTranslate2 形式への変換・int8 量子化、`<pad>` をデコーダ開始トークンとして語彙に残した、それ以外の重みは変更なし |
| 3(b)(1) 翻案は同じライセンス（CC BY-SA 4.0）で | 表示文・LICENSE-NOTE.txt・FAQ に「変換後のモデルも CC BY-SA 4.0 で提供」と明記 |
| 3(b)(3) 翻案に追加の条件・技術的制限を課さない | モデルは MSIX の中に暗号化・難読化せずに置いてある（インストール先の `_internal\models\elan-ja-en`・`elan-en-ja`。Store 版のインストール先は一般ユーザーでも読み取り・コピーできる：transcriber M3 で確認）。表示文と FAQ に「本アプリの使用許諾条件にかかわらず CC BY-SA 4.0 の条件でコピー・改変・再配布できる」と明記 |

**残る懸念と、依頼主に決めてほしいこと**
1. **Store の標準アプリケーション ライセンス条項（SALT）との関係**：Store で配布するアプリには Microsoft の SALT（複製・リバースエンジニアリングの制限等）が付く。SALT がアプリに同梱したモデルにまで「追加の条件」として及ぶと読まれる余地がある（3(b)(3)）。アプリ内の表示で「モデルは CC BY-SA 4.0 が優先」と書いたが、念のため次のどちらか（または両方）を推奨：
   - (a) Partner Center の「追加のライセンス条項（Additional license terms）」に、`listing-ja.md` / `listing-en.md` の「追加のライセンス条項」の文（同梱モデルは CC BY-SA 4.0 で利用・再配布できる）を入れる。
   - (b) **変換済みモデルを Store の外でも公開する**（推奨）：Hugging Face に `imoninja/elan-mt-bt-ja-en-ct2-int8`・`imoninja/elan-mt-bt-en-ja-ct2-int8` のようなリポジトリを作り、`apps/doc-translator/models/elan-ja-en`・`elan-en-ja` の中身（model.bin・shared_vocabulary.json・source.spm・target.spm・config.json・LICENSE-NOTE.txt・MODEL_CARD.md）をそのまま上げ、README に「ElanMT（作者・元 URL）を CTranslate2 int8 に変換。CC BY-SA 4.0。変換手順は convert_models.py（同じリポジトリに置く）」と書く。ライセンス欄は `cc-by-sa-4.0`。公開したら、その URL を main.py の `_model_entry` の表示文と FAQ（ui/strings.py「翻訳モデルのライセンスは？」）に足して作り直す（開発側に頼んでよい）。
     これで、アプリを買っていない人も含め、誰でも同じ条件で変換後のモデルを入手できる。義務ではない（CC BY-SA は共有した相手に同じライセンスで渡すことを求めるもので、公開の場所を用意する義務はない）が、3(b)(3) の疑いをなくせる。
2. ElanMT の学習データは CC0 / CC BY / CC BY-SA の公開コーパスだけとモデルカードに明記されている（LICENSES.md）。比較に使った FuguMT は同梱していない。
3. 同梱の他の OSS（Qt＝LGPL v3、Intel OpenMP＝Intel EULA、ctranslate2＝MIT、sentencepiece＝Apache 2.0 など）は「バージョン情報」の一覧に本文付きで出る（本文の欠け 0 件。DEVLOG）。**Qt の表示文（LGPL v3）と Intel の EULA の再配布条件（transcriber の SUBMIT.md §0 と同じ DLL）を一度読む**（common TODO-M2 §17.3 の注）。

## 6. Partner Center で提出する
1. **価格と使用可能状況**：市場＝日本（任意で全市場。英語の掲載文と一部英語の画面はある）、価格 **¥2,980**、
   無料試用＝**「期限なし」（Trial never expires）**（アプリ側で累計 10 ページに制限している。試用を「なし」にすると購入前に入れられず、
   期限付きにすると期限後に起動できなくなって 10 ページの制限と二重になる）。セール価格：なし。公開日：「手動で公開」を推奨（手順 7 を先に見る）。
2. **プロパティ**：カテゴリ＝**仕事効率化（Productivity）**（仕様 §8）。プライバシーポリシーの URL（手順 4）。サポート連絡先 imoninja@gmail.com。
   「このアプリは個人情報にアクセス・収集・送信しますか？」→ **いいえ**（外部送信しない。文書は端末内で処理し、インターネットに接続しない）。
   システム要件（推奨として）：メモリ 8 GB 以上、x64、空き容量 約 0.5 GB。
3. **年齢区分**：IARC の質問票（暴力・性的表現等なし、ユーザー同士のやり取りなし、位置情報なし、個人情報の共有なし、アプリ内購入なし、ブラウザー機能なし）→ 全年齢（3+）になるはず。
4. **パッケージ**：手順 2 で作り直した `.msix` をアップロード。対象：Windows 10/11 デスクトップだけ（Xbox・HoloLens 等は外す）。
   エラーが出たら：identity・publisher・display_name の不一致がほとんど（予約情報と 1 文字でも違うと弾かれる）。
5. **ストア登録情報（日本語）**：`listing-ja.md` を貼る。スクリーンショット 5 枚を番号順に（キャプションは listing の表）。アイコンはパッケージのもの。
   **英語**：`listing-en.md`。パッケージが ja-JP と en-US を宣言しているので両方の登録情報が求められる。
   手順 5 の (a) をするなら「追加のライセンス条項」に listing の該当の文を入れる。
6. **申請オプション**：
   - 制限付き機能 `runFullTrust` の理由（英語で貼る）：
     > Desktop (Win32) app packaged as MSIX (Python/Qt). runFullTrust is required to run the desktop executable, which reads the
     > user's PDF/Word documents and translates them locally with a bundled translation model (CTranslate2). The app has no network
     > access and does not send user files or data anywhere.
   - 認定の注意事項（Notes for certification、英語で貼る）：
     > Offline Japanese <-> English document translation (PDF, Word .docx, text). The translation model (ElanMT, CC BY-SA 4.0) is bundled;
     > the app makes no network connections. To test: Translate > Open document > choose any English or Japanese PDF/docx with text >
     > Start translation > Review shows the original and the translation side by side > Export writes "name.ja.pdf" / "name.en.docx"
     > and a bilingual table next to the original (originals are not modified). Trial: the Store trial allows 10 translated pages in total
     > (in-app counter); the full version has no limit. Scanned (image-only) PDFs are not supported and show a message.
     > The default language is Japanese; English UI is partially available (Settings > General > Language).

## 7. 公開後すぐ（2 週間は夜間チェック：ロードマップの共通基準 4）
「手動で公開」や限定公開にしておけば、一般に出す前にここを確かめられる。ログは `%LOCALAPPDATA%\Packages\<PFN>\LocalState\logs\app.log`。
- [ ] Store から試用版をインストール → ヘッダーが「試用 残り 10 / 10 ページ」。1 ページの文書を訳すと 9 に減る。ログに `store license: active=True trial=True`。
- [ ] 同じアカウントで購入 → アプリに戻るか再起動 → 「製品版」。ログに `store license: active=True trial=False`。購入ボタンで Store のページが開く（store_id が入っているか）。
- [ ] **オフライン**（common TODO-M2 §18.2。オフラインが売りなので必ず）：購入した PC で一度ネットありで起動 →「製品版」を確認して閉じる →
      機内モードで起動 →「製品版」のままか・文書を 1 つ訳せるか。ログに `store license: active=True trial=False` か
      `store license failed -> using last known state purchased`（`timeout`・`inactive` のこともある）が出れば正常。機内モードを戻す。
- [ ] 翻訳中に×→「中止して終了」で閉じて、もう一度起動できる（開発側で開発版・パッケージ版あわせて確認済み。DEVLOG）。
- [ ] 評価・レビューと imoninja@gmail.com を毎晩見る。誤訳の問い合わせには「どの方向か・問題の 1〜2 文・用語集を使ったか」を聞く（文書は送ってもらわなくてよい、と掲載文に書いた）。
      **「訳が悪い」という低評価は出る前提**。掲載文の「正直にお伝えしたいこと」と試用 10 ページで期待をそろえている。返金の依頼は Store の手続きに案内する。

## 未確認のまま提出することになる点（知っておいてほしいこと）
- 実際の利用者の文書での品質（手順 3）。開発側の確認は自作サンプルと公開論文 2 本（いずれも英→日。日→英は自作サンプルと縦書きの自作 PDF だけ）。
- 速度はアイドル状態の PC で測っていない（並行作業で CPU がほぼ 100% の中で測った値。掲載文の「10 ページで約 1〜2.5 分」はその条件の値で、空いた PC ならもっと速い見込み）。メモリ 8 GB の別の PC でも未確認（開発機の RAM は 7.9 GB で、翻訳中の使用量は約 220 MB）。
- 縦書きは自作の PDF（reportlab で作った 2 種類）だけ。実際の公文書・社内報・論文の縦書き PDF（ルビ・割注・縦中横・段組み）では未確認。
- スキャン PDF（OCR）は未対応（仕様の Should）。Windows 10・Windows N は未確認。
- Store 経由の購入・試用・オフライン判定の実反映（公開後にしか確かめられない）。

## プライバシーポリシーの URL（2026-11-10 公開済み）
https://offline-document-translator.pages.dev/ （Cloudflare Pages。更新手順は ms-store-apps/privacy-site/README.md）。Partner Center の「プライバシー ポリシーの URL」にこれを入れる。

## 提出用の最終 MSIX（2026-11-10、名前の予約後）

**これより前に書いた MSIX の大きさ・SHA256 は古い。提出にはこれを使う。**

- `apps/doc-translator/dist/DocTranslator_1.0.0.0_x64.msix`：195879134 バイト
- SHA256 `845B3E6FE30574BC49BA4F563100052B11A3C99935FACF9DF2423AA97D60F334`
- Identity/Name `imoninja.542389CC84D09`、Store ID `9NGD3QLKB211`、Publisher `CN=ECF78C6D-7A8E-415A-BEC7-4C853385A7DE`
- 含むもの：BOM 付き JSON の読み込み（common §22・アプリ側 utf-8-sig）、ライセンス収集の改善（§23）、左メニューの UIA（§23）、ビルド時の PATH 固定（§24：Git の OpenSSL DLL 混入なし）
- この PC にも同じレイアウトを開発者モードで登録済み（動作確認用）

- 2026-11-10 追記：英語名を「Offline Doc Translator」で予約したので main.py の INFO.name["en"]・listing-en・privacy-policy を直して作り直した（上の SHA256 は作り直した後の値）。
