Javascritpで多言語対応

こんにちは、今日は『Javascriptでの多言語対応方法』についてまとめておきます。

一般的には下記の方法が使用されると思います。

<h2>サーバ再度でメッセージを管理</h2>

<h5>日本語の場合</h5>

<pre>&lt;script> 

  var messages = {};  

message.loading = ‘ロード中’;  

message.error = ‘エラーが発生しました。

‘; &lt;/script>

</pre>

<h5>英語の場合</h5>

<pre>&lt;script>  

var messages = {};  

message.loading = ‘now loading’;  

message.error = ‘error was occuerd’;

&lt;/script>

</pre>

上記の用に記述して、サーバ再度で保持しているユーザの言語設定やGETパラメタを利用したりします。 また、管理上下記のように利用したほうが便利です。

<h5>フォルダで管理</h5>

<pre>&lt;script type=”text/javascript” src=”/messages/ja/message.js” /> </pre>

<h5>ファイルで管理</h5>

<pre>&lt;script type=”text/javascript” src=”/messages/ja.js” /> </pre>

<h2>Javascriptでメッセージを管理</h2>

メッセージオブジェクトに階層を持たせて

<pre> var messages = {}; messages.ja = {}; messages.en = {}; </pre>

で使用するときに <pre> var useMessages = messages[‘ja’]; </pre>

こんな風に使ってみたり。 if分岐やscriptタグのsrcタグ属性で振り分けたり

下記の用にしたりする方法もあるようです。

<pre>

var LANGUAGE = ‘en’;//デフォルト設定

var s = document.getElementsByTagName(‘script’); for(var i =0,len = s.length;i<len;i++){   if(s[i].src.indexOf(‘hoge.js?’) > 0){

    var tmp = s[i].src.splite(?)[1].splite(‘&’);

    for(var j = 0,leng = tmp.length;j<leng;j++){

      var tmp2 = tmp[j].splite(‘=’);

      if(tmp2.length == 2 && tmp2[0] == ‘lang’) LANGUAGE = tmp2[1];

    }

  } } var useMessages = messages[LANGUAGE];

</pre>

<h2>(<a href=”http://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%8C%96%E3%81%A8%E5%9C%B0%E5%9F%9F%E5%8C%96” title=”国際化と地域化” target=”_blank”>i18n</a>のための)jqueryを利用する</h2>

<strong>個人的には管理上この方法を利用することが最も良いと思います。 </strong>

<h5>利用方法</h5>

<ul>  

<li>下記のリンクから”jQuery.i18n.properties” をダウンロードします。</li>

<a href=”http://codingwithcoffee.com/?p=272” title=”codeing with coffee” target=”_blank”>jQuery.i18n.properties</a>

 <li>Messages.propertiesを用意します。</li>

Messages.propertiesを言語に応じて用意します。(ここでは一般的なものと日本語を用意します) <strong>Messages.properties(一般的に利用される)</strong>

 <pre># This line is ignored by the plugin MSG_HELLO = Hello MSG_COMPLEX = Hey, {0} </pre>

<strong>Messages_ja.properties(日本語に利用される)</strong>

 <pre> # This line is ignored by the plugin MSG_HELLO = こんにちわ MSG_COMPLEX = やあ、{0} </pre>  

<li>リソースファイルを任意のフォルダに保存します(ここでは /i18n/におきます。)</li>

 <li>ヘッダに”scriptタグ” を追加する</li>

<pre>

&lt;script src=”/js/jquery-1.5.1.min.js” type=”text/javascript”>

&lt;/script> &lt;script src=”/js/jquery.i18n.properties.js” type=”text/javascript”

>&lt;/script>

 </pre>

 <li>Javascriptを記述する</li>

<pre>

jQuery.i18n.properties({

   name: ‘Messages’,

   path:’/i18n/’,

   mode:’both’

          callback: function() {

               alert(MSG_HELLO);

               alert(MSG_COMPLEX(‘John’));

          } });

 </pre>

以上で『jQuery.i18n.properties』の使い方は終わりです。

by Saito

<h2>引用</h2>

<ul>

<li>

<a href=”http://dev.chrisryu.com/2007/12/multi_language_by_javascript.html” title=”JavaScriptの多言語対応の方法についてぼんやり考えてみた” target=”_blank”>JavaScriptの多言語対応の方法についてぼんやり考えてみた</a>

</li>

<li>

<a href=”http://d.hatena.ne.jp/shinobu_siv/20110326/1301164497” title=”しのぶの日記 (技術編)” target=”_blank”>javascriptで国際化(多言語対応)</a>

</li>

</ul>

広告

POSTGRES:カラムの型変換

images (1)

POSTGRES公式サイトを参照にテーブルのカラムの型を変更してみました。

現状のテーブル構成
ID(serial)	category(character varying)
1		10
2		12
3		3

変更後のテーブル構成
ID(serial)	category(integer)
1		10
2		12
3		3

正しいやり方:

alter table t1 alter column category type integer;

すると、下記エラーメッセージが出力されます。

ERROR:  列"category"を型"integer"にキャストできません

********** エラー **********

ERROR: 列"category"を型"integer"にキャストできません
SQLステート:42804

キャストできないようですでの、別のやり方でやってみましょう

--仮カラムを作成
alter table t1 add column new_category integer;

--仮カラムにキャストされたcategory値を挿入
update t1 set new_category = cast(category as integer);

--元のcategoryカラムを削除
alter table t1 drop column category;

--新しくカラムを作成
alter table t1 add column category integer;

--仮カラムの値を挿入
update t1 set category = new_category;

--仮カラムを削除
alter table t1 drop column new_category;

うまく型変換できました!・・・・以上 !

by johann

HTMLで画像がリフレッシュされない場合の対策

こんにちは、『imgのsrc先の画像を差し替えたのにブラウザで閲覧すると画像が更新されない』というエラー対策について説明します。

ブラウザでは、参照先ファイル名の場合画像が更新されていないものとして、内部に画像をキャッシュします。
(どのブラウザでも)

これを回避するには『参照先画像ファイル名をリフレッシュするたびに変える』 必要があります。
画像をアップロードする度に画像名を変更するのは効率が悪いです。
そのためリクエストパラメータを利用する方法が効率的です。
(GETとPOSTをうまく利用します。)

< img src="sample.sample.jpg?****>

この***はアクセスする毎に変わる値ならなんでも可能ですが、一般的にはタイムスタンプが利用されます。
※注意として、毎回画像をリロードするので重いページになってしまうので注意が必要ですね。
※他にもjavascriptでリフレッシュする方法もあります。

by Saito

JSP内でのimgタグsrc属性内の改行について

今日はStrust2で少しはまってしまったことを書いておきます。 (初歩的なんですが意外と気づきませんでした…)

それは「imgタグsrc属性内で改行をすると %20」 に置き換わるです。

<環境>

  • <Java + JSP + Struts2

system.properties内

resource.hostname=sample.com/

JavaのAction内

String imagePath = "image_path.jpg";

JSP内

<img src=”<s:property value = “%{getText('resource.hostname')}”/>
<s:property value="imagePath" />" alt="Sample" width="40" height="60″ />

表示されたHTMLソース

<img src=”sample.com/image_path.jpg” />

HTMLでは

<HTML>   

  <HEAD>

    <META http-equiv=”Content-Type” content=”text/html; charset=Shift_JIS”>     
   <TITLE></TITLE>

  </HEAD>   

  <BODY>   

      <img src=”http://sankei.jp.msn.com/images/news/130118/wir13011813110003-p1.jpg”>

  </BODY>   

</HTML>

結果

結果は下の通り
wir13011813110003-p1

まとめ

  • Struts2では、imgタグsrc属性内で改行をすると %20 に置き換わる
  • imgタグsrc属性内で改行の利用をやめましょう。   そもそも2つの変数をjsp側で繋げているのが良くないですね。   また、変数はちゃんと”URL Encoding“してから利用しましょう。

では

by Saito

今回役に立ったreplaceの使い方struts2(jsp側)

textareaのタグを使用し、次の画面でラベル表示する時に改行する方法を紹介したいと思います。今回のプロジェクトで、入力画面→確認画面に遷移する画面がいくつかあり非常に活用しました。

textareaタグを使用しこのように入力画面で改行を入れた文章を入力します。

テスト 1改行
テスト 2改行
テスト 3改行

ラベルタグ(propertyタグ)の確認画面に遷移した時このように改行されないで表示されてしまいます。

テスト 1改行 テスト 2改行 テスト 3改行

そこでjsp側でreplaceAllを使用します。

使用例

<s:property value="%{xxx.contents.replaceAll('¥¥n', '<br />')}" escape="false"  />

propertyタグ内に

value="%{xxx.contents.replaceAll('¥¥n', '<br />')}"

¥nを<br/>に変えます。すると下の図のように改行されて画面に表示されます。

テスト 1改行
テスト 2改行
テスト 3改行

知っている方が大半だと思いますが、役に立ったので書かせて頂きました!また、上記の説明で分からなかった場合は、googleで『jsp textarea 改行 replaceAll』で検索してください。

以上です。

by ttakamatsu

Unix/Linuxのエイリアス管理サイト

logo

Unix/Linux系のサーバーメンテナンス担当者にうれしいお知らせ!
エイリアスと関数を管理してくれるサイトが誕生しました → http://alias.sh/

簡単にデータの同期化・共有ができますので、サーバーの設定が楽になります。
ユーザーに公開されたエイリアスの閲覧も可能です。使えそうなものが沢山ありますので、是非アクセスしてみてください!

以上

johann

SQLite:AUTOINCREMENTの現在値を取得

autoincrement

SQLiteはPostgresqlと違って、【currval】または【nextval】のようなメッソードが用意されてないため、オートインクリメントの現在値や次値を取得したい場合は、自分で実装しなければなりません。

事前にSQLiteのオートインクリメント仕組みを知っておきましょう!

  1. autoincrement情報は【SQLITE_SEQUENCE】に保存されている
  2. 【SQLITE_SEQUENCE】の必要なカラム名: name(対象テーブル名)+ seq(現在値)
  3. 同じテーブル内に一つのオートインクリメントしか宣言できない

下記メッソードで簡単に現在値を取得できます:

public void printAutoIncrements(){

    //DBの全てAUTOINCREMENTを取得
    String query = "SELECT * FROM SQLITE_SEQUENCE";

  //対処autoincrementの指定
    String myAutoIncrementTableName= "myTable";

  //Cursorでループ
    Cursor cursor = mDb.rawQuery(query, null);
    if (cursor.moveToFirst()){

        do{
            String curTable= cursor.getString(cursor.getColumnIndex("name")));
	    String curId= cursor.getString(cursor.getColumnIndex("seq")));

	//指定されたテーブルでしたら、値を出力
	if(curTable.equals(myAutoIncrementTableName)){
		Debug.d("DEBUG", "現在値="+curId);
		break;
	}

        }while (cursor.moveToNext());
    }

    cursor.close(); 

}

以上

by Johann