[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[upki-fed:00489] localization of Shibboleth IdP



土屋です.

Java Servlet に慣れている人にとっては楽勝の話なんでしょうけど,初めての作
業で試行錯誤しながらやったので,せっかくですから手順を報告します.

Java Servlet の localize については,2通りの方法があります.
第1は,primitive に java.util.ResourceBundle を用いる方法,第2は,JSTL を
使う方法です.ここでは,JSTL を使う方法を報告します.

(1) Apache Taglibs からライブラリをダウンロードして,展開.

    wget http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/jakarta-taglibs-standard-1.1.2.zip
    unzip -x jakarta-taglibs-standard-1.1.2.zip

(2) 必要なライブラリは jstl.jar と standard.jar の2つです.他のライブラリ
と見分けがつくように,適当に名前を変更しながらコピーしました.

    mkdir /opt/shibboleth-idp-2.x/src/main/webapp/WEB-INF/lib
    cp -p jakarta-taglibs-standard-1.1.2/lib/jstl.jar /opt/shibboleth-idp-2.x/src/main/webapp/WEB-INF/lib/jakarta-taglibs-jstl-1.1.2.jar
    cp -p jakarta-taglibs-standard-1.1.2/lib/standard.jar /opt/shibboleth-idp-2.x/src/main/webapp/WEB-INF/lib/jakarta-taglibs-standard-1.1.2.jar

(3) メッセージ用のプロパティファイルを用意します.プロパティファイルは,
クラスパスの通っている個所に置く必要があります.とりあえず,

    日本語用プロパティファイルは WEB-INF/classes/mymessage_ja.properties
    デフォルトのプロパティファイルは WEB-INF/classes/mymessage.properties

に置くことにしました.

mymessage.properties は以下のような感じです.

==== mymessage.properties ここから ====
login.username = Username
login.password = Password
login.authfail = Credentials not recognized.
login.continue = Continue
==== mymessage.properties ここまで ====

mymessage_ja.properties は,unicode エスケープした形式で置く必要がありま
す.そのため,前段階として,unicode のプロパティファイルを作ります.

==== mymessage_ja.properties.utf8 ここから ====
login.username = ユーザ名
login.password = パスワード
login.authfail = ユーザ名またはパスワードが違います.
login.continue = 次に進む
==== mymessage_ja.properties.utf8 ここまで ====

これを,native2ascii コマンドで変換して,日本語用プロパティファイルにしま
す.

    native2ascii mymessage_ja.properties.utf8 mymessage_ja.properties

(4) login.jsp でメッセージ用プロパティファイルを使うための記述をします.
最初に文字コードを宣言.

    <%@ page contentType="text/html; charset=UTF-8" %>

JSTL のパッケージをロード.

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

ブラウザから送信された accept-language にしたがって言語を選択.

    <fmt:setLocale value="${pageContext.request.locale}" />

適切なプロパティファイルを開く.

    <fmt:bundle basename="mymessage">
    〜内部〜
    </fmt:bundle>

すると,内部では,<fmt:message key="〜"> で文字列を取り出せるようになりま
す.これらをまとめると,以下のようになります.

==== login.jsp ここから ====
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="urn:mace:shibboleth:2.0:idp:ui" prefix="idpui" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<fmt:setLocale value="${pageContext.request.locale}" />
<fmt:bundle basename="mymessage">
<html>
  <head>
    <title>Shibboleth Identity Provider, Example - Login</title>
    <link rel="stylesheet" type="text/css" href="<%= request.getContextPath()%>/login.css"/>
  </head>
  <body>
    <img src="<%= request.getContextPath()%>/images/logo.jpg" alt="Shibboleth Logo"/>
    <h1>Shibboleth Identity Provider Login</h1>
    <% if ("true".equals(request.getAttribute("loginFailed"))) { %>
       <p><font color="red"><fmt:message key="login.authfail"/></font> </p>
    <% } %>
    <% if(request.getAttribute("actionUrl") != null){ %>
       <form action="<%=request.getAttribute("actionUrl")%>" method="post">
    <% }else{ %>
       <form action="j_security_check" method="post">
    <% } %>
    <table>
      <tr><td><label for="username"><fmt:message key="login.username"/>:</label></td><td><input name="j_username" type="text" id="username" autocapitalize="off" /></td></tr>
      <tr><td><label for="password"><fmt:message key="login.password"/>:</label></td><td><input name="j_password" type="password" id="password" /></td></tr>
      <tr><td></td><td><input type="submit" value="<fmt:message key="login.continue"/>" />
    </table>
    </form>
  </body>
</html>
</fmt:bundle>
==== login.jsp ここまで ====

(5) Shibboleth IdP を再デプロイ.

初めての作業で試行錯誤しながらやったので,もっと良い方法があればコメント
をお願いします.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )