faae8b86fa
A tool to allow pseudo translations to be created in order to identify potential translation problems. To use the tool: Make sure your English file is up to date: ./run_tests.sh --makemessages Run the pseudo tool to create pseudo translations: ./run_tests.sh --pseudo de Compile the catalog: ./run_tests.sh --compilemessages Run your dev server. Log in and change to the language you pseudo translated. It should look weird. More specifically, every translatable string is going to start and end with a bracket and they are going to have some added characters. For example, "Log In" will become "[~Log In~您好яшçあ]" This is useful because you can inspect for the following: - If you see a string in English it's not translatable. Should it be? - If you see brackets next to each other that might be concatenation. - If there is unexpected wrapping/truncation there might not be enough space for translations - If you see a string in the proper translated language, it comes from an external source. (That's not bad, just sometimes useful to know) - If you get new crashes, there is probably a bug. :-) Implements blueprint: pseudo-translation-tool Change-Id: If97754c2d4234b12b3d73616ff60527f6ad82d55
80 lines
2.5 KiB
Python
Executable File
80 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
|
|
# Copyright 2015 IBM Corp.
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import argparse
|
|
|
|
import babel.messages.catalog as catalog
|
|
import babel.messages.pofile as pofile
|
|
|
|
|
|
def translate(segment):
|
|
prefix = u""
|
|
# When the id starts with a newline the mo compiler enforces that
|
|
# the translated message must also start with a newline. Make
|
|
# sure that doesn't get broken when prepending the bracket.
|
|
if segment.startswith('\n'):
|
|
prefix = u"\n"
|
|
orig_size = len(segment)
|
|
# Add extra expansion space based on recommenation from
|
|
# http://www-01.ibm.com/software/globalization/guidelines/a3.html
|
|
if orig_size < 20:
|
|
multiplier = 1
|
|
elif orig_size < 30:
|
|
multiplier = 0.8
|
|
elif orig_size < 50:
|
|
multiplier = 0.6
|
|
elif orig_size < 70:
|
|
multiplier = 0.4
|
|
else:
|
|
multiplier = 0.3
|
|
extra_length = int(max(0, (orig_size * multiplier) - 10))
|
|
extra_chars = "~" * extra_length
|
|
return u"{0}[~{1}~您好яшçあ{2}]".format(prefix, segment, extra_chars)
|
|
|
|
|
|
def main():
|
|
# Check arguments
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('pot_filename', type=argparse.FileType('r'))
|
|
parser.add_argument('po_filename', type=argparse.FileType('w'))
|
|
parser.add_argument('locale')
|
|
args = parser.parse_args()
|
|
|
|
# read POT file
|
|
pot_cat = pofile.read_po(args.pot_filename, ignore_obsolete=True)
|
|
|
|
# Create the new Catalog
|
|
new_cat = catalog.Catalog(locale=args.locale,
|
|
last_translator="pseudo.py",
|
|
charset="utf-8")
|
|
num_plurals = new_cat.num_plurals
|
|
|
|
# Process messages from template
|
|
for msg in pot_cat:
|
|
if msg.pluralizable:
|
|
msg.string = [translate(u"{}:{}".format(i, msg.id[0]))
|
|
for i in range(num_plurals)]
|
|
else:
|
|
msg.string = translate(msg.id)
|
|
new_cat[msg.id] = msg
|
|
|
|
# Write "translated" PO file
|
|
pofile.write_po(args.po_filename, new_cat, ignore_obsolete=True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|