# バッチ設計書 14-lint-localizations

## 概要

本ドキュメントは、Wikipedia iOSアプリのローカライゼーションファイルに対する品質チェック（Lint）を実行するシェルスクリプト「lint-localizations.sh」のバッチ設計書です。

### 本バッチの処理概要

このバッチはWikipedia iOSアプリの翻訳ファイル（.stringsファイル）に対して品質検証を行い、一般的な翻訳エラーやフォーマット問題を検出します。特に、プレースホルダーの逆ドル記号（reversed dollar sign）やMediaWikiテンプレート構文の残存など、アプリのクラッシュや表示異常を引き起こす可能性のある問題を早期に発見します。

**業務上の目的・背景**：Wikipedia iOSアプリは多言語対応しており、翻訳作業はTranslateWiki等の外部プラットフォームで行われます。翻訳者によってはiOSの文字列フォーマット規則に不慣れな場合があり、`1$`のような逆ドル記号（正しくは`$1`）や、MediaWikiの`{{テンプレート}}`構文が誤って残されることがあります。これらの問題がアプリに含まれると、クラッシュや文字化けの原因となるため、CI/CDパイプラインでの品質ゲートとして本バッチを使用し、問題のある翻訳をリリース前に検出しています。

**バッチの実行タイミング**：CI/CDパイプライン実行時、またはローカライゼーション更新後に手動で実行されます。

**主要な処理内容**：
1. Wikipedia/Localizationsディレクトリ配下の全.stringsファイルを検索
2. 逆ドル記号パターン（[1-9]+$）の検出
3. MediaWikiテンプレート構文（{{...}}）の検出
4. 問題が見つかった場合はエラーを報告して終了コード1を返す

**前後の処理との関連**：localizationバッチで翻訳ファイルが更新された後、本バッチで品質チェックを行います。問題が検出された場合、翻訳の修正が必要となります。CIパイプラインでは、このチェックに失敗するとビルドが中断されます。

**影響範囲**：Wikipedia/Localizations/配下の全.stringsファイルを検査対象とします。qqq.lproj（翻訳者向けドキュメント）はテンプレート構文チェックから除外されます。

## バッチ種別

開発ツール / 品質検証（Lint）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（CI/CD実行時、手動実行） |
| 実行時刻 | 不定 |
| 実行曜日 | 不定 |
| 実行日 | 不定 |
| トリガー | CI/CDパイプライン / 手動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| macOS環境 | Darwin（macOS）でのみ実行可能 |
| プロジェクト構造 | Wikipedia/Localizationsディレクトリが存在すること |
| 基本コマンド | find, xargs, grep コマンドが利用可能であること |

### 実行可否判定

- macOS以外のプラットフォームでは "Only supported on OS X" エラーで終了
- 翻訳ファイルが存在しない場合は実質的にスキップ（grepがマッチしない）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 引数は受け付けない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| Wikipedia/Localizations/**/*.strings | .stringsファイル | 全言語のローカライゼーションファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 標準出力 | テキスト | 問題のあるファイルと行の情報 |
| 終了コード | 整数 | 0: 正常、1: エラー検出 |

### 出力ファイル仕様

ファイル出力はありません。結果は標準出力と終了コードで報告されます。

## 処理フロー

### 処理シーケンス

```
1. プラットフォームチェック
   └─ Darwin（macOS）でなければエラー終了
2. 逆ドル記号チェック
   └─ Wikipedia/Localizations配下の全.stringsファイルを検索
   └─ [1-9]+$ パターンをgrep
   └─ マッチした場合: エラーメッセージ出力、exit 1
3. テンプレート構文チェック
   └─ qqq.lprojを除外して.stringsファイルを検索
   └─ {{ パターンをgrep
   └─ マッチした場合: エラーメッセージ出力、exit 1
4. 正常終了
   └─ 問題なければ暗黙的にexit 0
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{プラットフォーム == Darwin?}
    B -->|No| C[Only supported on OS X エラー]
    C --> D[exit 1]
    B -->|Yes| E[全.stringsファイル検索]
    E --> F[逆ドル記号パターン検出]
    F --> G{マッチあり?}
    G -->|Yes| H[Found files containing reversed dollar sign! エラー]
    H --> D
    G -->|No| I[qqq.lproj除外で.stringsファイル検索]
    I --> J[テンプレート構文検出]
    J --> K{マッチあり?}
    K -->|Yes| L[Found files containing templates! エラー]
    L --> D
    K -->|No| M[正常終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | データベース操作なし |

### テーブル別操作詳細

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | プラットフォームエラー | macOS以外で実行 | macOSで実行する |
| 1 | 逆ドル記号検出 | `[1-9]+$` パターン検出 | 翻訳ファイルを修正（`1$` -> `$1`） |
| 1 | テンプレート構文検出 | `{{` パターン検出 | MediaWikiテンプレートを削除・修正 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | - |
| リトライ対象エラー | - |

### 障害時対応

出力されたファイル名と行番号を確認し、該当する翻訳ファイルを手動で修正してください。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（読み取り専用） |
| コミットタイミング | - |
| ロールバック条件 | - |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数百ファイル（全言語の.stringsファイル） |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

読み取り専用処理のため、排他制御は不要です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| エラーログ | 逆ドル記号検出時 | マッチしたファイルと行、"Found files containing reversed dollar sign!" |
| エラーログ | テンプレート検出時 | マッチしたファイルと行、"Found files containing templates!" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| CI失敗 | 1回 | CI/CD通知設定による |

## 備考

- `qqq.lproj` は翻訳者向けのドキュメントロケールであり、テンプレート構文が含まれることが正常なため除外されています
- 逆ドル記号（`1$`）はiOSの文字列フォーマットでは`$1`が正しい形式です
- MediaWikiのテンプレート構文`{{...}}`はアプリでは解釈できないため、プレースホルダー等に置き換える必要があります
- このスクリプトはCI品質ゲートとして機能し、問題がある翻訳がリリースされることを防ぎます
