summaryrefslogtreecommitdiffstats
path: root/lib/locale.sh
blob: 5e168abdd89c5d95b8c093993d451b2488ad9453 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Locale functions
#
# Copyright (C) 2012, 2018 Patrick McDermott
#
# This file is part of opkbuild.
#
# opkbuild 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.
#
# opkbuild 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 opkbuild.  If not, see <http://www.gnu.org/licenses/>.

_OB_DEFAULT_LOCALE='en_US'
_OB_INTERNAL_TEXT_DOMAIN="libopkbuild_${LIBOPKBUILD_SHSOVERSION}"
_OB_TEXT_DOMAIN=
_OB_LOCALE_PATH="${LOCALEDIR}/%s/LC_MESSAGES/%s.ms"

## @brief Get the current message domain
## @details \fBob_get_text_domain\fP prints the currently loaded message domain.
## @return Returns 0 on success or 125 if any arguments are given.
## @stdout Prints the name of the currently loaded message domain.
## @pure yes This function has no side effects.
ob_get_text_domain()
{
	if [ ${#} -ne 0 ]; then
		return 125
	fi

	echo "${_OB_TEXT_DOMAIN}"
	return 0
}

_ob_try_load_messages()
{
	local locale=
	local ms=

	locale="${1}"
	ms="$(printf "${_OB_LOCALE_PATH}" \
		"${locale}" "${_OB_TEXT_DOMAIN}")"

	if [ -f "${ms}" ]; then
		. "${ms}"
	else
		return 1
	fi

	return 0
}

## @brief Set and load the message domain
## @details \fBob_set_text_domain\fP() sets and loads the message domain for
##          future \fBob_get_msg\fP() calls.  A message domain is a catalog of
##          localized messages identified by message IDs.  Each application
##          should have its own message domain.  libopkbuild also has its own
##          message domain and temporarily switches to it when needed.
## @operand text_domain req The message domain to load.
## @return Returns 0 on success, 1 if the message domain cannot be loaded, or
##         125 if \fItext_domain\fP is missing.
## @stderr Prints a warning to stderr if the message domain cannot be loaded.
## @pure no This function sets an internal global variable and loads a message
##          catalog that sets numerous message variables.
ob_set_text_domain()
{
	if [ ${#} -eq 1 ]; then
		_OB_TEXT_DOMAIN="${1}"
	else
		return 125
	fi

	# Make sure LC_MESSAGES is set.
	if [ -z "${LC_MESSAGES}" ]; then
		if [ -n "${LC_ALL}" ]; then
			LC_MESSAGES="${LC_ALL}"
		elif [ -n "${LANG}" ]; then
			LC_MESSAGES="${LANG}"
		else
			LC_MESSAGES="${_OB_DEFAULT_LOCALE}"
		fi
	fi

	# TODO: Exit early if domain's messages have already been loaded.

	# Try to load the messages.
	if ! _ob_try_load_messages "${LC_MESSAGES%.*}"; then
		if ! _ob_try_load_messages "${LC_MESSAGES%_*}"; then
			if ! _ob_try_load_messages "${_OB_DEFAULT_LOCALE}"; then
				# TODO: Move this warning to the executables.
				# TODO: And use printf, since ob_warn() will be
				# internationalized.
				ob_warn 'Cannot load messages in "%s" domain.' \
					"${_OB_TEXT_DOMAIN}"
				return 1
			fi
		fi
	fi

	return 0
}

ob_set_locale_path()
{
	local format=

	if [ ${#} -eq 1 ]; then
		format="${1}"
	else
		return 125
	fi

	_OB_LOCALE_PATH="${format}"

	return 0
}

## @brief Get a message from the current message domain
## @details \fBob_get_msg\fP prints a message, identified by a message ID, from
##          the currently loaded message catalog.
## @operand msgid req The ID of the message to print
## @return Returns 0 on success or 125 if \fImsgid\fP is missing.
## @stdout Prints the requested message from the current message domain.
## @pure yes This function has no side effects.
ob_get_msg()
{
	local msgid=

	if [ ${#} -eq 1 ]; then
		msgid="${1}"
	else
		return 125
	fi

	IFS= eval echo \$\{"msg_${_OB_TEXT_DOMAIN}_${msgid}"\}

	return 0
}