Live geek or die tryin'

Twig: Traduction Dans Du JavaScript

Hello,

Lors du développement d’une application Silex, je devais générer du code à la volée à l’aide de JavaScript. Le code généré ne pouvait évidemment pas être traduit. Pour palier à cela, le principe est de mettre les traductions dans un objet javascript, et de l’utiliser dans votre code JS.

Ce qui suit est une manière de procéder.

Je pars du principe que votre traduction est déjà mise en place et qu’elle marche correctement dans vos templates Twig.

Créer un fichier translations.html.twig

Je l’ai personnellement mis avec les autres vues. Mettez y un script JS avec les expressions que vous voulez traduire.

<script type="text/javascript">
    var translations = {
        'hello_world': '{% trans %}hello_world{% endtrans %}',
        'foobar': '{% trans %}foobar{% endtrans %}'
    }
</script>

Inclure ce template dans votre layout

Avant la déclaration des autre scripts bien sûr.

{% include './translations.html.twig' %}

Et voilà, vous pouvez maintenant accéder à l’objet translations depuis vos scripts JS.

Exemple:

console.log(translations.hello_world);

Silex: Le Service De Traduction Et Les Templates Twig

Silex est un micro-framework basé sur les composants de Symfony 2 grâce auquel je suis entrain de développer une sorte de vCard ou page d’accueil (faute de meilleur terme).

Parmi ses nombreuses fonctionnalités: La traduction. Bien qu’elle soit très facile à implémenter, la méthode n’est décrite nulle part sur la doc.
Heureusement, sinon je n’aurais rien à poster sur ce blog.

Trêve de plaisanteries, voici sans attendre comment implémenter la traduction avec Silex.

Déclarer les traductions

Dans un répertoire src/locales/ créez autant de fichiers yml que de langues désirées.

Exemple de fichiers:

en.yml:

  hello:      Hello
  about_me:   About me
  contact_me: Contact me

fr.yml:

hello:      Bonjour
about_me:   A propos de moi
contact_me: Contactez-moi

Déclarer le service TranslationServiceProvider dans votre app.php

$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'locale'                    => LiveGeekUtil::getClientLanguage(),
    'locale_fallback'           => 'en',
    'translation.class_path'    => __DIR__.'/vendor/Symfony/Component',
));

locale indique la langue utilisée.
locale_fallback indique la langue utilisée si notre application ne supporte pas la langue donnée dans locale.

Notez que j’ai utilisé une méthode statique pour récupérer la langue du navigateur du visiteur. La voici:

public static function getClientLanguage() {
    $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    return substr($langs[0], 0, 2);
}

Indiquer à l’application où se trouvent vos fichiers de langue:

$app['translator.messages'] = array(
    'fr' => __DIR__.'/../src/locales/fr.yml',
    'en' => __DIR__.'/../src/locales/en.yml'
);

Charger le composant qui lit les fichiers yml

PHP ne comprennant pas les fichiers YAML, on utilise le composant YAML de Symfony;

$app['autoloader']->registerNamespace('Symfony', __DIR__.'/../vendor/Symfony/src');
$app['translator.loader'] = new Symfony\Component\Translation\Loader\YamlFileLoader();

Déclarer SymfonyBridgesServiceProvider

Ce service fait la liaison entre la traduction et les templates Twig.

$app->register(new Silex\Provider\SymfonyBridgesServiceProvider(), array(
    'symfony_bridges.class_path' => __DIR__.'/vendor/Symfony/Component',
));

Et voilà.

A partir de maintenant, affichez le texte dans vos templates grâce aux balises Twig {% trans %}, ceux-ci seront automatiquement traduits dans la langue du navigateur de votre utilisateur, du moment qu’elle soit supportée.

{% trans %}contact_me{% endtrans %}

Liens utiles:

Bon courage et amusez-vous bien avec Silex! :)

Utiliser Le Format exFat Sous Linux

Bonjour,

Si comme moi vos disques durs externes sont formatés en exFat (pour gérer les fichiers de plus de 4Go par exemple), et que vous utilisez souvent Linux, vous savez sûrement que le système de fichiers de Microsoft n’est pas géré nativement par Linux.
Il y a par contre une solution, facile mais difficilement trouvable sur le net, et c’est celle que je partagerai avec vous.

Pour cela, il faut installer FUSE:

sudo apt-add-repository ppa:relan/exfat
sudo apt-get install fuse-exfat

Ensuite, branchez votre disque dur si ce n’est déjà fait, et vérifiez le nom de votre lecteur avec la commande suivante:

more /proc/partitions

Une liste de tous les périphériques de stockage sera alors affichée, votre disque dur externe sera sûrement dans la fin de la liste, vous le reconnaîtrez grâce à sa taille. Notez son nom, on va utiliser /dev/sdc1 dans cet exemple.

Maintenant créer un répertoire vide pour y monter votre DD:

cd /mnt
sudo mkdir usbdrive/

Et montez le disque dur:

sudo mount -t exfat /dev/sdc1 usbdrive

Et voilà, votre lecteur devra s’afficher sur le bureau. Si ce n’est pas le cas, accédez à /mnt/usbdrive avec votre explorateur de fichier.

Si vous avez terminé d’utiliser votre disque dur et que vous voulez le démonter, un simple umount suffit:

umount /mnt/usbdrive

Tutoriel basé sur: http://apcmag.com/how-to-enable-exfat-in-ubuntu.htm.

Symfony2: Créer Un Utilisateur Depuis Un Contrôleur Avec FOSUB

Si vous utilisez FOSUserBundle et que vous voulez créer un nouvel utilisateur depuis un contrôleur, sachez que vous pouvez le faire sans vous taper une série de lignes de code. Il existe en effet une classe pour cela, UserManipulator, qui fera la sale besogne à votre place, et en une seule ligne!

Pour l’utiliser, rien de plus simple:

$user = $this->get('fos_user.util.user_manipulator')->create($username, $password, $email, 1, 0);

Comme indiqué dans le fichier de la classe, le quatrième paramètre sert à définir si le compte sera activé ou pas et le cinquième à définir si ce compte est un super admin.

Cette méthode vous renverra une instance de l’objet User qui vient d’être créé.

Symfony2: Utiliser Des Variables Globales

Pour utiliser des variables dans un contrôleur Symfony2, il faut les déclarer dans parameters.ini, ou dans tout autre fichier ini à condition que vous l’importiez dans config.yml. Au cas où vous voudrez les utiliser dans un template Twig, il faut les déclarer dans config.yml. (Merci à Chris pour l’astuce)

Vous pourrez alors les appeler avec getParameter() depuis un contrôleur ou avec la syntaxe “ depuis un template Twig.

Déclarer votre variable

Dans un fichier ini:

[parameters]
    maVariable = 2

Ou dans config.yml:

twig:
  globals:
    maVariableTwig: %maVariable%

Importer votre fichier ini dans config.yml

Vous pouvez sauter cette étape si vous aviez déclaré la variable dans parameters.ini.

imports:
    - { resource: monFichier.ini }

Utiliser la variable globale

Dans un contrôleur:

$maVariable = $this->container->getParameter('maVariable');

Dans un template Twig:

<p>
    Ma variable: 
</p>

Enjoy. ;)