diff --git a/src/org/omegat/Bundle.properties b/src/org/omegat/Bundle.properties index 7cf4afacd8..5459a3f222 100644 --- a/src/org/omegat/Bundle.properties +++ b/src/org/omegat/Bundle.properties @@ -580,6 +580,8 @@ MW_PROGRESS_TOOLTIP_PERCENTAGE=File: unique translated % (unique left) \ MW_JUMPING_LAST_ENTRY=Jumping to last edited segment... +MW_SEGMENT_LOCKED=Locked segment ({0}) + # NOTE: segment start is assumed to end with "0000" string to overwrite # with entry number. If zeros not detected, entry number will not be # displayed @@ -1801,6 +1803,7 @@ WG_SAVE_ORIGIN=Save origin of &translation WG_INITIAL_SEGMENT_LOAD_COUNT=Initial number of loaded segments: WG_INITIAL_SEGMENT_LOAD_COUNT_TOOLTIP=When a single file has more segments than this, additional segments will be loaded on-demand as you scroll. WG_PARA_MARK=Paragraph delimiter: +WG_SUPPORT_LOCKED_SEGMENTS=Support for locked segments # org.omegat.gui.preferences.view.TMMatchesPreferencesPanel.java EXT_TMX_DESCRIPTION=Settings for tags originating from non-OmegaT TMX files: @@ -2509,7 +2512,8 @@ COLOR_MARK_COMES_FROM_TM_MT=From MT memory COLOR_MARK_COMES_FROM_TM_XICE=From ICE memory COLOR_MARK_COMES_FROM_TM_X100PC=From 100% memory COLOR_MARK_COMES_FROM_TM_XAUTO=From auto memory -COLOR_MARK_COMES_FROM_TM_XENFORCED=From enforced memory +# COLOR_MARK_COMES_FROM_TM_XENFORCED=From enforced memory +COLOR_LOCKED_SEGMENT=Locked segment COLOR_PARAGRAPH_START=Paragraph delimitation COLOR_REPLACE=Replace COLOR_LANGUAGE_TOOLS=Language checker diff --git a/src/org/omegat/filters3/xml/xliff/XLIFFFilter.java b/src/org/omegat/filters3/xml/xliff/XLIFFFilter.java index 40a3861adb..84ecb7b468 100644 --- a/src/org/omegat/filters3/xml/xliff/XLIFFFilter.java +++ b/src/org/omegat/filters3/xml/xliff/XLIFFFilter.java @@ -219,6 +219,11 @@ public void tagStart(String path, Attributes atts) { if ("/xliff/file/header".equals(path)) { ignored = true; } + if (path.endsWith("/target")) { + if ("final".equals(atts.getValue("state"))) { + addProperty("LOCKED", "xliff final"); + } + } text.setLength(0); } diff --git a/src/org/omegat/filters4/xml/xliff/AbstractXliffFilter.java b/src/org/omegat/filters4/xml/xliff/AbstractXliffFilter.java index bfc10724c2..e712e08c5f 100755 --- a/src/org/omegat/filters4/xml/xliff/AbstractXliffFilter.java +++ b/src/org/omegat/filters4/xml/xliff/AbstractXliffFilter.java @@ -107,6 +107,7 @@ public boolean isBilingual() { protected List source = new LinkedList<>(); protected List target = null; protected List note = new LinkedList<>(); + protected boolean isFinalState; protected void cleanBuffers() { source.clear(); @@ -144,7 +145,7 @@ protected boolean isToIgnore(String src, String tra) { /** Add one unit to OmegaT, or more in case of **/ protected void registerCurrentTransUnit(String entryId, List unitSource, - List unitTarget, String notePattern) { + List unitTarget, String notePattern, boolean isFinalState) { String src = buildTags(unitSource, false); String tra = null; if (unitTarget != null && !unitTarget.isEmpty()) { @@ -180,8 +181,17 @@ protected void registerCurrentTransUnit(String entryId, List unitSourc } noteStr = subNoteBuf; } - entryParseCallback.addEntry(entryId, src, tra, false, - noteStr == null ? null : noteStr.toString(), path, this, buildProtectedParts(src)); + if (isFinalState) { + entryParseCallback.addEntryWithProperties(entryId, src, tra, false, + noteStr == null ? new String[] { "LOCKED", "xliff final" } + : new String[] { "LOCKED", "xliff final", org.omegat.core.data.SegmentProperties.COMMENT, noteStr.toString() }, + path, this, buildProtectedParts(src)); + + } else { + entryParseCallback.addEntryWithProperties(entryId, src, tra, false, + noteStr == null ? null : new String[] { org.omegat.core.data.SegmentProperties.COMMENT, noteStr.toString() }, + path, this, buildProtectedParts(src)); + } } if (entryAlignCallback != null) { entryAlignCallback.addTranslation(entryId, src, tra, false, path, this); diff --git a/src/org/omegat/filters4/xml/xliff/Xliff1Filter.java b/src/org/omegat/filters4/xml/xliff/Xliff1Filter.java index d2f57f9c0f..29981f136f 100755 --- a/src/org/omegat/filters4/xml/xliff/Xliff1Filter.java +++ b/src/org/omegat/filters4/xml/xliff/Xliff1Filter.java @@ -163,6 +163,12 @@ protected boolean processStartElement(StartElement startElement, XMLStreamWriter throw new XMLStreamException( OStrings.getString("XLIFF_MANDATORY_ORIGINAL_MISSING", "id", "trans-unit")); } + isFinalState = false; + try { + isFinalState = "final".equals(startElement.getAttributeByName(new QName("state")).getValue()); + } catch (Exception e) { + // non mandatory (and indeed should only accidentally be at this level) + } flushedUnit = false; targetStartEvent = null; updateIgnoreScope(startElement); @@ -176,6 +182,11 @@ protected boolean processStartElement(StartElement startElement, XMLStreamWriter currentBuffer = target; inTarget = true; targetStartEvent = startElement; + try { + isFinalState = "final".equals(startElement.getAttributeByName(new QName("state")).getValue()); + } catch (Exception e) { + // non mandatory, but in good place + } break; case "note": currentBuffer = note; @@ -235,11 +246,11 @@ protected boolean processEndElement(EndElement endElement, XMLStreamWriter write } if (ignoreScope == null || ignoreScope.startsWith("!")) { // registerCurrentTransUnit(unitId); if (subSegments.isEmpty()) { - registerCurrentTransUnit(unitId, source, target, ".*"); + registerCurrentTransUnit(unitId, source, target, ".*", isFinalState); } else { for (Map.Entry> me : subSegments.entrySet()) { registerCurrentTransUnit(unitId + "/" + me.getKey(), me.getValue(), - findSubsegment(target, me.getKey()), "\\[(\\d+)\\](.*)\\[\\1\\]"); + findSubsegment(target, me.getKey()), "\\[(\\d+)\\](.*)\\[\\1\\]", isFinalState); } } } @@ -540,7 +551,11 @@ protected final void generateTargetStartElement(XMLStreamWriter writer) throws X } if (isTranslated) { writer.writeStartElement(namespace, "target"); - writer.writeAttribute("state", "translated"); + if (isFinalState) { // if segment is final it should be also final in the result + writer.writeAttribute("state", "final"); + } else { // add status translated, which was not before + writer.writeAttribute("state", "translated"); + } if (targetStartEvent != null) { for (java.util.Iterator iter = targetStartEvent.getAttributes(); iter.hasNext();) { Attribute next = iter.next(); diff --git a/src/org/omegat/filters4/xml/xliff/Xliff2Filter.java b/src/org/omegat/filters4/xml/xliff/Xliff2Filter.java index 1e886a73bc..441951ccd8 100755 --- a/src/org/omegat/filters4/xml/xliff/Xliff2Filter.java +++ b/src/org/omegat/filters4/xml/xliff/Xliff2Filter.java @@ -131,6 +131,12 @@ protected boolean processStartElement(StartElement startElement, XMLStreamWriter segId = "1"; } flushedSegment = false; + isFinalState = false; + try { + isFinalState = "final".equals(startElement.getAttributeByName(new QName("state")).getValue()); + } catch (Exception e) { + // non mandatory + } break; case "source": currentBuffer = source; @@ -185,7 +191,7 @@ protected boolean processEndElement(EndElement endElement, XMLStreamWriter write flushTranslations(writer); // if there was no at all } if (ignoreScope == null || ignoreScope.startsWith("!")) { - registerCurrentTransUnit(segId, source, target, ".*"); + registerCurrentTransUnit(segId, source, target, ".*", isFinalState); } segId = null; cleanBuffers(); diff --git a/src/org/omegat/gui/editor/EditorController.java b/src/org/omegat/gui/editor/EditorController.java index ac60c22bbf..a849cc11b0 100644 --- a/src/org/omegat/gui/editor/EditorController.java +++ b/src/org/omegat/gui/editor/EditorController.java @@ -811,7 +811,7 @@ public void activateEntry(CaretPosition pos) { // clear undo history. ((NotesTextArea) notes).clearHistory(); } - + // then add new marks markerController.reprocessImmediately(builder); @@ -2253,4 +2253,9 @@ protected Map getViewableSegmentLocations() { public IAutoCompleter getAutoCompleter() { return editor.autoCompleter; } + + public void unlockSegment() { + editor.unlockSegment(); + } + } diff --git a/src/org/omegat/gui/editor/EditorTextArea3.java b/src/org/omegat/gui/editor/EditorTextArea3.java index 2461da1f73..8b02acfa68 100644 --- a/src/org/omegat/gui/editor/EditorTextArea3.java +++ b/src/org/omegat/gui/editor/EditorTextArea3.java @@ -9,6 +9,7 @@ 2013 Zoltan Bartko 2014 Aaron Madlon-Kay 2015 Yu Tang + 2023-2024 Thomas Cordonnier Home page: https://www.omegat.org/ Support center: https://omegat.org/support @@ -65,9 +66,12 @@ import org.omegat.core.CoreEvents; import org.omegat.core.data.ProtectedPart; import org.omegat.core.data.SourceTextEntry; +import org.omegat.core.data.TMXEntry; +import org.omegat.core.events.IEntryEventListener; import org.omegat.gui.editor.autocompleter.AutoCompleter; import org.omegat.gui.shortcuts.PropertiesShortcuts; import org.omegat.util.OStrings; +import org.omegat.util.Preferences; import org.omegat.util.StringUtil; import org.omegat.util.gui.Styles; import org.omegat.util.gui.UIDesignManager; @@ -163,6 +167,7 @@ protected void createInputAttributes(Element element, MutableAttributeSet set) { }); addMouseListener(mouseListener); + CoreEvents.registerEntryEventListener(lockListener); // Custom caret for overtype mode OvertypeCaret c = new OvertypeCaret(); @@ -322,6 +327,39 @@ protected void registerPopupMenuConstructors(int priority, IPopupMenuConstructor Collections.sort(popupConstructors, (o1, o2) -> o1.priority - o2.priority); } } + + /** + * On new entry, check if we are in a locked segment, in which case we lock the editor + * Using this method ensures that isLocked is set here and only here + **/ + protected final class LockListener implements IEntryEventListener { + private String isLocked = null; + + public void onEntryActivated(SourceTextEntry newEntry) { + isLocked = null; + SourceTextEntry entry = controller.getCurrentEntry(); + String[] props = entry.getRawProperties(); + for (int i = 0; i < props.length; i++) { + if (props[i].equals("LOCKED")) { + isLocked = props[i + 1]; + // Entries populated via a filter are always with context, as alternative + controller.setAlternateTranslationForCurrentEntry(true); + } + } + if (isLocked == null) { + TMXEntry tmx = Core.getProject().getTranslationInfo(entry); + isLocked = (tmx.linked == TMXEntry.ExternalLinked.xENFORCED) ? "tm/enforce" : null; + } + } + + public void onNewFile(String activeFileName) { + } + }; + private final transient LockListener lockListener = new LockListener(); + + public void unlockSegment() { + lockListener.isLocked = null; + } /** * Redefine some keys behavior. We can't use key listeners, because we have @@ -364,6 +402,9 @@ protected void processKeyEvent(KeyEvent e) { if (controller.settings.isUseTabForAdvance()) { controller.nextEntry(); processed = true; + } else if (lockListener.isLocked != null) { + // We should not accept any character, including TAB + processed = Preferences.isPreferenceDefault(Preferences.SUPPORT_LOCKED_SEGMENTS, true); } } else if (s.equals(KEYSTROKE_PREV)) { // Go back when 'Use TAB to advance' @@ -475,6 +516,15 @@ protected void processKeyEvent(KeyEvent e) { checkAndFixCaret(true); } } + // Treat the case of enforced translations which should be locked - this case does not seem to be treated via replaceSelection + if (lockListener.isLocked != null) { + if ((e.getKeyCode() == KeyEvent.VK_BACK_SPACE) || (e.getKeyCode() == KeyEvent.VK_DELETE)) { + Core.getMainWindow().showStatusMessageRB("MW_SEGMENT_LOCKED", lockListener.isLocked); + if (Preferences.isPreferenceDefault(Preferences.SUPPORT_LOCKED_SEGMENTS, true)) { + return; + } + } + } super.processKeyEvent(e); // note that the translation start/end position are not updated yet. This has been updated when // then keyreleased event occurs. @@ -828,6 +878,12 @@ private static class PopupMenuConstructorInfo { @Override public void replaceSelection(String content) { + if (lockListener.isLocked != null) { + Core.getMainWindow().showStatusMessageRB("MW_SEGMENT_LOCKED", lockListener.isLocked); + if (Preferences.isPreferenceDefault(Preferences.SUPPORT_LOCKED_SEGMENTS, true)) { + return; + } + } // Overwrite current selection, and if at the end of the segment, allow // inserting new text. if (isEditable() && overtypeMode && getSelectionStart() == getSelectionEnd() diff --git a/src/org/omegat/gui/editor/IEditor.java b/src/org/omegat/gui/editor/IEditor.java index 6eb1cdf2d1..58a979df34 100644 --- a/src/org/omegat/gui/editor/IEditor.java +++ b/src/org/omegat/gui/editor/IEditor.java @@ -507,4 +507,7 @@ default boolean isOrientationAllLtr() { default CaretPosition getCurrentPositionInEntryTranslationInEditor() { return CaretPosition.startOfEntry(); } + + /** Enable to edit a segment which was locked **/ + void unlockSegment(); } diff --git a/src/org/omegat/gui/editor/mark/ComesFromAutoTMMarker.java b/src/org/omegat/gui/editor/mark/ComesFromAutoTMMarker.java index be8ef9e8a2..de8cdad152 100644 --- a/src/org/omegat/gui/editor/mark/ComesFromAutoTMMarker.java +++ b/src/org/omegat/gui/editor/mark/ComesFromAutoTMMarker.java @@ -45,7 +45,7 @@ public class ComesFromAutoTMMarker implements IMarker { private final HighlightPainter painterXice; private final HighlightPainter painterX100Pc; private final HighlightPainter painterXauto; - private final HighlightPainter painterXenforced; + private final HighlightPainter painterLocked; public ComesFromAutoTMMarker() { painterXice = new TransparentHighlightPainter( @@ -54,8 +54,8 @@ public ComesFromAutoTMMarker() { Styles.EditorColor.COLOR_MARK_COMES_FROM_TM_X100PC.getColor(), 0.5F); painterXauto = new TransparentHighlightPainter( Styles.EditorColor.COLOR_MARK_COMES_FROM_TM_XAUTO.getColor(), 0.5F); - painterXenforced = new TransparentHighlightPainter( - Styles.EditorColor.COLOR_MARK_COMES_FROM_TM_XENFORCED.getColor(), 0.5F); + painterLocked = new TransparentHighlightPainter( + Styles.EditorColor.COLOR_LOCKED_SEGMENT.getColor(), 0.5F); } @Override @@ -64,6 +64,7 @@ public synchronized List getMarksForEntry(SourceTextEntry ste, String sour if (!Core.getEditor().getSettings().isMarkAutoPopulated()) { return null; } + boolean isLocked = false; TMXEntry e = Core.getProject().getTranslationInfo(ste); if (e == null || e.linked == null) { return null; @@ -80,7 +81,7 @@ public synchronized List getMarksForEntry(SourceTextEntry ste, String sour m.painter = painterXauto; break; case xENFORCED: - m.painter = painterXenforced; + m.painter = painterLocked; } return Collections.singletonList(m); } diff --git a/src/org/omegat/gui/main/MainWindowMenuHandler.java b/src/org/omegat/gui/main/MainWindowMenuHandler.java index 23dfc79afd..8551f9ea51 100644 --- a/src/org/omegat/gui/main/MainWindowMenuHandler.java +++ b/src/org/omegat/gui/main/MainWindowMenuHandler.java @@ -517,6 +517,7 @@ public void editMultipleDefaultActionPerformed() { public void editMultipleAlternateActionPerformed() { Core.getEditor().setAlternateTranslationForCurrentEntry(true); + Core.getEditor().unlockSegment(); } public void editRegisterUntranslatedMenuItemActionPerformed() { diff --git a/src/org/omegat/gui/multtrans/MultipleTransPane.java b/src/org/omegat/gui/multtrans/MultipleTransPane.java index 1b14a70adf..babe9cdbc5 100644 --- a/src/org/omegat/gui/multtrans/MultipleTransPane.java +++ b/src/org/omegat/gui/multtrans/MultipleTransPane.java @@ -110,6 +110,7 @@ public void actionPerformed(ActionEvent e) { miMultiple.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Core.getEditor().setAlternateTranslationForCurrentEntry(true); + Core.getEditor().unlockSegment(); } }); } diff --git a/src/org/omegat/gui/preferences/view/EditingBehaviorController.java b/src/org/omegat/gui/preferences/view/EditingBehaviorController.java index a3a2a700a7..6795f06e2c 100644 --- a/src/org/omegat/gui/preferences/view/EditingBehaviorController.java +++ b/src/org/omegat/gui/preferences/view/EditingBehaviorController.java @@ -100,6 +100,7 @@ protected void initFromPrefs() { Preferences.EDITOR_INITIAL_SEGMENT_LOAD_COUNT, Preferences.EDITOR_INITIAL_SEGMENT_LOAD_COUNT_DEFAULT)); panel.paraMarkText.setText(Preferences.getPreferenceDefault( Preferences.MARK_PARA_TEXT, Preferences.MARK_PARA_TEXT_DEFAULT)); + panel.cbSupportLockedSegments.setSelected(Preferences.isPreferenceDefault(Preferences.SUPPORT_LOCKED_SEGMENTS, true)); updateEnabledness(); } @@ -120,6 +121,7 @@ public void restoreDefaults() { panel.tagValidateOnLeave.setSelected(false); panel.cbSaveAutoStatus.setSelected(false); panel.cbSaveOrigin.setSelected(false); + panel.cbSupportLockedSegments.setSelected(true); panel.initialSegCountSpinner.setValue(Preferences.EDITOR_INITIAL_SEGMENT_LOAD_COUNT_DEFAULT); panel.paraMarkText.setText(Preferences.MARK_PARA_TEXT_DEFAULT); @@ -154,6 +156,7 @@ public void persist() { Preferences.setPreference(Preferences.TAG_VALIDATE_ON_LEAVE, panel.tagValidateOnLeave.isSelected()); Preferences.setPreference(Preferences.SAVE_AUTO_STATUS, panel.cbSaveAutoStatus.isSelected()); Preferences.setPreference(Preferences.SAVE_ORIGIN, panel.cbSaveOrigin.isSelected()); + Preferences.setPreference(Preferences.SUPPORT_LOCKED_SEGMENTS, panel.cbSupportLockedSegments.isSelected()); int segCount = Math.max(0, (Integer) panel.initialSegCountSpinner.getValue()); Preferences.setPreference(Preferences.EDITOR_INITIAL_SEGMENT_LOAD_COUNT, segCount); diff --git a/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.form b/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.form index e620000d09..3dee6dd30c 100644 --- a/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.form +++ b/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.form @@ -375,5 +375,20 @@ + + + + + + + + + + + + + + + diff --git a/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.java b/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.java index 5479193824..552106192d 100644 --- a/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.java +++ b/src/org/omegat/gui/preferences/view/EditingBehaviorPanel.java @@ -80,6 +80,7 @@ private void initComponents() { filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 32767)); paraMarkLabel = new javax.swing.JLabel(); paraMarkText = new javax.swing.JTextField(); + cbSupportLockedSegments = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10)); setLayout(new java.awt.GridBagLayout()); @@ -307,6 +308,16 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { gridBagConstraints.ipadx = 250; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; add(paraMarkText, gridBagConstraints); + + org.openide.awt.Mnemonics.setLocalizedText(cbSupportLockedSegments, OStrings.getString("WG_SUPPORT_LOCKED_SEGMENTS")); // NOI18N + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 16; + gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; + gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; + gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; + gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0); + add(cbSupportLockedSegments, gridBagConstraints); }// //GEN-END:initComponents private void radiosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radiosActionPerformed @@ -336,6 +347,7 @@ private void radiosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST: javax.swing.JSpinner similaritySpinner; javax.swing.JCheckBox stopOnAlternativeTranslation; javax.swing.JCheckBox tagValidateOnLeave; + javax.swing.JCheckBox cbSupportLockedSegments; // End of variables declaration//GEN-END:variables } diff --git a/src/org/omegat/gui/scripting/ConsoleBindings.java b/src/org/omegat/gui/scripting/ConsoleBindings.java index 9afb44e9db..c744966785 100644 --- a/src/org/omegat/gui/scripting/ConsoleBindings.java +++ b/src/org/omegat/gui/scripting/ConsoleBindings.java @@ -323,6 +323,11 @@ public final IAutoCompleter getAutoCompleter() { return null; } + @Override + public final void unlockSegment() { + + } + @Override public final List getDisplayedEntries() { return null; diff --git a/src/org/omegat/util/Preferences.java b/src/org/omegat/util/Preferences.java index 8e4408776e..f06c8f8e29 100644 --- a/src/org/omegat/util/Preferences.java +++ b/src/org/omegat/util/Preferences.java @@ -248,6 +248,9 @@ public final class Preferences { /** Workflow Option: Number of segments to load initially in editor */ public static final String EDITOR_INITIAL_SEGMENT_LOAD_COUNT = "editor_initial_segment_load_count"; public static final int EDITOR_INITIAL_SEGMENT_LOAD_COUNT_DEFAULT = 2000; + /** Activate support for locked segments **/ + public static final String SUPPORT_LOCKED_SEGMENTS = "support_locked_segments"; + /** Tag Validation Option: Don't check printf-tags */ public static final String DONT_CHECK_PRINTF_TAGS = "tagValidation_noCheck"; diff --git a/src/org/omegat/util/gui/Styles.java b/src/org/omegat/util/gui/Styles.java index c7635dbcae..0ef7514843 100644 --- a/src/org/omegat/util/gui/Styles.java +++ b/src/org/omegat/util/gui/Styles.java @@ -118,7 +118,8 @@ public enum EditorColor { COLOR_MARK_COMES_FROM_TM_XAUTO(UIManager.getColor("OmegaT.markComesFromTmXauto")), - COLOR_MARK_COMES_FROM_TM_XENFORCED(UIManager.getColor("OmegaT.markComesFromTmXenforced")), + //COLOR_MARK_COMES_FROM_TM_XENFORCED(UIManager.getColor("OmegaT.markComesFromTmXenforced")), + COLOR_LOCKED_SEGMENT(UIManager.getColor("OmegaT.markComesFromTmXenforced")), COLOR_MARK_ALT_TRANSLATION(UIManager.getColor("OmegaT.markAltTranslations")), diff --git a/test/data/filters/xliff/file-XLIFFFilter-state-final.xlf b/test/data/filters/xliff/file-XLIFFFilter-state-final.xlf new file mode 100644 index 0000000000..8d94d23f40 --- /dev/null +++ b/test/data/filters/xliff/file-XLIFFFilter-state-final.xlf @@ -0,0 +1,15 @@ + + + + + + This is test + tr1=This is test + + + test2 + tr2=test2 + + + + \ No newline at end of file diff --git a/test/fixtures/org/omegat/core/TestCore.java b/test/fixtures/org/omegat/core/TestCore.java index ae30b89485..614c4a73ec 100644 --- a/test/fixtures/org/omegat/core/TestCore.java +++ b/test/fixtures/org/omegat/core/TestCore.java @@ -690,6 +690,10 @@ public void activateEntry() { public boolean isOrientationAllLtr() { return true; } + + @Override + public void unlockSegment() { + } }); } diff --git a/test/src/org/omegat/filters/XLIFFFilterTest.java b/test/src/org/omegat/filters/XLIFFFilterTest.java index caa3bf891d..599736c3ef 100644 --- a/test/src/org/omegat/filters/XLIFFFilterTest.java +++ b/test/src/org/omegat/filters/XLIFFFilterTest.java @@ -96,6 +96,27 @@ public void testLoad() throws Exception { checkMulti("tr2=test2", null, null, "tr1=This is test", "", null); checkMultiEnd(); } + + @Test + public void testKeepProperties() throws Exception { + String f = "test/data/filters/xliff/file-XLIFFFilter-state-final.xlf"; + IProject.FileInfo fi = loadSourceFiles(filter, f); + + checkMultiStart(fi, f); + checkMulti("tr1=This is test", null, null, "", "tr2=test2", null); + assertEquals(fi.entries.get(fiCount - 1).getRawProperties().length, 0); + checkMultiProps("tr2=test2", null, null, "tr1=This is test", "", "LOCKED", "xliff final"); + checkMultiEnd(); + + translate(filter, new File(f).getPath()); + fi = loadSourceFiles(filter, outFile.toString()); + + checkMultiStart(fi, outFile.toString()); + checkMulti("tr1=This is test", null, null, "", "tr2=test2", null); + assertEquals(fi.entries.get(fiCount - 1).getRawProperties().length, 0); + checkMultiProps("tr2=test2", null, null, "tr1=This is test", "", "LOCKED", "xliff final"); + checkMultiEnd(); + } @Test public void testTags() throws Exception { diff --git a/test/src/org/omegat/filters4/Xliff1FilterTest.java b/test/src/org/omegat/filters4/Xliff1FilterTest.java index 17e897eb8e..da6f675633 100644 --- a/test/src/org/omegat/filters4/Xliff1FilterTest.java +++ b/test/src/org/omegat/filters4/Xliff1FilterTest.java @@ -29,6 +29,7 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; +import java.io.File; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -103,6 +104,29 @@ public void testTranslation() throws Exception { assertEquals("Devrait traduire dans le r\u00E9sultat.", entries.get(2).translation); } + @Test + public void testKeepProperties() throws Exception { + Xliff1Filter filter = new Xliff1Filter(); + String f = "test/data/filters/xliff/file-XLIFFFilter-state-final.xlf"; + org.omegat.core.data.IProject.FileInfo fi = loadSourceFiles(filter, f); + + checkMultiStart(fi, f); + checkMulti("This is test", "1", "//text.txt", null, null, null); + assertEquals(fi.entries.get(fiCount - 1).getRawProperties().length, 0); + checkMultiProps("test2", "2", "//text.txt", null, null, "LOCKED", "xliff final"); + checkMultiEnd(); + + translate(filter, new File(f).getPath()); + fi = loadSourceFiles(filter, outFile.toString()); + + checkMultiStart(fi, outFile.toString()); + checkMulti("This is test", "1", "//text.txt", null, null, null); + assertEquals(fi.entries.get(fiCount - 1).getRawProperties().length, 0); + checkMultiProps("test2", "2", "//text.txt", null, null, "LOCKED", "xliff final"); + checkMultiEnd(); + } + + /** * Test with live example of XLIFF version 1.2, as similar with exported * file from Crowdin service. diff --git a/test/src/org/omegat/gui/editor/mark/MarkerTestBase.java b/test/src/org/omegat/gui/editor/mark/MarkerTestBase.java index cb2509ab0a..aa4143f7f4 100644 --- a/test/src/org/omegat/gui/editor/mark/MarkerTestBase.java +++ b/test/src/org/omegat/gui/editor/mark/MarkerTestBase.java @@ -476,6 +476,9 @@ public void activateEntry() { public boolean isOrientationAllLtr() { return true; } - + + @Override + public void unlockSegment() { + } } } diff --git a/test/src/org/omegat/gui/matches/MatchesVarExpansionTest.java b/test/src/org/omegat/gui/matches/MatchesVarExpansionTest.java index 8a552c120e..1b93e659f8 100644 --- a/test/src/org/omegat/gui/matches/MatchesVarExpansionTest.java +++ b/test/src/org/omegat/gui/matches/MatchesVarExpansionTest.java @@ -473,6 +473,10 @@ public void activateEntry() { public boolean isOrientationAllLtr() { return true; } + + @Override + public void unlockSegment() { + } }; }