ورود

View Full Version : یک ایراد کوچک به yii در قسمت چند زبانه



shpegah
سه شنبه 10 تیر 1393, 11:01 صبح
یک امکان خوب که yii داره اینه که برای چند زبانه کردن میتونستیم یک شاخه توی view مثلا fa بسازیم و یک کپی از صفحه ها به زبان فارسی در اون شاخه بریزیم و به راحتی تغییر وضعیت از زبانی به زبان دیگه بدیم منتها اگر شاخه ای داشته باشیم به عنوان مثال در پروژه دیفالت pages فایل های درون اون رو هم باید روی شاخه fa در همین شاخه pages بریزیم یعنی به تعداد شاخه هایی که داریم باید شاخه fa بسازیم در حالیکه میتونست خیلی راحت مسیر روت view رو fa میگرفت ودیگه نیازی به ساختن اینهمه شاخه نبود ما خودمون میتونیم بایک تغییر کوچک در yii اینو درست کنیم ولی برای پروژه های تیمی کار درستی نیست
یک نگاه به کلاس CApplication بندازید



public function findLocalizedFile($srcFile,$srcLanguage=null,$lang uage=null)
{
if($srcLanguage===null)
$srcLanguage=$this->sourceLanguage;
if($language===null)
$language=$this->getLanguage();
if($language===$srcLanguage)
return $srcFile;
$desiredFile=dirname($srcFile).DIRECTORY_SEPARATOR .$language.DIRECTORY_SEPARATOR.basename($srcFile);
return is_file($desiredFile) ? $desiredFile : $srcFile;
}

بهتر بود به جای سورس فایل از سورس دایرکتوری (همون دایرکتوری زبان) استفاده میشد

MMSHFE
سه شنبه 10 تیر 1393, 12:53 عصر
یک راه راحتتر هم دارین:
پوشه protected/messages رو بسازین و داخلش پوشه های زبان خودتون رو ایجاد کنید (fa و...) و حالا برای هر صفحه یا کلاً هر دسته بندی دلخواه خودتون، یک فایل توی پوشه مخصوص هر زبان ایجاد کنید. مثلاً protected/messages/fa/login.php و داخلش اینطوری بنویسید:

<?php
return array(
'Username' => 'نام کاربری',
'Password' => 'رمز عبور',
'RememberMe' => 'مرا به خاطر بسپار',
);
حالا هرجا خواستین ترجمه شده به locale جاری رو بگذارین، اینطوری کار میکنید:

<?php echo Yii::t('login', 'Username');
قابلیت دسته بندی هم به این جهت گذاشته شده که ممکنه یک عبارت یا کلمه کلیدی، در صفحه یا دسته بندی خاصی، یک معنا بده و در صفحه یا دسته بندی دیگه، معنای دیگری بخواین براش بگذارین.
درواقع Yii دو راهکار به شما داده:
1- استفاده از سیستم ترجمه پیغامها
2- ترجمه کل صفحات به هر زبان دلخواه (با قابلیت تغییر کامل UI و فرضاً RTL و LTR بودن صفحات)
-----
فکر کنم دیگه نقص یا ایرادی باقی نمونده باشه.

shpegah
سه شنبه 10 تیر 1393, 13:08 عصر
راه اول خیلی خوبه و پرتابل بودنش لذت استفاده اش را بیشتر میکنه منتها همونطور که فرمودید برای مثلا دو وضعیت فارسی ولاتین کمی سختره(هم چپ وهم راست تمام کامپوننتهای قابل استفاده متفاوت همچنین css,... متفاوت)
راه دوم هم مشکلی که من گفتم رو داره البته مشکلی نیست خیلی بهینه نیست کاری رو که میتونستیم با ساختن یک شاخه انجام بدیم مجبوریم به تعداد شاخه ها مون شاخه بسازیم

MMSHFE
سه شنبه 10 تیر 1393, 13:44 عصر
البته میتونید از دیتابیس هم برای ذخیره سازی محتوا استفاده کنید. کلاً این لینک رو بخونید بد نیست:
http://www.yiiframework.com/doc/guide/1.1/en/topics.i18n

shpegah
سه شنبه 10 تیر 1393, 14:52 عصر
ممنون
توی سایت خود yii هم مترجم داره واحتمالا از همین روشی که فرمودید استفاده کرده واز لوکیشن هم برای اصطلاحات وتاریخ وزمان و .... خاص هر منطقه ولی اگر دقت کنید زبانهایی مثل فارسی وعربی و ... که راست به چپند نداره
اگر مترجم گوگل کروم رو هم برای ترجمه به زبان فارسی استفاده کنید میبینید که مشکلات راست به چپی رو درست ساپورت نمیکنه منوها وسایر کامپوننتها رو راست به چپ نمیکنه تلفیق فارسی و انگلیسی که کلا درست کار نمیکنه وما قطعا مجبوریم صفحه های مجزا استفاده کنیم و یا اینکه کلاسهایی خودمون طراحی کنیم که سازگاری با زبانهای دیگه رو بوجود بیاره
بعنوان مثال توی css های مربوطه بگرده وهرکجا از left استفاده شده المان اونو خصوصی سازی کنه و right کنه و هرجا dir=ltr بود بذاره dir=rtl ,...

MMSHFE
سه شنبه 10 تیر 1393, 15:00 عصر
بهرصورت تا جایی که بررسی کردم همین قابلیت Yii در همین حد و اندازه هم در خیلی از فریمورکها بصورت پیشفرض نیست. البته میتونیم برای توسعه این قابلیتها از افزونه ها استفاده کنیم یا خودمون افزونه دلخواه رو بنویسیم و یا حتی کلاس ترجمه Yii رو توی پروژه خودمون بازنویسی کنیم و از اون نسخه بازنویسی شده استفاده کنیم. تا جایی که با تیم توسعه Yii صحبت کردم، علت این رویکردشون این بوده که بشه به راحتی ویوهای یک کنترلر رو همراه با ترجمه هاش از یک پروژه به پروژه دیگه منتقل کرد که بنظرم دلیل منطقی و خوبی میاد.

MMSHFE
چهارشنبه 11 تیر 1393, 09:04 صبح
بعنوان مثال توی css های مربوطه بگرده وهرکجا از left استفاده شده المان اونو خصوصی سازی کنه و right کنه و هرجا dir=ltr بود بذاره dir=rtl ,...

البته میتونید قسمت CSS مربوط به تنظیم راست به چپ بودن عناصر و کلاسهای مربوطه رو هم بصورت متغیر در بیارین و توی فایل زبان، بعنوان یک شناسه (مثل کلمات عادی) درج کنید و مقادیر دلخواهتون رو داخلش بنویسید و توی فایل ویو، از Yii::t برای نمایش نسخه مناسب زبان مربوطه و استخراجش از فایل ترجمه، استفاده کنید.

shpegah
چهارشنبه 11 تیر 1393, 10:29 صبح
من هم همینطور که شما فرمودید تقریبا عمل کردم منتها تسلط خوبی روی cssندارم ونمیدونم چطور میشود یک مقدار را بعنوان پارامتر به یک css فرستاد ومتغیرش کرد مجبور شدم دوفایل css بسازم وبسته به نیازمسیر اونو در فایلم لینک کنم
خواستم در داخل فرم های شاخه ویو هر کجا div دارم یک متغییر بسازم که دو مقدار" direction=rtl " و"direction=ltr" رابگیرد وبنابه خاصیت لوکال بودنش این آخرین مقدار را قبول کند متاسفانه درست کار نکرد و فکر میکنم هنوز درست مفاهیم استفاده از style ها را نمیدانم که این اندازه دچار مشکل میشوم البته با تک تک خواص المانها آشنایی ومطالعه کافی داشته ام ولی از تاثیراتی که روی همدیگر میگذارند احتمالا مطالبی هست که من بی اطلاعم

MMSHFE
چهارشنبه 11 تیر 1393, 10:38 صبح
این مثال رو ببینید:

// protected/messages/fa/style.php
return array(
'direction'=>'rtl',
...
);

// protected/messages/en/style.php
return array(
'direction'=>'ltr',
...
);
حالا توی ویو:

<?php echo CHtml::tag('p', array('style'=>'direction: ' . Yii::t('style', 'direction') . ';'), Yii::t('messages', 'welcome'));

SlowCode
چهارشنبه 11 تیر 1393, 15:11 عصر
به نظرم بهتره برای هر زبان یه فایل css جداگانه داشته باشین. بعد تو صفحه layout/main.php یه شرط میزاری، اگه زبان انگلیسی بود فلان فایل رو لینک کنه، اگه فارسی بود فلان...
اینطوری کدهای view تمیزتر و کم حجم تر میشن.