# pro-archman # src/locale.sh # Locale functions # # Copyright (C) 2012, 2013, 2017, 2019 Patrick McDermott # # This file is part of the ProteanOS Archive Manager. # # The ProteanOS Archive Manager is free software: you can redistribute # it and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # The ProteanOS Archive Manager is distributed in the hope that it # will be useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the ProteanOS Archive Manager. If not, see # . DEFAULT_LOCALE='en_US' _try_load_locale() { local localedir="${1}" local locale="${2}" shift 2 local ms= for ms in "${localedir}/${locale}/LC_MESSAGES/${TEXTDOMAIN}.ms" \ "${localedir}/${locale}.ms"; do # POSIX on the dot utility: # "If no readable file is found, a non-interactive shell shall # abort" # So to survive an ENOENT or other error and display a more # informative error message before aborting, we need this # eval/cat command. This is more resilient against race # conditions than `[ -f "${ms}" ]` is. ms="$(cat -- "${ms}" 2>/dev/null)" || continue eval "${ms}" return 0 done return 1 } load_locale() { local localedir= # Make sure LC_MESSAGES is set. if [ "x${LC_MESSAGES+set}" != 'xset' ]; then if [ "x${LC_ALL+set}" = 'xset' ]; then LC_MESSAGES="${LC_ALL}" elif [ "x${LANG+set}" = 'xset' ]; then LC_MESSAGES="${LANG}" else LC_MESSAGES="${DEFAULT_LOCALE}" fi fi if ${in_place}; then localedir="${builddir}/locale" else localedir="${LOCALEDIR}" fi # Try to load the locale. if ! _try_load_locale "${localedir}" \ "${LC_MESSAGES%.*}"; then if ! _try_load_locale "${localedir}" \ "${LC_MESSAGES%_*}"; then if ! _try_load_locale "${localedir}" \ "${DEFAULT_LOCALE}"; then error 1 'Cannot load locale' return 1 fi fi fi return 0 } get_msg() { local msgid="${1}" shift 1 eval "printf '%s' \"\${msg_${TEXTDOMAIN}_${msgid}}\"" return 0 }