#! /usr/bin/env bash source bashlib isIn() { local key=$1; shift for value do [[ $value = "$key" ]] && return; done } cd "${0%/*}/../../" emit "Enumerating localization keys" code=$(find Classes -type f -exec grep -o 'NSLocalizedString(@"[^"]*"' {} + | sed -n 's/.*\("[^"]*"\).*/\1/p' | sort -bu) for l in Resources/*.lproj/Localizable.strings; do k=${l#*/}; k=${k%%/*} emit " - Found language: ${k%.lproj}" lang+=( "$k" ) lprojLocal+=( "$(sed -n '/\/\/[^"]*\[REMOTE\][^"]*$/!s/^\("[^"]*"\).*/\1/p' "$l" | sort -bu)" ) lprojAll+=( "$(sed -n 's/^\("[^"]*"\).*/\1/p' "$l" | sort -u)" ) done allhealthy=1 healthy=1 echo; emit "Looking for unused localization keys" for l in "${!lang[@]}"; do while read; do (( healthy )) && emit -y "Not used in code or marked '// [REMOTE]':" allhealthy=0 healthy=0 emit -y " ${lang[l]}: ${REPLY##*([[:space:]])} " done < <(comm -1 -3 <(printf '%s\n' "$code") <(printf '%s\n' "${lprojLocal[l]}")) done (( healthy )) && emit "No unused keys." healthy=1 echo; emit "Looking for missing localization keys" for l in "${!lang[@]}"; do chealthy=1 while read; do (( chealthy )) && emit -y "Used by code:" allhealthy=0 chealthy=0 healthy=0 emit -r " ${lang[l]}: ${REPLY##*([[:space:]])} " done < <(comm -2 -3 <(printf '%s\n' "$code") <(printf '%s\n' "${lprojAll[l]}")) khealthy=1 while read; do (( khealthy )) && emit -y "Present in other languages:" allhealthy=0 khealthy=0 healthy=0 emit -r " ${lang[l]}: ${REPLY##*([[:space:]])} " done < <(for ol in "${!lang[@]}"; do comm -1 -3 <(printf '%s\n' "${lprojAll[l]}") <(printf '%s\n' "${lprojAll[ol]}"); done | sort -bu) done (( healthy )) && emit "No missing keys." echo (( allhealthy )) && emit "All good." || emit -y "Some issues detected."