OSDN Git Service

dbb1a4a6026bf901f6e3e28aa0e5453101ea7ab3
[alterlinux/alterlinux.git] / tools / locale.sh
1 #!/usr/bin/env bash
2
3 set -e
4
5 script_path="$( cd -P "$( dirname "$(readlink -f "$0")" )" && cd .. && pwd )"
6 mode=""
7 arch=""
8 channel=""
9 locale=""
10 script=false
11
12 _help() {
13     echo "usage ${0} [options] [command]"
14     echo
15     echo "Scripts that perform locale-related processing " 
16     echo
17     echo " General command:"
18     echo "    check [name]              Determine if the locale is available"
19     echo "    show                      Shows a list of available locales"
20     echo "    get [name]                Prints the specified locale settings"
21     echo "    help                      This help message"
22     echo
23     echo " General options:"
24     echo "    -a | --arch [arch]        Specify the architecture"
25     echo "    -c | --channel            Specify the channel"
26     echo "    -s | --script             Enable script mode"
27     echo "    -h | --help               This help message"
28     echo
29     echo " Script mode usage:"
30     echo "     check                    Returns 0 if the check was successful, 1 otherwise."
31     printf '     get                      eval $(%s -s -a <arch> -c <channel> get <locale>)\n' "$(basename ${0})"
32 }
33
34 # Usage: getclm <number>
35 # 標準入力から値を受けとり、引数で指定された列を抽出します。
36 getclm() { cut -d " " -f "${1}"; }
37
38 # Message functions
39 msg_error() {
40     "${script_path}/tools/msg.sh" -s 6 -a "locale.sh" error "${1}"
41 }
42
43 gen_locale_list() {
44     if [[ -z "${arch}" ]]; then
45         msg_error "No architecture specified." 
46         exit 1
47     fi
48     if [[ ! -f "${script_path}/system/locale-${arch}" ]]; then
49         msg_error "Missing architecture ${arch}"
50         exit 1
51     fi
52     local _locale
53     for _locale in $(grep -h -v ^'#' "${script_path}/system/locale-${arch}" | grep -v ^$ | getclm 1); do 
54         localelist+=("${_locale}")
55     done
56 }
57
58 check() {
59     gen_locale_list
60     if [[ ! "${#}" = "1" ]]; then
61         _help
62         exit 1
63     fi
64     if [[ $(printf '%s\n' "${localelist[@]}" | grep -qx "${1}"; echo -n ${?} ) -eq 0 ]]; then
65         #echo "correct"
66         exit 0
67     else
68         #echo "incorrect"
69         exit 1
70     fi
71 }
72
73 show() {
74     gen_locale_list
75     if (( "${#localelist[*]}" > 0)); then
76         echo "${localelist[*]}"
77     fi
78 }
79
80 get() {
81     gen_locale_list
82     if [[ ! "${#}" = "1" ]]; then
83         _help
84         exit 1
85     fi
86
87     #-- ロケールを解析、設定 --#
88     local _get_locale_line_number _locale_config_file _locale_name_list _locale_line_number _locale_config_line
89
90     # 選択されたロケールの設定が描かれた行番号を取得
91     _locale_config_file="${script_path}/system/locale-${arch}"
92     readarray -t _locale_name_list < <(grep -h -v ^'#' "${_locale_config_file}" | grep -v ^$ | awk '{print $1}')
93     _get_locale_line_number() {
94         local _lang _count=0
95         for _lang in "${_locale_name_list[@]}"; do
96             _count=$(( _count + 1 ))
97             if [[ "${_lang}" = "${1}" ]]; then echo "${_count}"; return 0; fi
98         done
99         echo -n "failed"
100     }
101     _locale_line_number="$(_get_locale_line_number "${@}")"
102
103     # 不正なロケール名なら終了する
104     if [[ "${_locale_line_number}" = "failed" ]]; then
105         msg_error "${1} is not a valid language."
106         if [[ "${script}" = true ]]; then
107             echo "exit 1"
108         fi
109         exit 1
110     fi
111
112     # ロケール設定ファイルから該当の行を抽出
113     readarray -t _locale_config_line < <(grep -h -v ^'#' "${_locale_config_file}" | grep -v ^$ | head -n "${_locale_line_number}" | tail -n 1 | tail -n 1 | sed -e 's/  */ /g' | tr " " "\n")
114
115     # 抽出された行に書かれた設定をそれぞれの変数に代入
116     # ここで定義された変数のみがグローバル変数
117     cat << EOF
118 locale_name="${_locale_config_line[0]}"
119 locale_gen_name="${_locale_config_line[1]}"
120 locale_version="${_locale_config_line[2]}"
121 locale_time="${_locale_config_line[3]}"
122 locale_fullname="${_locale_config_line[4]}"
123 EOF
124 }
125
126 # Parse options
127 OPTS="a:c:hs"
128 OPTL="arch:,channel:,help,script"
129 if ! OPT=$(getopt -o ${OPTS} -l ${OPTL} -- "${@}"); then
130     exit 1
131 fi
132 eval set -- "${OPT}"
133 unset OPTS OPTL
134
135 while true; do
136     case "${1}" in
137         -a | --arch)
138             arch="${2}"
139             shift 2
140             ;;
141         -c | --channel)
142             channel="${2}"
143             shift 2
144             ;;
145         -s | --script)
146             script=true
147             shift 1
148             ;;
149         -h | --help)
150             _help
151             exit 0
152             ;;
153         --)
154             shift 1
155             break
156             ;;
157
158     esac
159 done
160
161 if [[ -z "${1}" ]]; then
162     _help
163     exit 1
164 else
165     mode="${1}"
166     shift 1
167 fi
168
169 case "${mode}" in
170     "check" ) check "${@}"    ;;
171     "show"  ) show          ;;
172     "get"   ) get "${@}"      ;;
173     "help"  ) _help; exit 0 ;;
174     *       ) _help; exit 1 ;;
175 esac