Java 如果文件中有翻译,如何翻译或替换DSpace中的主题术语

Java 如果文件中有翻译,如何翻译或替换DSpace中的主题术语,java,xslt-1.0,dspace,Java,Xslt 1.0,Dspace,如果切换了语言,我想在我正在维护的DSPace实例中翻译item-view.xsl中显示的subject(MeSH)术语。之前,我使用下面的代码(我在XSLUtils.javaclass中添加了此代码)查找Babelmesh站点并动态翻译它 public static String lookupBabelMeSH(String term, String lang) { try { URLConnection babelMeshConn = (new URL("ht

如果切换了语言,我想在我正在维护的DSPace实例中翻译item-view.xsl中显示的subject(MeSH)术语。之前,我使用下面的代码(我在
XSLUtils.java
class中添加了此代码)查找Babelmesh站点并动态翻译它

    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>
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::加速度
如果您注意到,
是英语术语和翻译之间的分隔符。如果没有该术语的翻译,则保留英文术语(例如
杀螨剂

那么,是否可以从
[dspace]/config/mesh
目录中查找这些文件,并动态进行翻译

编辑

我想补充一点,如果在翻译文件中找不到术语,应该按原样返回(例如
一些随机文本
应该返回
一些随机文本
),因为我无法控制用户在主题字段中输入的内容(即通过批量导入)


提前谢谢

您可以尝试以下方法(添加到XSLUtils.java中):

在dspace.cfg中,应添加文件路径:

mterms_zh.path= /put/the/file/path
mterms_fr.path=/home/dspace_instalation/config/mterms_fr
检查langs比较和文件请求

然后改变:

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

阿丹,谢谢你。但我的IDE中有错误。特别是在
getClass()
部分,其中说“非静态方法'getClass()'不能从静态上下文引用”。此外,该方法如何定位网格项?实际上,我希望
ConfigurationManager.propertyNames
将用于引用这些文件。请提前提出建议和感谢。我修改了代码并编译了它,但我没有试过。嗨,阿丹。我在IDE中添加了以下测试代码:
publicstaticvoidmain(String[]args){XSLUtils s=new XSLUtils();System.out.println(lookupMeSH(“Health”,“fr”);}
我还将
String mterms\u frPath
的值替换为文件的绝对路径。当我运行代码时,我收到了以下错误:
线程“main”java.lang.NullPointerException中的异常位于org.dspace.app.xmlui.utils.XSLUtils.lookupMeSH(XSLUtils.java:145)
,它指的是这行代码:
translated=french.getProperty(term)。此文件的内容似乎未加载。再次感谢您的帮助。感谢更新的代码。在使用不同的术语运行了多个测试之后,我发现该代码对于有空格的术语不起作用(例如
加速的心室内节律
)。它返回了
null
。请尝试用\u0020替换术语文件中的空格。一个两个=值到一个\u00202=值
mterms_zh.path= /put/the/file/path
mterms_fr.path=/home/dspace_instalation/config/mterms_fr
<xsl:value-of select="util:lookupBabelMeSH(node(),$current-locale)"/>
<xsl:value-of select="util:lookupMeSH(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")); }
}