Last active
May 15, 2025 13:08
-
-
Save wata/9ba0bd522aeb0eec8288a707cf1dd79a to your computer and use it in GitHub Desktop.
Localizable.xcstringsファイルを直接編集し、英語(ソース言語)以外の言語で英語のままの翻訳に⚠️ マークを追加します
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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