Framework: Fungsi TRANS dengan parameter untuk keluar dari tanda kutip

Dibuat pada 24 Jan 2015  ·  3Komentar  ·  Sumber: laravel/framework

Karakter berikut dapat mengganggu parser HTML atau Javascript dan harus diloloskan dalam literal string: <, >, ", ', \, dan &. Jika penerjemah menulis beberapa di antaranya dalam file lang, itu akan menjadi masalah.
Kami harus memastikan kami melawan karakter ini. Alangkah baiknya jika kita bisa menggunakan argumen tambahan (flag) seperti ini:
trans('file.str1', EscApos) //EscApos - escape apostrof
trans('file.str1', EscQuot) //EscQuot- melarikan diri ganda EscQuot
trans('file.str1', EscLtBt) // ganti kiri dari dan lebih besar dari dengan entitas HTML <

Sekarang Anda mungkin mengatakan - lepaskan saja di file lang. Oke, tetapi jika saya menggunakan layanan penerjemah lain (jika saya tidak menerjemahkan file saya), mereka mungkin membuat kesalahan fatal. Saya dapat memberi tahu mereka untuk menghindari tanda kutip ganda atau tanda kutip tunggal setiap kali dan bahkan melakukan pemeriksaan outomatic, tetapi ini lebih rumit - kadang-kadang harus menghindari tanda kutip ganda, kadang tanda kutip tunggal (tanda kutip), itu tergantung pada konteksnya. Jadi, saya pikir tempat yang tepat untuk melakukan escaping adalah ketika kita mengeluarkan string dengan fungsi trans(), kita akan menyiapkan argumen tambahan tergantung pada konteksnya. Penerjemah tidak akan peduli tentang itu.
Kami dapat menggunakan fungsi pelolosan khusus seperti ini: EscQuot(trans('file.str1')) atau
untuk mengganti fungsi trans() seperti ini:
transEscQuot('file.str1')

Bukan keputusan yang baik jika kita mengganti tanda kutip dengan entitas html dalam file lang seperti ini:
'str1'=>'Ada apa?'
karena ini akan memberikan kesalahan penggunaan:


itu akan mencetak

dan parser akan menggunakan ' secara harfiah, itu sama dengan

Saya tidak yakin mana yang merupakan pendekatan terbaik.
Yang terbaik adalah jika kerangka kerja lolos dari karakter ini secara otomatis tergantung pada konteksnya, saya tidak yakin apakah ini mungkin.
Anda dapat mempertimbangkan ide saya untuk Laravel versi mendatang.

Komentar yang paling membantu

Saya tidak menemukan tarikannya.

Yang saya maksud adalah Anda dapat mengirim tarikan. :)

Semua 3 komentar

Kami terbuka untuk menarik permintaan.

Saya tidak menemukan tarikannya. Jadi inilah yang saya lakukan untuk menyelesaikan masalah saya dengan tanda kutip dan apostrof. Saya menulis dua fungsi baru, yang memperluas trans() biasa:
trans1() - yang lolos dari apostrof \'
trans2() - yang lolos dari tanda kutip ganda \"
Saya menambahkannya di:
\non-publik\vendor\laravel\framework\src\Illuminate\Support\helpers.php

Saya menyimpan beberapa aturan sederhana untuk melokalkan aplikasi saya:

1) kami selalu menggunakan tanda kutip ganda untuk file lang kami, seperti ini: "key" => "value"
2) penerjemah tidak melarikan diri atau mengganti apa-apa, mereka harus menerjemahkan tetapi tidak memikirkan karakter melarikan diri. Mereka tidak tahu cara kerja aplikasi Anda, dan mereka bukan programmer. Mereka hanya perlu menyimpan pengganti, jika ada. Mereka bekerja dengan file PO atau XLIFF, bukan dengan array php.
3) ketika kami mengonversi file PO atau XLIFF yang diterjemahkan ke array php, kami menghindari tanda kutip ganda "invalideEmail" => "Tolong, periksa \"email\" Anda dan ganti "kurang dari", "lebih dari", "ampersand" dan "backslash" dengan entitas html.
4) kami menggunakan fungsi kustom kami trans1() dan trans2() (yang memperluas trans() biasa). trans1() lolos dari tanda kutip tunggal, dan trans2() lolos dari tanda kutip ganda. Kita juga bisa menggunakan fungsi trans() biasa.

Kode saya (saya bukan guru, tetapi masih berfungsi :)):

jika ( ! function_exists('trans1'))
{
function trans1($id, $arg1=null, $arg2=null, $arg3=null, $arg4=false) //($id, $number, $replacements, $locale, isCalledFromTrans2())
{
if($arg1!==null) {
if(is_numeric($arg1)) {
$angka=$arg1;
}
elseif(is_array($arg1)) {
$penggantian=$arg1;
}
elseif(is_string ($arg1)) {
$lokal=$arg1;
}
}
if($arg2!==null) {
if(is_numeric($arg2)) {
$angka=$arg2;
}
elseif(is_array($arg2)) {
$penggantian=$arg2;
}
elseif(is_string ($arg2)) {
$lokal=$arg2;
}
}
if($arg3!==null) {
if(is_numeric($arg3)) {
$angka=$arg3;
}
elseif(is_array($arg3)) {
$penggantian=$arg3;
}
elseif(is_string ($arg3)) {
$lokal=$arg3;
}
}

    $translation="";

    if(isset($number) && isset($replacements) && isset($locale)) {
        $translation = app('translator')->choice($id, $number, $replacements, $locale);
    }       
    elseif(isset($number) && isset($replacements)) {
        $translation = app('translator')->choice($id, $number, $replacements);
    }
    elseif(isset($number) && isset($locale)) {
        $translation = app('translator')->choice($id, $number, [], $locale);
    }   
    elseif(isset($replacements) && isset($locale)) {
        $translation = app('translator')->get($id, $replacements, $locale);
    }   
    elseif(isset($number)) {
        $translation = app('translator')->choice($id, $number);
    }   
    elseif(isset($replacements)) {
        $translation = app('translator')->get($id, $replacements);
    }   
    elseif(isset($locale)) {
        $translation = app('translator')->get($id, [], $locale);
    }           
    else {
        $translation = app('translator')->get($id);
    }

    if($arg4===false) { //ako trans1() ne se vika ot trans2()
        $translation = str_replace("\'","'",$translation);
        $translation = str_replace("'","\'",$translation);
    }
    return $translation;
}

}

jika ( ! function_exists('trans2'))
{
fungsi trans2($id, $arg1=null, $arg2=null, $arg3=null) //($id, $number, $replacements, $locale)
{
$translation = trans1($id, $arg1, $arg2, $arg3, benar);
$translation = str_replace('\"','"',$translation);
$translation = str_replace('"','\"',$translation);
kembali $terjemahan;
}
}

Hal baiknya adalah Anda dapat menggunakan fungsi-fungsi ini dengan argumen dalam urutan acak, seperti:
trans1('file.str', $number, $replacements) atau
trans1('file.str', $penggantian, $angka)

Saya tidak menemukan tarikannya.

Yang saya maksud adalah Anda dapat mengirim tarikan. :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat