Nucleus(JP)フォーラム Forum Index

Find on the forum:
OR  AND    » Advanced Search

未返信の記事を表示全てのフォーラムを既読にする

新しいトピックを投稿 トピックに返信
投稿者 メッセージ
Andy
モデレーター
モデレーター


登録日: 2004.03.18
記事: 1490
所在地: 横浜

記事 日時: 2005.05.13 (金) 12:23   記事の件名: Tips:プラグインの国際化
引用付きで返信

最近,プラグインを作るときに,メッセージなどをハードコーディングするのではなく,Nucleus本体と同じように
言語ファイルを使うようにしています(実際には途中までハードコーディングで作っていて,完成が近づくと
言語ファイル化するという感じですが)。

一応,覚書とほかの方にも参考になるかと思って方法を書いておきます。

(1)プラグインと同じ名前のディレクトリを作る
  ただし,NP_は取って,小文字にする必要があります。
  例えばNP_ABC.phpなら abc というディレクトリをプラグイン・ディレクトリの下に作ります
(2)ディレクトリの中に,開発環境と同じ言語用の言語ファイルを作る
  UTF-8ならjapanese-utf8.php,EUC-JPならjapanese-euc.phpが標準です
(3)
Code:

<?php
define('_ABC_MESSAGENAME',                  'じっさいのメッセージ');
  ・
  ・
  ・
?>

といった形でプログラム中の日本語メッセージを定義していき,並行してプログラムのメッセージを _ABC_MESSAGENAME などに置き換える。
メッセージはグローバルな名前になるので,プラグイン名を最初に付けるようにしています。
(4)プラグインのinit関数を以下のようにする
Code:
   function init() {
      // include language file for this plugin
      $language = ereg_replace( '[\\|/]', '', getLanguageName());
      if (file_exists($this->getDirectory().$language.'.php'))
         include_once($this->getDirectory().$language.'.php');
      else
         include_once($this->getDirectory().'english.php');
   }

(5)言語ファイルを増やしていく
UTF-8からEUC-JPや,その逆はエディタでエンコードを変えるだけでできます。
あと,english.phpは日本語以外のデフォルトなのでなるべく作るようにします。

以上です。
これで,後から他の言語を追加するのも容易になります。

_________________
Foodyn CMS開発日誌
http://www.matsubarafamily.com/lab/

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
nakahara21
モデレーター
モデレーター


登録日: 2003.11.14
記事: 1298
所在地: 尼崎

記事 日時: 2005.07.25 (月) 12:39   記事の件名: 相談です
引用付きで返信

最新版ではhelp.htmlをadminディレクトリに置いて、
Code:
      function supportsFeature($feature) {
         switch($feature) {
            case 'SqlTablePrefix':
               return 1;
            case 'HelpPage':
               return 1;
            default:
               return 0;
         }
      }

と書くと、プラグイン一覧ページの「アクション」に『ヘルプ』リンクが生成されて、ヘルプ表示が可能となっているようですが。

このhelp.htmlを他言語化したい(言語ファイルを使いたい)場合は、どのようにすれば一番簡単なのでしょう?
言語ファイルを読み込ませるよりも、japanese-euc.help.htmlとかを用意する方が作成時は楽チンなのですが、ADMIN.phpのfunction action_pluginhelp()を改良してもらった方がいいような気がします。
改良例がないと誰も賛同してくれないような気がしますが...

_________________
nakahara21
http://nakahara21.com/
*移転しています

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
nakahara21
モデレーター
モデレーター


登録日: 2003.11.14
記事: 1298
所在地: 尼崎

記事 日時: 2005.07.25 (月) 13:00   記事の件名:
引用付きで返信

ADMIN.phpのfunction action_pluginhelp()の後半は、
Code:
      echo '<h2>',_PLUGS_HELP_TITLE,': ',htmlspecialchars($plugName),'</h2>';

      $plug =& $manager->getPlugin($plugName);
      
      $language = ereg_replace( '[\\|/]', '', getLanguageName());
      
      $helpFile = $DIR_PLUGINS.$plug->getShortName().'/help.html';
      if(@file_exists($DIR_PLUGINS.$plug->getShortName().'/'.$language.'.help.html')){
         $helpFile = $DIR_PLUGINS.$plug->getShortName().'/'.$language.'.help.html';
      }
      
      if (($plug->supportsFeature('HelpPage') > 0) && (@file_exists($helpFile))) {
         @readfile($helpFile);
      } else {
         echo '<p>Error: ', _ERROR_PLUGNOHELPFILE,'</p>';
         echo '<p><a href="index.php?action=pluginlist">(',_BACK,')</a></p>';
      }

こんなかんじでどうでしょうか。
file_existsが2回実行されるのでスマートではないですが、例えばって事で。

_________________
nakahara21
http://nakahara21.com/
*移転しています

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
Andy
モデレーター
モデレーター


登録日: 2004.03.18
記事: 1490
所在地: 横浜

記事 日時: 2005.07.25 (月) 14:05   記事の件名:
引用付きで返信

まみおさんの書いた方法が現実的ではないかと思います。
install()内で言語調べてリネームなんていうのも考えたのですが,
そうなると今度はパーミッションが引っかかってくるし… Rolling Eyes

_________________
Foodyn CMS開発日誌
http://www.matsubarafamily.com/lab/

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
nakahara21
モデレーター
モデレーター


登録日: 2003.11.14
記事: 1298
所在地: 尼崎

記事 日時: 2005.07.25 (月) 14:14   記事の件名:
引用付きで返信

あつかましいですが、本家に意見投稿をお願いできたら嬉しいです。
くだんのスキン内変数の件と一緒でも良いです。

_________________
nakahara21
http://nakahara21.com/
*移転しています

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
Andy
モデレーター
モデレーター


登録日: 2004.03.18
記事: 1490
所在地: 横浜

記事 日時: 2005.07.25 (月) 14:17   記事の件名:
引用付きで返信

了解です。 Smile
_________________
Foodyn CMS開発日誌
http://www.matsubarafamily.com/lab/

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
shizuki
モデレーター
モデレーター


登録日: 2006.03.23
記事: 891
所在地: 西播磨

記事 日時: 2006.08.24 (木) 17:03   記事の件名:
引用付きで返信

古い話を引っ張り出して恐縮ですが、この話はその後どうなったんでしょう?

もし都合が悪くなければ日本語版だけでも・・・

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動 MSNM
Andy
モデレーター
モデレーター


登録日: 2004.03.18
記事: 1490
所在地: 横浜

記事 日時: 2006.08.24 (木) 17:16   記事の件名:
引用付きで返信

ここはまだ入れてないです。すみません…
3.3日本語版に入れますか?→Kimitakeさん

_________________
Foodyn CMS開発日誌
http://www.matsubarafamily.com/lab/

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
yama.kyms
モデレーター
モデレーター


登録日: 2005.07.07
記事: 1049
所在地: fujisawa

記事 日時: 2006.08.26 (土) 20:40   記事の件名:
引用付きで返信

もしこのようにヘルプのページを簡単に作れるようになるなら、自分もできる範囲で
いくつかのプラグインのヘルプの作成をお手伝いしたいと思います。
よろしくお願いします。

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
kosugiatkips



登録日: 2006.01.15
記事: 353
所在地: 金沢区

記事 日時: 2006.08.26 (土) 21:29   記事の件名:
引用付きで返信

コア側で言語を判定して読んでくれるのはありがたいのかもしれませんが、プラグイン一覧からヘルプを呼ぶだけではなく、管理画面の他のシチュエーションから呼ぶことも考えられるので、そもそもhelp.html決め打ちじゃなくて、help.phpを呼ぶようにすれば、ダイナミックなヘルプページが作れるからいいと思います。

リンク元の状況や、見る人の権限によっては不要なヘルプコンテンツもあるでしょうから。

help.phpがなかったらhelp.htmlを呼ぶようにすれば下位互換性も保てるわけですし。

Code:
   function action_pluginhelp() {
      global $member, $manager, $DIR_PLUGINS, $CONF;

      // check if allowed
      $member->isAdmin() or $this->disallow();

      $plugid = intGetVar('plugid');

      if (!$manager->pidInstalled($plugid))
         $this->error(_ERROR_NOSUCHPLUGIN);

      $plugName = getPluginNameFromPid($plugid);

      $this->pagehead();

      echo '<p><a href="index.php?action=pluginlist">(',_PLUGS_BACK,')</a></p>';

      echo '<h2>',_PLUGS_HELP_TITLE,': ',htmlspecialchars($plugName),'</h2>';

      $plug =& $manager->getPlugin($plugName);
      $helpFile = $DIR_PLUGINS.$plug->getShortName().'/help.html';
      $helpPHP =  $DIR_PLUGINS.$plug->getShortName().'/help.php';

      if (($plug->supportsFeature('HelpPage') > 0) && (@file_exists($helpPHP))) {
         @include($helpPHP);
      } elseif (($plug->supportsFeature('HelpPage') > 0) && (@file_exists($helpFile))) {
         @readfile($helpFile);
      } else {
         echo '<p>Error: ', _ERROR_PLUGNOHELPFILE,'</p>';
         echo '<p><a href="index.php?action=pluginlist">(',_BACK,')</a></p>';
      }


      $this->pagefoot();
   }

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信
Katsumi
モデレーター
モデレーター


登録日: 2005.06.24
記事: 632
所在地: CA

記事 日時: 2006.09.01 (金) 06:12   記事の件名: Re: 相談です
引用付きで返信

nakahara21 wrote:
このhelp.htmlを他言語化したい(言語ファイルを使いたい)場合は、どのようにすれば一番簡単なのでしょう?

 ちょっと強引ですが、あるプラグインで help.html を
Code:
<script type="text/javascript" src="../index.php?action=plugin&name=XXXX&type=help"></script>
<p>If you cannot see the help, please click <a href="plugins/xxxx/help-euc.html">here</a>,
or find the "help-euc.hml" file and open it by a browser.</p>
として実現させていたことがありました。

 でも、やはり help.php をコアで読み込みに行くなどの方法が、簡単でいいですね。

_________________
Nucleus-SQLite 配布中
VBScript / JScript で Win32API / 構造体 / コールバック関数: SFC mini

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
Katsumi
モデレーター
モデレーター


登録日: 2005.06.24
記事: 632
所在地: CA

記事 日時: 2006.11.20 (月) 09:57   記事の件名: 簡単な help.html
引用付きで返信

 最近、wiki のページが充実しているプラグインが増えていますが、プラグイン一覧ページの『ヘルプ』にwikiの内容を取り込めばいいなと思っていました。

 このトピックスで議論のある多言語化の問題とか複雑なのですが、おそらく一番簡単にこれが実装できる方法を発見しました。

help.htmlに、
Code:
<iframe src="http://japan.nucleuscms.org/wiki/plugins:xxxxxxxx" width="750" height="600"></iframe>
と書くだけです。必要なら、wiki の内容を編集することも出来ますョ。
_________________
Nucleus-SQLite 配布中
VBScript / JScript で Win32API / 構造体 / コールバック関数: SFC mini

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
yama.kyms
モデレーター
モデレーター


登録日: 2005.07.07
記事: 1049
所在地: fujisawa

記事 日時: 2008.02.19 (火) 00:21   記事の件名:
引用付きで返信

国際化をちょくちょくやるようになって気付いたことですが。。

自国語のlangファイルがなければenglish.phpを読みに行く。そこのところはいいのですが、
ファイルはあるけど中身のエントリー数が合ってないということがあると思います。
プラグインのバージョンアップに合わせてlangファイルもアップデートする必要があるわけで、
対応言語が多いほど単純作業が増えることになりますね。
この手間を惜しんでも_ABC_MESSAGENAMEなどのエントリー名がそのまんま表示されるだけで
さほど困ったことにはならないですが、もし該当エントリーが存在しない場合はデフォルトの
english.phpから読み出してくるという書き方もできそうな気がします。

_________________
yama Nucleus CMS 3.51JP

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
Katsumi
モデレーター
モデレーター


登録日: 2005.06.24
記事: 632
所在地: CA

記事 日時: 2008.02.19 (火) 07:24   記事の件名:
引用付きで返信

yama.kyms wrote:
この手間を惜しんでも_ABC_MESSAGENAMEなどのエントリー名がそのまんま表示されるだけで
さほど困ったことにはならないですが、もし該当エントリーが存在しない場合はデフォルトの
english.phpから読み出してくるという書き方もできそうな気がします。

一番簡単な解決策は、例えば japanese-utf8.phpをインクルードした後に、english.phpをインクルードすることです。先にインクルードされたほうが優先になります。2回目のインクルードのときに Notice が出るので、@include()としておけばよいと思います。ただしこの方法だと1ミリ秒ほどのロスがあるので、ベータバージョンでのみ使うようにしたほうが良いと思います。

_________________
Nucleus-SQLite 配布中
VBScript / JScript で Win32API / 構造体 / コールバック関数: SFC mini

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
yama.kyms
モデレーター
モデレーター


登録日: 2005.07.07
記事: 1049
所在地: fujisawa

記事 日時: 2008.02.19 (火) 10:32   記事の件名:
引用付きで返信

先にenglish.phpを読み込んで、後からjapanese.phpで上書きするのかと思ってましたが、逆なんですね。今度機会があったら試してみます。今やってるNP_MitasNomはまた違う方式のようですが。(MovableTypeみたい、と思いました)
_________________
yama Nucleus CMS 3.51JP

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
Andy
モデレーター
モデレーター


登録日: 2004.03.18
記事: 1490
所在地: 横浜

記事 日時: 2008.02.19 (火) 10:50   記事の件名:
引用付きで返信

Code:
   function init() {
      // include language file for this plugin
      $language = ereg_replace( '[\\|/]', '', getLanguageName());
      if (file_exists($this->getDirectory().$language.'.php'))
         include_once($this->getDirectory().$language.'.php');
      include_once($this->getDirectory().'english.php');
   }

これでそうなります。

_________________
Foodyn CMS開発日誌
http://www.matsubarafamily.com/lab/

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
yama.kyms
モデレーター
モデレーター


登録日: 2005.07.07
記事: 1049
所在地: fujisawa

記事 日時: 2008.02.19 (火) 12:31   記事の件名:
引用付きで返信

ありがとうございます。おかげで他国語対応少し手抜きができそうです。
_________________
yama Nucleus CMS 3.51JP

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信 投稿者のウェブサイトに移動
きゃしゃ



登録日: 2007.12.15
記事: 302
所在地: 河内平野

記事 日時: 2009.01.19 (月) 18:02   記事の件名: 日本語化新方式
引用付きで返信

プラグインの日本語化について、Katsumiさん方式と佐藤(な)さん方式の折衷でこんなルーチンを考えてみました。
開発効率の向上が目的です。arrayにすれば多言語化も可能です。

メリット
・langファイルを別途用意しなくて良い
・ソースの見通しがよい
・辞書の見通しがよい
・辞書に漏れやtypoがあっても英文が表示される
・グローバル定数とのバッティングを気にしなくてよい

デメリット
・いちいちfunction呼ぶので効率がよろしくない

Code:

   function lang($english) {
      $multilang = array(
//         'English'      => array('日本語','another language',...),
         'Description'   => '解説',
         'Eroor message'   => 'エラーメッセージ',
      );
      if (array_key_exists($english,$multilang)) {
         switch (ereg_replace('[\\|/]', '', getLanguageName())) {
            case 'japanese-euc':
               $translated = mb_convert_encoding($multilang[$english],'EUC-JP','UTF-8');
               break;
            case 'japanese-utf8':
               $translated = $multilang[$english];
               break;
/*            case 'another-language':
               $translated = $multilang[$english][i];
               break;
*/
            default:
               $translated = $english;
               break;
         }
      } else {
         $translated = $english;
      }
   return $translated;
   }

実例として、試しにNP_Captchaを日本語化してみました

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信
きゃしゃ



登録日: 2007.12.15
記事: 302
所在地: 河内平野

記事 日時: 2009.02.05 (木) 18:13   記事の件名: プラグインのDescriptionについて
引用付きで返信

質問です。
っていうか、相談ていうか、意見を伺いたいんですが。
日本語版コアではglobalfunctionsのencode_descをHTML_ENTITIESからHTML_SPECIALCHARSに変更してあるので、
Descriptionも2バイト文字で表示できますけど、本家版では文字化けしますよね。
最新の本家版3.40RCで確認したんですが、HTML_ENTITIESのままでした。
日本語版コアで使う分にはよいのですが、プラグインを「国際版」と考えるなら、
「"歴史的理由により"Descriptionは英文にしておく」というのを暗黙のお作法にしたほうがいいんでしょうか?
そういえば、多言語化してあるプラグインでもDescriptionは英文にしてあるのが結構ありますよねぇ。
NP_Mediatocuも英文でしたわ、そういえば。勝手に日本語にしちゃったのですけど。

現実的には、日/英 以外の多言語化されているプラグインをあたしは知らないのですけど。

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信
Mocchi



登録日: 2006.11.19
記事: 143

記事 日時: 2009.02.07 (土) 19:06   記事の件名:
引用付きで返信

折衷案は、言語ファイルの規模があまり大きくないプラグインに向いてそうですね。基本は配列操作なので、それほど重さを感じないようなルーチンではないでしょうか。

きゃしゃ wrote:
「"歴史的理由により"Descriptionは英文にしておく」というのを暗黙のお作法にしたほうがいいんでしょうか?


これは今まで気づきませんでした。言語ファイルでDescriptionもプラグイン・オプションの説明文も日本語化していましたが、これらって、インストールと同時にデータベースに登録されてしまうんですね。そうしたら、言語ファイルを準備しても、表示自体は、インストール時の言語設定に左右されてしまうという事態に。。。

ここ痒い。何とかして手が届くようにならないものか Rolling Eyes

トップに戻る

ユーザーのプロフィールを表示 プライベートメッセージを送信
新しいトピックを投稿 トピックに返信
特定期間内の記事を表示:   

ページ移動 1, 2  次へ

Page 1 of 2

All times are GMT + 9 Hours

移動先:  

新規投稿: 不可
返信投稿: 不可
記事編集: 不可
記事削除: 不可
投票参加: 不可
ファイル添付不可
ダウンロード:

Powered by phpBB © 2001, 2002 phpBB Group