/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2000-2006 Keith Godfrey and Maxym Mykhalchuk
2007-2010 Didier Briel
2010 Antonio Vilei
2011-2016 Didier Briel
Home page: http://www.omegat.org/
Support center: http://groups.yahoo.com/group/OmegaT/
This file is part of OmegaT.
OmegaT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OmegaT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
**************************************************************************/
package org.omegat.filters3.xml.openxml;
import org.omegat.filters3.Attribute;
import org.omegat.filters3.Attributes;
import org.omegat.filters3.xml.DefaultXMLDialect;
/**
* Dialect of Open XML files.
*
* @author Didier Briel
* @author Antonio Vilei
*/
public class OpenXMLDialect extends DefaultXMLDialect {
/**
* Actually defines the dialect. It cannot be done during creation, because
* options are not known at that step.
*/
public void defineDialect(OpenXMLOptions options) {
defineParagraphTags(new String[] {
// Word
"w:p", "w:tab", "dc:title", "dc:subject", "dc:creator",
// Excel
"si", "comment", "definedName",
// PowerPoint
"a:p", "c:v",
// Visio
"Text"});
if (options.getBreakOnBr()) {
defineParagraphTag("w:br"); // Word
}
if (options.getTranslateHiddenText()) {
defineOutOfTurnTag("w:instrText");
} else {
defineIntactTag("w:instrText");
}
if (!options.getTranslateFallbackText()) { // Word
defineIntactTag("mc:Fallback");
}
defineIntactTags(new String[] {
// Excel
"authors", "rPh", "definedNames",
// PowerPoint
"p:attrName", "a:tableStyleId",
// Charts
"c:f", "c:formatCode",
// Word
"wp:align", "wp:posOffset", "wp14:pctWidth", "wp14:pctHeight", "w:fldChar", "cp:lastModifiedBy",
"cp:revision", "cp:lastPrinted", "dcterms:created", "dcterms:modified", "cp:version",
// Drawings
"xdr:col", "xdr:row", "xdr:colOff", "xdr:rowOff",
// Visio (copied directly from the Visio filter. As far as we know, the dialect is the same)
"DocumentProperties",
"DocumentSettings",
"Colors",
"FaceNames",
"StyleSheets",
"DocumentSheet",
"Masters",
"Misc",
"TextBlock",
"Geom",
"Para",
"Char",
"Connection",
"XForm",
"Line",
"Fill",
"Event",
"PageSheet",
"PageProps",
"PageLayout",
"PrintProps",
"PageHeight",
"PageWidth",
"Image",
"PinY",
"Width",
"Height",
"XForm1D",
"EndX",
"LayerMem",
"TextXForm",
"Control",
"ForeignData",
"Foreign",
"Menu",
"Act",
"User",
"Help",
"Copyright",
"VBProjectData",
"FooterMargin",
"HeaderMargin",
"HeaderFooter",
"Window",
"Windows",
"EventList",
"Scratch",
"TextBlock",
"Protection",
"Layout",
"Icon",
"vx:Event",
"v14:Geom",
"vx:Fill",
"PreviewPicture",
"vx:Char",
"vx:Color",
"vx:Line",
"FillForegnd",
"XForm1D",
"ShdwBkgnd",
"TextBkgnd",
"vx:TextBkgnd",
});
defineTranslatableTagAttribute("sheet", "name"); // Excel
if (options.getTranslateWordArt()) {
defineTranslatableTagAttribute("v:textpath", "string"); // WordArt
}
if (options.getTranslateLinks()) {
defineTranslatableTagAttribute("Relationship", "Target"); // PowerPoint, only if TargetMode is External
}
boolean aggregationEnabled = options.getAggregateTags();
/*
* The current OpenXML filter finds too many tags, usually causing what
* users call the "tag soup". Tags aggregation can help alleviate this
* problem, but can sometimes lead to semantic issues. Aggregation is OK
* only as a temporary hack, until we improve the OpenXML filter.
*/
setTagsAggregationEnabled(aggregationEnabled);
// If defined in the options, set space preserving for all tags
setForceSpacePreserving(options.getSpacePreserving());
}
/**
* Returns for a given attribute of a given tag if the attribute should be
* translated with the given other attributes present. If the tagAttribute
* is returned by getTranslatable(Tag)Attributes(), this function is called
* to further test the attribute within its context. This allows for example
* the OpenXML filter to not translate the value attribute of Target, except if TargetMode is External
*/
@Override
public Boolean validateTranslatableTagAttribute(String tag, String attribute, Attributes atts) {
// special case:
if ("Relationship".equalsIgnoreCase(tag) && attribute.equalsIgnoreCase("Target")) {
for (int i = 0; i < atts.size(); i++) {
Attribute otherAttribute = atts.get(i);
if ("TargetMode".equalsIgnoreCase(otherAttribute.getName())
&& "External".equalsIgnoreCase(otherAttribute.getValue())) {
return super.validateTranslatableTagAttribute(tag, attribute, atts);
}
}
// Do not translate if TargetMode is not External
return false;
}
return super.validateTranslatableTagAttribute(tag, attribute, atts);
}
}