@@ -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;
0 commit comments