3

J'ai besoin de créer une application globale. Cela signifie que cela devrait fonctionner partout dans le monde, dans n'importe quel pays (ou la plupart d'entre eux). C'est un site PHP qui traitera de l'argent et du temps à certains moments.Les douleurs de la création d'une application globale

Je voudrais pouvoir connaître une bonne ressource pour les pays, les fuseaux horaires liés, le formatage des devises, des symboles et des codes, ce genre de choses ...

Si quelqu'un a des conseils sur ces types de données et comment pourrais-je utiliser eux dans la manière propper, je serais vraiment reconnaissant :)

Merci d'avance!

+1

Devrait ajouter 1337 comme étiquette;) – RCIX

Répondre

1

Regardez comment le Mantis BugTracking software gère l'internationalisation. La méthode qu'ils utilisent est plutôt sympa.

Informations complémentaires: Il a été des années que je l'ai utilisé, mais un rapide coup d'oeil à travers le code source montre que cette partie du code n'a pas changé de manière significative. Ils utilisent le catalogue de messages commun et obtiennent message approche que de nombreux produits utilisent. Leur API de langage est assez simple - le phpxref output is available et ce n'est pas si surprenant. Le catalogue de messages est implémenté comme un script PHP qui obtient simplement include 'd. Par exemple, the catalog for English contient des entrées comme:

$s_new_bug = 'New Issue'; 
$s_bugnote_added = 'Note Added'; 

Il contient environ 1 600 déclarations. La magie intéressante se passe à l'intérieur de lang_load. Lorsqu'une langue est chargée, le fichier de catalogue est inclus afin que toutes les variables qu'elle définit soient définies dans la portée locale. Lang_load effectue une itération sur les variables définies localement et génère une mappe de message basée sur les noms des variables afin qu'elle puisse rechercher le message par son nom. Par exemple, après le chargement de l'extrait précédent, ce sera comme si les déclarations suivantes ont été exécutées:

$g_lang_strings['en']['new_bug'] = 'New Issue'; 
$g_lang_strings['en']['bugnote_added'] = 'Note Added'; 

Lorsque l'interface utilisateur a besoin d'accéder à un « codé en dur » chaîne, il utilise un appel comme lang_get('new_bug') qui:

  1. Lookup la langue préférée dans les paramètres de l'utilisateur actuel
  2. Assurez-vous que la carte de la langue est chargée en appelant lang_load()
  3. Renvoie la valeur de la carte de langue appropriée

La chose intéressante est que toute la machinerie est chargée paresseusement. Vous ne payez pas pour le fait qu'ils ont une cinquantaine de langues définies jusqu'à ce que vous ayez besoin d'accéder à l'un d'entre eux. Dans l'ensemble, c'est probablement l'une des applications PHP les plus inpressives que j'ai creusées au fil des ans.

+0

Pourriez-vous ajouter d'autres clarifications? Je suis curieux, mais je n'ai pas le temps de vérifier le code maintenant. –

+0

Désolé, il y a de meilleures façons de gérer les applications multilingues - gettext. Je n'irais jamais comme tu l'as décrit. Gettext est une norme de facto et vous n'avez pas besoin de la construire vous-même. – dwich

3

Zend Locale, une partie de Zend Framework, vous aide à résoudre les problèmes liés aux devises, les fuseaux horaires, la traduction, ...

Il est facile d'adopter pièce par pièce Zend Framework, vous pouvez simplement utiliser ces pièces vous avez besoin (pas de ballonnement ou de ralentissement).

1

J'ai travaillé sur une application mondialisée et je trouve que l'un des éléments les plus difficiles est le fuseau horaire et la façon dont vous stockez vos dates d'utilisation. Parfois, les dates doivent être stockées dans l'heure locale (comme l'heure d'un événement à l'endroit du monde) et quelquefois elles doivent être stockées dans un fuseau horaire commun (par exemple stocker des dates créées comme UTC pour tout) et converties aux utilisateurs heure locale si nécessaire. Je conseillerais une convention de nommage de vos colonnes/variables db pour préciser ce que c'est. Ne jamais essayer de faire face à des conversions de fuseau horaire manuellement (c'est beaucoup plus compliqué que vous ne le pensez), utiliser une sorte de bibliothèque/framework - je ne saurais pas quoi utiliser en PHP, en .Net nous pouvons compter sur le .Net BCL pour ce genre de chose.

+1

JonoW, pourquoi ne pas stocker toutes les dates/heures en UTC et les convertir à la volée? Cela me semble beaucoup plus fiable, et puisque vous connaissez la date et l'heure, les fonctions de conversion fonctionneront en conséquence. La seule façon que je pourrais voir se heurter à des ennuis serait si vous avez seulement stocké le temps sans la date. – Brad

+1

Oui vous pouvez bien sûr, mais il y a des dates que vous pouvez vouloir rester non converti. Par exemple. Si un utilisateur à Londres dit qu'un événement commence à 19h à Londres, vous ne voulez pas que les utilisateurs en Allemagne voient cela comme 20h (dépend du contexte), donc il doit y avoir un moyen de documenter cela - dans notre cas, nous choisissons un nom convention. Si l'événement était un événement global (par exemple un discours diffusé sur le Web), il serait logique de stocker en UTC. – JonoW