OSDN Git Service

[add] : Added locale.sh
[alterlinux/alterlinux.git] / tools / locale.sh
diff --git a/tools/locale.sh b/tools/locale.sh
new file mode 100755 (executable)
index 0000000..bd5810e
--- /dev/null
@@ -0,0 +1,159 @@
+#!/usr/bin/env bash
+
+set -e
+
+script_path="$( cd -P "$( dirname "$(readlink -f "$0")" )" && cd .. && pwd )"
+mode=""
+arch=""
+channel=""
+locale=""
+
+_help() {
+    echo "usage ${0} [options] [command]"
+    echo
+    echo "Scripts that perform locale-related processing " 
+    echo
+    echo " General command:"
+    echo "    check [name]       Determine if the locale is available"
+    echo "    show               Shows a list of available locales"
+    echo "    get [name]         Prints the specified locale settings"
+    echo "    help               This help message"
+    echo
+    echo " General options:"
+    echo "    -a | --arch [arch]        Specify the architecture"
+    echo "    -c | --channel            Specify the channel"
+    echo "    -h | --help               This help message"
+}
+
+# Usage: getclm <number>
+# 標準入力から値を受けとり、引数で指定された列を抽出します。
+getclm() {
+    echo "$(cat -)" | cut -d " " -f "${1}"
+}
+
+# Message functions
+msg_error() {
+    "${script_path}/tools/msg.sh" -a "locale.sh" error "${1}"
+}
+
+gen_locale_list() {
+    if [[ -z "${arch}" ]]; then
+        msg_error "No architecture specified." 
+        exit 1
+    fi
+    local _locale
+    for _locale in $(grep -h -v ^'#' "${script_path}/system/locale-${arch}" | getclm 1); do 
+        localelist+=("${_locale}")
+    done
+}
+
+check() {
+    gen_locale_list
+    if [[ ! "${#}" = "1" ]]; then
+        _help
+        exit 1
+    fi
+    if [[ $(printf '%s\n' "${localelist[@]}" | grep -qx "${1}"; echo -n ${?} ) -eq 0 ]]; then
+        echo "correct"
+    else
+        echo "incorrect"
+    fi
+}
+
+show() {
+    gen_locale_list
+    if (( "${#localelist[*]}" > 0)); then
+        echo "${localelist[*]}"
+    fi
+}
+
+get() {
+    gen_locale_list
+    if [[ ! "${#}" = "1" ]]; then
+        _help
+        exit 1
+    fi
+
+    #-- ロケールを解析、設定 --#
+    local _get_locale_line_number _locale_config_file _locale_name_list _locale_line_number _locale_config_line
+
+    # 選択されたロケールの設定が描かれた行番号を取得
+    _locale_config_file="${script_path}/system/locale-${arch}"
+    _locale_name_list=($(cat "${_locale_config_file}" | grep -h -v ^'#' | awk '{print $1}'))
+    _get_locale_line_number() {
+        local _lang _count=0
+        for _lang in ${_locale_name_list[@]}; do
+            _count=$(( _count + 1 ))
+            if [[ "${_lang}" = "${1}" ]]; then echo "${_count}"; return 0; fi
+        done
+        echo -n "failed"
+    }
+    _locale_line_number="$(_get_locale_line_number ${@})"
+
+    # 不正なロケール名なら終了する
+    if [[ "${_locale_line_number}" = "failed" ]]; then
+        msg_error "${1} is not a valid language."
+        exit 1
+    fi
+
+    # ロケール設定ファイルから該当の行を抽出
+    _locale_config_line=($(cat "${_locale_config_file}" | grep -h -v ^'#' | grep -v ^$ | head -n "${_locale_line_number}" | tail -n 1))
+
+    # 抽出された行に書かれた設定をそれぞれの変数に代入
+    # ここで定義された変数のみがグローバル変数
+    cat << EOF
+locale_name="${_locale_config_line[0]}"
+locale_gen_name="${_locale_config_line[1]}"
+locale_version="${_locale_config_line[2]}"
+locale_time="${_locale_config_line[3]}"
+locale_fullname="${_locale_config_line[4]}"
+EOF
+}
+
+# Parse options
+ARGUMENT="${@}"
+_opt_short="a:c:h"
+_opt_long="arch:,channel:,help"
+OPT=$(getopt -o ${_opt_short} -l ${_opt_long} -- ${ARGUMENT})
+[[ ${?} != 0 ]] && exit 1
+
+eval set -- "${OPT}"
+unset OPT _opt_short _opt_long
+
+while true; do
+    case ${1} in
+        -a | --arch)
+            arch="${2}"
+            shift 2
+            ;;
+        -c | --channel)
+            channel="${2}"
+            shift 2
+            ;;
+        -h | --help)
+            _help
+            exit 0
+            ;;
+        --)
+            shift 1
+            break
+            ;;
+
+    esac
+done
+
+if [[ -z "${1}" ]]; then
+    _help
+    exit 1
+else
+    mode="${1}"
+    shift 1
+fi
+
+case "${mode}" in
+    "check" ) check ${@}    ;;
+    "show"  ) show          ;;
+    "get"   ) get ${@}      ;;
+    "help"  ) _help; exit 0 ;;
+    *       ) _help; exit 1 ;;
+esac