It is annoying for developers to make number of steps to provide default translation of single text message within OpenMRS. If developer needs to do it, he puts corresponding spring:message tag into jsp file. Then, he finds the messages.properties file and appends default English translation for this message. If developer should provide translation into another language he needs to edit one more message.properties file etc. From the other hand, another person (translator) needs to complete a lot of steps to provide further qualitative translation of this message into other language (in the most common case, he needs to open default message.properties file to obtain message key, then open message properties file to put new translation into and to runs web-app to see translating message in context of web page).
In more details, we use Spring's message taglib for putting strings onto our web pages currently. This gives us the ability to translate openmrs very easily. If you want to put a string into a jsp page into openmrs you put this spring:message in your jsp:
Now the text can be is displayed automatically in Spanish if the user has set their locale as Spanish. If the user is in the English locale or any other, they will see the english translation.
- inefficient to have to edit two files to add a simple string.
- Many devs only know english and so will only ever edit the one file
- When translating message bundles, the translator lacks the context of the message within the application.
Allow for in-line adding/editing of the translated text by the developer.
These are separated into mostly independent tasks that can be done by different developers.
Task #1: (Java)
Subclass the default Spring "message" taglib class and allow for text inside of the tag. The spring.tld file in openmrs tells me that the class is org.springframework.web.servlet.tags.MessageTag.
If that text is entered in the body of the html tag by the developer, use that as the "en" translation in the message taglib class instead of looking in the messages.properties file.
Task #2: (no tech knowledge needed)
Move text from the messages.properties into the body of the spring tags in core. This is a very tedious task but doesn't require a lot of java knowledge.
Task #3: (scripting knowledge helpful)
Create a shell script or ant script/target that scans the web folder looking for spring:message tags. The script should take the 'key' from the tag and insert it into the messages.properties file (but only if it doesn't exist in the file already).
The value for the key in the messages.properties file should be the body content of the spring:message tag in the jsp file
Task #4: (scripting knowledge helpful)
If a volunteer comes along and says "I want to help translate openmrs in Spanish" we typically just given them the english messages.properties and they turn the right side of it into spanish. However, seeing the text in context is SOO much easier to translate.
It would be awesome to be able to see the codes and then translate right when viewing the page. We could use a firefox plugin + custom modifications to our custom message tag (see task 1) for this:
There could be a Global Property that can be set to put the OpenmrsMessageTag into "translate mode". So the text returned from the tag is "<span class="openmrstranslate">Enter the person id</span>. The webapp will run just as it did before with this new entry.
Implement and integrate pretty handy tool for in-page localization, which can greatly simplify work on translating OpenMRS.
- Create an OpenMRS JSTL tag for messages – i.e.,
openmrs:message– allowing us to control the output and enhance messaging within OpenMRS.
- This can extend the existing spring:message tag; however, we will want to add the ability to output special HTML to support in-line localization as well as allow for locale & message to be specified in the web page.
- At the same time, we'd like to enhance the utility for referencing messages within Java code to include a locale and message for that locale.
- Create a module that enables in-line localization.
- When translation is enabled, render messages in a manner that support in-line changes.
- Persist those changes back to the message bundles.
- Create a workflow that ensures that local changes to the message bundles are not lost when OpenMRS is upgraded.
- Create a script to identify embedded messages in web pages and code and bring those into the appropriate message bundle(s).
- Create a script to take the default bundles (i.e., en) and import those messages into web pages and code as the default message.
Features list for future versions (2, 3 etc):
- Allow export of message bundles for core or another module that contain the sum of message from bundles + changes in database.
- Add a way to clean out changes in the database that are no longer different from message bundles.
Review of project requirements
Functional and non-functional requirements set to this project are currently collected into one document and placed on separate page.
Basically, from the structural perspective, in-page localization tool for OpenMRS can consist of two parts. First is a dynamic web widgets, which work inside client browser. The second one might be a DWR-based backend for serving AJAX requests from web widgets. Both these parts can be built on the top of custommessages module 's codebase.
There are couple of child pages with detailed descriptions of proposed design:
Project implementation plan
See this wiki page to get details of project implementation plan.
Jira TRUNK-1525 TRUNK-1525
- JIRA project is https://tickets.openmrs.org/browse/CSTM
- Related module is Custom Messages Module