[Svn-src-all:3285] [version-2_12-multilang 22186] #1988 (国際化テンプレート:エスケープ処理) 現状コミット。

Seasoft admin @ mail.ec-cube.net
2012年 12月 28日 (金) 22:39:21 JST


Subversion committed to /home/svn/open 22186
http://svn.ec-cube.net/open_trac/changeset/22186
┌────────────────────────────┐
│更新者 :  Seasoft                                      │
│更新日時:  2012-12-28 22:39:21 +0900 (金, 28 12月 2012)│
└────────────────────────────┘

Log:
--------------------------------------------------------
#1988 (国際化テンプレート:エスケープ処理) 現状コミット。
  * ja.po は、data/Smarty/templates/admin/ownersstore/plugin.tpl に対応する部分のみ、局所的に変更しています。
    * data/Smarty/templates/admin/ownersstore/plugin.tpl にコメントを記載している「案1」及び「案2」の方向性については協議中。
  * 上記以外では、po ファイルの改修が終わるまで、HTML エスケープが過剰に行なわれます。(主に、入力必須マークの出力が正しく行なわれないといった状況が生じます。)

Changed:                      [U:修正,A:追加,D:削除]
--------------------------------------------------------
U   branches/version-2_12-multilang/data/Smarty/templates/admin/ownersstore/plugin.tpl
U   branches/version-2_12-multilang/data/class/helper/SC_Helper_Locale.php
U   branches/version-2_12-multilang/data/locales/ja.mo
U   branches/version-2_12-multilang/data/locales/ja.po
U   branches/version-2_12-multilang/data/smarty_extends/function.t.php

変更: branches/version-2_12-multilang/data/Smarty/templates/admin/ownersstore/plugin.tpl
===================================================================
--- branches/version-2_12-multilang/data/Smarty/templates/admin/ownersstore/plugin.tpl	2012-12-28 13:08:43 UTC (rev 22185)
+++ branches/version-2_12-multilang/data/Smarty/templates/admin/ownersstore/plugin.tpl	2012-12-28 13:39:21 UTC (rev 22186)
@@ -33,12 +33,12 @@
             var mode = event.target.name;
 
             if(mode === 'disable') {
-                result = window.confirm('<!--{t string="tpl_458"}-->');
+                result = window.confirm('<!--{t string="tpl_458" escape="j"}-->');
                 if(result === false) {
                     $(event.target).attr("checked", "checked");
                 }
             } else if(mode === 'enable') {
-                result = window.confirm('<!--{t string="tpl_459"}-->');
+                result = window.confirm('<!--{t string="tpl_459" escape="j"}-->');
                 if(result === false) {
                     $(event.target).attr("checked", "");
                 }
@@ -54,7 +54,7 @@
      * 通信エラー表示.
      */
     function remoteException(XMLHttpRequest, textStatus, errorThrown) {
-        alert('<!--{t string="tpl_460"}-->');
+        alert('<!--{t string="tpl_460" escape="j"}-->');
     }
 
     /**
@@ -79,7 +79,7 @@
      * インストール
      */
     function install() {
-        if (window.confirm('<!--{t string="tpl_461" kaigyo_escape=true}-->')){
+        if (window.confirm('<!--{t string="tpl_461" escape="j"}-->')){
             fnModeSubmit('install','','');
         }
     }
@@ -88,7 +88,7 @@
      * アンインストール(削除)
      */
     function uninstall(plugin_id, plugin_code) {
-        if (window.confirm('<!--{t string="tpl_462"}-->')){
+        if (window.confirm('<!--{t string="tpl_462" escape="j"}-->')){
             fnSetFormValue('plugin_id', plugin_id);
             fnModeSubmit('uninstall', 'plugin_code', plugin_code);
         }
@@ -98,7 +98,7 @@
      * アップデート処理
      */
     function update(plugin_id, plugin_code) {
-        if (window.confirm('<!--{t string="tpl_463"}-->')){
+        if (window.confirm('<!--{t string="tpl_463" escape="j"}-->')){
             removeUpdateFile('update_file_' + plugin_id);
             fnSetFormValue('plugin_id', plugin_id);
             fnModeSubmit('update','plugin_code', plugin_code);
@@ -127,8 +127,9 @@
 <div id="system" class="contents-main">
     <h2><!--{t string="tpl_464"}--></h2>
     <table class="form">
+        <!--{* 案1 *}-->
         <tr>
-            <th><!--{t string="tpl_465"}--></th>
+            <th><!--{t string="tpl_465"}--> <!--{t string="<require>"}--></th>
             <td>
                 <!--{assign var=key value="plugin_file"}-->
                 <span class="attention"><!--{$arrErr[$key]}--></span>
@@ -136,6 +137,16 @@
                 <a class="btn-action" href="javascript:;" onclick="install(); return false;"><span class="btn-next"><!--{t string="tpl_466"}--></span></a>
             </td>
         </tr>
+        <!--{* 案2 *}-->
+        <tr>
+            <th><!--{t string="tpl_465"}--> <span class='attention'><!--{t string="require_mark"}--></span></th>
+            <td>
+                <!--{assign var=key value="plugin_file"}-->
+                <span class="attention"><!--{$arrErr[$key]}--></span>
+                <input type="file" name="<!--{ $key }-->" class="box45" size="43"  style="<!--{$arrErr[$key]|sfGetErrorColor}--> <!--{if $arrErr[$key]}--> background-color:<!--{$smarty.const.ERR_COLOR|h}--><!--{/if}-->">
+                <a class="btn-action" href="javascript:;" onclick="install(); return false;"><span class="btn-next"><!--{t string="tpl_466"}--></span></a>
+            </td>
+        </tr>
     </table>
 
     <!--▼プラグイン一覧ここから-->

変更: branches/version-2_12-multilang/data/class/helper/SC_Helper_Locale.php
===================================================================
--- branches/version-2_12-multilang/data/class/helper/SC_Helper_Locale.php	2012-12-28 13:08:43 UTC (rev 22185)
+++ branches/version-2_12-multilang/data/class/helper/SC_Helper_Locale.php	2012-12-28 13:39:21 UTC (rev 22186)
@@ -69,19 +69,112 @@
             $device_type_id = $options['device_type_id'];
         }
 
+        $return = $string;
         // Get string list of specified language.
-        if ($lang_code == 'en') {
-            return $string;
-        } else {
+        if ($lang_code != 'en') {
             $translations = SC_Helper_Locale_Ex::$_instance->get_translations($lang_code, $device_type_id);
             // Whether a string which corresponding with alias is exist.
-            if (isset($translations[$string])) {
-                return $translations[$string];
+            if (isset($translations[$return])) {
+                $return = $translations[$return];
             }
-            else {
-                return $string;
+        }
+
+        $esc_types = $options['escape'];
+        if (is_null($esc_types) && $string[0] !== '<') {
+            $esc_types = 'h';
+        }
+        foreach (explode(',', $esc_types) as $esc_type) {
+            switch ($esc_type) {
+                case 'h':
+                case 'html':
+                    $return = htmlspecialchars($return, ENT_QUOTES);
+                    break;
+
+                case 'j':
+                case 'javascript':
+                    // escape quotes and backslashes, newlines, etc.
+                    $return = strtr($return, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
+                    break;
+
+                case 'nl2br':
+                    $return = nl2br($return, true);
+                    break;
+
+                case '':
+                case 'none':
+                    break;
+
+                case 'htmlall':
+                    $return = htmlentities($return, ENT_QUOTES);
+                    break;
+
+                case 'u':
+                case 'url':
+                    $return = rawurlencode($return);
+                    break;
+
+                case 'urlpathinfo':
+                    $return = str_replace('%2F','/',rawurlencode($return));
+                    break;
+
+                case 'quotes':
+                    // escape unescaped single quotes
+                    $return = preg_replace("%(?<!\\\\)'%", "\\'", $return);
+                    break;
+
+                case 'hex':
+                    // escape every character into hex
+                    $text = '';
+                    for ($x=0; $x < strlen($return); $x++) {
+                        $text .= '%' . bin2hex($return[$x]);
+                    }
+                    $return = $text;
+                    break;
+
+                case 'hexentity':
+                    $text = '';
+                    for ($x=0; $x < strlen($return); $x++) {
+                        $text .= '&#x' . bin2hex($return[$x]) . ';';
+                    }
+                    $return = $text;
+                    break;
+
+                case 'decentity':
+                    $text = '';
+                    for ($x=0; $x < strlen($return); $x++) {
+                        $text .= '&#' . ord($return[$x]) . ';';
+                    }
+                    $return = $text;
+                    break;
+
+                case 'mail':
+                    // safe way to display e-mail address on a web page
+                    $return = str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $return);
+                    break;
+
+                case 'nonstd':
+                   // escape non-standard chars, such as ms document quotes
+                   $_res = '';
+                   for($_i = 0, $_len = strlen($return); $_i < $_len; $_i++) {
+                       $_ord = ord(substr($return, $_i, 1));
+                       // non-standard char, escape it
+                       if($_ord >= 126){
+                           $_res .= '&#' . $_ord . ';';
+                       }
+                       else {
+                           $_res .= substr($return, $_i, 1);
+                       }
+                   }
+                   $return = $_res;
+                    break;
+
+                default:
+                    trigger_error('unknown escape type. ' . var_export(func_get_args(), true), E_USER_WARNING);
+                    break;
             }
         }
+
+        return $return;
     }
 
     /**

変更: branches/version-2_12-multilang/data/locales/ja.mo
===================================================================
(バイナリファイルが異なっています)

変更: branches/version-2_12-multilang/data/locales/ja.po
===================================================================
--- branches/version-2_12-multilang/data/locales/ja.po	2012-12-28 13:08:43 UTC (rev 22185)
+++ branches/version-2_12-multilang/data/locales/ja.po	2012-12-28 13:39:21 UTC (rev 22186)
@@ -2,7 +2,7 @@
 msgstr ""
 "Project-Id-Version: EC-CUBE Core\n"
 "POT-Creation-Date: 2012-05-07 13T_39+0900\n"
-"PO-Revision-Date: 2012-12-27 14:19+0900\n"
+"PO-Revision-Date: 2012-12-28 22:26+0900\n"
 "Last-Translator: MATSUDA Terutaka <matsudaterutaka @ gmail.com>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
@@ -3529,8 +3529,7 @@
 
 msgid "SC_Utils_001"
 msgstr ""
-"&gt;&gt; /install/T_FIELD は、インストール完了後にファイルを削除してくださ"
-"い。"
+">> /install/T_FIELD は、インストール完了後にファイルを削除してください。"
 
 msgid "SC_Utils_002"
 msgstr "前方互換用メソッドが使用されました。"
@@ -5021,7 +5020,8 @@
 
 msgid "tpl_462"
 msgstr ""
-"一度削除したデータは元に戻せません。\\nプラグインを削除しても宜しいですか?"
+"一度削除したデータは元に戻せません。\n"
+"プラグインを削除しても宜しいですか?"
 
 msgid "tpl_463"
 msgstr "プラグインをアップデートしても宜しいですか?"
@@ -5030,7 +5030,7 @@
 msgstr "プラグイン登録"
 
 msgid "tpl_465"
-msgstr "プラグイン<span class='attention'> *</span>"
+msgstr "プラグイン"
 
 msgid "tpl_466"
 msgstr "インストール"
@@ -5875,3 +5875,9 @@
 
 msgid "pt_suffix"
 msgstr "pt"
+
+msgid "<require>"
+msgstr "<span class='attention'>*</span>"
+
+msgid "require_mark"
+msgstr "*"

変更: branches/version-2_12-multilang/data/smarty_extends/function.t.php
===================================================================
--- branches/version-2_12-multilang/data/smarty_extends/function.t.php	2012-12-28 13:08:43 UTC (rev 22185)
+++ branches/version-2_12-multilang/data/smarty_extends/function.t.php	2012-12-28 13:39:21 UTC (rev 22186)
@@ -44,6 +44,11 @@
         $options['device_type_id'] = $params['device_type_id'];
         unset($params['device_type_id']);
     }
+    // エスケープの指定がある場合、オプションに移す
+    if (isset($params['escape'])) {
+        $options['escape'] = $params['escape'];
+        unset($params['escape']);
+    }
 
     return t($string, $params, $options);
 }




Svn-src-all メーリングリストの案内