package foundation.data.meta.field; import foundation.data.entity.DictionaryTranslator; import foundation.json.IJSONWriter; import foundation.translator.ITranslator; import foundation.util.Util; public class FieldTranslateWriter extends FieldWriter { private String targetFieldName; private DictionaryTranslator dictionary; private boolean includeOrighinal; private Field targetField; private boolean active; public FieldTranslateWriter(String fieldName, int index, ITranslator translator, String targetFieldName, DictionaryTranslator dictionary, boolean includeOrighinal) { super(fieldName, index, translator); this.targetFieldName = targetFieldName; this.dictionary = dictionary; this.includeOrighinal = includeOrighinal; this.targetField = new Field(targetFieldName); FieldExtension extension = new FieldExtension(); extension.setFieldName(targetFieldName); extension.setAlign(Align.left); targetField.setExtension(extension); active = true; } @Override public void write(Object[] dataArray, IJSONWriter writer, boolean writeNull) { Object value = dataArray[index]; if (Util.isEmpty(value)) { if (!writeNull) { return; } else { writer.writeNull(fieldName); return; } } //1. 如果原有表中已经有了需要翻译的字段,就不需要再翻译了 String original = String.valueOf(value); if (!active) { writer.writeJSON(fieldName, Util.doubleQuotedStr(original)); return; } //2. 进行翻译 String target = dictionary.toValue(original); try { if (includeOrighinal) { writer.writeJSON(fieldName, Util.doubleQuotedStr(original)); } writer.writeJSON(targetFieldName, Util.doubleQuotedStr(target)); } catch (Exception e) { if (includeOrighinal) { writer.writeJSON(fieldName, "\"error\""); } writer.writeJSON(targetFieldName, "\"error\""); } } @Override public boolean hasDictionaryTranslator() { return true; } @Override public boolean includeOrighinal() { return includeOrighinal; } @Override public Field getTargetField() { return targetField; } public void setActive(boolean active) { this.active = active; } public Object getValue(Object value) { if (Util.isEmpty(value)) { return null; } //1. 如果原有表中已经有了需要翻译的字段,就不需要再翻译了 if (!active) { return value; } //2. 进行翻译 String original = String.valueOf(value); String target = dictionary.toValue(original); return target; } }