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;
}
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>
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::加速度
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
).
So would it be possible to just lookup to these files from the [dspace]/config/mesh
directory and do the translation on-the-fly?
EDIT
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).
Thanks in advance!
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;
}
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.
then change:
<xsl:value-of select="util:lookupBabelMeSH(node(),$current-locale)"/>
for
<xsl:value-of select="util:lookupMeSH(node(),$current-locale)"/>
at the xsl
And replace the files separator from "::" to "="
ADDED full running class:
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")); }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With