Page 1 sur 1

ma classe CultureInfo

Posté : 01 nov. 2009, 15:03
par Sn3b
Bonjour à tous :)

Parlons peu mais parlons bien, j'ai écrit une petite classe qui me permet de gérer les sites multilangues et je voudrais savoir ce que vous en pensez :)
class CultureInfo
{
	#Fields
	private $_name;
	private $_twoLetterCountryName;
	private $_twoLetterLanguageName;
	private $_countryName;
	private $_languageName;
	private $_languages = array(
		'af' => array( 'Language' =>'Afrikaans' ),
		'sq' => array( 'Language' =>'Albanian' ),
		'ar-dz' => array( 'Language' =>'Arabic', 'Country' => 'Algeria' ),
		'ar-bh' => array( 'Language' =>'Arabic', 'Country' => 'Bahrain' ),
		'ar-eg' => array( 'Language' =>'Arabic', 'Country' => 'Egypt' ),
		'ar-iq' => array( 'Language' =>'Arabic', 'Country' => 'Iraq' ),
		'ar-jo' => array( 'Language' =>'Arabic', 'Country' => 'Jordan' ),
		'ar-kw' => array( 'Language' =>'Arabic', 'Country' => 'Kuwait' ),
		'ar-lb' => array( 'Language' =>'Arabic', 'Country' => 'Lebanon' ),
		'ar-ly' => array( 'Language' =>'Arabic', 'Country' => 'Libya' ),
		'ar-ma' => array( 'Language' =>'Arabic', 'Country' => 'Morocco' ),
		'ar-om' => array( 'Language' =>'Arabic', 'Country' => 'Oman' ),
		'ar-qa' => array( 'Language' =>'Arabic', 'Country' => 'Qatar' ),
		'ar-sa' => array( 'Language' =>'Arabic', 'Country' => 'Saudi Arabia' ),
		'ar-sy' => array( 'Language' =>'Arabic', 'Country' => 'Syria' ),
		'ar-tn' => array( 'Language' =>'Arabic', 'Country' => 'Tunisia' ),
		'ar-ae' => array( 'Language' =>'Arabic', 'Country' => 'U.A.E.' ),
		'ar-ye' => array( 'Language' =>'Arabic', 'Country' => 'Yemen' ),
		'ar' => array( 'Language' =>'Arabic' ),
		'hy' => array( 'Language' =>'Armenian' ),
		'as' => array( 'Language' =>'Assamese' ),
		'az' => array( 'Language' =>'Azeri' ),
		'eu' => array( 'Language' =>'Basque' ),
		'be' => array( 'Language' =>'Belarusian' ),
		'bn' => array( 'Language' =>'Bengali' ),
		'bg' => array( 'Language' =>'Bulgarian' ),
		'ca' => array( 'Language' =>'Catalan' ),
		'zh-cn' => array( 'Language' =>'Chinese', 'Country' => 'China' ),
		'zh-hk' => array( 'Language' =>'Chinese', 'Country' => 'Hong Kong SAR' ),
		'zh-mo' => array( 'Language' =>'Chinese', 'Country' => 'Macau SAR' ),
		'zh-sg' => array( 'Language' =>'Chinese', 'Country' => 'Singapore' ),
		'zh-tw' => array( 'Language' =>'Chinese', 'Country' => 'Taiwan' ),
		'zh' => array( 'Language' =>'Chinese' ),
		'hr' => array( 'Language' =>'Croatian' ),
		'cs' => array( 'Language' =>'Czech' ),
		'da' => array( 'Language' =>'Danish' ),
		'div' => array( 'Language' =>'Divehi' ),
		'nl-be' => array( 'Language' =>'Dutch', 'Country' => 'Belgium' ),
		'nl' => array( 'Language' =>'Dutch', 'Country' => 'Netherlands' ),
		'en-au' => array( 'Language' =>'English', 'Country' => 'Australia' ),
		'en-bz' => array( 'Language' =>'English', 'Country' => 'Belize' ),
		'en-ca' => array( 'Language' =>'English', 'Country' => 'Canada' ),
		'en-ie' => array( 'Language' =>'English', 'Country' => 'Ireland' ),
		'en-jm' => array( 'Language' =>'English', 'Country' => 'Jamaica' ),
		'en-nz' => array( 'Language' =>'English', 'Country' => 'New Zealand' ),
		'en-ph' => array( 'Language' =>'English', 'Country' => 'Philippines' ),
		'en-za' => array( 'Language' =>'English', 'Country' => 'South Africa' ),
		'en-tt' => array( 'Language' =>'English', 'Country' => 'Trinidad' ),
		'en-gb' => array( 'Language' =>'English', 'Country' => 'United Kingdom' ),
		'en-us' => array( 'Language' =>'English', 'Country' => 'United States' ),
		'en-zw' => array( 'Language' =>'English', 'Country' => 'Zimbabwe' ),
		'en' => array( 'Language' =>'English' ),
		'us' => array( 'Language' =>'English', 'Country' => 'United States' ),
		'et' => array( 'Language' =>'Estonian' ),
		'fo' => array( 'Language' =>'Faeroese' ),
		'fa' => array( 'Language' =>'Farsi' ),
		'fi' => array( 'Language' =>'Finnish' ),
		'fr-be' => array( 'Language' =>'French', 'Country' => 'Belgium' ),
		'fr-ca' => array( 'Language' =>'French', 'Country' => 'Canada' ),
		'fr-lu' => array( 'Language' =>'French', 'Country' => 'Luxembourg' ),
		'fr-mc' => array( 'Language' =>'French', 'Country' => 'Monaco' ),
		'fr-ch' => array( 'Language' =>'French', 'Country' => 'Switzerland' ),
		'fr' => array( 'Language' =>'French', 'Country' => 'France' ),
		'mk' => array( 'Language' =>'FYRO Macedonian' ),
		'gd' => array( 'Language' =>'Gaelic' ),
		'ka' => array( 'Language' =>'Georgian' ),
		'de-at' => array( 'Language' =>'German', 'Country' => 'Austria' ),
		'de-li' => array( 'Language' =>'German', 'Country' => 'Liechtenstein' ),
		'de-lu' => array( 'Language' =>'German', 'Country' => 'Luxembourg' ),
		'de-ch' => array( 'Language' =>'German', 'Country' => 'Switzerland' ),
		'de' => array( 'Language' =>'German', 'Country' => 'Germany' ),
		'el' => array( 'Language' =>'Greek' ),
		'gu' => array( 'Language' =>'Gujarati' ),
		'he' => array( 'Language' =>'Hebrew' ),
		'hi' => array( 'Language' =>'Hindi' ),
		'hu' => array( 'Language' =>'Hungarian' ),
		'is' => array( 'Language' =>'Icelandic' ),
		'id' => array( 'Language' =>'Indonesian' ),
		'it-ch' => array( 'Language' =>'Italian', 'Country' => 'Switzerland' ),
		'it' => array( 'Language' =>'Italian', 'Country' => 'Italy' ),
		'ja' => array( 'Language' =>'Japanese' ),
		'kn' => array( 'Language' =>'Kannada' ),
		'kk' => array( 'Language' =>'Kazakh' ),
		'kok' => array( 'Language' =>'Konkani' ),
		'ko' => array( 'Language' =>'Korean' ),
		'kz' => array( 'Language' =>'Kyrgyz' ),
		'lv' => array( 'Language' =>'Latvian' ),
		'lt' => array( 'Language' =>'Lithuanian' ),
		'ms' => array( 'Language' =>'Malay' ),
		'ml' => array( 'Language' =>'Malayalam' ),
		'mt' => array( 'Language' =>'Maltese' ),
		'mr' => array( 'Language' =>'Marathi' ),
		'mn' => array( 'Language' =>'Mongolian', 'Country' => 'Cyrillic' ),
		'ne' => array( 'Language' =>'Nepali', 'Country' => 'India' ),
		'nb-no' => array( 'Language' =>'Norwegian', 'Country' => 'Bokmal' ),
		'nn-no' => array( 'Language' =>'Norwegian', 'Country' => 'Nynorsk' ),
		'no' => array( 'Language' =>'Norwegian', 'Country' => 'Bokmal' ),
		'or' => array( 'Language' =>'Oriya' ),
		'pl' => array( 'Language' =>'Polish' ),
		'pt-br' => array( 'Language' =>'Portuguese', 'Country' => 'Brazil' ),
		'pt' => array( 'Language' =>'Portuguese', 'Country' => 'Portugal' ),
		'pa' => array( 'Language' =>'Punjabi' ),
		'rm' => array( 'Language' =>'Rhaeto-Romanic' ),
		'ro-md' => array( 'Language' =>'Romanian', 'Country' => 'Moldova' ),
		'ro' => array( 'Language' =>'Romanian' ),
		'ru-md' => array( 'Language' =>'Russian', 'Country' => 'Moldova' ),
		'ru' => array( 'Language' =>'Russian' ),
		'sa' => array( 'Language' =>'Sanskrit' ),
		'sr' => array( 'Language' =>'Serbian' ),
		'sk' => array( 'Language' =>'Slovak' ),
		'ls' => array( 'Language' =>'Slovenian' ),
		'sb' => array( 'Language' =>'Sorbian' ),
		'es-ar' => array( 'Language' =>'Spanish', 'Country' => 'Argentina' ),
		'es-bo' => array( 'Language' =>'Spanish', 'Country' => 'Bolivia' ),
		'es-cl' => array( 'Language' =>'Spanish', 'Country' => 'Chile' ),
		'es-co' => array( 'Language' =>'Spanish', 'Country' => 'Colombia' ),
		'es-cr' => array( 'Language' =>'Spanish', 'Country' => 'Costa Rica' ),
		'es-do' => array( 'Language' =>'Spanish', 'Country' => 'Dominican Republic' ),
		'es-ec' => array( 'Language' =>'Spanish', 'Country' => 'Ecuador' ),
		'es-sv' => array( 'Language' =>'Spanish', 'Country' => 'El Salvador' ),
		'es-gt' => array( 'Language' =>'Spanish', 'Country' => 'Guatemala' ),
		'es-hn' => array( 'Language' =>'Spanish', 'Country' => 'Honduras' ),
		'es-mx' => array( 'Language' =>'Spanish', 'Country' => 'Mexico' ),
		'es-ni' => array( 'Language' =>'Spanish', 'Country' => 'Nicaragua' ),
		'es-pa' => array( 'Language' =>'Spanish', 'Country' => 'Panama' ),
		'es-py' => array( 'Language' =>'Spanish', 'Country' => 'Paraguay' ),
		'es-pe' => array( 'Language' =>'Spanish', 'Country' => 'Peru' ),
		'es-pr' => array( 'Language' =>'Spanish', 'Country' => 'Puerto Rico' ),
		'es-us' => array( 'Language' =>'Spanish', 'Country' => 'United States' ),
		'es-uy' => array( 'Language' =>'Spanish', 'Country' => 'Uruguay' ),
		'es-ve' => array( 'Language' =>'Spanish', 'Country' => 'Venezuela' ),
		'es' => array( 'Language' =>'Spanish', 'Country' => 'Traditional Sort' ),
		'sx' => array( 'Language' =>'Sutu' ),
		'sw' => array( 'Language' =>'Swahili' ),
		'sv-fi' => array( 'Language' =>'Swedish', 'Country' => 'Finland' ),
		'sv' => array( 'Language' =>'Swedish' ),
		'syr' => array( 'Language' =>'Syriac' ),
		'ta' => array( 'Language' =>'Tamil' ),
		'tt' => array( 'Language' =>'Tatar' ),
		'te' => array( 'Language' =>'Telugu' ),
		'th' => array( 'Language' =>'Thai' ),
		'ts' => array( 'Language' =>'Tsonga' ),
		'tn' => array( 'Language' =>'Tswana' ),
		'tr' => array( 'Language' =>'Turkish' ),
		'uk' => array( 'Language' =>'Ukrainian' ),
		'ur' => array( 'Language' =>'Urdu' ),
		'uz' => array( 'Language' =>'Uzbek' ),
		'vi' => array( 'Language' =>'Vietnamese' ),
		'xh' => array( 'Language' =>'Xhosa' ),
		'yi' => array( 'Language' =>'Yiddish' ),
		'zu' => array( 'Language' =>'Zulu' ) );
	
	# Universal getter
	public function __get( $propertyName )
	{
		// converts Property into _property 
		$fieldName = '_' . strtolower( substr( $propertyName, 0, 1 ) ) . substr( $propertyName, 1 );

		if( property_exists( $this, $fieldName ) )
			return $this->$fieldName;
      	else
      		throw new Exception( 'Unknow attribute ' . $propertyName );
	}
	
	# Constructors
    public function __construct( $name )
    {
		$this->_name = strtolower( $name );
		$this->_twoLetterLanguageName = strtolower( substr( $name, 0, 2 ) ); // cut out language
		$this->_twoLetterCountryName = strtolower( substr( $name, 3, 2 ) ); // cut out country
		
		foreach( $this->_languages as $key => $value )
		{
			if( $key == $this->_name )
			{
				$this->_countryName = $value[ 'Country' ];
				$this->_languageName = $value[ 'Language' ];
				break;
			}
		}
		
		if ( $this->_countryName == null && $this->_languageName == null )
			throw new Exception( 'Unknown culture' );
    }
    
    # Magic method ToString()
    public function __toString()
    {
    	return "$this->_languageName ($this->_countryName)";
    }

    # Public Static Methods
	public static function CurrentCulture()
	{
		if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) )
		{
			$languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
			// $languages = ' fr-ch;q=0.3, da, en-us;q=0.8, en;q=0.5, fr;q=0.3';
			// need to remove spaces from strings to avoid error
			$languages = str_replace( ' ', '', $languages );
			$languages = explode( ",", $languages );
			// we only want the preferred language, therefore the 1st one in the list
			return new CultureInfo( $languages[ 0 ] );
		}
		else
			throw new Exception( 'No culture info found' );
	}
}
Voilà, je peux donc appeler CultureInfo::CurrentCulture() pour obtenir un object de type CultureInfo qui contiendra le pays et la langue du browser, ou alors je peux manuellement créer un objet en appelant new CultureInfo('fr-BE') par exemple. Je pourrais aussi en suite ajouter la propriété PreferredCulture (culture préférée) à ma classe user qui me permettrait de savoir quel fichier de langue je dois charger apres que les utilisateurs se soient logués.

Qu'en pensez-vous?

Re: ma classe CultureInfo

Posté : 02 nov. 2009, 18:28
par Hywan
Hey :-),

Et si le serveur est sous Windows ? Tu ne gères que la norme iso-3166-1_alpha_2 (soit xx_XX) mais pas l'apha_3 (xxx_XXX) que Windows utilise.
Et PHP 5.3 a définitivement résolu tous ces genres de problème avec la classe native Locale :-).

Re: ma classe CultureInfo

Posté : 03 nov. 2009, 11:47
par Sn3b
Aaaaah mais c'est super ça! Je ne connaissais pas cette classe Locale!

Juste un petit truc que je ne comprends pas, et ça va parraître bête sûrement...

Mon script me retourne en-UK, parce que c'est ce que j'ai choisi dans mon browser, cependant, la classe Locale me retourne fr-BE, et la seule chose que je sais a ces paramètres est mon clavier, oui j'ai un clavier belge, mais honnêtement je ne pense pas qu'il trouve ça en allant chercher les parametres de mon clavier, donc d'où est-ce que ça vient?

Re: ma classe CultureInfo

Posté : 03 nov. 2009, 20:36
par Hywan
Ton serveur est où ? Tu habites où (sans te faire peur ;-)) ?

Re: ma classe CultureInfo

Posté : 03 nov. 2009, 21:20
par Sn3b
en local, sur un kit eclipse+debugger+zend server+phpmyadmin

et c'est bel et bien un ordinateur belge mais configuré à l'anglaise avec un clavier belge : /

Et je suis en France

Re: ma classe CultureInfo

Posté : 04 nov. 2009, 07:43
par Hywan
Aucune idée :-).

Re: ma classe CultureInfo

Posté : 04 nov. 2009, 12:17
par Sn3b
J'ai regardé un petit peu et il semblerait que Locale::getDefault() retourne en fait tout simplement locale_get_default() qui effectivement obtient ses info du serveur, plus précisément de la directive intl.default_locale.

J'ai changé la valeur de cette directive et maintenant Locale::getDefault() me retourne la bonne valeur, mais moi je cherche à renseigner les préférences du client, pas du serveur!

Dans tous les cas merci quand même, je pense que je vais essayer de faire en sorte que ma classe reflecte un peu la classe Locale mais en m'assurant que j'obtient bien les infos du client :)

Re: ma classe CultureInfo

Posté : 04 nov. 2009, 13:00
par Sn3b
Bon ben en fait il me suffit d'utiliser:
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Ma classe devient donc obsolète ;)

Re: ma classe CultureInfo

Posté : 04 nov. 2009, 14:11
par Hywan
Sauf pour PHP < 5.3 :-).

Re: ma classe CultureInfo

Posté : 04 nov. 2009, 19:34
par Sn3b
merci tu me remonte le moral ;)