Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport translator comment PR to 3.2 #41859

Merged
merged 1 commit into from
Sep 7, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 127 additions & 7 deletions editor/translations/extract.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/python
#!/usr/bin/env python3

import fnmatch
import os
Expand Down Expand Up @@ -46,22 +46,138 @@
msgstr ""
"Project-Id-Version: Godot Engine editor\\n"
"Content-Type: text/plain; charset=UTF-8\\n"
"Content-Transfer-Encoding: 8-bit\\n"
"Content-Transfer-Encoding: 8-bit\\n"\n
"""


def _write_translator_comment(msg, translator_comment):
if translator_comment == "":
return

global main_po
msg_pos = main_po.find('\nmsgid "' + msg + '"')

# If it's a new message, just append comment to the end of PO file.
if msg_pos == -1:
main_po += _format_translator_comment(translator_comment, True)
return

# Find position just before location. Translator comment will be added there.
translator_comment_pos = main_po.rfind("\n\n#", 0, msg_pos) + 2
if translator_comment_pos - 2 == -1:
print("translator_comment_pos not found")
return

# Check if a previous translator comment already exists. If so, merge them together.
if main_po.find("TRANSLATORS:", translator_comment_pos, msg_pos) != -1:
translator_comment_pos = main_po.find("\n#:", translator_comment_pos, msg_pos) + 1
if translator_comment_pos == 0:
print('translator_comment_pos after "TRANSLATORS:" not found')
return
main_po = (
main_po[:translator_comment_pos]
+ _format_translator_comment(translator_comment, False)
+ main_po[translator_comment_pos:]
)
return

main_po = (
main_po[:translator_comment_pos]
+ _format_translator_comment(translator_comment, True)
+ main_po[translator_comment_pos:]
)


def _format_translator_comment(comment, new):
if not comment:
return ""

comment_lines = comment.split("\n")

formatted_comment = ""
if not new:
for comment in comment_lines:
formatted_comment += "#. " + comment.strip() + "\n"
return formatted_comment

formatted_comment = "#. TRANSLATORS: "
for i in range(len(comment_lines)):
if i == 0:
formatted_comment += comment_lines[i].strip() + "\n"
else:
formatted_comment += "#. " + comment_lines[i].strip() + "\n"
return formatted_comment


def _is_block_translator_comment(translator_line):
line = translator_line.strip()
if line.find("//") == 0:
return False
else:
return True


def _extract_translator_comment(line, is_block_translator_comment):
line = line.strip()
reached_end = False
extracted_comment = ""

start = line.find("TRANSLATORS:")
if start == -1:
start = 0
else:
start += len("TRANSLATORS:")

if is_block_translator_comment:
# If '*/' is found, then it's the end.
if line.rfind("*/") != -1:
extracted_comment = line[start : line.rfind("*/")]
reached_end = True
else:
extracted_comment = line[start:]
else:
# If beginning is not '//', then it's the end.
if line.find("//") != 0:
reached_end = True
else:
start = 2 if start == 0 else start
extracted_comment = line[start:]

return (not reached_end, extracted_comment)


def process_file(f, fname):

global main_po, unique_str, unique_loc

patterns = ['RTR("', 'TTR("', 'TTRC("']

l = f.readline()
lc = 1
reading_translator_comment = False
is_block_translator_comment = False
translator_comment = ""

while l:

patterns = ['RTR("', 'TTR("', 'TTRC("']
# Detect translator comments.
if not reading_translator_comment and l.find("TRANSLATORS:") != -1:
reading_translator_comment = True
is_block_translator_comment = _is_block_translator_comment(l)
translator_comment = ""

# Gather translator comments. It will be gathered for the next translation function.
if reading_translator_comment:
reading_translator_comment, extracted_comment = _extract_translator_comment(l, is_block_translator_comment)
if extracted_comment != "":
translator_comment += extracted_comment + "\n"
if not reading_translator_comment:
translator_comment = translator_comment[:-1] # Remove extra \n at the end.

idx = 0
pos = 0
while pos >= 0:

while not reading_translator_comment and pos >= 0:
pos = l.find(patterns[idx], pos)
if pos == -1:
if idx < len(patterns) - 1:
Expand All @@ -79,10 +195,14 @@ def process_file(f, fname):
if line_nb:
location += ":" + str(lc)

# Write translator comment.
_write_translator_comment(msg, translator_comment)
translator_comment = ""

if not msg in unique_str:
main_po += "\n#: " + location + "\n"
main_po += "#: " + location + "\n"
main_po += 'msgid "' + msg + '"\n'
main_po += 'msgstr ""\n'
main_po += 'msgstr ""\n\n'
unique_str.append(msg)
unique_loc[msg] = [location]
elif not location in unique_loc[msg]:
Expand All @@ -100,7 +220,7 @@ def process_file(f, fname):
print("Updating the editor.pot template...")

for fname in matches:
with open(fname, "r") as f:
with open(fname, "r", encoding="utf8") as f:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will break Python 2 compatibility, you should use open_utf8 from our compat.py (import compat).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah nevermind, this is not part of the buildsystem so it doesn't matter.

But might be worth bumping the shebang to python3 then.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh ok. Didn't see your msg. I will revert the changes.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@akien-mga You want me to change to #!/usr/bin/env python3? I didn't understand the shebang part until now.
The /usr/bin/env part I refer from this discussion.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that works fine.

process_file(f, fname)

with open("editor.pot", "w") as f:
Expand Down