/**************************************************************************
OmegaT - Computer Assisted Translation (CAT) tool
with fuzzy matching, translation memory, keyword search,
glossaries, and translation leveraging into updated projects.
Copyright (C) 2008 Alex Buloichik
2010 Didier Briel
2014-2015 Alex Buloichik
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.core.data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.omegat.core.statistics.StatisticsInfo;
import org.omegat.tokenizer.ITokenizer;
import org.omegat.util.Language;
/**
* Interface for access to loaded project. Each loaded project will be new instance of IProject.
*
* @author Alex Buloichik (alex73mail@gmail.com)
* @author Didier Briel
*/
public interface IProject {
/**
* Save project properties only.
*/
void saveProjectProperties() throws Exception;
/**
* Save project.
*/
void saveProject(boolean doTeamSync);
/**
* Prepare for team synchronization from save thread.
*/
void teamSyncPrepare() throws Exception;
/**
* Check if team synchronization prepared.
*/
boolean isTeamSyncPrepared();
/**
* Execute synchronization.
*/
void teamSync();
/**
* Close project.
*/
void closeProject();
/**
* Create translated documents.
*/
void compileProject(String sourcePattern) throws Exception;
/**
* Get project properties.
*
* @return project properties
*/
ProjectProperties getProjectProperties();
/**
* Get project loaded status.
*
* @return true if project loaded
*/
boolean isProjectLoaded();
/**
* Is project modified ?
*/
boolean isProjectModified();
/**
* Returns tokenizer for source language.
*/
ITokenizer getSourceTokenizer();
/**
* Returns tokenizer for target language.
*/
ITokenizer getTargetTokenizer();
/**
* Get all source segments. It's unmodifiable list, so, there is no need synchronization to read it.
*/
List<SourceTextEntry> getAllEntries();
/**
* Set translation for entry.
*
* Optimistic locking will not be checked.
*
* @param entry
* entry
* @param trans
* translation. It can't be null
*/
void setTranslation(SourceTextEntry entry, PrepareTMXEntry trans, boolean defaultTranslation,
TMXEntry.ExternalLinked externalLinked);
/**
* Set translation for entry with optimistic lock checking: if previous translation is not the same like
* in storage, OptimisticLockingFail exception will be generated. Use when user has typed a new
* translation.
*
* @param entry
* entry
* @param trans
* translation. It can't be null
*/
void setTranslation(SourceTextEntry entry, PrepareTMXEntry trans, boolean defaultTranslation,
TMXEntry.ExternalLinked externalLinked, AllTranslations previousTranslations)
throws OptimisticLockingFail;
/**
* Change note only for translation.
*
* @param entry
* entry
* @param oldTrans
* old translation
* @param note
* note text
*/
void setNote(SourceTextEntry entry, TMXEntry oldTrans, String note);
/**
* Get statistics for project.
*
* @return
*/
StatisticsInfo getStatistics();
/**
* Get translation info for specified entry. It looks first for multiple, then for default. This method
* ALWAYS returns TMXEntry, because note can exist even for non-translated segment. Use
* TMXEntry.isTranslated() for check if translation text really exist. Translation can be checked for
* default/alternative by the TMXEntry.defaultTranslation.
*
* @param ste
* source entry
* @return translation
*/
TMXEntry getTranslationInfo(SourceTextEntry ste);
/**
* Get default and alternative translations for optimistic locking.
*/
AllTranslations getAllTranslations(SourceTextEntry ste);
/**
* Iterate by all default translations in project.
*/
void iterateByDefaultTranslations(DefaultTranslationsIterator it);
/**
* Iterate by all multiple translations in project.
*/
void iterateByMultipleTranslations(MultipleTranslationsIterator it);
/**
* Check if orphaned.
*/
boolean isOrphaned(String source);
/**
* Check if orphaned.
*/
boolean isOrphaned(EntryKey entry);
/**
* Get all translation memories from /tm/ folder.
*
* @return translation memories
*/
Map<String, ExternalTMX> getTransMemories();
/**
* Get all translation memories from /other_lang/ folder.
*
* @return translation memories
*/
Map<Language, ProjectTMX> getOtherTargetLanguageTMs();
/**
* Get info about each source file in project. It's unmodifiable list, so, there is no need
* synchronization to read it.
*/
List<FileInfo> getProjectFiles();
/**
* For a given source file, calculate the path of the target file that would be created
* by running Create Translated Documents (the file may not exist yet).
* <p>
* The target path must be calculated because it can depend on project properties such
* as the target language, etc.
*
* @param sourceFile The relative path (under the <code>source</code> directory) of the
* source file, e.g. <code>Bundle.properties</code>
* @return The relative path (under the <code>target</code> directory) of the corresponding
* target file, e.g. <code>Bundle_fr_FR.properties</code>
*/
String getTargetPathForSourceFile(String sourceFile);
/**
* Get ordered list of source file names.
*/
List<String> getSourceFilesOrder();
/**
* Set ordered list of source file names.
*/
void setSourceFilesOrder(List<String> filesList);
public static class FileInfo {
public String filePath;
/**
* IFilter implementing Class that was used to parse the file
*/
public Class<?> filterClass;
/**
* Human readable name of the file format as defined by the filter.
*/
public String filterFileFormatName;
/**
* Characterset name used for parsing the source file.
*/
public String fileEncoding;
public List<SourceTextEntry> entries = new ArrayList<SourceTextEntry>();
}
public interface DefaultTranslationsIterator {
void iterate(String source, TMXEntry trans);
}
public interface MultipleTranslationsIterator {
void iterate(EntryKey source, TMXEntry trans);
}
/**
* These translations can't be null. Only value or EMPTY_TRANSLATION.
*/
public class AllTranslations {
protected TMXEntry defaultTranslation;
protected TMXEntry alternativeTranslation;
protected TMXEntry currentTranslation;
public TMXEntry getDefaultTranslation() {
return defaultTranslation;
}
public TMXEntry getAlternativeTranslation() {
return alternativeTranslation;
}
public TMXEntry getCurrentTranslation() {
return currentTranslation;
}
}
/**
* Exception for optimistic locking fail. Used when segment changed remotely or by automatic translation,
* but user also changed data.
*/
@SuppressWarnings("serial")
public class OptimisticLockingFail extends Exception {
private final String oldTranslationText;
private final String newTranslationText;
private final AllTranslations previous;
public OptimisticLockingFail(String oldTranslationText, String newTranslationText,
AllTranslations previous) {
this.oldTranslationText = oldTranslationText;
this.newTranslationText = newTranslationText;
this.previous = previous;
}
public String getOldTranslationText() {
return oldTranslationText;
}
public String getNewTranslationText() {
return newTranslationText;
}
public AllTranslations getPrevious() {
return previous;
}
}
}