Украинизация интерфейса Oracle BI

Сегодня поговорим о том, как перевести интерфейс Oracle BI на другие языки.

Как известно Oracle BI поддерживает большое количество языков но, к сожалению украинского среди них нет, равно как и белорусского или грузинского.

Исправить этот недочет можно относительно легко, для этого нужно создать базу сообщений (Custom Message) для украинского языка. Расположены эти базы в папке obi/web/msgdb/

Создаем здесь же свою папку l_ua и копируем в неё содержимое папки другого доступного языка, кому с какого удобнее переводить, например если удобнее переводить с русского то копируем всё содержимое папки l_ru.

Дальше нужно внести изменения еще в несколько xml файлов.

Первый это файл obi/web/msgdb/messages/languagenames.xml. Добавляем в него информацию об украинском языке

Второй файл obi/web/msgdb/messages/localenames.xml. Также добавляем в него информацию об украинской LocalName.

Третий файл obi/web/config/localecharactersetlists.xml

Четвертый файл obi/web/config/localedefinitions.xml

И пятый файл obi/web/config/localemappings.xml

Теперь можно перестартовать Oracle BI и в окне входа в выпадающем списке выбора языков должен появиться украинский язык.

Дальше начинается самое интересное, нам нужно перевести базу сообщений системы, общий вес папки с базой почти 1 Мб. Это конечно можно сделать вручную, но я предпочитаю другой способ.

Суть его в следующем, у Google есть неплохой сервис Google Translate, который относительно сносно справляется с переводом. Но еще большим его плюсом, о котором знают немногие, является то что у него есть свободный SDK. Скачать его можно по следующей ссылке http://code.google.com/p/google-api-translate-java/downloads/detail?name=google-api-translate-java-0.95.jar&can=2&q=

Теперь осталось написать утилиту, которая переведет содержимое базы сообщений на украинский язык. Содержимое кода на java перескажу вкратце, в деталях, кто захочет, сам разберет.
Принцип работы следующий открываем указанную папку с исходной базой сообщений на русском языке c:\OracleBI\web\msgdb\l_ru\messages\ поочередно перебираем все встречающиеся в ней xml файлы, внутри файлов ищем элементы с тэгом “TEXT” переводим его и так до конца файла. Переведенные файлы складываем в папку c:\OracleBI\web\msgdb\l_ua\messages\

/**
* Пакет для перевода содержимого XML файлов
* с русского на украинский язык.
* Может быть использован для перевода интерфейса Oracle BI и Oracle BI Publisher
*/

package ua.com.borlas.oraclebiee;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.google.api.translate.Language;
import com.google.api.translate.Translate;

public class TranslateBI {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

execTranslate("c:\OracleBI\web\msgdb\l_ru\messages\", "c:\OracleBI\web\msgdb\l_ua\messages\");
}

public static void execTranslate(String inputDirectoryName, String outputDirectoryName) {

// Set the HTTP referrer to your website address.
Translate.setHttpReferrer("http://borlas.com.ua");

String[] xmlFiles = getFiles(inputDirectoryName);
for(int i = 0; i < xmlFiles.length; i++) {

System.out.println("Сейчас переводится: " + xmlFiles[i]);
File file = new File(inputDirectoryName + xmlFiles[i]);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Document doc = null;
try {
doc = db.parse(file);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
doc.getDocumentElement().normalize();

NodeList nodeLst = doc.getElementsByTagName("TEXT");
for (int s = 0; s < nodeLst.getLength(); s++) {

Node fstNode = nodeLst.item(s);

if (fstNode.getNodeType() == Node.ELEMENT_NODE) {

// Непосредственно перевод ...
String sourceText = nodeToString(fstNode);
String translatedText = null;
try {
translatedText = Translate.execute(sourceText, Language.RUSSIAN, Language.UKRANIAN);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}

//if(translatedText.isEmpty()) translatedText = sourceText;

System.out.println("     старое название: "  + sourceText + "n     переведенное название: " + translatedText);

// Обновляем Node
Element fstElmnt = (Element) fstNode.getParentNode();
try {
appendXmlFragment(db, fstElmnt, translatedText);
fstElmnt.removeChild(fstNode);
//fstElmnt.setTextContent(translatedText);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
//fstElmnt.(fstElmnt);
}

}
}
// Сохраняем результат перевода ...
Transformer xformer = null;
try {
xformer = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
xformer.transform
(new DOMSource(doc), new StreamResult(new File(outputDirectoryName + xmlFiles[i])));
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//System.out.println(translatedText);
}
}

private static String nodeToString(Node node) {

String xmlString = null;
try {
TransformerFactory transfac = TransformerFactory.newInstance();
Transformer trans = transfac.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
trans.setOutputProperty(OutputKeys.INDENT, "yes");

// Print the DOM node

StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(node);
trans.transform(source, result);
xmlString = sw.toString();

} catch (TransformerException te) {
System.out.println("nodeToString Transformer Exception");
}
return xmlString;
}

private static void appendXmlFragment(DocumentBuilder docBuilder, Node parent, String fragment) {

Document doc = parent.getOwnerDocument();
Node fragmentNode = null;
try {
fragmentNode = docBuilder.parse(
new ByteArrayInputStream(fragment.getBytes("UTF-8")))
.getDocumentElement();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fragmentNode = doc.importNode(fragmentNode, true);
parent.appendChild(fragmentNode);
}

private static String[] getFiles(String directoryName) {

String[] result = null;

File dir = new File(directoryName);
result = dir.list();

return result;
}
}

Кому неохота упражняться с Java привожу ссылку на готовую базу сообщений на украинском языке.

Дальше перестартовываем Oracle BI и получаем переведенный интерфейс.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s