Yii Framework Forum: نحوه تنظیم زبان سیستم بر اساس Url - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

نحوه تنظیم زبان سیستم بر اساس Url URL based language config

#1 User is offline   amiri 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 82
  • Joined: 08-January 12

Posted 24 September 2012 - 09:39 AM

سلام.
فرض کنید قراره URL ها در سایت به شکل زیر پیاده سازی بشه: (سایت دوزبانه بصورت fa/en هست)

Domain.com/language/module/controller/action
Or
Domain.com/language/controller/action
Example:
Domain.com/fa/admin/user/view
Domain.com/fa/user/view


2 مشکل هست.
1- در config/main چطور تنظیمات urlManager رو بنویسیم تا فورمات بالا پیاده سازی بشه؟
من بخش مربوط به این مبحث رو در مستندات Yii مطالعه کردم و چند راه حل به ذهنم رسید که البته برای هر کدام چند اشکال احتمالی هم ذهنم میاد.
ممنون میشم راه حل پیشنهادی دوستان رو بدونم.

2- چطور بر اساس پارامتر language که در URL قید شده، پارامتر Yii::app->language رو ست کنیم؟
من چند جا مثل خود فایل config/main.php و یا index.php سعی کردم اما موفق نبودم.
مثلا کد زیر هم پیام خطا می داد.

class Controller extends CController
{
	/**
	* Init the Controller to set the language according the URL, first.
	*/
	 
public function init()
	{
	if (isset($_get('lang')) && strtolower($_get('lang'))=='fa')
		{ Yii::app()->language='fa'; }
           else {
	Yii::app()->language='en';}
	}
...

result:
Fatal error: Can't use function return value in write  
context in .../protected/components 
/Controller.php on line 13



0

#2 User is offline   Hesam K 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 144
  • Joined: 14-August 11

Posted 25 September 2012 - 02:57 AM


سلام
در پاسخ به پرسش اول تون، من قواعدی که خودم در پروژه ها استفاده میکنم به شکل زیر هست. البته در صورت لزوم میتونید تغییرات لازم رو بدید، اما کلیات قضیه به همین شکل هست



				
'<language:(fa|en)>/<controller:\w+>'=>'<controller>',
'<language:(fa|en)>/<module:\w+>/<controller:\w+>'=>'<module>/<controller>',
'<language:(fa|en)>/<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<language:(fa|en)>/<module:\w+>/<controller:\w+>/<id:\d+>'=>'<module>/<controller>/view',
'<language:(fa|en)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<language:(fa|en)>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
'<language:(fa|en)>/<module:\w+>/<controller:\w+>/<action:\w+>'=>'<module>/<controller>/<action>',

1

#3 User is offline   Hesam K 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 144
  • Joined: 14-August 11

Posted 25 September 2012 - 03:05 AM



برای قسمت دوم و کنترلر برنامه، کد زیر پاسخگوی نیاز من بوده و هست



    // Set the application language if provided by GET or session  
    if(isset($_GET['language'])) {
        Yii::app()->language = $_GET['language'];
        Yii::app()->user->setState('language', $_GET['language']); 
    }
    else if (Yii::app()->user->hasState('language')){
      Yii::app()->language = Yii::app()->user->getState('language');
    }
    else{
        Yii::app()->language = 'fa';
    }





زبان انتخابی کاربر در session هم ذخیره میشه تا اگر در URL قید نشده بود، زبان قبلی که باهاش کار میکرده انتخاب بشه



2

#4 User is offline   Hesam K 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 144
  • Joined: 14-August 11

Posted 25 September 2012 - 03:28 AM


یه نکته دیگه هم وجود داره. شما باید تابع ساخت آدرس خود فریمورک ـ تابع createUrl ـ رو هم تغییر بدید
این کار باعث میشه که لینک هایی که با استفاده از این تابع میسازید ( که قاعدتا باید همه لینک های برنامه تون باشه ) هم قواعد زبانی رو رعایت کنند و با توجه به زبان فعلی، لینک های صحیحی بسازند
برای این کار باید یک کلاس UrlManager جدید بنویسید که از CUrlManager ارث بری میکنه. کد این کلاس به شکل زیر هست:


<?php
class UrlManager extends CUrlManager
{
    public function createUrl($route,$params=array(),$ampersand='&')
    {
        if (!isset($params['language'])) {
          if (Yii::app()->user->hasState('language')){
            Yii::app()->language = Yii::app()->user->getState('language');
          }
          $params['language']=Yii::app()->language;
        }
        
        return parent::createUrl($route, $params, $ampersand);
    }
}
?>



این فایل رو در پوشه component های پروژه قرار بدید. و در نهایت در کانفیگ برنامه تغییرات زیر رو اعمال کنید:


'urlManager'=>array(
  'class'=>'application.components.UrlManager',
  'urlFormat'=>'path',
  'rules'=>array(
    /* proper rules, mentioned before */
  ),
),



امیدوارم کمکی شده باشه : )

3

#5 User is offline   amiri 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 82
  • Joined: 08-January 12

Posted 25 September 2012 - 04:15 PM

View PostHesam Khaki, on 25 September 2012 - 03:05 AM, said:



برای قسمت دوم و کنترلر برنامه، کد زیر پاسخگوی نیاز من بوده و هست



    // Set the application language if provided by GET or session  
    if(isset($_GET['language'])) {
        Yii::app()->language = $_GET['language'];
        Yii::app()->user->setState('language', $_GET['language']); 
    }
    else if (Yii::app()->user->hasState('language')){
      Yii::app()->language = Yii::app()->user->getState('language');
    }
    else{
        Yii::app()->language = 'fa';
    }





زبان انتخابی کاربر در session هم ذخیره میشه تا اگر در URL قید نشده بود، زبان قبلی که باهاش کار میکرده انتخاب بشه







سلام دوست عزیز
خیلی ممنون از کمک شما
در خصوص پاسخ اول. من هم به همون ترکیب رسیده بودم. منتها به خاطر طولانی شدن کد و مبتدی بودنم فکر می کردم شاید
بعدها مشکلاتی ایجاد بشه. ممنونم که خیالم رو راحت کردید.
اما پیرامون کد بالا که زحمت کشیدید. ای کاش محل قرار دادن این کد رو هم مشخص می کردید.

اولین جایی که به ذهن من میرسید کنترلر بود. اما اینطوری باید تو هر کنترلر این کد تکرار بشه
بعد سعی کردم یک مدخل ورودی ایجاد کنم تا بلافاصله بعد از ست شدن کانفیگ، این کد اجرا بشه اما تا الان موفق نبودم.
اتفاقا سوال دیگری هم در این خصوص مطرح کردم که هنوز کسی از دوستان جوابی نداده.




0

#6 User is offline   Hesam K 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 144
  • Joined: 14-August 11

Posted 26 September 2012 - 05:04 AM


سلام
در رابطه با قواعد آدرس ها، خوشبختانه من تا بحال باهاش مشکلی نداشتم، اما اگر هم مشکلی وجود اومد مطرح بفرمایید دوستان اینجا کمک میکنند. و یا در فروم انگلیسی مطرح کنید که حتما پاسخ میگیرید
در رابطه با اون قطعه کد، محل قرار گرفتنش دقیقا همون جایی هست که شما تو پست اولتون قرار دادید. کلاس Controller که از کلاس CController ارث بری میکنه! کدی که من نوشتم تو تابع init() اون کلاس قرار میگیره.
و فقط کافیه که همه کنترلرهای شما از این کلاس Controller جدید ارث بری کنند.


1

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users