Framework: Função TRANS com parâmetros para aspas de escape

Criado em 24 jan. 2015  ·  3Comentários  ·  Fonte: laravel/framework

Os caracteres a seguir podem interferir com um analisador HTML ou Javascript e devem ser escapados em strings literais: <,>, ", ', \ e &. Se o tradutor escrever alguns deles em arquivos lang, seria um problema.
Temos que nos proteger contra esses chars. Seria ótimo se pudéssemos usar argumentos adicionais (sinalizadores) como este:
trans ('file.str1', EscApos) // EscApos - apóstrofo de escape
trans ('file.str1', EscQuot) // EscQuot- escape duplo EscQuot
trans ('file.str1', EscLtBt) // substitua esquerda e maior que entidades HTML <

Agora você pode dizer - apenas escape em arquivos lang. OK, mas se eu estiver usando serviços de outros tradutores (se não estiver traduzindo meus arquivos), eles podem cometer erros fatais. Eu poderia dizer a eles para escapar das aspas duplas ou simples todas as vezes e até mesmo fazer verificações automáticas, mas é mais complicado - às vezes tem que escapar aspas duplas, às vezes aspas simples (apóstrofo), depende do contexto. Então, eu acho que o lugar correto para fazer o escape é quando geramos a string com a função trans (), vamos configurar o argumento adicional dependendo do contexto. Os tradutores não se importarão com isso.
Podemos usar a função de escape personalizada como esta: EscQuot (trans ('file.str1')) ou
para substituir a função trans () desta forma:
transEscQuot ('file.str1')

Não é uma boa decisão substituir aspas por entidades html em um arquivo lang como este:
'str1' => 'O que foi?'
porque isso gerará um erro de uso:


vai imprimir

e o analisador usará 'literalmente, é o mesmo que

Não tenho certeza de qual é a melhor abordagem.
O melhor será se o framework escapar desses caracteres automaticamente dependendo do contexto, não tenho certeza se isso é possível.
Você pode considerar minhas idéias para versões futuras do Laravel.

Comentários muito úteis

Eu não encontrei a atração.

O que eu quis dizer é que você pode enviar um puxão. :)

Todos 3 comentários

Estamos abertos para receber solicitações.

Eu não encontrei a atração. Então foi isso que fiz para resolver meu problema com aspas e apóstrofos. Escrevi duas novas funções, que estendem o trans () regular:
trans1 () - que escapa apóstrofos \ '
trans2 () - que escapa aspas duplas \ "
Eu os adicionei em:
\ non-public \ vendor \ laravel \ framework \ src \ Illuminate \ Support \ helpers.php

Eu mantenho algumas regras simples para localizar meu aplicativo:

1) sempre usamos aspas duplas para nossos arquivos de idioma, como este: "chave" => "valor"
2) os tradutores não escapam ou não substituem nada, eles têm que traduzir, mas não pensar em escapar dos caracteres. Eles não sabem como seu aplicativo está funcionando e não são programadores. Eles só precisam preservar as substituições, se houver. Eles funcionam com arquivos PO ou XLIFF, não com matrizes php.
3) quando convertemos os arquivos PO ou XLIFF traduzidos em matrizes php, evitamos aspas duplas "invalideEmail" => "Por favor, verifique seu \" e-mail \ "" e substitua "menor que", "maior que", "e comercial" e "barra invertida" com entidades html.
4) usamos nossas funções personalizadas trans1 () e trans2 () (que estendem o trans () regular). trans1 () escapa de aspas simples e trans2 () escapa de aspas duplas. Podemos usar a função regular trans () também.

Meu código (não sou guru, mas ainda está funcionando :)):

if (! function_exists ('trans1'))
{
função trans1 ($ id, $ arg1 = nulo, $ arg2 = nulo, $ arg3 = nulo, $ arg4 = falso) // ($ id, $ número, $ substituições, $ locale, isCalledFromTrans2 ())
{
if ($ arg1! == null) {
if (is_numeric ($ arg1)) {
$ número = $ arg1;
}
elseif (is_array ($ arg1)) {
$ substituições = $ arg1;
}
elseif (is_string ($ arg1)) {
$ locale = $ arg1;
}
}
if ($ arg2! == null) {
if (is_numeric ($ arg2)) {
$ número = $ arg2;
}
elseif (is_array ($ arg2)) {
$ substituições = $ arg2;
}
elseif (is_string ($ arg2)) {
$ locale = $ arg2;
}
}
if ($ arg3! == null) {
if (is_numeric ($ arg3)) {
$ número = $ arg3;
}
elseif (is_array ($ arg3)) {
$ substituições = $ arg3;
}
elseif (is_string ($ arg3)) {
$ locale = $ 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;
}

}

if (! function_exists ('trans2'))
{
função trans2 ($ id, $ arg1 = nulo, $ arg2 = nulo, $ arg3 = nulo) // ($ id, $ número, $ reposições, $ locale)
{
$ tradução = trans1 ($ id, $ arg1, $ arg2, $ arg3, verdadeiro);
$ translation = str_replace ('\ "', '"', $ tradução);
$ translation = str_replace ('"', '\"', $ tradução);
return $ tradução;
}
}

O bom é que você pode usar essas funções com argumentos em ordem aleatória, como:
trans1 ('arquivo.str', $ número, $ substituições) ou
trans1 ('arquivo.str', $ substituições, $ número)

Eu não encontrei a atração.

O que eu quis dizer é que você pode enviar um puxão. :)

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

lzp819739483 picture lzp819739483  ·  3Comentários

fideloper picture fideloper  ·  3Comentários

PhiloNL picture PhiloNL  ·  3Comentários

RomainSauvaire picture RomainSauvaire  ·  3Comentários

ghost picture ghost  ·  3Comentários