Project

General

Profile

Evolution #4471

singulier_ou_pluriel pour l'arabe

Added by George Kandalaft about 1 year ago. Updated 25 days ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Category:
filtres et balises
Target version:
Start date:
04/13/2020
Due date:
% Done:

0%

Resolution:
fixed

Description

Voici le filtre singulier_ou_pluriel adapté à l'arabe (qui a plusieurs formes de pluriels suivant le nombre d'objets):

/**
 * Afficher un message "un truc"/("deux trucs" pour l'arabe)/"N trucs" 
 * Les items sont à indiquer comme pour la fonction _T() sous la forme :
 * "module:chaine" 
 *
 * @param int $nb : le nombre
 * @param string $chaine_un : l'item de langue si $nb vaut un (ou $nb > 10 pour l'arabe)
 * @param string $chaine_plusieurs : l'item de lanque si $nb > 1 ($nb est compris entre 3 et 10 pour l'arabe)
 * @param string $var : La variable à remplacer par $nb dans l'item de langue (facultatif, défaut "nb")
 * @param array $vars : Les autres variables nécessaires aux chaines de langues (facultatif)
 * @return string : la chaine de langue finale en utilisant la fonction _T()
 */
function ar_singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) {
    if (!$nb = intval($nb)) {
        return '';
    }
    if (!is_array($vars)) {
        return '';
    }
    $vars[$var] = $nb;

    if ($GLOBALS['spip_lang'] == 'ar') {
        $fem = substr($chaine_un, -2);
        switch (true) {
            case ($nb == 1):
                if ($fem == 'ة') {
                    $chaine_un = $chaine_un . ' واحدة';
                } else {
                    $chaine_un = $chaine_un . ' واحد';
                }
                return _T($chaine_un, $vars);
                break;
            case ($nb == 2):
                if ($fem == 'ة') {
                    $chaine_deux = rtrim($chaine_un, $fem) . 'تان';
                } else {
                    $chaine_deux = $chaine_un . 'ان';
                }
                return _T($chaine_deux, $vars);
                break;
            case ($nb >2 && $nb < 11):
                return _T($chaine_plusieurs, $vars);
                break;
            default:
                $chaine_un = $nb . ' ' . $chaine_un;
                return _T($chaine_un, $vars);
        }
    } else {
        if ($nb > 1) {
            return _T($chaine_plusieurs, $vars);
        } else {
            return _T($chaine_un, $vars);
        }
    }
}

Associated revisions

Revision 24664 (diff)
Added by bruno@eliaz.fr 8 months ago

permettre d'étendre singulier_ou_pluriel() par variante de langue à l'aide de fonctions propres à chaque langue

ref #4471

Revision 24665 (diff)
Added by bruno@eliaz.fr 8 months ago

introduction de la variante de singulier_ou_pluriel() pour la langue arabe

ref #4471

History

#1 Updated by George Kandalaft 11 months ago

Correction:

/**
 * Afficher un message "un truc"/("deux trucs" pour l'arabe)/"N trucs" 
 * Les items sont à indiquer comme pour la fonction _T() sous la forme :
 * "module:chaine" 
 *
 * @param int $nb : le nombre
 * @param string $chaine_un : l'item de langue si $nb vaut un (ou $nb > 10 pour l'arabe)
 * @param string $chaine_plusieurs : l'item de lanque si $nb > 1 ($nb est compris entre 3 et 10 pour l'arabe)
 * @param string $var : La variable à remplacer par $nb dans l'item de langue (facultatif, défaut "nb")
 * @param array $vars : Les autres variables nécessaires aux chaines de langues (facultatif)
 * @return string : la chaine de langue finale en utilisant la fonction _T()
 */
function ar_singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) {
    if (!$nb = intval($nb)) {
        return '';
    }
    if (!is_array($vars)) {
        return '';
    }
    $vars[$var] = $nb;

    if ($GLOBALS['spip_lang'] == 'ar') {
        $fem = substr(_T($chaine_un), -2);
        switch (true) {
            case ($nb == 1):
                if ($fem == 'ة') {
                    $un = _T($chaine_un) . ' واحدة';
                } else {
                    $un = _T($chaine_un) . ' واحد';
                }
                return $un;
                break;
            case ($nb == 2):
                if ($fem == 'ة') {
                    $deux = rtrim(_T($chaine_un), $fem) . 'تان';
                } else {
                    $deux = _T($chaine_un) . 'ان';
                }
                return $deux;
                break;
            case ($nb >2 && $nb < 11):
                return _T($chaine_plusieurs, $vars);
                break;
            default:
                $chaine_un = $nb . ' ' . $chaine_un;
                return _T($chaine_un, $vars);
        }
    } else {
        if ($nb > 1) {
            return _T($chaine_plusieurs, $vars);
        } else {
            return _T($chaine_un, $vars);
        }
    }
}

#2 Updated by b b 10 months ago

  • Status changed from Nouveau to En cours

Super, merci pour le patch ! Je viens justement de corriger cette fonction pour le français, ton patch sera l'occasion de la compléter :)

#3 Updated by tcharlss 🐽 10 months ago

Mes 2 sous :

Ça fait penser qu'il y a peut-être d'autres façons de procéder pour d'autres langues (et là j'avoue ma complète ignorance sur le sujet).

Mais bref, pour prévoir les autres cas possibles dans le futur, plutôt que de tout faire dans la fonction singulier_ou_pluriel, celle-ci pourrait chercher la présence de fonctions propres à certaines langues, et si c'est le cas les utiliser en priorité. Exactement comme generer_info_entite() ou d'autres fonctions.

function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) {
  $texte = '';
  $langue = $GLOABLS['spip_lang'];

  // Soit il y a une fonction propre à la langue
  if ($fn = charger_fonction("singulier_ou_pluriel_${langue}", '', true)) {
    $texte = $fn($nb, $chaine_un, $chaine_plusieurs, $var, $vars);
  }

  // Soit on fait par défaut (français ou autre)
  else {
    ...
  }

  return $texte;
}

Et donc dans cet exemple ta fonction se nommerait singulier_ou_pluriel_ar()

#4 Updated by RastaPopoulos ♥ 10 months ago

Haha j'étais en train d'écrire strictement la même chose que tcharlss et ça m'a bloqué car ticket déjà modifié :D

Donc bah tout pareil : il faudrait au moins permettre une variante par langue si existante (même si ça ne suffit pas à gérer tous les cas, qui parfait ont besoin de plus que 2 chaines)

#5 Updated by b b 10 months ago

Bonne idée ! On peut le faire par étapes, intégrer le patch proposé ici, puis dans la foulée le déporter en suivant ta proposition (?).

#6 Updated by George Kandalaft 10 months ago

Hello,
Je ne connais pas non plus les pluriels d'autres langues mais l’idée semble bonne.
En tout cas pour l'arabe, j'ai fait en sorte qu'on ne soit pas obligé d'ajouter des chaînes de langue pour les paires mais il faut noter que pour $nb = 2 j'ai pris uniquement le cas le plus simple du nombre d'objets dans une liste: 2 articles, 2 mots clé, etc.
Par contre ce n'est pas très juste dans la phrase: "la recherche a retourné 2 articles", articles est complément d'objet et $deux devrai être égal à _T($chaine_un) . 'ين' au lieu _T($chaine_un) . 'ان';

#7 Updated by b b 8 months ago

George j'ai commencé à intégrer ça, mais j'ai une question à propos des valeurs non entières. En effet, depuis ta proposition, j'ai amélioré singulier_ou_pluriel pour prendre en compte les valeurs non entières comme 0.5 cf https://git.spip.net/spip/spip/commit/380c4f95fff44b617745fc7e5a5515009b082ebf ; ça se passe comment en arabe pour ce type de valeur ?

#8 Updated by b b 8 months ago

Pour info, c'est en cours ici https://git.spip.net/spip/spip/pulls/55

#9 Updated by George Kandalaft 8 months ago

Hello

Ça ne change pas, c’est la partie entière qui compte. Je suis en
déplacement, je vérifierai à mon retour la semaine prochaine.

Merci Bruno

George

Quoting :

La demande #4471 a été mise à jour par b b.

george j'ai commencé à intégrer ça, mais j'ai une question à propos
des valeurs non entières. En effet, depuis ta proposition, j'ai
amélioré @singulier_ou_pluriel
pour prendre en compte les valeurs
non entières comme 0.5 cf
https://git.spip.net/spip/spip/commit/380c4f95fff44b617745fc7e5a5515009b082ebf ; ça se passe comment en arabe pour ce type de valeur
?

----------------------------------------
Evolution #4471: singulier_ou_pluriel pour l'arabe
https://core.spip.net/issues/4471#change-16006

  • Auteur: George Kandalaft
  • Statut: En cours
  • Priorité: Normal
  • Assigné à:
  • Catégorie: filtres et balises
  • Version cible: 3.3
  • Resolution:
    ----------------------------------------
    Voici le filtre singulier_ou_pluriel adapté à l'arabe (qui a
    plusieurs formes de pluriels suivant le nombre d'objets):
> /**
>  * Afficher un message "un truc"/("deux trucs" pour l'arabe)/"N trucs" 
>  * Les items sont à indiquer comme pour la fonction _T() sous la forme :
>  * "module:chaine" 
>  *
>  * @param int $nb : le nombre
>  * @param string $chaine_un : l'item de langue si $nb vaut un (ou  
> $nb > 10 pour l'arabe)
>  * @param string $chaine_plusieurs : l'item de lanque si $nb > 1  
> ($nb est compris entre 3 et 10 pour l'arabe)
>  * @param string $var : La variable à remplacer par $nb dans l'item  
> de langue (facultatif, défaut "nb")
>  * @param array $vars : Les autres variables nécessaires aux chaines  
> de langues (facultatif)
>  * @return string : la chaine de langue finale en utilisant la fonction _T()
>  */
> function ar_singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs,  
> $var = 'nb', $vars = array()) {
>     if (!$nb = intval($nb)) {
>         return '';
>     }
>     if (!is_array($vars)) {
>         return '';
>     }
>     $vars[$var] = $nb;
>
>     if ($GLOBALS['spip_lang'] == 'ar') {
>         $fem = substr($chaine_un, -2);
>         switch (true) {
>             case ($nb == 1):
>                 if ($fem == 'ة') {
>                     $chaine_un = $chaine_un . ' واحدة';
>                 } else {
>                     $chaine_un = $chaine_un . ' واحد';
>                 }
>                 return _T($chaine_un, $vars);
>                 break;
>             case ($nb == 2):
>                 if ($fem == 'ة') {
>                     $chaine_deux = rtrim($chaine_un, $fem) . 'تان';
>                 } else {
>                     $chaine_deux = $chaine_un . 'ان';
>                 }
>                 return _T($chaine_deux, $vars);
>                 break;
>             case ($nb >2 && $nb < 11):
>                 return _T($chaine_plusieurs, $vars);
>                 break;
>             default:
>                 $chaine_un = $nb . ' ' . $chaine_un;
>                 return _T($chaine_un, $vars);
>         }
>     } else {
>         if ($nb > 1) {
>             return _T($chaine_plusieurs, $vars);
>         } else {
>             return _T($chaine_un, $vars);
>         }
>     }
> }
> 

--
Vous recevez ce mail car vous êtes impliqués sur ce projet.
Pour changer les préférences d'envoi de mail, allez sur
http://core.spip.net/my/account

#10 Updated by cedric - about 2 months ago

  • Status changed from En cours to Fermé
  • Resolution set to fixed

Comme ça nous plaisait pas trop d'ajouter une core une fonction très spécifique qui en plus bidouille les chaines de langue, on a fait un compromis :
https://git.spip.net/spip/spip/commit/b6af384d9f7ef75096784065971d2b0a3f6139a7

on a donc maintenant la possibilité de définir une variante de la fonction par langue + une variante pour toutes les langues, et ça va permettre de travailler ça tranquillement indépendant du core, dans un plugin.
Quand on a quelque chose de propre on pourra voir pour intégrer

#11 Updated by George Kandalaft 25 days ago

Merci

Sauf que cette fonction cherche une fonction par langue dans un répertoire "inc". Ce serait aussi pratique de pouvoir mettre la fonction par langues dans "mes_fonctions.php".

Also available in: Atom PDF