Skip to content

Commit ef60d6c

Browse files
Merge pull request #2492 from dastgirp/huld/split
Split HULD translations to per NPC file instead of one large file
2 parents 1e6580e + ae22cb6 commit ef60d6c

File tree

10 files changed

+343
-142
lines changed

10 files changed

+343
-142
lines changed

db/translations.conf

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131
//=========================================================================
3232

3333
translations: (
34-
//"path/to/my/Language.po",
35-
//"db/Spanish.po", //(Example)
34+
//"db/translations/Foo",
35+
// "db/Spanish", // (Example)
36+
// The .po files in the language folder should have the same directory
37+
// structure as the generating scripts:
38+
// - db/Spanish/conf/messages_conf.po
39+
// - db/Spanish/npc/MOTD_txt.po
40+
// - db/Spanish/npc/airports/airship_txt.po
41+
// - ...
3642
)

src/common/utils.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static char *checkpath(char *path, const char *srcpath)
128128
return path;
129129
}
130130

131-
void findfile(const char *p, const char *pat, void (func)(const char *))
131+
void findfile(const char *p, const char *pat, void (func)(const char *, void *context), void *context)
132132
{
133133
WIN32_FIND_DATAA FindFileData;
134134
HANDLE hFind;
@@ -155,12 +155,11 @@ void findfile(const char *p, const char *pat, void (func)(const char *))
155155
sprintf(tmppath,"%s%c%s",path,PATHSEP,FindFileData.cFileName);
156156

157157
if (strstr(FindFileData.cFileName, pattern)) {
158-
func( tmppath );
158+
func(tmppath, context);
159159
}
160160

161-
if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
162-
{
163-
findfile(tmppath, pat, func);
161+
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
162+
findfile(tmppath, pat, func, context);
164163
}
165164
}while (FindNextFileA(hFind, &FindFileData) != 0);
166165
FindClose(hFind);
@@ -190,7 +189,7 @@ static char *checkpath(char *path, const char *srcpath)
190189
return path;
191190
}
192191

193-
void findfile(const char *p, const char *pat, void (func)(const char *))
192+
void findfile(const char *p, const char *pat, void (func)(const char *, void *context), void *context)
194193
{
195194
DIR* dir; ///< pointer to the scanned directory.
196195
struct dirent* entry; ///< pointer to one directory entry.
@@ -220,7 +219,7 @@ void findfile(const char *p, const char *pat, void (func)(const char *))
220219

221220
// check if the pattern matches.
222221
if (strstr(entry->d_name, pattern)) {
223-
func( tmppath );
222+
func(tmppath, context);
224223
}
225224
// check if it is a directory.
226225
if (stat(tmppath, &dir_stat) == -1) {
@@ -230,7 +229,7 @@ void findfile(const char *p, const char *pat, void (func)(const char *))
230229
// is this a directory?
231230
if (S_ISDIR(dir_stat.st_mode)) {
232231
// decent recursively
233-
findfile(tmppath, pat, func);
232+
findfile(tmppath, pat, func, context);
234233
}
235234
}//end while
236235

src/common/utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
void WriteDump(FILE* fp, const void* buffer, size_t length);
4040
void ShowDump(const void* buffer, size_t length);
4141

42-
void findfile(const char *p, const char *pat, void (func)(const char*));
42+
void findfile(const char *p, const char *pat, void (func)(const char *, void *), void *context);
4343
bool exists(const char* filename);
4444

4545
/// calculates the value of A / B, in percent (rounded down)

src/map/script.c

Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5189,8 +5189,8 @@ static void script_load_translations(void)
51895189
size = libconfig->setting_length(translations);
51905190

51915191
for(i = 0; i < size; i++) {
5192-
const char *translation_file = libconfig->setting_get_string_elem(translations, i);
5193-
total += script->load_translation(translation_file, ++lang_id);
5192+
const char *translation_dir = libconfig->setting_get_string_elem(translations, i);
5193+
total += script->load_translation(translation_dir, ++lang_id);
51945194
}
51955195
libconfig->destroy(&translations_conf);
51965196

@@ -5227,39 +5227,39 @@ static void script_load_translations(void)
52275227
}
52285228

52295229
/**
5230-
* Generates a language name from a translation filename.
5230+
* Generates a language name from a translation directory name.
52315231
*
5232-
* @param file The filename.
5232+
* @param directory The directory name.
52335233
* @return The corresponding translation name.
52345234
*/
5235-
static const char *script_get_translation_file_name(const char *file)
5235+
static const char *script_get_translation_dir_name(const char *directory)
52365236
{
52375237
const char *basename = NULL, *last_dot = NULL;
52385238

5239-
nullpo_retr("Unknown", file);
5239+
nullpo_retr("Unknown", directory);
52405240

5241-
basename = strrchr(file, '/');;
5241+
basename = strrchr(directory, '/');
52425242
#ifdef WIN32
52435243
{
5244-
const char *basename_windows = strrchr(file, '\\');
5244+
const char *basename_windows = strrchr(directory, '\\');
52455245
if (basename_windows > basename)
52465246
basename = basename_windows;
52475247
}
52485248
#endif // WIN32
52495249
if (basename == NULL)
5250-
basename = file;
5250+
basename = directory;
52515251
else
52525252
basename++; // Skip slash
52535253
Assert_retr("Unknown", *basename != '\0');
52545254

52555255
last_dot = strrchr(basename, '.');
52565256
if (last_dot != NULL) {
5257-
static char file_name[200];
5257+
static char dir_name[200];
52585258
if (last_dot == basename)
52595259
return basename + 1;
52605260

5261-
safestrncpy(file_name, basename, last_dot - basename + 1);
5262-
return file_name;
5261+
safestrncpy(dir_name, basename, last_dot - basename + 1);
5262+
return dir_name;
52635263
}
52645264

52655265
return basename;
@@ -5340,18 +5340,19 @@ static bool script_load_translation_addstring(const char *file, uint8 lang_id, c
53405340
/**
53415341
* Parses an individual translation file.
53425342
*
5343-
* @param file The filename to parse.
5343+
* @param directory The directory structure to read.
53445344
* @param lang_id The language identifier.
53455345
* @return The amount of strings loaded.
53465346
*/
5347-
static int script_load_translation(const char *file, uint8 lang_id)
5347+
static int script_load_translation_file(const char *file, uint8 lang_id)
53485348
{
5349-
int translations = 0;
53505349
char line[1024];
5351-
char msgctxt[NAME_LENGTH*2+1] = { 0 };
5352-
FILE *fp;
5353-
int lineno = 0;
5350+
char msgctxt[NAME_LENGTH*2+1] = "";
53545351
struct script_string_buf msgid, msgstr;
5352+
struct script_string_buf *msg_ptr;
5353+
int translations = 0;
5354+
int lineno = 0;
5355+
FILE *fp;
53555356

53565357
nullpo_ret(file);
53575358

@@ -5363,46 +5364,50 @@ static int script_load_translation(const char *file, uint8 lang_id)
53635364
VECTOR_INIT(msgid);
53645365
VECTOR_INIT(msgstr);
53655366

5366-
script->add_language(script->get_translation_file_name(file));
5367-
if (lang_id >= atcommand->max_message_table)
5368-
atcommand->expand_message_table();
5369-
53705367
while (fgets(line, sizeof(line), fp) != NULL) {
53715368
int len = (int)strlen(line);
53725369
int i;
53735370
lineno++;
53745371

5375-
if(len <= 1)
5372+
if (len <= 1) {
5373+
if (VECTOR_LENGTH(msgid) > 0 && VECTOR_LENGTH(msgstr) > 0) {
5374+
// Add string
5375+
if (script->load_translation_addstring(file, lang_id, msgctxt, &msgid, &msgstr))
5376+
translations++;
5377+
5378+
msgctxt[0] = '\0';
5379+
VECTOR_TRUNCATE(msgid);
5380+
VECTOR_TRUNCATE(msgstr);
5381+
}
53765382
continue;
5383+
}
53775384

53785385
if (line[0] == '#')
53795386
continue;
53805387

5381-
if (VECTOR_LENGTH(msgid) > 0 && VECTOR_LENGTH(msgstr) > 0) {
5388+
if (VECTOR_LENGTH(msgid) > 0) {
5389+
if (VECTOR_LENGTH(msgstr) > 0) {
5390+
msg_ptr = &msgstr;
5391+
} else {
5392+
msg_ptr = &msgid;
5393+
}
53825394
if (line[0] == '"') {
53835395
// Continuation line
5384-
(void)VECTOR_POP(msgstr); // Pop final '\0'
5385-
for (i = 8; i < len - 2; i++) {
5386-
VECTOR_ENSURE(msgstr, 1, 512);
5396+
(void)VECTOR_POP(*msg_ptr); // Pop final '\0'
5397+
for (i = 1; i < len - 2; i++) {
5398+
VECTOR_ENSURE(*msg_ptr, 1, 512);
53875399
if (line[i] == '\\' && line[i+1] == '"') {
5388-
VECTOR_PUSH(msgstr, '"');
5400+
VECTOR_PUSH(*msg_ptr, '"');
53895401
i++;
53905402
} else {
5391-
VECTOR_PUSH(msgstr, line[i]);
5403+
VECTOR_PUSH(*msg_ptr, line[i]);
53925404
}
53935405
}
5394-
VECTOR_ENSURE(msgstr, 1, 512);
5395-
VECTOR_PUSH(msgstr, '\0');
5406+
VECTOR_ENSURE(*msg_ptr, 1, 512);
5407+
VECTOR_PUSH(*msg_ptr, '\0');
53965408
continue;
53975409
}
53985410

5399-
// Add string
5400-
if (script->load_translation_addstring(file, lang_id, msgctxt, &msgid, &msgstr))
5401-
translations++;
5402-
5403-
msgctxt[0] = '\0';
5404-
VECTOR_TRUNCATE(msgid);
5405-
VECTOR_TRUNCATE(msgstr);
54065411
}
54075412

54085413
if (strncasecmp(line,"msgctxt \"", 9) == 0) {
@@ -5477,10 +5482,47 @@ static int script_load_translation(const char *file, uint8 lang_id)
54775482
VECTOR_CLEAR(msgid);
54785483
VECTOR_CLEAR(msgstr);
54795484

5480-
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' translations in '"CL_WHITE"%s"CL_RESET"'.\n", translations, file);
54815485
return translations;
54825486
}
54835487

5488+
struct load_translation_data {
5489+
uint8 lang_id;
5490+
int translation_count;
5491+
};
5492+
5493+
static void script_load_translation_sub(const char *filename, void *context)
5494+
{
5495+
nullpo_retv(context);
5496+
5497+
struct load_translation_data *data = context;
5498+
5499+
data->translation_count += script->load_translation_file(filename, data->lang_id);
5500+
}
5501+
5502+
/**
5503+
* Loads a translations directory
5504+
*
5505+
* @param directory The directory structure to read.
5506+
* @param lang_id The language identifier.
5507+
* @return The amount of strings loaded.
5508+
*/
5509+
static int script_load_translation(const char *directory, uint8 lang_id)
5510+
{
5511+
struct load_translation_data data = { 0 };
5512+
data.lang_id = lang_id;
5513+
5514+
nullpo_ret(directory);
5515+
5516+
script->add_language(script->get_translation_dir_name(directory));
5517+
if (lang_id >= atcommand->max_message_table)
5518+
atcommand->expand_message_table();
5519+
5520+
findfile(directory, ".po", script_load_translation_sub, &data);
5521+
5522+
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' translations in '"CL_WHITE"%s"CL_RESET"'.\n", data.translation_count, directory);
5523+
return data.translation_count;
5524+
}
5525+
54845526
/**
54855527
*
54865528
**/
@@ -27514,12 +27556,13 @@ void script_defaults(void)
2751427556
script->string_dup = script_string_dup;
2751527557
script->load_translations = script_load_translations;
2751627558
script->load_translation_addstring = script_load_translation_addstring;
27559+
script->load_translation_file = script_load_translation_file;
2751727560
script->load_translation = script_load_translation;
2751827561
script->translation_db_destroyer = script_translation_db_destroyer;
2751927562
script->clear_translations = script_clear_translations;
2752027563
script->parse_cleanup_timer = script_parse_cleanup_timer;
2752127564
script->add_language = script_add_language;
27522-
script->get_translation_file_name = script_get_translation_file_name;
27565+
script->get_translation_dir_name = script_get_translation_dir_name;
2752327566
script->parser_clean_leftovers = script_parser_clean_leftovers;
2752427567

2752527568
script->run_use_script = script_run_use_script;

src/map/script.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,12 +1039,13 @@ struct script_interface {
10391039
int (*string_dup) (char *str);
10401040
void (*load_translations) (void);
10411041
bool (*load_translation_addstring) (const char *file, uint8 lang_id, const char *msgctxt, const struct script_string_buf *msgid, const struct script_string_buf *msgstr);
1042-
int (*load_translation) (const char *file, uint8 lang_id);
1042+
int (*load_translation_file) (const char *file, uint8 lang_id);
1043+
int (*load_translation) (const char *directory, uint8 lang_id);
10431044
int (*translation_db_destroyer) (union DBKey key, struct DBData *data, va_list ap);
10441045
void (*clear_translations) (bool reload);
10451046
int (*parse_cleanup_timer) (int tid, int64 tick, int id, intptr_t data);
10461047
uint8 (*add_language) (const char *name);
1047-
const char *(*get_translation_file_name) (const char *file);
1048+
const char *(*get_translation_dir_name) (const char *directory);
10481049
void (*parser_clean_leftovers) (void);
10491050
void (*run_use_script) (struct map_session_data *sd, struct item_data *data, int oid);
10501051
void (*run_item_equip_script) (struct map_session_data *sd, struct item_data *data, int oid);

src/plugins/HPMHooking/HPMHooking.Defs.inc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7056,8 +7056,10 @@ typedef void (*HPMHOOK_pre_script_load_translations) (void);
70567056
typedef void (*HPMHOOK_post_script_load_translations) (void);
70577057
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);
70587058
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);
7059-
typedef int (*HPMHOOK_pre_script_load_translation) (const char **file, uint8 *lang_id);
7060-
typedef int (*HPMHOOK_post_script_load_translation) (int retVal___, const char *file, uint8 lang_id);
7059+
typedef int (*HPMHOOK_pre_script_load_translation_file) (const char **file, uint8 *lang_id);
7060+
typedef int (*HPMHOOK_post_script_load_translation_file) (int retVal___, const char *file, uint8 lang_id);
7061+
typedef int (*HPMHOOK_pre_script_load_translation) (const char **directory, uint8 *lang_id);
7062+
typedef int (*HPMHOOK_post_script_load_translation) (int retVal___, const char *directory, uint8 lang_id);
70617063
typedef int (*HPMHOOK_pre_script_translation_db_destroyer) (union DBKey *key, struct DBData **data, va_list ap);
70627064
typedef int (*HPMHOOK_post_script_translation_db_destroyer) (int retVal___, union DBKey key, struct DBData *data, va_list ap);
70637065
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
70667068
typedef int (*HPMHOOK_post_script_parse_cleanup_timer) (int retVal___, int tid, int64 tick, int id, intptr_t data);
70677069
typedef uint8 (*HPMHOOK_pre_script_add_language) (const char **name);
70687070
typedef uint8 (*HPMHOOK_post_script_add_language) (uint8 retVal___, const char *name);
7069-
typedef const char* (*HPMHOOK_pre_script_get_translation_file_name) (const char **file);
7070-
typedef const char* (*HPMHOOK_post_script_get_translation_file_name) (const char* retVal___, const char *file);
7071+
typedef const char* (*HPMHOOK_pre_script_get_translation_dir_name) (const char **directory);
7072+
typedef const char* (*HPMHOOK_post_script_get_translation_dir_name) (const char* retVal___, const char *directory);
70717073
typedef void (*HPMHOOK_pre_script_parser_clean_leftovers) (void);
70727074
typedef void (*HPMHOOK_post_script_parser_clean_leftovers) (void);
70737075
typedef void (*HPMHOOK_pre_script_run_use_script) (struct map_session_data **sd, struct item_data **data, int *oid);

src/plugins/HPMHooking/HPMHooking_map.HPMHooksCore.inc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5590,6 +5590,8 @@ struct {
55905590
struct HPMHookPoint *HP_script_load_translations_post;
55915591
struct HPMHookPoint *HP_script_load_translation_addstring_pre;
55925592
struct HPMHookPoint *HP_script_load_translation_addstring_post;
5593+
struct HPMHookPoint *HP_script_load_translation_file_pre;
5594+
struct HPMHookPoint *HP_script_load_translation_file_post;
55935595
struct HPMHookPoint *HP_script_load_translation_pre;
55945596
struct HPMHookPoint *HP_script_load_translation_post;
55955597
struct HPMHookPoint *HP_script_translation_db_destroyer_pre;
@@ -5600,8 +5602,8 @@ struct {
56005602
struct HPMHookPoint *HP_script_parse_cleanup_timer_post;
56015603
struct HPMHookPoint *HP_script_add_language_pre;
56025604
struct HPMHookPoint *HP_script_add_language_post;
5603-
struct HPMHookPoint *HP_script_get_translation_file_name_pre;
5604-
struct HPMHookPoint *HP_script_get_translation_file_name_post;
5605+
struct HPMHookPoint *HP_script_get_translation_dir_name_pre;
5606+
struct HPMHookPoint *HP_script_get_translation_dir_name_post;
56055607
struct HPMHookPoint *HP_script_parser_clean_leftovers_pre;
56065608
struct HPMHookPoint *HP_script_parser_clean_leftovers_post;
56075609
struct HPMHookPoint *HP_script_run_use_script_pre;
@@ -12403,6 +12405,8 @@ struct {
1240312405
int HP_script_load_translations_post;
1240412406
int HP_script_load_translation_addstring_pre;
1240512407
int HP_script_load_translation_addstring_post;
12408+
int HP_script_load_translation_file_pre;
12409+
int HP_script_load_translation_file_post;
1240612410
int HP_script_load_translation_pre;
1240712411
int HP_script_load_translation_post;
1240812412
int HP_script_translation_db_destroyer_pre;
@@ -12413,8 +12417,8 @@ struct {
1241312417
int HP_script_parse_cleanup_timer_post;
1241412418
int HP_script_add_language_pre;
1241512419
int HP_script_add_language_post;
12416-
int HP_script_get_translation_file_name_pre;
12417-
int HP_script_get_translation_file_name_post;
12420+
int HP_script_get_translation_dir_name_pre;
12421+
int HP_script_get_translation_dir_name_post;
1241812422
int HP_script_parser_clean_leftovers_pre;
1241912423
int HP_script_parser_clean_leftovers_post;
1242012424
int HP_script_run_use_script_pre;

src/plugins/HPMHooking/HPMHooking_map.HookingPoints.inc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2861,12 +2861,13 @@ struct HookingPointData HookingPoints[] = {
28612861
{ HP_POP(script->string_dup, HP_script_string_dup) },
28622862
{ HP_POP(script->load_translations, HP_script_load_translations) },
28632863
{ HP_POP(script->load_translation_addstring, HP_script_load_translation_addstring) },
2864+
{ HP_POP(script->load_translation_file, HP_script_load_translation_file) },
28642865
{ HP_POP(script->load_translation, HP_script_load_translation) },
28652866
{ HP_POP(script->translation_db_destroyer, HP_script_translation_db_destroyer) },
28662867
{ HP_POP(script->clear_translations, HP_script_clear_translations) },
28672868
{ HP_POP(script->parse_cleanup_timer, HP_script_parse_cleanup_timer) },
28682869
{ HP_POP(script->add_language, HP_script_add_language) },
2869-
{ HP_POP(script->get_translation_file_name, HP_script_get_translation_file_name) },
2870+
{ HP_POP(script->get_translation_dir_name, HP_script_get_translation_dir_name) },
28702871
{ HP_POP(script->parser_clean_leftovers, HP_script_parser_clean_leftovers) },
28712872
{ HP_POP(script->run_use_script, HP_script_run_use_script) },
28722873
{ HP_POP(script->run_item_equip_script, HP_script_run_item_equip_script) },

0 commit comments

Comments
 (0)