summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorHaru <haru@dotalux.com>2019-10-18 13:29:03 +0200
committerGitHub <noreply@github.com>2019-10-18 13:29:03 +0200
commitef60d6c53db89a6a932618895acf4ee194b3f2e3 (patch)
tree5683ad48dd74af701b463a5aeaad7b7f58f95705 /src/plugins
parent1e6580e56850adb241261c33bffca60f934294fb (diff)
parentae22cb6f20091e290cf6c30c049400535d6f1aca (diff)
downloadhercules-ef60d6c53db89a6a932618895acf4ee194b3f2e3.tar.gz
hercules-ef60d6c53db89a6a932618895acf4ee194b3f2e3.tar.bz2
hercules-ef60d6c53db89a6a932618895acf4ee194b3f2e3.tar.xz
hercules-ef60d6c53db89a6a932618895acf4ee194b3f2e3.zip
Merge pull request #2492 from dastgirp/huld/split
Split HULD translations to per NPC file instead of one large file
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/HPMHooking/HPMHooking.Defs.inc10
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc12
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc3
-rw-r--r--src/plugins/HPMHooking/HPMHooking_map.Hooks.inc63
-rw-r--r--src/plugins/generate-translations.c242
5 files changed, 241 insertions, 89 deletions
diff --git a/src/plugins/HPMHooking/HPMHooking.Defs.inc b/src/plugins/HPMHooking/HPMHooking.Defs.inc
index 61de7bbc6..b207e52ba 100644
--- a/src/plugins/HPMHooking/HPMHooking.Defs.inc
+++ b/src/plugins/HPMHooking/HPMHooking.Defs.inc
@@ -7056,8 +7056,10 @@ typedef void (*HPMHOOK_pre_script_load_translations) (void);
typedef void (*HPMHOOK_post_script_load_translations) (void);
typedef bool (*HPMHOOK_pre_script_load_translation_addstring) (const char **file, uint8 *lang_id, const char **msgctxt, const struct script_string_buf **msgid, const struct script_string_buf **msgstr);
typedef bool (*HPMHOOK_post_script_load_translation_addstring) (bool retVal___, const char *file, uint8 lang_id, const char *msgctxt, const struct script_string_buf *msgid, const struct script_string_buf *msgstr);
-typedef int (*HPMHOOK_pre_script_load_translation) (const char **file, uint8 *lang_id);
-typedef int (*HPMHOOK_post_script_load_translation) (int retVal___, const char *file, uint8 lang_id);
+typedef int (*HPMHOOK_pre_script_load_translation_file) (const char **file, uint8 *lang_id);
+typedef int (*HPMHOOK_post_script_load_translation_file) (int retVal___, const char *file, uint8 lang_id);
+typedef int (*HPMHOOK_pre_script_load_translation) (const char **directory, uint8 *lang_id);
+typedef int (*HPMHOOK_post_script_load_translation) (int retVal___, const char *directory, uint8 lang_id);
typedef int (*HPMHOOK_pre_script_translation_db_destroyer) (union DBKey *key, struct DBData **data, va_list ap);
typedef int (*HPMHOOK_post_script_translation_db_destroyer) (int retVal___, union DBKey key, struct DBData *data, va_list ap);
typedef void (*HPMHOOK_pre_script_clear_translations) (bool *reload);
@@ -7066,8 +7068,8 @@ typedef int (*HPMHOOK_pre_script_parse_cleanup_timer) (int *tid, int64 *tick, in
typedef int (*HPMHOOK_post_script_parse_cleanup_timer) (int retVal___, int tid, int64 tick, int id, intptr_t data);
typedef uint8 (*HPMHOOK_pre_script_add_language) (const char **name);
typedef uint8 (*HPMHOOK_post_script_add_language) (uint8 retVal___, const char *name);
-typedef const char* (*HPMHOOK_pre_script_get_translation_file_name) (const char **file);
-typedef const char* (*HPMHOOK_post_script_get_translation_file_name) (const char* retVal___, const char *file);
+typedef const char* (*HPMHOOK_pre_script_get_translation_dir_name) (const char **directory);
+typedef const char* (*HPMHOOK_post_script_get_translation_dir_name) (const char* retVal___, const char *directory);
typedef void (*HPMHOOK_pre_script_parser_clean_leftovers) (void);
typedef void (*HPMHOOK_post_script_parser_clean_leftovers) (void);
typedef void (*HPMHOOK_pre_script_run_use_script) (struct map_session_data **sd, struct item_data **data, int *oid);
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
index 0b3e9b923..6b3cee6b5 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc
@@ -5590,6 +5590,8 @@ struct {
struct HPMHookPoint *HP_script_load_translations_post;
struct HPMHookPoint *HP_script_load_translation_addstring_pre;
struct HPMHookPoint *HP_script_load_translation_addstring_post;
+ struct HPMHookPoint *HP_script_load_translation_file_pre;
+ struct HPMHookPoint *HP_script_load_translation_file_post;
struct HPMHookPoint *HP_script_load_translation_pre;
struct HPMHookPoint *HP_script_load_translation_post;
struct HPMHookPoint *HP_script_translation_db_destroyer_pre;
@@ -5600,8 +5602,8 @@ struct {
struct HPMHookPoint *HP_script_parse_cleanup_timer_post;
struct HPMHookPoint *HP_script_add_language_pre;
struct HPMHookPoint *HP_script_add_language_post;
- struct HPMHookPoint *HP_script_get_translation_file_name_pre;
- struct HPMHookPoint *HP_script_get_translation_file_name_post;
+ struct HPMHookPoint *HP_script_get_translation_dir_name_pre;
+ struct HPMHookPoint *HP_script_get_translation_dir_name_post;
struct HPMHookPoint *HP_script_parser_clean_leftovers_pre;
struct HPMHookPoint *HP_script_parser_clean_leftovers_post;
struct HPMHookPoint *HP_script_run_use_script_pre;
@@ -12403,6 +12405,8 @@ struct {
int HP_script_load_translations_post;
int HP_script_load_translation_addstring_pre;
int HP_script_load_translation_addstring_post;
+ int HP_script_load_translation_file_pre;
+ int HP_script_load_translation_file_post;
int HP_script_load_translation_pre;
int HP_script_load_translation_post;
int HP_script_translation_db_destroyer_pre;
@@ -12413,8 +12417,8 @@ struct {
int HP_script_parse_cleanup_timer_post;
int HP_script_add_language_pre;
int HP_script_add_language_post;
- int HP_script_get_translation_file_name_pre;
- int HP_script_get_translation_file_name_post;
+ int HP_script_get_translation_dir_name_pre;
+ int HP_script_get_translation_dir_name_post;
int HP_script_parser_clean_leftovers_pre;
int HP_script_parser_clean_leftovers_post;
int HP_script_run_use_script_pre;
diff --git a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
index c6e887d08..ad9e7e123 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc
@@ -2861,12 +2861,13 @@ struct HookingPointData HookingPoints[] = {
{ HP_POP(script->string_dup, HP_script_string_dup) },
{ HP_POP(script->load_translations, HP_script_load_translations) },
{ HP_POP(script->load_translation_addstring, HP_script_load_translation_addstring) },
+ { HP_POP(script->load_translation_file, HP_script_load_translation_file) },
{ HP_POP(script->load_translation, HP_script_load_translation) },
{ HP_POP(script->translation_db_destroyer, HP_script_translation_db_destroyer) },
{ HP_POP(script->clear_translations, HP_script_clear_translations) },
{ HP_POP(script->parse_cleanup_timer, HP_script_parse_cleanup_timer) },
{ HP_POP(script->add_language, HP_script_add_language) },
- { HP_POP(script->get_translation_file_name, HP_script_get_translation_file_name) },
+ { HP_POP(script->get_translation_dir_name, HP_script_get_translation_dir_name) },
{ HP_POP(script->parser_clean_leftovers, HP_script_parser_clean_leftovers) },
{ HP_POP(script->run_use_script, HP_script_run_use_script) },
{ HP_POP(script->run_item_equip_script, HP_script_run_item_equip_script) },
diff --git a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
index daa1b9d7a..6dd6cb34f 100644
--- a/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
+++ b/src/plugins/HPMHooking/HPMHooking_map.Hooks.inc
@@ -74589,15 +74589,42 @@ bool HP_script_load_translation_addstring(const char *file, uint8 lang_id, const
}
return retVal___;
}
-int HP_script_load_translation(const char *file, uint8 lang_id) {
+int HP_script_load_translation_file(const char *file, uint8 lang_id) {
int hIndex = 0;
int retVal___ = 0;
- if (HPMHooks.count.HP_script_load_translation_pre > 0) {
+ if (HPMHooks.count.HP_script_load_translation_file_pre > 0) {
int (*preHookFunc) (const char **file, uint8 *lang_id);
*HPMforce_return = false;
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_file_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_script_load_translation_file_pre[hIndex].func;
+ retVal___ = preHookFunc(&file, &lang_id);
+ }
+ if (*HPMforce_return) {
+ *HPMforce_return = false;
+ return retVal___;
+ }
+ }
+ {
+ retVal___ = HPMHooks.source.script.load_translation_file(file, lang_id);
+ }
+ if (HPMHooks.count.HP_script_load_translation_file_post > 0) {
+ int (*postHookFunc) (int retVal___, const char *file, uint8 lang_id);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_file_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_script_load_translation_file_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, file, lang_id);
+ }
+ }
+ return retVal___;
+}
+int HP_script_load_translation(const char *directory, uint8 lang_id) {
+ int hIndex = 0;
+ int retVal___ = 0;
+ if (HPMHooks.count.HP_script_load_translation_pre > 0) {
+ int (*preHookFunc) (const char **directory, uint8 *lang_id);
+ *HPMforce_return = false;
for (hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_pre; hIndex++) {
preHookFunc = HPMHooks.list.HP_script_load_translation_pre[hIndex].func;
- retVal___ = preHookFunc(&file, &lang_id);
+ retVal___ = preHookFunc(&directory, &lang_id);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -74605,13 +74632,13 @@ int HP_script_load_translation(const char *file, uint8 lang_id) {
}
}
{
- retVal___ = HPMHooks.source.script.load_translation(file, lang_id);
+ retVal___ = HPMHooks.source.script.load_translation(directory, lang_id);
}
if (HPMHooks.count.HP_script_load_translation_post > 0) {
- int (*postHookFunc) (int retVal___, const char *file, uint8 lang_id);
+ int (*postHookFunc) (int retVal___, const char *directory, uint8 lang_id);
for (hIndex = 0; hIndex < HPMHooks.count.HP_script_load_translation_post; hIndex++) {
postHookFunc = HPMHooks.list.HP_script_load_translation_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, file, lang_id);
+ retVal___ = postHookFunc(retVal___, directory, lang_id);
}
}
return retVal___;
@@ -74729,15 +74756,15 @@ uint8 HP_script_add_language(const char *name) {
}
return retVal___;
}
-const char* HP_script_get_translation_file_name(const char *file) {
+const char* HP_script_get_translation_dir_name(const char *directory) {
int hIndex = 0;
const char* retVal___ = NULL;
- if (HPMHooks.count.HP_script_get_translation_file_name_pre > 0) {
- const char* (*preHookFunc) (const char **file);
+ if (HPMHooks.count.HP_script_get_translation_dir_name_pre > 0) {
+ const char* (*preHookFunc) (const char **directory);
*HPMforce_return = false;
- for (hIndex = 0; hIndex < HPMHooks.count.HP_script_get_translation_file_name_pre; hIndex++) {
- preHookFunc = HPMHooks.list.HP_script_get_translation_file_name_pre[hIndex].func;
- retVal___ = preHookFunc(&file);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_get_translation_dir_name_pre; hIndex++) {
+ preHookFunc = HPMHooks.list.HP_script_get_translation_dir_name_pre[hIndex].func;
+ retVal___ = preHookFunc(&directory);
}
if (*HPMforce_return) {
*HPMforce_return = false;
@@ -74745,13 +74772,13 @@ const char* HP_script_get_translation_file_name(const char *file) {
}
}
{
- retVal___ = HPMHooks.source.script.get_translation_file_name(file);
+ retVal___ = HPMHooks.source.script.get_translation_dir_name(directory);
}
- if (HPMHooks.count.HP_script_get_translation_file_name_post > 0) {
- const char* (*postHookFunc) (const char* retVal___, const char *file);
- for (hIndex = 0; hIndex < HPMHooks.count.HP_script_get_translation_file_name_post; hIndex++) {
- postHookFunc = HPMHooks.list.HP_script_get_translation_file_name_post[hIndex].func;
- retVal___ = postHookFunc(retVal___, file);
+ if (HPMHooks.count.HP_script_get_translation_dir_name_post > 0) {
+ const char* (*postHookFunc) (const char* retVal___, const char *directory);
+ for (hIndex = 0; hIndex < HPMHooks.count.HP_script_get_translation_dir_name_post; hIndex++) {
+ postHookFunc = HPMHooks.list.HP_script_get_translation_dir_name_post[hIndex].func;
+ retVal___ = postHookFunc(retVal___, directory);
}
}
return retVal___;
diff --git a/src/plugins/generate-translations.c b/src/plugins/generate-translations.c
index 759e788a2..14a3c0a4d 100644
--- a/src/plugins/generate-translations.c
+++ b/src/plugins/generate-translations.c
@@ -22,11 +22,13 @@
#include "common/hercules.h"
#include "common/cbasetypes.h"
#include "common/memmgr.h"
+#include "common/nullpo.h"
#include "common/showmsg.h"
#include "common/strlib.h"
#include "common/sysinfo.h"
#include "map/atcommand.h"
#include "map/map.h"
+#include "map/npc.h"
#include "map/script.h"
#include "plugins/HPMHooking.h"
@@ -34,6 +36,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include <sys/stat.h>
+#include <time.h>
HPExport struct hplugin_info pinfo = {
"generate-translations", // Plugin name
@@ -45,14 +49,33 @@ HPExport struct hplugin_info pinfo = {
struct DBMap *translatable_strings; // string map parsed (used when exporting strings only)
/* Set during startup when attempting to export the lang, unset after server initialization is over */
FILE *lang_export_fp;
-char *lang_export_file;/* for lang_export_fp */
+char *lang_export_filepath;
+#define DIRECTORYNAME "generated_translations"
struct script_string_buf lang_export_line_buf;
struct script_string_buf lang_export_escaped_buf;
-int lang_export_stringcount;
+int lang_export_stringcount_total;
+int lang_export_stringcount_current;
/// Whether the translations template generator will automatically run.
bool generating_translations = false;
+bool createdirectory(const char *dirname)
+{
+#ifdef WIN32
+ if (!CreateDirectory(dirname, NULL)) {
+ if (ERROR_ALREADY_EXISTS != GetLastError())
+ return false;
+ }
+#else /* Not WIN32 */
+ struct stat st = { 0 };
+ if (stat(dirname, &st) == -1 ) {
+ if (mkdir(dirname, 0755) != 0)
+ return false;
+ }
+#endif // WIN32 check
+ return true;
+}
+
/**
* --generate-translations
*
@@ -61,49 +84,9 @@ bool generating_translations = false;
*/
CMDLINEARG(generatetranslations)
{
- lang_export_file = aStrdup("./generated_translations.pot");
-
- if ((lang_export_fp = fopen(lang_export_file, "wb")) == NULL) {
- ShowError("export-dialog: failed to open '%s' for writing\n", lang_export_file);
- } else {
- time_t t = time(NULL);
- struct tm *lt = localtime(&t);
- int year = lt->tm_year+1900;
- char timestring[128] = "";
- strftime(timestring, sizeof(timestring), "%Y-%m-%d %H:%M:%S%z", lt);
- fprintf(lang_export_fp,
- "# This file is part of Hercules.\n"
- "# http://herc.ws - http://github.com/HerculesWS/Hercules\n"
- "#\n"
- "# Copyright (C) 2013-%d Hercules Dev Team\n"
- "#\n"
- "# Hercules is free software: you can redistribute it and/or modify\n"
- "# it under the terms of the GNU General Public License as published by\n"
- "# the Free Software Foundation, either version 3 of the License, or\n"
- "# (at your option) any later version.\n"
- "#\n"
- "# This program is distributed in the hope that it will be useful,\n"
- "# but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
- "# GNU General Public License for more details.\n"
- "#\n"
- "# You should have received a copy of the GNU General Public License\n"
- "# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
-
- "#,fuzzy\n"
- "msgid \"\"\n"
- "msgstr \"\"\n"
- "\"Project-Id-Version: %s\\n\"\n"
- "\"Report-Msgid-Bugs-To: dev@herc.ws\\n\"\n"
- "\"POT-Creation-Date: %s\\n\"\n"
- "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n"
- "\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n"
- "\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n"
- "\"Language: \\n\"\n"
- "\"MIME-Version: 1.0\\n\"\n"
- "\"Content-Type: text/plain; charset=ISO-8859-1\\n\"\n"
- "\"Content-Transfer-Encoding: 8bit\\n\"\n\n",
- year, sysinfo->vcsrevision_scripts(), timestring);
+ if (!createdirectory(DIRECTORYNAME)) {
+ ShowError("generatetranslations: Unable to create output directory '%s'.\n", DIRECTORYNAME);
+ return false;
}
generating_translations = true;
return true;
@@ -188,7 +171,8 @@ void script_add_translatable_string_posthook(const struct script_string_buf *str
script->parser_current_npc_name ? script->parser_current_npc_name : "Unknown NPC",
VECTOR_DATA(lang_export_escaped_buf)
);
- lang_export_stringcount++;
+ lang_export_stringcount_total++;
+ lang_export_stringcount_current++;
VECTOR_TRUNCATE(lang_export_line_buf);
VECTOR_TRUNCATE(lang_export_escaped_buf);
}
@@ -214,44 +198,184 @@ void script_parser_clean_leftovers_posthook(void)
VECTOR_CLEAR(lang_export_escaped_buf);
}
+bool translations_enter_file(const char *filepath)
+{
+ const char *p = NULL;
+ int len, i;
+
+ if (!generating_translations)
+ return false;
+
+ p = filepath;
+ len = (int)strlen(filepath) + (int)strlen(DIRECTORYNAME) + (int)strlen(PATHSEP_STR);
+ lang_export_filepath = aCalloc(len + 4 + 1, sizeof(char)); // + ".pot"
+ strncat(lang_export_filepath, DIRECTORYNAME PATHSEP_STR, len);
+ lang_export_stringcount_current = 0;
+
+ i = (int)strlen(lang_export_filepath);
+ while (*p != '\0') {
+ if (Assert_chk(i < len)) {
+ aFree(lang_export_filepath);
+ lang_export_filepath = NULL;
+ return false;
+ }
+ if (*p == '.') {
+ lang_export_filepath[i] = '_';
+ } else if (*p == PATHSEP) {
+ if (!createdirectory(lang_export_filepath)) {
+ ShowError("generatetranslations: Unable to create output directory '%s'.\n", lang_export_filepath);
+ aFree(lang_export_filepath);
+ lang_export_filepath = NULL;
+ return false;
+ }
+ lang_export_filepath[i] = PATHSEP;
+ } else {
+ lang_export_filepath[i] = *p;
+ }
+ i++;
+ p++;
+ }
+ strncat(lang_export_filepath, ".pot", len + 4);
+
+ if ((lang_export_fp = fopen(lang_export_filepath, "wb")) == NULL) {
+ ShowError("export-dialog: failed to open '%s' for writing\n", lang_export_filepath);
+ aFree(lang_export_filepath);
+ lang_export_filepath = NULL;
+ return false;
+ }
+
+ {
+ time_t t = time(NULL);
+ struct tm *lt = localtime(&t);
+ int year = lt->tm_year+1900;
+ char timestring[128] = "";
+ strftime(timestring, sizeof(timestring), "%Y-%m-%d %H:%M:%S%z", lt);
+ fprintf(lang_export_fp,
+ "# This file is part of Hercules.\n"
+ "# http://herc.ws - http://github.com/HerculesWS/Hercules\n"
+ "#\n"
+ "# Copyright (C) 2013-%d Hercules Dev Team\n"
+ "#\n"
+ "# Hercules is free software: you can redistribute it and/or modify\n"
+ "# it under the terms of the GNU General Public License as published by\n"
+ "# the Free Software Foundation, either version 3 of the License, or\n"
+ "# (at your option) any later version.\n"
+ "#\n"
+ "# This program is distributed in the hope that it will be useful,\n"
+ "# but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ "# GNU General Public License for more details.\n"
+ "#\n"
+ "# You should have received a copy of the GNU General Public License\n"
+ "# along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n"
+
+ "#,fuzzy\n"
+ "msgid \"\"\n"
+ "msgstr \"\"\n"
+ "\"Project-Id-Version: %s\\n\"\n"
+ "\"Report-Msgid-Bugs-To: dev@herc.ws\\n\"\n"
+ "\"POT-Creation-Date: %s\\n\"\n"
+ "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n"
+ "\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n"
+ "\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n"
+ "\"Language: \\n\"\n"
+ "\"MIME-Version: 1.0\\n\"\n"
+ "\"Content-Type: text/plain; charset=ISO-8859-1\\n\"\n"
+ "\"Content-Transfer-Encoding: 8bit\\n\"\n\n",
+ year, sysinfo->vcsrevision_scripts(), timestring);
+ }
+ return true;
+}
+
+bool translations_leave_file(const char *filepath)
+{
+ if (lang_export_fp != NULL) {
+ fclose(lang_export_fp);
+ lang_export_fp = NULL;
+ }
+ if (lang_export_filepath != NULL) {
+ if (lang_export_stringcount_current == 0) {
+ remove(lang_export_filepath);
+ } else {
+ ShowMessage("\r");
+ ShowInfo("%s => %s (%d strings)\n", filepath, lang_export_filepath, lang_export_stringcount_current);
+ }
+ aFree(lang_export_filepath);
+ lang_export_filepath = NULL;
+ }
+ lang_export_stringcount_current = 0;
+ return true;
+}
+
+bool msg_config_read_prehook(const char **cfg_name, bool *allow_override)
+{
+ if (*allow_override) // allow_override is true in nested calls
+ return false;
+
+ translations_enter_file(*cfg_name);
+ return true;
+}
+
bool msg_config_read_posthook(bool retVal, const char *cfg_name, bool allow_override)
{
- static int called = 1;
+ int i;
if (!generating_translations || lang_export_fp == NULL)
return retVal;
- if (!retVal)
+ if (allow_override) // allow_override is true in nested calls
return retVal;
- if (++called == 1) { // Original
- int i;
+ if (retVal) {
for (i = 0; i < MAX_MSG; i++) {
if (atcommand->msg_table[0][i] == NULL)
continue;
- fprintf(lang_export_fp, "msgctxt \"messages.conf\"\n"
+ fprintf(lang_export_fp, "\n#: conf/messages.conf\n"
+ "# %d: %s\n"
+ "#, c-format\n"
+ "msgctxt \"messages.conf\"\n"
"msgid \"%s\"\n"
"msgstr \"\"\n",
+ i, atcommand->msg_table[0][i],
atcommand->msg_table[0][i]
);
- lang_export_stringcount++;
+ lang_export_stringcount_total++;
+ lang_export_stringcount_current++;
}
}
+ translations_leave_file(cfg_name);
+
+ return retVal;
+}
+
+int npc_parsesrcfile_prehook(const char **filepath, bool *runOnInit)
+{
+ translations_enter_file(*filepath);
+ return 0;
+}
+
+int npc_parsesrcfile_posthook(int retVal, const char *filepath, bool runOnInit)
+{
+ translations_leave_file(filepath);
return retVal;
}
HPExport void server_preinit(void)
{
addArg("--generate-translations", false, generatetranslations,
- "Creates './generated_translations.pot' file with all translateable strings from scripts, server terminates afterwards.");
+ "Creates 'generated_translations/**/*.pot' file with all translateable strings from scripts, server terminates afterwards.");
VECTOR_INIT(lang_export_line_buf);
VECTOR_INIT(lang_export_escaped_buf);
addHookPost(script, add_translatable_string, script_add_translatable_string_posthook);
addHookPre(script, parse, parse_script_prehook);
addHookPost(script, parser_clean_leftovers, script_parser_clean_leftovers_posthook);
+ addHookPre(atcommand, msg_read, msg_config_read_prehook);
addHookPost(atcommand, msg_read, msg_config_read_posthook);
- lang_export_stringcount = 0;
+ addHookPre(npc, parsesrcfile, npc_parsesrcfile_prehook);
+ addHookPost(npc, parsesrcfile, npc_parsesrcfile_posthook);
+ lang_export_stringcount_total = 0;
+ lang_export_stringcount_current = 0;
}
HPExport void plugin_init(void)
@@ -260,18 +384,12 @@ HPExport void plugin_init(void)
HPExport void server_online(void)
{
- if (generating_translations && lang_export_fp != NULL) {
- ShowInfo("Translations template exported to '%s' with %d strings.\n", lang_export_file, lang_export_stringcount);
- fclose(lang_export_fp);
- lang_export_fp = NULL;
+ if (generating_translations) {
+ ShowInfo("Translations template exported to '%s' with %d strings.\n", DIRECTORYNAME, lang_export_stringcount_total);
}
core->runflag = CORE_ST_STOP;
}
HPExport void plugin_final(void)
{
- if (lang_export_file != NULL) {
- aFree(lang_export_file);
- lang_export_file = NULL;
- }
}