...
- In the servlet code:
- In `AuthorizeAdminServlet`, some English is passed for direct display in the title through the attribute `edit_title`. E.g. "Item".
- `config/dstat.map`
- Support for easy customisation of UI without needing to fork language bundles.
- Display dates, numbers etc. according to Locale. (JSTL has tags for this)
- Searching in non-Western languages such as Chinese; Lucene cannot parse/separate words
- Multi-lingual metadata. Submission forms do not include language info for metadata. (The "language" DC field relates to the language of the content, i.e. the bitstreams.)
- HPCLab, University of Patras, has submitted a new patch addressing this issue, against 1.4.2 (including the I18N patch) here. Please test and verify in order to remove from to-do.
- Author and title ordering.
- Browse controls ("Jump to" 0-9, A-Z) – support for other characters
- Use of Collator fixes non-English language sort order problems. Not developed but small. No schema changes. JimDowning
- i18n of non-Web UI – e.g. command line tools like the import/export tools. Currently the dictionaries are only stored in the .war file, so other parts of code won't have access to them.
Useful Tools
Python
...
script to check for missing/extra strings
Given the English original (messages.xml or Messages.properties) and the corresponding translation file, this script will report both strings missing in the translation file and extra strings that shouldn't be in the translation. Tested on Python 2.7, requires ElementTree (wrapper for libxml2) for checking XML and/or jprops for testing .properties.
Code Block | ||||
---|---|---|---|---|
| ||||
#!/usr/bin/env python import sys class MessagesXmlParser(): def __init__(self, filename): import xml.etree.ElementTree as etree self.keys = [] tree = etree.parse(filename) root = tree.getroot() for message in root: self.keys.append(message.attrib['key']) class MessagesPropertiesParser(): def __init__(self, filename): try: import jprops except: print('Error: jprops module for parsing .properties files is missing. Download and follow installation instructions from http://mgood.github.com/jprops/') sys.exit(2) self.keys = [] with open(filename) as fp: for key, value in jprops.iter_properties(fp): self.keys.append(key) if __name__ == "__main__": if len(sys.argv) != 3: print("Usage:") print(" %s messages.xml messages_XX.xml" % (sys.argv[0])) print("or") print(" %s Messages.properties Messages_XX.properties" % (sys.argv[0])) sys.exit(1) testfile = open(sys.argv[1], 'rb') if testfile.readline().find('<?xml') != -1: # xml file detected, assume messages.xml messages_tmpl = MessagesXmlParser(sys.argv[1]) messages_in = MessagesXmlParser(sys.argv[2]) else: # assume Messages.properties messages_tmpl = MessagesPropertiesParser(sys.argv[1]) messages_in = MessagesPropertiesParser(sys.argv[2]) print "Present in %s but missing in %s:" % (sys.argv[1], sys.argv[2]) for i in set(messages_tmpl.keys) - set(messages_in.keys): print i print "\nPresent in %s but missing in %s:" % (sys.argv[2], sys.argv[1]) for i in set(messages_in.keys) - set(messages_tmpl.keys): print i |
Newer version of the script which allows comparison and dumping in columnar TSV of several messages files simulatenously: dspace-i10n-check2.py. Usage example:
Code Block | ||||
---|---|---|---|---|
| ||||
./dspace-i10n-check2.py --compare file1 file2 ./dspace-i10n-check2.py --dump file1 ./dspace-i10n-check2.py --dump-tsv-for-translation /dspace/webapps/xmlui/i18n/messages.xml /dspace/webapps/xmlui/i18n/messages_es.xml /dspace/webapps/xmlui/i18n/messages_it.xml |
Python script to prepare a list of untranslated XMLUI strings when updating and older translation
A python script to generate a messages_xx.xml file by merging existing translations from an older committed translation to the latest messages.xml file. Thus, you get a file with the latest keys, where you only need to look for the untranslated strings.
https://github.com/evelthon/dspace-xmlui-lang-util
PHP
Scriptscript to check for missing/extra strings
Given the English original (messages.xml and the corresponding translation file, this script will report both strings missing in the translation file and extra strings that shouldn't be in the translation.
Code Block | ||||
---|---|---|---|---|
| ||||
<?php if ($argc != 3) { echo "Usage: checkkeys.php <master> <tocheck>\n"; exit(1); } $masterKeys = getKeys($argv[1]); $toCheckKeys = getKeys($argv[2]); print "IN $argv[1] BUT NOT IN $argv[2]:\n\n"; printMissing($masterKeys, $toCheckKeys); print "\n\n\nIN $argv[2] BUT NOT IN $argv[1]:\n\n"; printMissing($toCheckKeys, $masterKeys); function printMissing($reference, $test) { foreach ($test as $value) { if (! in_array($value, $reference)) { echo "$value \n"; } } } function readFileMessage($path) { if (! $fileContent = @file($path)) { echo "Can't open $path \n"; exit(1); } return $fileContent; } function getKeys($path) { $fileContent = readFileMessage($path); return readKeys($fileContent); } function readKeys($file) { $keys = []; foreach ($file as $key => $line) { if (strpos($line, '<message key="') === false) { continue; } $key = getKey($line); $keys[] = $key; } return $keys; } function getKey($line) { $line = trim($line); $line = substr($line, 14); $charEnd = strpos($line, '">'); $key = substr($line, 0, $charEnd - strlen($line)); return $key; } |
Code Block | ||||
---|---|---|---|---|
| ||||
php ./checkkeys.php file1 file2 php ./checkkeys.php /dspace/webapps/xmlui/i18n/messages.xml /dspace/webapps/xmlui/i18n/messages_es.xml /dspace/webapps/xmlui/i18n/messages_it.xml |
Perl
...
script for unused keys
Here's a useful Perl script that finds all of the dictionary keys in the JSPs and the `Messages.properties` file, and prints out keys that are used in the JSPs but aren't in the dictionary, and vice versa. Missing File: Find-unused-keys.pl Note: slightly out of date, can't detect message keys used in e.g. LocaleSupport.getLocalizedMessage()
You'll need to change the variables at the top of the file to point to your DSpace source dir.
...