POT Generator: Add support for TRANSLATORS: and NO_TRANSLATE comments
This commit is contained in:
@ -69,11 +69,16 @@ void POTGenerator::generate_pot(const String &p_file) {
|
||||
for (int i = 0; i < files.size(); i++) {
|
||||
Vector<String> msgids;
|
||||
Vector<Vector<String>> msgids_context_plural;
|
||||
|
||||
Vector<String> msgids_comment;
|
||||
Vector<String> msgids_context_plural_comment;
|
||||
|
||||
const String &file_path = files[i];
|
||||
String file_extension = file_path.get_extension();
|
||||
|
||||
if (EditorTranslationParser::get_singleton()->can_parse(file_extension)) {
|
||||
EditorTranslationParser::get_singleton()->get_parser(file_extension)->parse_file(file_path, &msgids, &msgids_context_plural);
|
||||
EditorTranslationParser::get_singleton()->get_parser(file_extension)->get_comments(&msgids_comment, &msgids_context_plural_comment);
|
||||
} else {
|
||||
ERR_PRINT("Unrecognized file extension " + file_extension + " in generate_pot()");
|
||||
return;
|
||||
@ -81,16 +86,18 @@ void POTGenerator::generate_pot(const String &p_file) {
|
||||
|
||||
for (int j = 0; j < msgids_context_plural.size(); j++) {
|
||||
const Vector<String> &entry = msgids_context_plural[j];
|
||||
_add_new_msgid(entry[0], entry[1], entry[2], file_path);
|
||||
const String &comment = (j < msgids_context_plural_comment.size()) ? msgids_context_plural_comment[j] : String();
|
||||
_add_new_msgid(entry[0], entry[1], entry[2], file_path, comment);
|
||||
}
|
||||
for (int j = 0; j < msgids.size(); j++) {
|
||||
_add_new_msgid(msgids[j], "", "", file_path);
|
||||
const String &comment = (j < msgids_comment.size()) ? msgids_comment[j] : String();
|
||||
_add_new_msgid(msgids[j], "", "", file_path, comment);
|
||||
}
|
||||
}
|
||||
|
||||
if (GLOBAL_GET("internationalization/locale/translation_add_builtin_strings_to_pot")) {
|
||||
for (const Vector<String> &extractable_msgids : get_extractable_message_list()) {
|
||||
_add_new_msgid(extractable_msgids[0], extractable_msgids[1], extractable_msgids[2], "");
|
||||
_add_new_msgid(extractable_msgids[0], extractable_msgids[1], extractable_msgids[2], "", "");
|
||||
}
|
||||
}
|
||||
|
||||
@ -136,15 +143,25 @@ void POTGenerator::_write_to_pot(const String &p_file) {
|
||||
String context = v_msgid_data[i].ctx;
|
||||
String plural = v_msgid_data[i].plural;
|
||||
const HashSet<String> &locations = v_msgid_data[i].locations;
|
||||
const HashSet<String> &comments = v_msgid_data[i].comments;
|
||||
|
||||
// Put the blank line at the start, to avoid a double at the end when closing the file.
|
||||
file->store_line("");
|
||||
|
||||
// Write comments.
|
||||
bool is_first_comment = true;
|
||||
for (const String &E : comments) {
|
||||
if (is_first_comment) {
|
||||
file->store_line("#. TRANSLATORS: " + E.replace("\n", "\n#. "));
|
||||
} else {
|
||||
file->store_line("#. " + E.replace("\n", "\n#. "));
|
||||
}
|
||||
is_first_comment = false;
|
||||
}
|
||||
|
||||
// Write file locations.
|
||||
for (const String &E : locations) {
|
||||
if (!E.is_empty()) {
|
||||
file->store_line("#: " + E.trim_prefix("res://").replace("\n", "\\n"));
|
||||
}
|
||||
file->store_line("#: " + E.trim_prefix("res://").replace("\n", "\\n"));
|
||||
}
|
||||
|
||||
// Write context.
|
||||
@ -199,7 +216,7 @@ void POTGenerator::_write_msgid(Ref<FileAccess> r_file, const String &p_id, bool
|
||||
}
|
||||
}
|
||||
|
||||
void POTGenerator::_add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location) {
|
||||
void POTGenerator::_add_new_msgid(const String &p_msgid, const String &p_context, const String &p_plural, const String &p_location, const String &p_comment) {
|
||||
// Insert new location if msgid under same context exists already.
|
||||
if (all_translation_strings.has(p_msgid)) {
|
||||
Vector<MsgidData> &v_mdata = all_translation_strings[p_msgid];
|
||||
@ -208,18 +225,27 @@ void POTGenerator::_add_new_msgid(const String &p_msgid, const String &p_context
|
||||
if (!v_mdata[i].plural.is_empty() && !p_plural.is_empty() && v_mdata[i].plural != p_plural) {
|
||||
WARN_PRINT("Redefinition of plural message (msgid_plural), under the same message (msgid) and context (msgctxt)");
|
||||
}
|
||||
v_mdata.write[i].locations.insert(p_location);
|
||||
if (!p_location.is_empty()) {
|
||||
v_mdata.write[i].locations.insert(p_location);
|
||||
}
|
||||
if (!p_comment.is_empty()) {
|
||||
v_mdata.write[i].comments.insert(p_comment);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add a new entry of msgid, context, plural and location - context and plural might be empty if the inserted msgid doesn't associated
|
||||
// context or plurals.
|
||||
// Add a new entry.
|
||||
MsgidData mdata;
|
||||
mdata.ctx = p_context;
|
||||
mdata.plural = p_plural;
|
||||
mdata.locations.insert(p_location);
|
||||
if (!p_location.is_empty()) {
|
||||
mdata.locations.insert(p_location);
|
||||
}
|
||||
if (!p_comment.is_empty()) {
|
||||
mdata.comments.insert(p_comment);
|
||||
}
|
||||
all_translation_strings[p_msgid].push_back(mdata);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user