Skip to content

Instantly share code, notes, and snippets.

@wata
Last active May 15, 2025 13:08
Show Gist options
  • Save wata/9ba0bd522aeb0eec8288a707cf1dd79a to your computer and use it in GitHub Desktop.
Save wata/9ba0bd522aeb0eec8288a707cf1dd79a to your computer and use it in GitHub Desktop.
Localizable.xcstringsファイルを直接編集し、英語(ソース言語)以外の言語で英語のままの翻訳に⚠️マークを追加します
#!/bin/bash
# 使用方法のヘルプを表示する関数
show_help() {
echo "使用方法: $0 <JSONファイル>"
echo " 指定されたJSONファイルを直接編集し、英語(ソース言語)以外の言語で英語のままの翻訳に⚠️マークを追加します"
exit 1
}
# 引数チェック
if [ $# -lt 1 ]; then
show_help
fi
INPUT_FILE="$1"
# ファイルの存在確認
if [ ! -f "$INPUT_FILE" ]; then
echo "エラー: ファイル '$INPUT_FILE' が見つかりません"
exit 1
fi
# 書き込み権限の確認
if [ ! -w "$INPUT_FILE" ]; then
echo "エラー: ファイル '$INPUT_FILE' に書き込み権限がありません"
exit 1
fi
# jqがインストールされているか確認
if ! command -v jq &> /dev/null; then
echo "エラー: このスクリプトにはjqが必要です。インストールしてください。"
echo "インストール方法: apt-get install jq または brew install jq"
exit 1
fi
# ソース言語(通常は英語)を取得
SOURCE_LANG=$(jq -r '.sourceLanguage' "$INPUT_FILE")
echo "ソース言語: $SOURCE_LANG"
# 変換処理用の一時ファイル
TEMP_FILE=$(mktemp)
echo "処理中..."
# # es
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.es.stringUnit.value as $es
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $es == $source_value then
# .value.localizations.es.stringUnit.value = "⚠️" + $es
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# # fil
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.fil.stringUnit.value as $fil
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $fil == $source_value then
# .value.localizations.fil.stringUnit.value = "⚠️" + $fil
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# # fr
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.fr.stringUnit.value as $fr
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $fr == $source_value then
# .value.localizations.fr.stringUnit.value = "⚠️" + $fr
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# # hi
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.hi.stringUnit.value as $hi
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $hi == $source_value then
# .value.localizations.hi.stringUnit.value = "⚠️" + $hi
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# # ja
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.ja.stringUnit.value as $ja
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $ja == $source_value then
# .value.localizations.ja.stringUnit.value = "⚠️" + $ja
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# # ko
# jq --arg source_lang "$SOURCE_LANG" '
# .strings |= with_entries(
# .value.localizations.ko.stringUnit.value as $ko
# | .value.localizations.[$source_lang].stringUnit.value as $source_value
# | if $ko == $source_value then
# .value.localizations.ko.stringUnit.value = "⚠️" + $ko
# else
# .
# end
# )
# ' "$INPUT_FILE" > "$TEMP_FILE"
# zh-Hant-TW
jq --arg source_lang "$SOURCE_LANG" '
.strings |= with_entries(
.value.localizations["zh-Hant-TW"].stringUnit.value as $zh
| .value.localizations.[$source_lang].stringUnit.value as $source_value
| if $zh == $source_value then
.value.localizations["zh-Hant-TW"].stringUnit.value = "⚠️" + $zh
else
.
end
)
' "$INPUT_FILE" > "$TEMP_FILE"
if [ -s "$TEMP_FILE" ]; then # 一時ファイルが空でないことを確認
# 元のファイルを置き換え
cat "$TEMP_FILE" > "$INPUT_FILE"
echo "処理が完了しました。ファイル '$INPUT_FILE' を直接更新しました。"
else
echo "エラー: 処理中に問題が発生しました。ファイルは更新されていません。"
fi
# 一時ファイルを削除
rm -f "$TEMP_FILE"
#!/bin/bash
# Localizable.xcstringsファイルから警告マーク(⚠️)が先頭にある翻訳を抽出するスクリプト
# デフォルトの入力ファイルと出力ディレクトリを設定
INPUT_FILE="${1:-./Localizable.xcstrings}"
OUTPUT_DIR="${2:-./output}"
# 引数の確認
if [ ! -f "$INPUT_FILE" ]; then
echo "エラー: 入力ファイル '$INPUT_FILE' が見つかりません。"
exit 1
fi
# 出力ディレクトリの作成(存在しない場合)
mkdir -p "$OUTPUT_DIR"
# jqコマンドの確認
if ! command -v jq &> /dev/null; then
echo "エラー: jqコマンドが見つかりません。インストールしてください。"
echo "macOSの場合: brew install jq"
echo "Ubuntuの場合: sudo apt-get install jq"
exit 1
fi
# 言語ごとに警告マーク付き翻訳を抽出する関数
process_language() {
local lang="$1"
local output_file="$2"
# 言語ごとにjqのフィルタで処理
jq --arg lang "$lang" '
[.strings | to_entries[] |
select(
.value.localizations[$lang]? and
.value.localizations[$lang].stringUnit? and
.value.localizations[$lang].stringUnit.value? and
((.value.localizations[$lang].stringUnit.value | type) == "string") and
(.value.localizations[$lang].stringUnit.value | startswith("⚠️"))
) |
{term: .key, context: ""}
]' "$INPUT_FILE" > "$output_file"
}
# 全ての言語をチェック
echo "翻訳ファイルを処理中..."
# 言語コードの一覧を取得
languages=$(jq -r '.strings | to_entries[] | .value.localizations | keys[]' "$INPUT_FILE" | sort | uniq)
# 警告付き翻訳のある言語を追跡
LANG_COUNT=0
for lang in $languages; do
# 一時ファイルを作成
TEMP_FILE=$(mktemp)
# 言語を処理
process_language "$lang" "$TEMP_FILE"
# 結果に警告付き翻訳があるか確認
if [ "$(jq 'length' "$TEMP_FILE")" != "0" ]; then
# 警告付き翻訳がある場合は出力ディレクトリに保存
OUTPUT_FILE="$OUTPUT_DIR/${lang}_warnings.json"
mv "$TEMP_FILE" "$OUTPUT_FILE"
echo "警告が見つかりました: $lang - '$OUTPUT_FILE'に保存されました"
LANG_COUNT=$((LANG_COUNT + 1))
else
# 警告付き翻訳がない場合は一時ファイルを削除
rm "$TEMP_FILE"
fi
done
# 結果の表示
if [ "$LANG_COUNT" -eq 0 ]; then
echo "警告マーク(⚠️)が先頭にある翻訳は見つかりませんでした。"
else
echo "合計 $LANG_COUNT 言語で警告付き翻訳が見つかりました。"
fi
exit 0
#!/bin/bash
# 警告マーク(⚠️)で始まる翻訳エントリを削除するスクリプト
# 使用方法:
# ./remove_warning_translations.sh [ファイルパス]
if [ $# -ne 1 ]; then
echo "使用方法: $0 [Localizable.xcstrings ファイルパス]"
exit 1
fi
INPUT_FILE="$1"
# ファイルの存在確認
if [ ! -f "$INPUT_FILE" ]; then
echo "エラー: ファイル '$INPUT_FILE' が見つかりません"
exit 1
fi
# 書き込み権限の確認
if [ ! -w "$INPUT_FILE" ]; then
echo "エラー: ファイル '$INPUT_FILE' に書き込み権限がありません"
exit 1
fi
# jqがインストールされているか確認
if ! command -v jq &> /dev/null; then
echo "エラー: このスクリプトにはjqが必要です。インストールしてください。"
echo "インストール方法: apt-get install jq または brew install jq"
exit 1
fi
TEMP_FILE="$(mktemp)"
# 言語エントリのパターンを検索して変換
# jqを使用してJSONファイルを処理
jq '
walk(
if type == "object" and has("localizations") then
.localizations |= with_entries(
if (.value | type == "object") and
(.value.stringUnit | type == "object") and
(.value.stringUnit.value | type == "string") and
(.value.stringUnit.value | startswith("⚠️"))
then
empty
else
.
end
)
else
.
end
)
' "$INPUT_FILE" > "$TEMP_FILE"
if [ -s "$TEMP_FILE" ]; then # 一時ファイルが空でないことを確認
# 元のファイルを置き換え
cat "$TEMP_FILE" > "$INPUT_FILE"
echo "処理が完了しました。ファイル '$INPUT_FILE' を直接更新しました。"
else
echo "エラー: 処理中に問題が発生しました。ファイルは更新されていません。"
fi
# 一時ファイルを削除
rm -f "$TEMP_FILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment