Salagir's Blog

Old name was: "Why do witches burn?"

This is french section. Go to English version

Fonctions temporelles 2 : le retour

Le novembre 15th, 2008

Je vous avais parlé de fonctions PHP permettant d’écrire des temps restant, soit dans plusieurs langues, soit en arrondit.
Et bien j’ai craqué, j’ai fait la fonction finale, qui fait les deux en même temps, et cela grâce aux traducteurs de Multiverse. En voici son utilisation. (Cherchez le « Prochaine page dans : … »)

Fonction et table de traduction

Je vous ai aussi parlé de ma fonction de traduction. Il est temps de vous la remettre (vous allez être épaté, wou la la …)

Vu le peu d’intérêt et le grand nombre de lignes de codes de mon site de traduction, qui est ouvert à mes divers traducteurs, je ne pense pas vous les partager. Mais je vais quand même vous montrer les résultats.

La table :

CREATE TABLE `get_textes` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `section` VARCHAR(20) NOT NULL,
  `txt_en` text NOT NULL,
  `txt_fr` text NOT NULL,
  `txt_it` text NOT NULL,
  `txt_es` text NOT NULL,
  `txt_jp` text NOT NULL,
  `txt_ar` text NOT NULL,
  `txt_nl` text NOT NULL,
  `txt_pl` text NOT NULL,
  `txt_pt` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `section` (`section`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

Donnez-lui le nom que vous voulez à la table, je m’en fous…
La colonne « section » permet de séparer des types de traduction. Vous verrez dans le paragraphe suivant. Ca me permet de ne pas vous partager d’un coup les traductions temporelles et les titres de chapitre multiverse, les textes de la section commentaire…
La colonne « txt_en » est obligatoire, car c’est la langue par défaut, quand la traduction manque.
Le moteur est MyISAM parce que c’est une table qui sera le plus souvent en lecture (si si j’y ai réfléchi et tout).
Donc oui il y a bien une colonne par langue, ça reste le plus simple. Pensez à l’utf8, il sera votre meilleur ami quand vous utiliserez des langues de gens-qui-écrivent-pas-comme-nous.
Egalement, dans vos scripts PHP, commencez toujours, juste après la connexion, par cette query :

SET NAMES 'utf8'

Sinon vous pourrez avoir des résultats étranges.

La fonction de traduction :

function __($id) {
    global $lang;
    static $tablename = 'get_textes';
    $id = (int) $id;
    $R = mysql_query("SELECT `txt_$lang`,txt_en FROM $tablename WHERE id=$id LIMIT 1");
    $txt = mysql_result($R, 0, 0);
    if (!$txt) return mysql_result($R, 0, 1);
    return $txt;
}

A vous vous débrouiller pour que votre variable global $lang (ou $GLOBALS['lang']) ne puisse avoir QUE l’une des valeurs présentes en base de donnée.
Et non il n’y a ni cache ni quoi que ce soit. Je n’ai pas eu l’envie ni le temps de travailler ce genre d’optimisations. Après tout une BDD est faire pour être accédée. Y’a un index et tout… De toutes façon y’a rien de transcendant là dedans, c’est juste pour vous donner ma marche à suivre puisque le reste en dépends.

Fonction d’affichage de temps, arrondi, international

/** Affiche un temps ecrit joliment.
 
  \param $secondes (int) nombre de secondes.
 
  \param $detail peut etre :
        - un booleen (oui on affiche tous les details)
        - ou les strings suivant: 'h' (detail a l'heure pres), 'mn' (detail a la minute pres)
        - ou bien un int: le nombre d'infos. 1 est identique a false
 
  \return (string)
 */
function super_write_delay($secondes, $detail=true) {
     // hum....
}

En fait c’est un peu long tout ce code alors choppez donc directement le fichier (zip), ou regardez-le en ligne.

Voici les quelques lignes SQL à ajouter à votre table (le fichier est encodé en UTF8).
Je pense que ce serai une TRES mauvaise idée que de copier-coller son contenu. Sauvez-le sur votre disque, puis importez-le avec phpMyAdmin par exemple.

Exemples d’utilisation :

// multiverse
// (ici, calcul de $S qui est le nombre de secondes restantes avant la prochaine page)
// note: 48 c'est bien sûr "Prochaine page dans :"
echo __(48).' '.super_write_delay($S, 2);
// resultat : Prochaine page dans : 3 jours, 10h   ou  Prochaine page dans : 9h, 23 mn
 
// autre delires :
echo super_write_delay(3661, 'h');
// 1 heure
echo super_write_delay(3661, 'mn');
// 1h, 01mn
echo super_write_delay(3661, 's');
// 1h, 01mn, 01s

Et histoire de faire croire que je cherche des infos avant de réinventer la roue, voici une fonction php5 qui écrit des date de façon internationale :
http://blog.pascal-martin.fr/post/php-5.3-intl-1-internationalisation-localisation (merci Nyamsprod)

2 Responses to “Fonctions temporelles 2 : le retour”

  1. Edit ! Je viens de voir un petit bug, quand le nombre de jours à afficher dépasse un mois.
    Le bug est réglé et géré dans le fichier zip.

    Maintenant, pour ce que ça a l’air d’intéresser du monde… ;)

    Salagir

  2. vraiment trop a lire, je m’y met demain promis xD

    kanif

Leave a Reply