Localizzazione in php, best practice o approccio?


11

Sto localizzando la mia applicazione php. Ho un dilemma sulla scelta del metodo migliore per ottenere lo stesso risultato.

Metodo 1: Attualmente sto memorizzando parole da localizzare in un array in un file php

<?php

$values = array (
                        'welcome' => 'bienvenida'
                ); 

?>

Sto usando una funzione per estrarre e restituire ogni parola in base alle esigenze

Metodo 2: dovrei usare un file txt che memorizza una stringa dello stesso?

<?php
$welcome = 'bienvenida'; 
?>

La mia domanda è quale sia un metodo migliore, in termini di velocità e impegno per sviluppare lo stesso e perché?

Modifica: vorrei sapere quale metodo su due è più veloce nel rispondere e perché dovrebbe essere? inoltre, qualsiasi miglioramento sul codice sopra sarebbe apprezzato !!


2
hai considerato gettext?
Sagarchalise,

@sagarchalise l'ho esaminato, ma voglio costruire il mio metodo, cioè uno dei due precedenti. Quindi, vorrei sapere quale metodo funziona più velocemente e quale è più affidabile! :)
sree

Se vuoi sapere in termini di velocità, fai solo alcuni casi di test. Cosa corre più veloce, 1 milione di volte il primo o il secondo metodo?
Francisco Presencia,

2
Non reinventare una ruota che funzioni bene.
gbjbaanb,

Risposte:


10

PHP ha grandi possibilità integrate per la localizzazione. Il modo più comune sembra essere gettext : questo tutorial mostra come viene utilizzato.

A partire da PHP 5.3 c'è anche intl che offre molte più funzionalità (per formattare numeri, date e valute a seconda delle impostazioni locali, ad esempio).


Grazie per la tua risposta, ma potrei sapere da sopra quale metodo è meglio costruire in termini di velocità e affidabilità.
sree,

10

Prima di tutto, gettextè una buona strada da percorrere, quindi non scartare se all'inizio non sembra facile; Tuttavia ci sono anche altre opzioni che possono essere utili da sapere. Prima di spiegare che diamo un'occhiata ai tuoi suggerimenti:

Nel tuo modo arraydi fare questo, hai una soluzione praticamente semplice. La cosa buona è che puoi archiviare le tue traduzioni in una memoria dati, quindi caricarle nello script PHP come un array, e il gioco è fatto. Tuttavia, se si desidera archiviare l'array in modo statico in un file PHP, la modifica richiede a) un programmatore PHP o un utente espropriato che abbia familiarità con la sintassi di PHP, solo per modificare il file b) sincronizzazione tra anche quattro o cinque file di lingue diverse potrebbe essere abbastanza fastidioso e soggetto a errori.

Quello che devi considerare qui è: come aggiungere successivamente nuovi elementi al file della lingua? Posso lasciarlo a un traduttore o dovrebbe esserci un programmatore PHP?

Il tuo modo variabledi farlo non è pratico. Perché? Presumo che avrai almeno un paio di funzioni nella tua applicazione, giusto? Quindi è necessario passare tutte queste variabili quando si chiama la funzione o è necessario per globalloro. Se pensi di avere più di dieci variabili come questa, ti scoraggio fortemente a farlo. Potrebbero esserci anche conflitti di nomi - puoi potenzialmente sovrascrivere il valore di un'altra variabile con lo stesso nome, tuttavia questo potrebbe essere risolto aggiungendo un prefisso anche semplice come un carattere di sottolineatura, quindi avrai $_welcomead esempio. Comunque, se fossi in te non ci penserei nemmeno; Non farlo

Un buon modo per farlo è definire Costanti con un prefisso. Quindi per esempio nel tuo en.lang.phpavrai qualcosa di simile define( 'LABEL_WELCOME', 'Welcome' );e nel tuo no.lang.phpavrai define ( 'LABEL_WELCOME', 'Velkommen' );. L'aspetto positivo dell'uso di costante anziché di variabili è che sono sempre disponibili nel tuo script. Quindi non è necessario iniettarli o globalizzarli. Rispetto sia alle matrici che alle variabili, sono più veloci a causa del modo in cui PHP le gestisce: occupano meno spazio nella memoria. Lo svantaggio è che non puoi passarli al traduttore, quindi hai di nuovo bisogno di uno sviluppatore PHP. Anche la sincronizzazione tra i file potrebbe essere di nuovo un po 'dolorosa.

L'altra opzione è avere una funzione o classe / metodo per recuperare la traduzione. Sarà meno efficiente, tuttavia non credo che tu abbia bisogno di quel tipo di micro-ottimizzazione, ma il vantaggio è che puoi applicare una logica personalizzata durante il recupero della traduzione. Ad esempio, immagina che un giorno il tuo amato project manager verrà da te chiedendoti se potresti convertire tutti quei testi in maiuscolo. Non puoi rifiutarti di farlo, quindi avere una funzione in mezzo potrebbe aiutarti molto quando devi applicare / cambiare un modello a tutte le tue traduzioni.

Per concludere:

  1. Pensa a come i traduttori possono usarlo e trovare una soluzione KISS funzionante per loro.

  2. Pensa a come rimanere sincronizzati tra lingue diverse.

  3. Pensa se potrebbe essere necessaria la stessa traduzione, diciamo per l'app mobile. Una soluzione multipiattaforma potrebbe farti risparmiare tempo. Non eliminare i database JSON e ordinari.

  4. Pensa a come applicare / modificare la logica durante il recupero delle traduzioni.

  5. Dimenticato la performance. Il 99,9% delle volte non riuscirai a fare la micro-ottimizzazione come Costante vs. Variabili vs. Chiamate di funzione . Presumo che il tuo tempo come sviluppatore / personale sia più costoso di un tempo di elaborazione.

Aggiornamento n. 1

Mio Dio, ho postato una risposta per una domanda di un anno. Perché nessuno sta dicendo qualcosa qui? Abbiamo bisogno di avvisi per questi casi.

Aggiornamento n. 2

Sul lato destro dice che è una domanda di un anno; Tuttavia è stato chiesto due anni fa! Qui tutto è fuorviante!


sembri un viaggiatore nel tempo indietro nel tempo :) grazie per la risposta!
sree

3
@sree Sì! Vengo dal 4 aprile 2014! Se acquisti alcune azioni Facebook o WhatsApp nel 2012, non dovrai scrivere il codice PHP nel 2014!
Mahdi

1
rofl d'accordo !!!
sree
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.