Wednesday, February 27, 2013

Klingon use CmisSync!

弊社製品CmisSyncクリンゴン語に翻訳しました。

言語リソースの翻訳はここで行われています。
翻訳作業は、自然言語と人工言語を趣味としている筆者(linzhixing)が担当しました。プログラミング言語は仕事で使っています。(主にJavaと、最近はRubyも)


[CmisSyncって?]
◆弊社の開発するCmisSyncというソフトウェアは、このブログでも既に紹介されていますが、AlfrescoなどのCMIS対応サーバとローカルPCの間で双方向の同期ができるDropbox風のツールです。

     Alfrescoに限らずMicrosoft SharepointやIBM FileNetなど、社内のECM(文書管理システム)サーバが文書をやり取りするCMISという標準規格に対応したものであれば、更新のあった文書がCmisSyncで自動的に同期されて、出先などオフライン/オンラインを問わずシームレスな作業が可能になります。


[クリンゴン語って?]

◆クリンゴン語は、SFテレビシリーズ『スタートレック』に登場するクリンゴン人が使用する架空の言語です。

  宇宙語の一種なので、ソフトウェアの多言語対応(globalization)としては地球(globe)の範囲を超えてしまっているきらいもありますが、便利なCmisSyncを、高度な情報技術を有する数多くのクリンゴン人やクリンゴン語を話す地球人の方々にも触れてもらいたいと思い、翻訳してみました。(英語と)クリンゴン語以外に、すでに日本語、フランス語、ウクライナ語などに翻訳されています。

◆ISO639(言語名コードの規格)によって、jaやenと同様に、tlhというコードが割り当てられています。OSやブラウザにもよりますが、言語コードを変更することでCmisSyncがクリンゴン語化されます。

     Windowsの場合は、コントロールバネル>>地域と言語>>フォーマットの値を切り替えると、対応する言語でCmisSyncのUIが表示されます。(直接は選択できないかもしれませんが……)

     "tlh"というのは不思議なスペルですが、これで一つの子音を表します。この発音はとても難しいので省略しますが、クリンゴン語を象徴する音で、クリンゴン語でクリンゴン語のことはtlhIngan Holと書きます。

◆クリンゴン語を言語として整備した言語学者マーク・オクランド氏が、Klingon Dictionaryという辞書を出しています。クリンゴン語の文法も単語も、事実上この本を基準とすることになります。ネット上でも、この本をなぞった解説サイトがいくつかありますので興味がある方は検索してみてください。


[Pick Up!]
Klingon Dictionaryには、約3000の単語しか含まれていません。また、クリンゴン人が戦闘民族であるためか、内容にも偏りがあるので、翻訳するときは上手い意訳・造語を考える必要があります。

そこで、翻訳が難しかったところや興味深かったポイントをいくつかピックアップしてみました。


Enterprise Content Management
     「enterprise」は難しい英語で、「組織」とも「冒険」とも少しずつニュアンスが違いますが、クリンゴン語とは実はとても相性のよい言葉です。そうです、エンタープライズ号は"enterpray"と呼ばれています。

       訳語: enterpray ngaSghach vu'ghach

Welcome to CmisSync!
  クリンゴン語は戦士の言葉なので、気安く「ようこそ」と挨拶することはありません。が、文明を有している限り(他の文明からそうは見えないとしても)挨拶に似たものは持っています。彼らの場合、nuqneH?「何か用か?」 というのが私たちのいう挨拶のようです。

     ちなみにCmisSyncのリソース多言語化にはcrowdinというサービスが使われていますが、ここで翻訳文を入力するとき、原文が"!"で終わっていれば訳文も"!"で終わっていないと警告表示が出ます。Welcome!のエクスクラメーションマークがnuqneH?のクエスチョンマークになるあたり、異文化の味わいがありますね。 

     訳語: CmisSyncDaq nuqneH?

Please…
     ヨーロッパ系の言語では、ソフトウェアのダイアログやメニューバーの「開く」や「戻る」は動詞の命令形ではなく不定詞で書かれることが一般的です。日本語でいうと「開け!」ではなく「開く」と書いてあるわけです。

     クリンゴン語でも、命令形ではなく動詞の原形を使うように訳しました。ただし、元の英語がPleaseで始まっている文章の場合は不定詞ではニュアンスが 出ません。命令形でもよいですが、クリンゴン語では何かを特に強く要請する場合、〜be'chugh bIHegh!「〜しないとお前は死ぬぞ!」という言い回しをします。物騒ですが、戦士の言葉なので仕方ありません。

     訳語: -be'chugh bIHegh!

synchronize
     クリンゴン語はよりによってsynchronizeを意味する単語がありません。CmisSyncは固有名詞だからそのままでよいとしても、これはCmisSyncの翻訳の根本を揺るがす由々しき事態です。しかし、クリンゴン語はたしかにボキャブラリに偏りがあるものの、幸いなことに強力な造語能力も兼ね備えています。名詞や動詞の前や後ろに、規則的に接辞を付けることで意味を変化させられるのです。

     たとえば、poS「開いている」に対しpoS-moH「開ける」、ja'「話す」に対しqa-ja'-qang「私は自主的にあなたに話す」など。

     rap「同じである」という動詞はあるので、rapmoH =「同じにする」=synchronize、という造語を作ってみました。さらに、synchronizationはrapmoHghachとなります。

     訳語: rapmoH

document / folder
     戦士であるだけでなく高度なテクノロジーと共に宇宙を駆ける彼らのこと、De'wI'「コンピュータ」やDe'「データ」、さらにtebwI'「サーバ」といった単語も存在しています。しかし、CmisSyncにとって重要なドキュメント/フォルダを意味する単語は見当たりません。

    ひとまずの訳語・造語として、ドキュメント=paper (eng.) =nav、フォルダ=container (eng.) = ngaSwI' としてみました。ngaSは英語の"contain"の意味で、-wI'を付けると行為者名詞にできます。

     この訳はベストではないかもしれません。クリンゴン語のフォーラムでは既に良い訳が作られているかもしれません。フィードバックをいただければ嬉しいです。

     訳語: nav / ngaSwI'


[最後に]
◆クリンゴン語への翻訳を通して、"Language is Open Source!"という思いを新たにしました。ぴったり来る単語や言い回しがないのなら自分で作ってしまえばいいのです。そのための材料(単語)もルール(文法)も公開されています。

     翻訳に使われているcrowdinは、誰もが翻訳することのできるコラボレーティブ型翻訳プラットホームなので、気軽にご参加ください。たとえ訳に自信がないところがあっても、他の人が修正してくれるでしょう。

     とくに筆者は『スタートレック』を一度も観たことがありませんので、本当のクリンゴン人はもっと自然な言い回しをしていた、などご指摘いただければと思います。

     CmisSyncはオープンソースソフトウェアで、現在も随時バージョンアップを重ねています。ぜひお使いください!

Wednesday, February 20, 2013

CmisSync:AlfrescoのためのDropboxのような同期ツール

CmisSync を使うと、あなたのPCと社内 Alfresco を簡単に同期できます。
オフラインでも、ドキュメントの閲覧と編集を行えます。


ステップ1

まず .NET Framework、次に CmisSync をインストールしましょう。

ステップ2

CmisSync を実行してください。
チュートリアル画面が終わると、タスクトレイに CmisSync のアイコンが追加されます。


アイコンを右クリックして、「リモートフォルダを追加...」を選択します。

ステップ3

表示された画面の「URL」フィールドに、Alfresco サーバの URL を入力します(ブラウザで Alfresco のドキュメントを閲覧する為のURL):


プロトコル( http:// か https:// )も必要です。
ユーザ名とパスワードも入力してください。

ステップ4

「次」を押すと、Alfrescoのフォルダのリストが表示されます。
同期したいフォルダを選択してください。
とくにAlfresco Share の場合は「Sites」をクリックして、同期したい Site を選び、その「documentLibrary」を選択してください。

  
設定はこれで終了です。
CmisSync はすぐに Alfresco とあなたのPCとの同期を開始します。
CmisSync はファイルの編集・追加を双方向で行えます。
もしもファイルの変更が衝突した場合、警告が表示されます。衝突した2つのファイルはバックアップされている為、後でマージすることも可能です。

CmisSyncはイージフが開発しているオープンソース製品です。
Alfrescoだけではなく、NuxeoやIBM FileNetやSharePointなど、CMIS準拠のリポジトリならなんでも同期できます。

Thursday, February 14, 2013

AlfrescoのJavaScriptコードをデバッグする

こんにちは。大谷です。

今日はAlfrescoでJavaScriptのデバッグを行う際に便利な機能をまとめてみました。Alfrescoをカスタマイズする際にJavaScriptを触ることも多いかと思いますので、その際に参考にしてみてください。


一言でJavaScriptって言っても


Alfrescoでは、サーバサイド、クライアントサイド(ブラウザですね)の両方でJavaScriptのコードが実行されます。サーバサイドでのJavaScript実行にはRhino(JavaによるJavaScript実装)を利用しています。
 また、Alfrescoはリポジトリのコア機能を提供するalfresco、UIレイヤを提供するshareの2アプリケーションから構成されています。
従って、 一言でJavaScriptと言っても、実際にはサーバサイドJavaScript(alfresco, shareの両者で実行)とクライアントサイドJavaScript(shareが提供)の計3ヶ所について、それぞれ個別にデバッグの方法を考えなくてはなりません。



サーバサイドJavaScript(alfrescoアプリケーション)


alfrescoアプリケーションのサーバサイドJavaScriptは主に、Web Scriptsと呼ばれる、簡単にREST APIを作ることのできるフレームワークを利用する際に使われます。

まずはデバッグツールですが、AlfrescoにはRhinoで実行されるJavaScriptをデバッグするための仕組みが用意されています。まず、http://localhost:8080/alfresco/service/api/javascript/debuggerにアクセスし、管理者のログイン情報を入力します。すると以下の画面が表示されるので「Enable」をクリックします。



あとは、通常どおりAlfrescoにアクセスすればOKです。JavaScript Debuggerのダイアログが表示され、あとはJavaScriptが実行されるタイミングで適切に割り込みが入るので、ブレークポイントを設定するなり変数をウォッチするなりすることができます。




次に、ログの出力方法を見てみます。まず、JavaScriptにログ出力を仕込むには、Alfresco JavaScript APIのLogging APIを利用します(詳しくは4.0 JavaScript API - alfrescowikiを参照)。さらに、log4jの設定を変更してログレベルを適切に設定する必要があります。

<alf_dir>/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties
log4j.logger.org.springframework.extensions.webscripts=debug
log4j.logger.org.springframework.extensions.webscripts.ScriptLogger=debug
これで、JavaScript内で仕込んだログがAlfrescoログに出力されるようになります。もちろんログレベル変更後にはAlfrescoサーバの再起動が必要です。


サーバサイドJavaScript(shareアプリケーション)


次にshareアプリケーションのサーバサイドJavaScriptについてですが、基本的にはalfrescoアプリケーションのJavaScriptと同様の方法になります。デバッガを有効にするには、http://localhost:8080/share/service/api/javascript/debugger(URLのalfrescoがshareに変わってることに注意!)にアクセスすればよいだけですし、ログは<alf_dir>/tomcat/webapps/share/WEB-INF/classes/log4j.properties(こちらもファイルパスのalfrescoがshareに変わっていることに注意!)を先ほどと同じように設定するだけでOKです。


クライアントサイドJavaScript(shareアプリケーション)


最後はクライアントサイドのJavaScriptです。これは、UIレイヤを担当するshareアプリケーションがブラウザに実行させるスクリプトということになります。UIカスタマイズの際にいじることがほとんどで、<alf_dir>/tomcat/webapps/share/components/あたりにあるファイルがそれに該当します。

まずデバッグについてですが、ブラウザ上で実行されるJavaScriptのデバッグになるので、ブラウザごとに利用可能なデバッグツールを利用してください。筆者の場合は、FirefoxならFirebugとか、IEならF12で起動する開発者ツールとか、Chromeならctrl+shift+Iで起動するデベロッパーツールとかを主に使っています。

ログ出力に関しても、Alfrescoにはlog4javascriptを利用した仕組みが用意されています。まずは、以下のファイルの当該箇所を以下のように変更し、Alfrescoを再起動します。

<alf_dir>/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml
<alfresco-config>

   <!-- Global config section -->
   <config replace="true">
      <flags>
         <!--
            Developer debugging setting to turn on DEBUG mode for client scripts in the browser
         -->
         <client-debug>true</client-debug>

         <!--
            LOGGING can always be toggled at runtime when in DEBUG mode (Ctrl, Ctrl, Shift, Shift).
            This flag automatically activates logging on page load.
         -->
         <client-debug-autologging>true</client-debug-autologging>
      </flags>
   </config>

   ...

</alfresco-config>
これで、Alfrescoアクセス時にlog4javascriptのダイアログが表示されるようになり、このダイアログ上でログを確認できるようになります。もしくは、client-debug-autologgingをfalseにしておき、必要なタイミングでCtrl, Ctrl, Shift, Shiftと入力することでもこのダイアログを表示させることができます。



ログ出力を新たに埋め込む場合は、Alfresco.loggerという名前のlog4javascriptロガーオブジェクトを利用します。例えば以下のように記述します(詳しくはlog4javascript manualのloggersを参照)。

Alfresco.logger.info("test");
Alfresco.logger.debug("current object: ", object);

Thursday, February 7, 2013

Alfrescoのカスタム属性(とアスペクト名、タイプ名とか)を日本語化する

こんにちは。大谷です。
今回は「Alfrescoにカスタム属性を追加する - タイプとアスペクト -」に続く形で、カスタムモデル周りの日本語化(多言語化)について紹介したいと思います。基本的にはメッセージリソースの追加方法の説明だと思ってください。


プロパティ名とか変じゃない?


先ほどのリンク先の記事、特に画像を見た人は既にお気づきだと思いますが、追加したプロパティ名やアスペクト名がリソースIDみたいな文字列になっています。まあ頑張れば何を表しているか分からなくもないですが、あまりユーザフレンドリではありません。そこで、今回はこの表示をユーザが分かりやすい文字列に変えてみようと思います。つまり、表示ラベルを設定するようなものです。


まずは英語で表示できるようにしてみる


日本人であれば日本語で表示したいところですが、まずは英語にしてみましょう。日本語に関しては、設定時に一工夫必要なので(まあ大体想像つくと思いますが)、後ほど多言語化の方法と併せて説明することとします。

まずは、プロパティの表示名を設定するために、以下の2ファイルを作成します。custom-model-context.xmlは前回作成してあるので、<property name="labels">タグを追加して読み込むリソースファイル名を指定します。そして、指定したファイル名のリソースファイルを作成します。コンテンツモデル名やプロパティ名の":"を"_"に置き換える形で用い、title(表示名)やdescription(説明)の文言を設定します。

<alf_dir>/tomcat/shared/classes/alfresco/extension/custom-model-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
    <!-- Registration of new models -->   
    <bean depends-on="dictionaryBootstrap" id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap">
        <property name="models">
            <list>
                <value>alfresco/extension/customModel.xml</value>
            </list>
        </property>
        <property name="labels">
            <list>
                <value>alfresco/messages/custom-model</value>
            </list>
        </property>
    </bean>
</beans>

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model.properties
custom_customModel.property.custom_reviewer.title=Reviewer
custom_customModel.property.custom_reviewer.description=Reviewer's name
custom_customModel.property.custom_reviewDate.title=Reviewed Date
custom_customModel.property.custom_reviewDate.description=When this item reviewed

次に、アスペクトの表示名を設定するために、以下の2ファイルを作成します。読み込むリソースファイル名を指定するcustom-messages-context.xmlはweb-extension以下に配置します。タイプもこの方法で表示名を設定できます。リソースファイル内でtype.***=***のように設定するだけです。

<alf_dir>/tomcat/shared/classes/alfresco/web-extension/custom-messages-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
   <bean id="custom.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
      <property name="resourceBundles">
         <list>
            <value>alfresco.messages.custom-share-messages</value>
         </list>
      </property>
   </bean>
</beans>

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages.properties
aspect.custom_reviewable=Reviewable

以上で設定完了です。Alfrescoサーバを再起動し、プロパティ名やアスペクト名が指定した文言になっていることが確認できると思います。先のエントリのスナップショットと比較すると変化が分かりやすいと思います。




日本語表示を追加してみよう


英語でうまく表示できたら、次は日本語表示に進みます。方法としては以下のように2通りの方法があります。
  1. 先ほど設定したリソースを日本語の文言に置き換える
  2. 先ほどのリソースファイルとは別に日本語用のリソースファイルを用意する
Alfrescoの場合、ブラウザの言語設定によって表示言語が自動的に変更されます。例えばブラウザの言語設定を英語に変更すると、Alfrescoの表示が英語になるはずです。ここで改めて先ほどの2つの方法を見てみると、2.の方法はこの言語切り替えに対応する方法ということになります。もちろんどちらの方法を選択するかは要件によりますが、ここでは2.の方法を紹介したいと思います。

手順は簡単、以下の2ファイルを追加で用意するだけです。追加するファイル名は、既存のリソースファイル名に_jaを付けたものになります。これだけで日本語フランス語のリソースだったら_fr、イタリア語だったら_it、英語だったら_enという感じです。英語のリソースファイルも用意してあげれば、日本語/英語の両方に対応した表示が完成です。何もついてない元のリソースファイルはデフォルトの表示名ということになります。

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model_ja.properties
custom_customModel.property.custom_reviewer.title=\u30ec\u30d3\u30e5\u30a2
custom_customModel.property.custom_reviewer.description=\u30ec\u30d3\u30e5\u30fc\u8005\u540d
custom_customModel.property.custom_reviewDate.title=\u30ec\u30d3\u30e5\u30fc\u65e5
custom_customModel.property.custom_reviewDate.description=\u30ec\u30d3\u30e5\u30fc\u65e5

<alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages_ja.properties
aspect.custom_reviewable=\u30ec\u30d3\u30e5\u30fc\u53ef\u80fd

ここでのポイントは、日本語の文言がUnicodeエンコーディングされている点です。JDKに付属するnative2ascii等を利用してエンコーディングする必要があります。もしくは、自動的にエンコーディングしてくれるようなEclipseプラグインを使ってpropertiesファイルを編集するなどの方法があります。

では、Alfrescoサーバを再起動して再度プロパティ名やアスペクト名を確認してみましょう。無事日本語の文言に変わっているはずです。



 
今回はextensionフォルダ側とweb-extensionフォルダ側から計2つのリソースファイルを参照しましたが、役割分担としては、extensionフォルダ側から参照するリソースファイルではカスタムモデルに関するものを、web-extensionフォルダ側から参照するリソースファイルではShare UI上のメッセージに関するものを指定します。


今回の説明は以上になりますが、基本的なメッセージリソースの追加方法はお分かりいただけたかと思います。メッセージの追加が必要になった場合は是非参考にしてください。