Jump to content

Ajuda:Extensão:Traduzir/Validadores

From mediawiki.org
This page is a translated version of the page Help:Extension:Translate/Validators and the translation is 100% complete.

As cadeias de caracteres traduzíveis geralmente contêm marcações que devem ser mantidas como estão na tradução. Digitar tais marcações pode ser um processo lento e difícil, dado que caracteres especiais estão quase sempre presentes nelas. A extensão Translate pode fornecer aos tradutores um botão que, ao ser clicado, insere o trecho de marcação na tradução para a posição atual do cursor. Além disso, se uma tradução não tiver essa marcação específica, a extensão Translate poderá avisar o tradutor ou simplesmente rejeitar a tradução, pois essa marcação geralmente é obrigatória para exibir as mensagens corretamente para o usuário final.

Por exemplo, na cadeia de caracteres

Adapted by %{name} from a work by %{original}

, há dois inseríveis - %{name} e %{original}.

Se o tradutor não os adicionar à sua tradução, o usuário final que estiver usando o software não verá uma mensagem adequada.

A estrutura MessageValidator foi adicionada com a intenção de ajudar a validar as traduções. Os validadores são executados na mensagem traduzida e, com base na configuração, uma mensagem de aviso ou erro é mostrada ao tradutor. As traduções com avisos ainda podem ser salvas, mas as que apresentam erros não podem. Somente um usuário com permissão translate-manage pode salvar traduções com erros.

Ao configurar um validador, uma regex é definida para identificar a marcação que é obrigatória. O validador também pode ser marcado como inserível e, nesse caso, será exibido um botão para o tradutor adicionar essa marcação à tradução.

A adição de validadores personalizados ainda é possível e será necessária para validações mais especializadas.

Configuração

A seguir, uma configuração resumida do validador,

VALIDATORS:
    # Exemplo 1
    - id: InsertableRegex
      enforce: true
      insertable: true
      params: /\$[a-z0-9]+/
      keymatch:
        - 'untranslated' # Corresponde à chave não traduzida diretamente
        - 
          type: 'wildcard'
          pattern: '*translated*' # Corresponde a qualquer chave que contenha a tradução
    # Exemplo 2
    - id: InsertableRegex
      insertable: true
      params:
          regex: /(?<pre>\[)[^]]+(?<post>\]\([^)]+\))/
          display: $pre $post
          pre: $pre
          post: $post
    # Exemplo 3
    - class: MathJaxMessageValidator
      enforce: true
    # Exemplo 4
    - id: BraceBalance

No exemplo acima,

  1. InsertableRegex é um validador integrado que pode aceitar uma regex personalizada e executar validações.
  2. MathJaxMessageValidator é uma classe de validador personalizada.
  3. BraceBalance é outro validador incluído no pacote.

VALIDATORS usa um formato de matriz. Vamos dar uma olhada nos vários parâmetros que estão sendo usados aqui em cada item da matriz,

Parâmetros ==

Imóvel Tipo Descrição
id texto Caso um validador empacotado/pré-fornecido esteja sendo usado, a ID do validador. Obrigatório se class não for especificado.
class texto Se um validador personalizado estiver sendo usado, use essa opção em vez de id. Especifica o nome da classe do validador. Consulte o exemplo nº 3 na configuração acima. A opção AUTOLOAD pode ser usada para carregar a classe. Obrigatório se id não for especificado.
enforce boolean Se o validador deve ser aplicado. Se definido como true, e uma tradução falhar na validação, será exibido um erro que deverá ser corrigido para que a tradução seja salva.
insertable boolean Se o validador também deve ser um inserível.
keymatch array Com essa opção, é possível limitar determinadas validações a determinadas mensagens. Keymatch é uma matriz em que cada opção é uma string ou um prototype Se for uma cadeia de caracteres, será feita uma comparação direta com a chave da mensagem. Veja o exemplo nº 1 na configuração acima.
keymatch[i].type texto O tipo é regex ou curinga. Essa é a abordagem que será usada para verificar se a chave da mensagem corresponde a um determinado padrão.
keymatch[i].pattern texto O padrão é uma cadeia de caracteres que será usada para correspondência.
params string / matriz associativa Se params for especificado como uma string, ele será usado como regex. Veja o exemplo nº 1

Nesse caso, se insertable for verdadeiro,

  1. display é o primeiro valor da correspondência regex.
  2. pre também é o primeiro valor da correspondência de regex.
  3. post é deixado vazio.

Se params for especificado como uma matriz associativa (veja o exemplo nº 2), consulte abaixo para obter mais detalhes.

params.regex texto O regex a ser usado para o validador. Deve usar capturas nomeadas. Ao especificar capturas nomeadas, não use o símbolo $ no nome.

No exemplo nº 2, são usadas duas capturas nomeadas - pre e post.

params.display texto Valor obrigatório. O valor de exibição do inserível. Capturas nomeadas prefixadas com $ são usadas aqui. Consulte o exemplo nº 2.
params.pre texto O valor pré para o inserível. Valor inserido antes da posição do cursor. Capturas nomeadas prefixadas com $ são usadas aqui. Se não for especificado, será definido como o valor de exibição. Consulte o exemplo nº 2.
params.post texto O valor do post para o inserível. Valor inserido após a posição do cursor. Capturas nomeadas prefixadas com $ são usadas aqui. Consulte o exemplo nº 2. Se não for especificado, o padrão é uma string vazia.

Validadores pré-fornecidos/em pacote

Veja a seguir uma lista de validadores agrupados,

BraceBalance

ID: BraceBalance

Garante que o número de chaves/colchetes abertos corresponda ao número de chaves/colchetes fechados na tradução.

Por exemplo, as seguintes traduções seriam aprovadas,

  • {{ }}
  • [ ]

enquanto isso, o seguinte falharia,

  • [ ]]
  • {{ }

Esse validador não pode ser marcado como inserível.

EscapeCharacter

ID: EscapeCharacter

O validador garante que somente o caractere de escape especificado esteja presente em uma tradução.

Os caracteres de escape permitidos podem ser especificados ao adicionar o validador e só podem incluir,

  • \t
  • \n
  • \'
  • \"
  • \f
  • \r
  • \a
  • \b
  • \\

Esse validador não pode ser inserido.

GettextNewline

ID: GettextNewline

Isso funciona especificamente para grupos de mensagens baseados em GetText.

Garante que a tradução tenha o mesmo número de novas linhas que a mensagem original no início e no final da string.

GettextPlural

ID: GettextPlural

Isso funciona especificamente em grupos de mensagens baseados em GetText.

Garante que, se a fonte/definição contiver um plural no formato - foo {{PLURAL:GETTEXT|one|many}} bar, a tradução também deverá contê-lo. Com base no idioma, ele também verifica se a tradução tem o número correto de formas plurais. Por exemplo, o inglês tem dois, mas o hebraico tem quatro.

InsertableRegex

ID: InsertableRegex

Um validador genérico reutilizável que pode ser usado para especificar validações e inserções personalizadas.

Por exemplo, veja a seguinte configuração em que o validador é marcado como inserível e aplicado,

- id: InsertableRegex
  enforce: true
  insertable: true
  params: "/\$[a-zA-Z0-9]+/"

Dada a seguinte mensagem de origem - Hello $name. My name is $myName. que está sendo traduzida, a tradução deve ter os parâmetros - $name e $myName. Eles também serão exibidos como inseríveis para facilitar o uso na tradução pelos tradutores. A ausência desses parâmetros causará a exibição de um erro para o tradutor.

InsertableRubyVariable

ID: InsertableRubyVariable

Esse é um validador que corresponde às variáveis rubi nas traduções. Internamente, ele estende InsertableRegexValidator e usa a seguinte regex - %{[a-zA-Z_]+}. Esse validador pode ser inserido.

Exemplo: %{abc}

IosVariable

ID: IosVariable

Um validador de variável inserível para IOS. Regex é usado dessa fonte Rubustrings. Esse validador pode ser inserido.

Exemplo: %@

MatchSet

ID: MatchSet

Garante que a tradução esteja presente na lista de valores. Também recebe um parâmetro - caseSensitive que pode ser true ("padrão") ou false.

Por exemplo, na configuração a seguir, o validador validará a mensagem com a chave - html.dir e garantirá que os valores para ela possam ser ltr ou rtl. Observe que LTR ou RTL não serão valores válidos, pois caseSensitive é verdadeiro por padrão.

  - id: MatchSet
    enforce: true
    keymatch:
      - html.dir
    params:
      values:
        - ltr
        - rtl

ID: MediaWikiLink

Verifica se a tradução usa links que não são recomendados. Os links válidos são aqueles que se vinculam às páginas Special:, {{ns:special}}: ou às páginas do projeto por meio de mensagens do MediaWiki, como {{MediaWiki:helppage-url}}:. Também são permitidos links na definição.

MediaWikiPageName

ID: MediaWikiPageName

Garante que, se a fonte/definição contiver um namespace como {{ns:project}}:hello, as traduções feitas não tentarão traduzir os próprios namespaces.

MediaWikiParameter

ID: MediaWikiParameter

Esse é um validador que corresponde aos parâmetros wiki nas traduções. Internamente, ele estende InsertableRegexValidator e usa a seguinte regex - /\$[1-9]/. Esse validador pode ser inserido.

Exemplo: $1, $2.

MediaWikiPlural

ID: MediaWikiPlural

Garante que, se o código-fonte/definição contiver um {{PLURAL:$1|message|messages}}, a tradução também deverá contê-lo. Ele também pode ser usado como um inserível. Com base no idioma, ele também verifica se a tradução tem o número correto de formas plurais. Por exemplo, o inglês tem dois, mas o hebraico tem três.

MediaWikiTimeList

ID: MediaWikiTimeList

Fornece validações para opções de expiração e opções de bloqueio de IP especificadas no núcleo do MediaWiki. Geralmente, eles estão no formato,

indefinite:indefinite,3 hours:3 hours,12 hours:12 hours,24 hours:24 hours,31 hours:31 hours,36 hours:36 hours,48 hours:48 hours,60 hours:60 hours,72 hours:72 hours,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,2 years:2 years,3 years:3 years,infinite:indefinite

As validações garantem que as traduções tenham exatamente o mesmo número de pares de valores-chave. Essas validações são executadas somente em mensagens com chaves,

  1. protect-expiry-options
  2. ipboptions

Newline

ID: Newline

Garante que a tradução tenha o mesmo número de novas linhas que a mensagem de origem/definição no "início da string". Esse validador não pode ser inserido.

NotEmpty

ID: NotEmpty

Garante que a tradução tenha algum conteúdo, e que esse conteúdo não seja apenas espaço em branco. Esse validador não pode ser inserido.

NumericalParameter

ID: NumericalParameter

Esse validador corresponde a parâmetros numéricos usando a seguinte regex: /\$\d+/. Esse validador pode ser inserido.

Exemplo: $33, $1 etc.

Printf

ID: Printf

Esse validador verifica se há caracteres de formatação printf ausentes e desconhecidos nas traduções. Esse validador pode ser inserido.

Exemplo: %2$f, %d etc.

PythonInterpolation

ID: PythonInterpolation

Esse validador corresponde às variáveis de interpolação de strings do python usando a seguinte regex: /\%(?:\([a-zA-Z0-9]*?\))?[diouxXeEfFgGcrs]/U. Esse validador pode ser inserido.

Exemplo: %s, %(name)s

Replacement

ID: Replacement

Verifica se uma tradução está usando a string search e, em vez disso, sugere que o tradutor use a string mencionada em replacement. Esse validador não pode ser inserido.

  - id: Replacement
    enforce: true
    params:
      search: '{{PLURAL:'
      replace: '{PLURAL:'

SmartFormatPlural

ID: SmartFormatPlural

Isso funciona especificamente em grupos de mensagens baseados em SmartFormat.

Garante que, se a fonte/definição contiver um plural no formato - {1:test|tests}{0:message|messages}, a tradução também deverá contê-lo. Com base no idioma, ele também verifica se a tradução tem o número correto de formas plurais. Por exemplo, o inglês tem dois, mas o hebraico tem quatro.

UnicodePlural

ID: UnicodePlural

Garante que, se a fonte/definição contiver um plural no formato - foo {{PLURAL|one=one|many}} bar, a tradução também deverá contê-lo. Com base no idioma, ele também verifica se a tradução tem o número correto de formas plurais. Por exemplo, o inglês tem dois, mas o hebraico tem três.

Interface do usuário

A interface do usuário foi atualizada para diferenciar entre erros e avisos.

Um aviso e um erro exibidos na parte superior de uma tradução

Durante a tradução, se for observado um erro na tradução, o botão Salvar tradução será desativado, a menos que o usuário que estiver traduzindo tenha permissão de translate-manage.

Além disso, a validação também é feita no servidor quando o usuário está salvando a tradução. Isso ainda permitirá que os usuários que têm a permissão translate-manage salvem a tradução, mesmo que ela tenha erros.

Validadores personalizados

Algumas validações complicadas ainda podem exigir a criação de um validador personalizado. Os validadores personalizados devem implementar a interface MediaWiki\Extensions\Translate\Validation\MessageValidator [1].

Abaixo está um exemplo de um validador personalizado,

<?php
// Filename: Validator.php
use MediaWiki\Extensions\Translate\Validation\MessageValidator;
use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
use MediaWiki\Extensions\Translate\Validation\ValidationIssues;

/**
 * Meu validador personalizado
 */
class MyCustomValidator implements MessageValidator {
	
	public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
		$issues = new ValidationIssues();
	    
	    // O código de validação fica aqui. Empurre ValidationIssue para dentro de ValidationIssues. Por exemplo:
	    $issue = new ValidationIssue(
			'value-not-present',                                // tipo
		    'invalid',                                          // subtipo
			'translate-checks-value-not-present',               // tecla de mensagem
			[                                                   // parâmetros de mensagem
				[ 'PLAIN-PARAMS', $this->possibleValues ],
				[ 'COUNT', count( $this->possibleValues ) ]
			]
		);

		$issues->add( $issue );
	    
	    return $issues;
	}
}

Veja também as seguintes classes,

  1. ValidationIssues - https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/Translate/+/master/src/Validation/ValidationIssues.php
  2. ValidationIssue - https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/Translate/+/master/src/Validation/ValidationIssue.php

Adicione o validador personalizado no arquivo de configuração,

VALIDATORS:
  - class: MyCustomValidator
    enforce: true

AUTOLOAD:
  MyCustomValidator: Validator.php