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

2024-04-10

如果语言切换,我想翻译我正在维护的 DSPace 实例中 item-view.xsl 中显示的主题(MeSH)术语。以前我使用下面的代码(我将其添加到XSLUtils.java类)来查找 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>

现在,我想翻译文本,而不是每次切换语言时都调用 BabelMesh 站点,因为请求数量有限制。此外,由于 BabelMesh 的 url 是硬编码的,因此对 BabelMesh 服务的任何更改都会破坏翻译的渲染。我只需要把这些术语翻译成中文和法文。我的翻译位于[dspace]/config/mesh目录。这些文件被命名为mterms_fr and 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)因为预计我无法控制用户将在主题字段中输入的内容(即通过批量导入)。

提前致谢!


您可以尝试这样的操作(添加到 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 中,您应该添加文件的路径:

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)"/>

for

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

在 xsl 处

并将文件分隔符从“::”替换为“=”

添加了完整的跑步课程:

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")); }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我的文件中有翻译,如何在 DSpace 中翻译或替换主题术语 的相关文章

随机推荐