l10n対応の漏れがないことをお手軽に確認したい
2024-11-30

9月にリリースした「CHIRITSUMO」、Analyticsによると海外からのインストールが全体の約3割を占めていました。

理由ははっきりしませんが、せっかくなので多言語対応をしてより多くの人に快適に使ってもらいたい!と思い、手始めに英語対応を実施しました。
(実際には現地の日本人ユーザーによるインストールかもしれませんが、勉強になったので良しとします🙆)

前提

CHIRITSUMOはFlutterで開発したアプリです。

多言語対応には、flutterの公式ドキュメントに記載のあるflutter_localizationsを使うことにしました。(Flutterではどうやらl10nという表現が使われることが多いようで、これまではi18nに慣れ親しんできたので、最初なんのことか分からなかったです。。)

※ インストール方法や使い方はドキュメントに詳細に載っているので今回は割愛します。

課題

開発当初はl10nを考慮していなかったため、次のように日本語が直接ハードコーディングされている箇所が多くありました。

settings_screen.dart
const Text('設定'),

↑を以下のように書き換える必要があるのですが、目検はしんどい(多分漏れる)な〜というのが課題感です。

settings_screen.dart
const Text(AppLocalizations.of(context)!.setting),

対応

このような機械的なチェックはコンピュータに任せるのが最適です。スクリプトを作成し、GitHubActionsで実行する仕組みを導入しました。

Dartで以下のスクリプトを実装しました。

extract_ja_without_comment.dart
import 'dart:io';

void main() {
  final directoryPath = './lib'; // プロジェクトのソースコードディレクトリ
  final directory = Directory(directoryPath);

  if (!directory.existsSync()) {
    print('指定されたディレクトリが存在しません: $directoryPath');
    exit(1);
  }

  // 日本語を含む行を抽出
  final hasJapanese = extractJapaneseLines(directory);

  // 日本語が検出された場合はエラー終了
  if (hasJapanese) {
    print('❌ 日本語を含むコード行が検出されました。修正してください。');
    exit(1);
  } else {
    print('✅ 日本語を含むコード行は検出されませんでした。');
  }
}

bool extractJapaneseLines(Directory directory) {
  final dartFiles = directory.listSync(recursive: true).where((file) {
    return file is File && file.path.endsWith('.dart');
  });

  final japaneseRegex = RegExp(r'[ぁ-んァ-ン一-龯]');
  final commentRegex = RegExp(r'//.*$');
  bool hasJapanese = false;

  for (final file in dartFiles) {
    final lines = (file as File).readAsLinesSync();
    for (var i = 0; i < lines.length; i++) {
      var line = lines[i];
      line = line.replaceAll(commentRegex, '').trim();

      if (japaneseRegex.hasMatch(line)) {
        hasJapanese = true;
        print('${file.path}:${i + 1}: ${lines[i]}');
      }
    }
  }

  return hasJapanese;
}

基本的にはコードを見ていただければと思いますが、ポイントを下記します。

  • コメントは日本語で記述したいので、// から始まる行の日本語は許容します。
  • エラー時には、該当ファイル名と行番号を出力するため、修正がスムーズです。
  • CIパイプラインに組み込めるよう、終了コードを設定して失敗をトリガーします。

手元で実行すると以下のようになります。

> dart extract_ja_without_comment.dart
./lib/settings/presentation/screens/settings_screen.dart:53:           child: Text('設定'),
❌ 日本語を含むコード行が検出されました。修正してください。

このスクリプトをGitHubActionsで以下のように実行すれば、OKです。

check_japanese.yml
- name: Run Japanese Check
  run: dart extract_ja_without_comment.dart

おわりに

今回の対応でアプリストアの文言も英語に対応しました。これをきっかけに、海外ユーザーがさらに増えてくれると嬉しいです。 これからも引き続き改善に取り組んでいきます💪

© 2023 yutasb