2016-11-13 19 views
4

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_frmterms_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 textsome 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; 
      } 

答えて

3

あなたはこの(XSLUtils.javaに追加された)のような何かを試すことができ

mterms_zh.path= /put/the/file/path 
mterms_fr.path=/home/dspace_instalation/config/mterms_fr 

チェックlangsのcomparationsとファイルadquisition 。

、その後変更:XSL

<xsl:value-of select="util:lookupMeSH(node(),$current-locale)"/> 

ため

<xsl:value-of select="util:lookupBabelMeSH(node(),$current-locale)"/> 

をそしてからファイルの区切りを置き換える "::" を "="

がフル稼働を追加しましたクラス:

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")); } 
} 
+0

Adán、ありがとう。 IDEでエラーが発生しています。特に 'getClass()'の部分では、 "静的メソッド以外 'getClass()'は静的コンテキストから参照できません。また、このメソッドはどのようにしてメッシュ項を見つけることができますか?私は実際に 'ConfigurationManager.propertyNames'がファイルを参照するために使用されることを期待しています。事前にアドバイスと感謝をお願いします。 – euler

+0

コードを変更してコンパイルしましたが、試してみません。 –

+0

こんにちは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

関連する問題