itemview.xslに表示されている件名(MeSH)を、言語が維持しているDSPaceインスタンスに翻訳したいと思います切り替えられる。以前は、以下のコードを使用しています(これをXSLUtils.java
クラスに追加しました)。Babelmeshサイトを参照して、その場で翻訳してください。ファイル内に翻訳がある場合、DSpaceの件名を翻訳または置換する方法
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
でそれを使用:今すぐ
<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
です。
これらのファイルの内容は、これらのように見えた:
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
)。
[dspace]/config/mesh
ディレクトリからこれらのファイルを検索し、その場で翻訳を行うことは可能でしょうか?
EDIT
私があるという用語は、翻訳ファイルに見つからない今までならば、それは返されるべきであることを追加したいと思います私が何を持っていることが予想されていないため(例えばsome random text
some random text
を返す必要があります)サブジェクトフィールドに入力するもの(つまり、バッチインポートを介して)を制御します。
ありがとうございます!あなたはファイルのパスを追加する必要がありdspace.cfgにで
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;
}
:
Adán、ありがとう。 IDEでエラーが発生しています。特に 'getClass()'の部分では、 "静的メソッド以外 'getClass()'は静的コンテキストから参照できません。また、このメソッドはどのようにしてメッシュ項を見つけることができますか?私は実際に 'ConfigurationManager.propertyNames'がファイルを参照するために使用されることを期待しています。事前にアドバイスと感謝をお願いします。 – euler
コードを変更してコンパイルしましたが、試してみません。 –
こんにちはAdán。私は私のIDEでテストするためにこのコードを追加しました: 'public static void main(String [] args){XSLUtils s = new XSLUtils(); System.out.println(lookupMeSH(" Health "、" fr ")); } 'また、' String mterms_frPath'の値をファイルの絶対パスに置き換えました。コードを実行すると、次のようなエラーが発生しました。「例外のスレッド」main「java.lang.NullPointerException \t at org.dspace.app.xmlui.utils.XSLUtils.lookupMeSH(XSLUtils.java:145)」このコード行は 'translated = french.getProperty(term);'です。このファイルの内容が読み込まれていないようです。助けてくれてありがとう。更新されたコードをお寄せいただきありがとうございます。 – euler