PDA

View Full Version : سوال: RightToLeft در سایت های چند زبانه



hdv212
یک شنبه 16 تیر 1387, 13:39 عصر
با سلام
من در ساخت سایت چند زبانه(به وسیله ی Local Resource) مشکلی ندارم، ولی هدف اینه که وقتی کاربر انگلیسی رو انتخاب میکنه، نوشته های Page من چپ چین بشه و وقتی فارسی رو انتخاب میکنه، راست چین بشه، اینو باید چطوری انجام بدم ؟
مرسی

Behrouz_Rad
یک شنبه 16 تیر 1387, 13:42 عصر
باید CSS های مختلفی رو برای Skin های سایت ایجاد کنی.

موفق باشید.

hdv212
یک شنبه 16 تیر 1387, 14:10 عصر
باید CSS های مختلفی رو برای Skin های سایت ایجاد کنی
ممنونم بهروز جان، منظورت اینه که بررسی کنم اگر زبان انتخاب شده، فارسی بود، CssClass رو برابر یک کلاس قرار بدم و اگر انگلیسی بود برابر یک کلاس دیگه ؟

Behrouz_Rad
یک شنبه 16 تیر 1387, 14:58 عصر
خیر. Skin رو تغییر بده. CSS های مختلف می تونن شامل کلاس های همنامی باشن. CSS رو هم به صورت داینامیک در تگ LINK که در HEAD هست تغییر بده.
اگر بخوای برای هر زبان یک CssClass مختلف برای هر کنترل ایجاد کنی که تمام وقتت گرفته میشه!

موفق باشید.

hdv212
یک شنبه 16 تیر 1387, 15:52 عصر
خیر. Skin رو تغییر بده. CSS های مختلف می تونن شامل کلاس های همنامی باشن. CSS رو هم به صورت داینامیک در تگ LINK که در HEAD هست تغییر بده.
اگر بخوای برای هر زبان یک CssClass مختلف برای هر کنترل ایجاد کنی که تمام وقتت گرفته میشه!
الان بهروز جان دقیقا مشکل من همین Css هست، اینکه به ازای هر زبان Theme های مختلفی لود بشه، درست، منتها CssClass کنترل ها رو چطوری به صورت Dynamic عوض کنم ؟
آیا برای Cssهای مختلف باید کلاسهای همنامی درست کنم که به ازای تغییر Css، کلاسهای اون در کنترل ها ست بشه ؟ یا راه دیگه ای هست ؟
اگه بتونی یه مثال بزنی، ممنون میشم.

Alireza_Salehi
یک شنبه 16 تیر 1387, 16:09 عصر
لازم نیست CssClass و Class ها رو عوض کنید، یک فایل CSS طراحی کنید و برای هر زبان فقط محتوای اون رو تغییر بدید، حالا به ازای هر زبان یک Theme ایجاد کنید که داخلش فایل CSS ، عکسها و ... قرار داره ، همین. و تنها کافیه Theme را عوض کنید که اون هم با کد خیلی راحته!

برای تغییر Theme


Page.Theme="fa-IR"


نکته ای که وجود داره اینه که در این فایل های CSS هم چیز (نام کلاس ها ، دسته ها، IDها و ...) همه یکسان هستند و تنها محتوای اونها فرق میکنه.

hdv212
یک شنبه 16 تیر 1387, 16:42 عصر
لازم نیست CssClass و Class ها رو عوض کنید، یک فایل CSS طراحی کنید و برای هر زبان فقط محتوای اون رو تغییر بدید، حالا به ازای هر زبان یک Theme ایجاد کنید که داخلش فایل CSS ، عکسها و ... قرار داره ، همین. و تنها کافیه Theme را عوض کنید که اون هم با کد خیلی راحته!
درسته، فعلا من هم همین نظر رو داشتم و برای هر زبان،یک Threme و یک Css ساختم (که از لحاظ نام کلاسها و عناصر هیچ فرقی با هم ندارند، به قول شما فقط در محتوا فرق دارن)، که هر وقت Theme مورد نظر Load شد، Css اون هم ست بشه، اما بهروز میگه که برای هر زبان یک Css ایجاد نکن، اون چه روشی میشه ؟

Behrouz_Rad
یک شنبه 16 تیر 1387, 19:37 عصر
اما بهروز میگه که برای هر زبان یک Css ایجاد نکن، اون چه روشی میشه ؟

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

دو بار گفتم که:


باید CSS های مختلفی رو برای Skin های سایت ایجاد کنی.



CSS های مختلف می تونن شامل کلاس های همنامی باشن.

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

موفق باشید.

mahdi_farhani
یک شنبه 16 تیر 1387, 19:45 عصر
با اجازه اساتید محترم .
اگر فقط مشکلت با RTL و LTR هست یه Resource اضافه کن و اونو تو تگ HTML بنویس ....................

mehrdad201
یک شنبه 16 تیر 1387, 20:44 عصر
ولی استانداردش تمهای مختلف و سی اس اس های حاوی کلاسهای همنام هستند که محتوای اونها با هم متفاوت هست.

دقیقا همون چیزی که استاد راد و جناب صالحی بیان کردند.

اینطوری وقتی که تم عوض میشه همه چی مطابق سیستم پیش میره

hdv212
دوشنبه 17 تیر 1387, 00:27 صبح
اگر بخوای برای هر زبان یک CssClass مختلف برای هر کنترل ایجاد کنی که تمام وقتت گرفته میشه!
بهروز جان شرمنده، معذرت میخوام، به خاطر نوشته ی بالا من به شک افتادم، به هر حال منو ببخشید، قصد جسارت نداشتم.

اگر فقط مشکلت با RTL و LTR هست یه Resource اضافه کن و اونو تو تگ HTML بنویس ....................
اما در این مورد، باید بگم که آره، مشکل من فقط Rtl هست، این دیگه چه روشی هست ؟ میشه یه مثال بزنید ؟
مرسی

hdv212
پنج شنبه 21 شهریور 1387, 17:49 عصر
من هنوز مشکلم با راست چین کردن حل نشده، من این پست (http://barnamenevis.org/forum/showpost.php?p=567208&postcount=5) رو پیدا کردم و در تگ Body صفحه ام این کد رو نوشتم :

<body dir="<%$ Resources:PageResource1, Layout %>">
اما در زمان کامپایل از من این خطا رو میگیره :

Literal expressions like '<%$ Resources:PageResource1, Layout %>' are not allowed. Use <asp:Literal runat="server" Text="<%$ Resources:PageResource1, Layout%>" /> instead.

این رو هم بگم که من در فایلهای resx صفحه ام، یک متغیر به نام Layout ایجاد کردم و Value اون رو در ریسورس فارسی برابر با rtl در ریسورس انگلیسی برابر با ltr قرار دادم. باید چکار کنم ؟
مرسی

hdv212
پنج شنبه 21 شهریور 1387, 22:26 عصر
کسی تا حالا با این موضوع برخورد نکرده ؟

salehbagheri
جمعه 22 شهریور 1387, 00:59 صبح
بله! بنده دوتا صفحه Master ایجاد کردم!

اگر کسی فارسی رو کلیک می کرد: Master فارسی رو انتخاب می کردم.
اگر کسی انگلیسی رو کلیک می کرد: Master انگلیسی رو انتخاب می کردم.

به همین راحتی!!!!!

(این نظر شخصی بنده است)

Behrouz_Rad
جمعه 22 شهریور 1387, 09:05 صبح
حامد چقدر عجله می کنی! صبور باش! ;)
"runat="server رو به تگ body اضافه کن.

موفق باشید.

hdv212
جمعه 22 شهریور 1387, 12:17 عصر
حامد چقدر عجله می کنی! صبور باش! ;)
"runat="server رو به تگ body اضافه کن.
ممنون بهروز جان، امتحان کرده بودم، مشکلم حل نشد، ولی یه راه نسبتا خوب پیدا کردم.
کلاسی به شکل زیر بسازید :

public class LangugesAlignHelper
{
// Check the Current Culture
public static bool IsRightToLeft()
{
return System.Threading.Thread.CurrentThread.CurrentCultu re.TextInfo.IsRightToLeft;
}

public static string GetCultureAlignString()
{

if (IsRightToLeft()) { return "rtl"; }
else { return "ltr"; }

}

public static string CurrentCultureAlign
{
get { return GetCultureAlignString(); }
}
}

حالا تگ Body رو به شکل زیر اصلاح کنید :

<body dir='<%= LangugesAlignHelper.CurrentCultureAlign %>'>
فکر نمیکنم با این روش به منظور RightTolEft کردن، دیگه نیازی به theme یا masterPage باشه.
فقط توجه داشته باشید که زبان پیش فرض با زبانی که صفحه داره لود میکنه یکی باشه.

Behrouz_Rad
جمعه 22 شهریور 1387, 13:36 عصر
ممنون بهروز جان، امتحان کرده بودم، مشکلم حل نشد،

امکان نداره! چرا نشد؟ برای اطمینان خاطر تست کردم، شد!

hdv212
جمعه 22 شهریور 1387, 16:02 عصر
امکان نداره! چرا نشد؟ برای اطمینان خاطر تست کردم، شد!
پیغام خطا رو نداد یا صفحه rtl شد ؟
من تگ Body رو به شکل زیر اصلاح کردم :

<body dir="<%$ Resources:PageResource1, Layout %>" runat="server">
ولی در زمان کامپایل خطای زیر رو میده :

The resource object with key 'Layout' was not found.
در صورتی که متغیر Layout رو در فایلهای resx مربوط به page مورد نظرم ساختم، حتی این شکلی هم خطا میگیره :

<body dir="<%$ Resources:Resource, Layout %>" runat="server">
بهروز جان شما چی نوشتی که اجرا شد ؟ آیا صفحه در هنگام انتخاب زبان فارسی rtl شد ؟
میشه نمونه کدش رو بذاری ؟
در ضمن resourcekey صفحه ی مورد نظرم PageResource1 هست :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs" Inherits="Default4"
Culture="auto:en-us" meta:resourcekey="PageResource1" UICulture="auto" %>

Behrouz_Rad
جمعه 22 شهریور 1387, 16:06 عصر
کار خاصی نکردم. یک فایل Resource به پروژه اضافه کردم. یک Key & Valye واسش تعریف کردم و به شکلی که می دونی به dir مقدار دادم. پس از اجرای صفحه، خاصیت dir مقدار rtl رو داشت. باید متوجه بشی که چرا اون Key رو نمیشناسه!

hdv212
جمعه 22 شهریور 1387, 16:13 عصر
باید متوجه بشی که چرا اون Key رو نمیشناسه!
بهروز جان اگه میدونستم که الکی پست نمیزدم اینجا.
من به ابتدای Key مورد نظرم در فایلهای resx کلمه ی .PageResource1 رو اضافه کردم دیدم خیلی خطا میگیره دوباره حذفش کردم، حالا واسه چی نمیشناسه ؟

Behrouz_Rad
جمعه 22 شهریور 1387, 21:29 عصر
واست یک Demo درست کردم برادر. ببین چطوری به dir مقدار دادم. صفحه رو اجرا کن.
در ضمن، به html جهت بده نه به body.

موفق باشید.

hdv212
جمعه 22 شهریور 1387, 22:51 عصر
واست یک Demo درست کردم برادر. ببین چطوری به dir مقدار دادم. صفحه رو اجرا کن.
در ضمن، به html جهت بده نه به body.
بهروز جان عزیزم مرسی، ولی این مثال با Global Resource کار شده، من با Local Resource کار کردم و مشکلم هم در Local Resource هست، نمیدونم در قسمت Resources:Resource نام ریسورس رو چی بدم چون هر زبانی یک فایل Resource داره، چکار کنم ؟
در ضمن بازم همون پیغام خطا رو میده که Key مورد نظر رو نمیشناسه (البته توی پروژه ی خودم، مال شما درست کار میکنه)

Behrouz_Rad
جمعه 22 شهریور 1387, 23:16 عصر
پست اولت چون قدیمی بود ندیدمش.
استفاده از Page-level Resources کمی نسبت به Global Resources متفاوت هست.

1) در یک پروژه فقط یک پوشه ی App_GlobalResources می تونی داشته باشی اما تعداد پوشه های App_LocalResources نا محدود هست.
2) App_LocalResources ّبرای هر صفحه باید در همونجایی قرار داشته باشه که صفحه قرار داره. به عنوان مثال اگر قصد تعیین Resource برای صفحه ای رو داری که اون صفحه در ریشه ی سایت قرار گرفته، پوشه ی App_LocalResources هم باید در ریشه ی سایت قرار داشته باشه.
3) نام فایل Resource هم از قانون خاصی پیروی می کنه. ابتدا نام صفحه و سپس نام Culture. به عنوان مثال، Resource.aspx.resx به عنوان زبان پیش فرض سایت یا Resource.aspx.fa-IR.resx برای زبان پارسی.
4) هنگام استفاده از Page-level Resources، نیاز به تعیین Class Key هم نیست! و این همون مشکلیه که تو داری.


<html runat="server" dir="<%$ Resources:myKey %>"></html>

این نوع رفتار به این دلیل هست که چندین Local Resource می تونه وجود داشته باشه و نام کلاس ها به طور خودکار توسط ASP.NET تعیین میشه. بنابراین باید فقط نام Key رو ذکر کنی.

+ با متد GetLocalResourceObject هم می تونی به مقادیر در سطح Page-level Resources دسترسی داشته باشی.

موفق باشید.

hdv212
شنبه 23 شهریور 1387, 00:05 صبح
ایول برادر، دمت گرم، همین بود. مرسی.