如果文件中有翻译,如何在 DSpace 中翻译或替换主题术语 [英] How to translate or replace subject terms in DSpace if I have the translations in a file
问题描述
如果语言切换,我想在我维护的 DSPace 实例中翻译 item-view.xsl 中显示的主题 (MeSH) 术语.以前我使用下面的代码(我在 XSLUtils.java
类中添加了它)来查找 Babelmesh 站点并即时翻译它.
I would like to translate the subject(MeSH) terms displayed in item-view.xsl in the DSPace instance that I'm maintaining if the language is switched. Previously I am using the code below (I added this in XSLUtils.java
class) to lookup to Babelmesh site and translate it on the fly.
public static String lookupBabelMeSH(String term, String lang) {
try {
URLConnection babelMeshConn = (new URL("https://babelmesh.nlm.nih.gov/mesh_trans.php?oterm=" + URLEncoder.encode(term, "UTF-8") + "&in=ENG&out=" + lang)).openConnection();
babelMeshConn.setConnectTimeout(5000);
babelMeshConn.setReadTimeout(5000);
BufferedReader in = new BufferedReader(new InputStreamReader(babelMeshConn.getInputStream(), "UTF-8"));
String value = in.readLine();
in.close();
if (!StringUtils.isEmpty(value)) {
return value;
}
} catch (MalformedURLException mue) {
} catch (IOException ioe) {
}
return null;
}
然后我在 item-view.xsl
中像这样使用它:
I then used it in item-view.xsl
like this:
<xsl:choose>
<xsl:when test="$active-locale!='en'">
<xsl:variable name="current-locale">
<xsl:if test="$active-locale='fr'">
<xsl:text>FRE</xsl:text>
</xsl:if>
<xsl:if test="$active-locale='zh'">
<xsl:text>CHN</xsl:text>
</xsl:if>
</xsl:variable>
<xsl:variable name="translation">
<xsl:value-of select="util:lookupBabelMeSH(node(),$current-locale)"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$translation=''">
<xsl:value-of select="node()"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$translation"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="node()"/>
</xsl:otherwise>
</xsl:choose>
现在,我想在每次切换语言时不调用 BabelMesh 站点的情况下翻译文本,因为请求数量有限制.此外,由于 BabelMesh 的 url 是硬编码的,对 BabelMesh 服务的任何更改都会破坏翻译的渲染.我只需要将这些条款翻译成中文和法文.我有位于 [dspace]/config/mesh
目录中的翻译.这些文件分别命名为 mterms_fr
和 mterms_zh
用于法语和中文翻译.
Now, I would like to translate the text without calling BabelMesh site everytime the language is switched since there's a limit to the number of requests. Also, since the url to BabelMesh is hardcoded, any changes to BabelMesh service will break the rendering of the translation. I only need to translate the terms into chinese and french. I have the translations located in [dspace]/config/mesh
directory. The files are named mterms_fr
and mterms_zh
for french and chinese translations respectively.
这些文件的内容如下所示:
The contents of these files looked like these:
mterms_fr
Acanthocheilonemiasis::acanthocheilonemiase
Acanthocytes::ACANTHOCYTE
Acantholysis::ACANTHOLYSE
Acanthoma::ACANTHOME
Acanthopodina::ACANTHOPODINA
Acanthosis Nigricans::ACANTHOSIS NIGRICANS
Acarbose::ACARBOSE
Acari::ACARIEN
Acaricides::Acaricides
Acaridae::ACARIDAE
Acatalasia::ACATALASIE
Accelerated Idioventricular Rhythm::RYTHME IDIOVENTRICULAIRE ACCELERE
Acceleration::ACCELERATION
mterms_zh
Acanthocheilonemiasis::棘唇虫病
Acanthocytes::棘形红细胞
Acantholysis::皮肤棘层松解
Acanthoma::棘皮瘤
Acanthopodina::Acanthopodina
Acanthosis Nigricans::Acanthosis Nigricans
Acarbose::Acarbose
Acari::Acari
Acaricides::Acaricides
Acaridae::Acaridae
Acatalasia::Acatalasia
Accelerated Idioventricular Rhythm::Accelerated Idioventricular Rhythm
Acceleration::加速度
如果您注意到,::
是英文术语和翻译之间的分隔符.如果该术语没有翻译,则保留英文术语(例如 Acaricides
).
If you noticed, the ::
is the separator between the english terms and the translations. If there's no translation for that term, the english term is retained (eg Acaricides
).
那么是否可以仅从 [dspace]/config/mesh
目录中查找这些文件并即时进行翻译?
So would it be possible to just lookup to these files from the [dspace]/config/mesh
directory and do the translation on-the-fly?
编辑
我想补充一点,如果在翻译文件中找不到该术语,则应按原样返回(例如 some random text
应返回 some random text
) 因为我无法控制用户将在主题字段中输入的内容(即通过批量导入).
I would like to add that if ever the term is not found in the translation file, it should be returned as is (eg some random text
should return some random text
) since it is expected that I have no control to what users will input in the subject field (ie via batch import).
提前致谢!
推荐答案
你可以尝试这样的事情(添加到 XSLUtils.java):
You can try something like this (added to XSLUtils.java):
private static Properties chinnese = null;
private static Properties french = null;
static{
try {
chinnese = new Properties();
String mterms_zhPath=ConfigurationManager.getProperty("mterms_zh.path");
chinnese.load(new InputStreamReader(new FileInputStream(new File(mterms_zhPath)), "UTF8"));
french = new Properties();
String mterms_frPath=ConfigurationManager.getProperty("mterms_fr.path");
french.load(new InputStreamReader(new FileInputStream(new File(mterms_frPath)), "UTF8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String lookupMeSH(String term, String lang) {
String translated=null;
if("zh".equals(lang)){
translated=chinnese.getProperty(term);
}else if("fr".equals(lang)){
translated=french.getProperty(term);
}
return translated;
}
在 dspace.cfg 你应该添加文件的路径:
At dspace.cfg you should add the path of files:
mterms_zh.path= /put/the/file/path
mterms_fr.path=/home/dspace_instalation/config/mterms_fr
检查语言比较和文件获取.
check langs comparations and file adquisition.
然后改变:
<xsl:value-of select="util:lookupBabelMeSH(node(),$current-locale)"/>
为了
<xsl:value-of select="util:lookupMeSH(node(),$current-locale)"/>
在 xsl
并将文件分隔符从::"替换为="
And replace the files separator from "::" to "="
添加完整运行类:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
public class Test3 {
private static Properties chinnese = null;
private static Properties french = null;
static{
chinnese = new Properties();
try {
String mterms_zhPath="D:/mterms_fr";
chinnese.load(new InputStreamReader(new FileInputStream(new File(mterms_zhPath)), "UTF8"));
french = new Properties();
String mterms_frPath="D:/mterms_fr";
french.load(new InputStreamReader(new FileInputStream(new File(mterms_frPath)), "UTF8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static String lookupMeSH(String term, String lang) {
String translated=null;
if("zh".equals(lang)){
translated=chinnese.getProperty(term);
}else if("fr".equals(lang)){
translated=french.getProperty(term);
}
return translated;
}
public static void main (String [] args) {
// Test3 test3=new Test3();
//XSLUtils s = new XSLUtils();
System.out.println(lookupMeSH("Acari", "fr")); }
}
这篇关于如果文件中有翻译,如何在 DSpace 中翻译或替换主题术语的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!