git

Форк
0
/
gettext.c 
157 строк · 3.2 Кб
1
/*
2
 * Copyright (c) 2010 Ævar Arnfjörð Bjarmason
3
 */
4

5
#include "git-compat-util.h"
6
#include "abspath.h"
7
#include "environment.h"
8
#include "exec-cmd.h"
9
#include "gettext.h"
10
#include "utf8.h"
11

12
#ifndef NO_GETTEXT
13
#	include <libintl.h>
14
#	ifdef GIT_WINDOWS_NATIVE
15

16
static const char *locale_charset(void)
17
{
18
	const char *env = getenv("LC_ALL"), *dot;
19

20
	if (!env || !*env)
21
		env = getenv("LC_CTYPE");
22
	if (!env || !*env)
23
		env = getenv("LANG");
24

25
	if (!env)
26
		return "UTF-8";
27

28
	dot = strchr(env, '.');
29
	return !dot ? env : dot + 1;
30
}
31

32
#	elif defined HAVE_LIBCHARSET_H
33
#		include <libcharset.h>
34
#	else
35
#		include <langinfo.h>
36
#		define locale_charset() nl_langinfo(CODESET)
37
#	endif
38
#endif
39

40
static const char *charset;
41

42
/*
43
 * Guess the user's preferred languages from the value in LANGUAGE environment
44
 * variable and LC_MESSAGES locale category if NO_GETTEXT is not defined.
45
 *
46
 * The result can be a colon-separated list like "ko:ja:en".
47
 */
48
const char *get_preferred_languages(void)
49
{
50
	const char *retval;
51

52
	retval = getenv("LANGUAGE");
53
	if (retval && *retval)
54
		return retval;
55

56
#ifndef NO_GETTEXT
57
	retval = setlocale(LC_MESSAGES, NULL);
58
	if (retval && *retval &&
59
		strcmp(retval, "C") &&
60
		strcmp(retval, "POSIX"))
61
		return retval;
62
#endif
63

64
	return NULL;
65
}
66

67
#ifndef NO_GETTEXT
68
__attribute__((format (printf, 1, 2)))
69
static int test_vsnprintf(const char *fmt, ...)
70
{
71
	char buf[26];
72
	int ret;
73
	va_list ap;
74
	va_start(ap, fmt);
75
	ret = vsnprintf(buf, sizeof(buf), fmt, ap);
76
	va_end(ap);
77
	return ret;
78
}
79

80
static void init_gettext_charset(const char *domain)
81
{
82
	charset = locale_charset();
83
	bind_textdomain_codeset(domain, charset);
84

85
	/*
86
	 * Work around an old bug fixed in glibc 2.17 (released on
87
	 * 2012-12-24), at the cost of potentially making translated
88
	 * messages from external functions like perror() emitted in
89
	 * the wrong encoding.
90
	 *
91
	 * The bug affected e.g. git.git's own 7eb93c89651 ([PATCH]
92
	 * Simplify git script, 2005-09-07), which is the origin of
93
	 * the "David_K\345gedal" test string.
94
	 *
95
	 * See a much longer comment added to this file in 5e9637c6297
96
	 * (i18n: add infrastructure for translating Git with gettext,
97
	 * 2011-11-18) for more details.
98
	 */
99
	if (test_vsnprintf("%.*s", 13, "David_K\345gedal") < 0)
100
		setlocale(LC_CTYPE, "C");
101
}
102

103
int git_gettext_enabled = 0;
104

105
void git_setup_gettext(void)
106
{
107
	const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT);
108
	char *p = NULL;
109

110
	if (!podir)
111
		podir = p = system_path(GIT_LOCALE_PATH);
112

113
	if (!is_directory(podir)) {
114
		free(p);
115
		return;
116
	}
117

118
	bindtextdomain("git", podir);
119
	setlocale(LC_MESSAGES, "");
120
	setlocale(LC_TIME, "");
121
	init_gettext_charset("git");
122
	textdomain("git");
123

124
	git_gettext_enabled = 1;
125

126
	free(p);
127
}
128

129
/* return the number of columns of string 's' in current locale */
130
int gettext_width(const char *s)
131
{
132
	static int is_utf8 = -1;
133
	if (is_utf8 == -1)
134
		is_utf8 = is_utf8_locale();
135

136
	return is_utf8 ? utf8_strwidth(s) : strlen(s);
137
}
138
#endif
139

140
int is_utf8_locale(void)
141
{
142
#ifdef NO_GETTEXT
143
	if (!charset) {
144
		const char *env = getenv("LC_ALL");
145
		if (!env || !*env)
146
			env = getenv("LC_CTYPE");
147
		if (!env || !*env)
148
			env = getenv("LANG");
149
		if (!env)
150
			env = "";
151
		if (strchr(env, '.'))
152
			env = strchr(env, '.') + 1;
153
		charset = xstrdup(env);
154
	}
155
#endif
156
	return is_encoding_utf8(charset);
157
}
158

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.