Browse Source

Fix loading PO files with missing newline after last msgstr

Fixes #20375.
Rémi Verschelde 7 years ago
parent
commit
12d69ef53e
1 changed files with 21 additions and 19 deletions
  1. 21 19
      core/io/translation_loader_po.cpp

+ 21 - 19
core/io/translation_loader_po.cpp

@@ -54,32 +54,25 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
 	int line = 1;
 	int line = 1;
 	bool skip_this = false;
 	bool skip_this = false;
 	bool skip_next = false;
 	bool skip_next = false;
+	bool is_eof = false;
 
 
-	while (true) {
+	while (!is_eof) {
 
 
-		String l = f->get_line();
+		String l = f->get_line().strip_edges();
+		is_eof = f->eof_reached();
 
 
-		if (f->eof_reached()) {
+		// If we reached last line and it's not a content line, break, otherwise let processing that last loop
+		if (is_eof && l.empty()) {
 
 
-			if (status == STATUS_READING_STRING) {
-
-				if (msg_id != "") {
-					if (!skip_this)
-						translation->add_message(msg_id, msg_str);
-				} else if (config == "")
-					config = msg_str;
-				break;
-
-			} else if (status == STATUS_NONE)
+			if (status == STATUS_READING_ID) {
+				memdelete(f);
+				ERR_EXPLAIN(p_path + ":" + itos(line) + " Unexpected EOF while reading 'msgid' at file: ");
+				ERR_FAIL_V(RES());
+			} else {
 				break;
 				break;
-
-			memdelete(f);
-			ERR_EXPLAIN(p_path + ":" + itos(line) + " Unexpected EOF while reading 'msgid' at file: ");
-			ERR_FAIL_V(RES());
+			}
 		}
 		}
 
 
-		l = l.strip_edges();
-
 		if (l.begins_with("msgid")) {
 		if (l.begins_with("msgid")) {
 
 
 			if (status == STATUS_READING_ID) {
 			if (status == STATUS_READING_ID) {
@@ -160,6 +153,15 @@ RES TranslationLoaderPO::load_translation(FileAccess *f, Error *r_error, const S
 	f->close();
 	f->close();
 	memdelete(f);
 	memdelete(f);
 
 
+	if (status == STATUS_READING_STRING) {
+
+		if (msg_id != "") {
+			if (!skip_this)
+				translation->add_message(msg_id, msg_str);
+		} else if (config == "")
+			config = msg_str;
+	}
+
 	if (config == "") {
 	if (config == "") {
 		ERR_EXPLAIN("No config found in file: " + p_path);
 		ERR_EXPLAIN("No config found in file: " + p_path);
 		ERR_FAIL_V(RES());
 		ERR_FAIL_V(RES());