/* Open the directory stream; if we can't, fail. */
snprintf(filename, sizeof(filename), "languages/%s", name);
- if (!(dir = opendir(filename)))
+ if (!(dir = opendir(filename))) {
+ log_module(MAIN_LOG, LOG_ERROR, "Unable to open language directory languages/%s: %s", name, strerror(errno));
return NULL;
+ }
if (!(lang = dict_find(languages, name, NULL)))
lang = language_alloc(name);
/* Read all the translations from the directory. */
while ((dirent = readdir(dir))) {
snprintf(filename, sizeof(filename), "languages/%s/%s", name, dirent->d_name);
- if (!strcmp(dirent->d_name,"parent")) {
+ if (!strcmp(dirent->d_name, "parent")) {
continue;
} else if (!strcmp(dirent->d_name, "strings.db")) {
dict = parse_database(filename);
static void language_read_list(void)
{
+ struct stat sbuf;
struct dirent *dirent;
DIR *dir;
+ char namebuf[MAXLEN];
if (!(dir = opendir("languages")))
return;
while ((dirent = readdir(dir))) {
if (dirent->d_name[0] == '.')
continue;
-#ifdef HAVE_DIRENT_D_TYPE
- if (dirent->d_type != DT_DIR)
+ snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name);
+ if (!strcmp(dirent->d_name, "strings.db")) {
continue;
-#else
- {
- char namebuf[MAXLEN];
- struct stat sbuf;
- snprintf(namebuf, sizeof(namebuf), "languages/%s", dirent->d_name);
- if (stat(namebuf, &sbuf) < 0)
- continue;
- if (!S_ISDIR(sbuf.st_mode))
- continue;
}
-#endif
- language_alloc(dirent->d_name);
+ if (stat(namebuf, &sbuf) < 0) {
+ log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (unable to stat).", dirent->d_name);
+ continue;
+ }
+ if (!S_ISDIR(sbuf.st_mode)) {
+ log_module(MAIN_LOG, LOG_INFO, "Skipping language entry '%s' (not directory).", dirent->d_name);
+ continue;
+ }
+ if (!dict_find(languages, dirent->d_name, NULL))
+ language_alloc(dirent->d_name);
}
closedir(dir);
}
int res;
va_list ap;
- if (IsLocal(dest)) return 0;
+ if (IsLocal(dest) && !IsDummy(dest)) return 0;
va_start(ap, format);
res = vsend_message(dest->nick, src, dest->handle_info, 0, NULL, format, ap);
va_end(ap);
int res;
va_list ap;
- if (IsLocal(dest)) return 0;
+ if (IsLocal(dest) && !IsDummy(dest)) return 0;
va_start(ap, format);
res = vsend_message(dest->nick, src, dest->handle_info, msg_type, NULL, format, ap);
va_end(ap);
language_read_list();
}
-void helpfile_finalize(void)
+static void helpfile_read_languages(void)
{
dict_iterator_t it;
+ dict_t dict;
+
+ language_read_list();
for (it = dict_first(languages); it; it = iter_next(it))
language_read(iter_key(it));
+
+ /* If the user has a strings.db in their languages directory,
+ * allow that to override C language strings.
+ */
+ dict = parse_database("languages/strings.db");
+ if (dict) {
+ language_set_messages(lang_C, dict);
+ free_database(dict);
+ }
+}
+
+void helpfile_finalize(void)
+{
+ conf_register_reload(helpfile_read_languages);
reg_exit_func(language_cleanup);
}