PDA

View Full Version : کلاس فارسی کردن تقویم میلادی + نمایش تقویم با فونت تمام فارسی بالاخص-_- اعداد-_-



majid_darab
شنبه 02 آبان 1388, 18:45 عصر
با سلام و درود فراوان بر شما دانش پژوهان عزیز و گرامی :

من در پروژه های خود از کلاسی برای نمایش فارسی تقویم (به طور مثال کامپوننت Calendar) استفاده می کنم - یعنی در Page_Load صفحه ای که این کامپوننت خاص قرار دارد این کلاس را فراخوانی می کنم و بقیه ی مسایل حل می شود - یعنی تقویم فارسی می شود - اما مشکلی که در اینجا وجود دارداین است که اعداد موجود در تقویم (مثلادر کامپوننت Calendar) با فونت انگلیسی هستند و یا اینکه وقتی تاریخو در یک لیبل نمایش می دهم تاریخ به صورت شمسی ، اما با حروف انگلیسی نمایش داده می شود.
حال سوال اینجاست که چگونه می توان به اعداد نمایش داده شده در تقویم دسترسی پیدا کرد و آنها رو فارسی کرد و یا اعداد نمایش داده شده در لیبل را؟
---------------------------------------------------------------------------
آیا تعویض فونت در اینجا کار درستی است ؟ (چون ممکنه بعضی کلاینت ها اون فونتو نداشته باشند و دیگر اینکه انجام این کار شاید در مرورگرهای مختلف برخورد متفاوتی داشته باشد)
اگر تعویض فونت تنها راه انجام این کار است از چه فونتی استفاده گردد؟
وچگونه کاری کنم که فونت مزبور به محض باز کردن وب سایت توسط کاربر در سیستم او کپی شود؟

یه جایی تو این فروم متدی توسط آقای behrouz_Rad معرفی شده بود که ذاتا عددو فارسی می کرد - آیا باید از این روش استفاده کرد ؟ چگونه؟
---------------------------------------------------------------------------
با تشکر فراوان

Saber_Fatholahi
یک شنبه 03 آبان 1388, 10:40 صبح
بله دوست من تعویض فونت ربطی به نمایش واقعی نداره روش آقای مهندس راد کاملا منطقی و درست و اصولیه شما برای فارسی سازی اعداد باید یه کدیو با اون کد عدد جمع کنی که فارسی بشه منم دقیقا تاپیک مهندس راد آدرسش یادم نیست پیداش کردی کدشو نگاه کنو بنویس به صورت دستی یا از اون کد استفاده کن
این متد آقای راده

public string ConvertToPersianNumber(string num)
{
string number = num.Trim();

bool m = Array.TrueForAll(number.ToCharArray(), s => char.IsDigit(s));
char[] temp = new char[number.Length];
if (m)
{
int i = 0;
Array.ForEach(number.ToCharArray(), b =>
{
temp[i] = (char)(((int)b + 1728)); i += 1;
});

string ff = new string(temp);
return ff;
}
else
{
return null;
}
}
شما باید داده هاتو به این متد پاس بدی و خروجی شو بگیری همین
موفق باشی

majid_darab
یک شنبه 03 آبان 1388, 12:50 عصر
باتشکر از مهندس صابر:
مشکل در پاس دادن اعداد داخل جدول calendar به این متد است...
داخل این جدول برای هر ماه 30 عدد وجود داره ، اما چگونه به این اعداد دسترسی پیدا کنم و اونا رو به صورت رشته به متد بالا پاس بدم.
ویا مثلا لیبلی که داره DateTime.Now.ToLongDate() رو نشون میده چه جوری اعداد این لیبلو بکشم بیرون و فارسیشون کنم و جایگزین کنم ؟
یه دوستی می گفت این مشکل با style ها حل میشه ؟ اما چگونه؟
(آیا منظورشون تغییر فونت بوده که دراین حالت تو ie جواب میده اما تو firefox نه و تازه این تو حالتیه که فونت مزبور رو سیستم موردنظر نصب باشه - حالا اگه نباشه که یه بحث دیگس)
-------------------------------------------------------------------------------------------
باتشکر
مجیدداراب

majid_darab
یک شنبه 03 آبان 1388, 13:00 عصر
برای دوستانی که میخواستند بدونن من از چه کلاسی برای تقویم شمسی استفاده می کنم لطفا به تاپیک زیر مراجعه نمایند...

http://barnamenevis.org/forum/showthread.php?t=39113

واما کد اصلی که توسط ادمین سایت (مهندس مهدی کرامتی) در تاپیکی دیگر قرارداده شده بود به صورت زیر است :
قسمت PersianCalendar این کد توسط آقای امید خندان نوشته شده است:


using System;
using System.Collections.Generic;
using System.Text;

namespace PersianUtils
{
public class CalendarUtils
{
public static void ActivatePersianCalendar()
{
System.Globalization.CultureInfo calture = new System.Globalization.CultureInfo("fa-IR");
System.Globalization.DateTimeFormatInfo info = calture.DateTimeFormat;
info.AbbreviatedDayNames = new string[] { "ی", "د", "س", "چ", "پ", "ج", "ش" };
info.DayNames = new string[] { "یکشنبه", "دوشنبه", "ﺳﻪشنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
info.AbbreviatedMonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.MonthNames = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند", "" };
info.AMDesignator = "ق.ظ";
info.PMDesignator = "ب.ظ";
info.ShortDatePattern = "dd/MM/yyyy";
info.LongDatePattern = "dd/MM/yyyy";


info.FirstDayOfWeek = DayOfWeek.Saturday;
System.Globalization.PersianCalendar cal = new System.Globalization.PersianCalendar();
typeof(System.Globalization.DateTimeFormatInfo).Ge tField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (info, cal);
object obj = typeof(System.Globalization.DateTimeFormatInfo).Ge tField("m_cultureTableRecord", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (info);
obj.GetType().GetMethod("UseCurrentCalendar", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(ob j, new object[] { cal.GetType().GetProperty("ID", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue (cal, null) });
typeof(System.Globalization.CultureInfo).GetField("calendar", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue (calture, cal);
System.Threading.Thread.CurrentThread.CurrentCultu re = calture;
System.Threading.Thread.CurrentThread.CurrentUICul ture = calture;
System.Globalization.CultureInfo.CurrentCulture.Da teTimeFormat = info;
System.Globalization.CultureInfo.CurrentUICulture. DateTimeFormat = info;
}
}
}

majid_darab
دوشنبه 04 آبان 1388, 19:37 عصر
یکی از دوستان هم امروز بهم گفت اینکارو با تنظیمات خود ویندوز انجام بده - یعنی برو به Regional and language options در قسمت customize تنظیم digit substitution را روی National بذار که با این کار حتی اعداد خود ویندوز هم به شکل فارسی در میان.
اما من دنبال راهی هستم که وابستگی به سیستم کلاینت را کنار بگذارد ، پس این روش به قولی گفتنی یک روش Fake است...
باتشکر
مجید داراب

iman_ad
دوشنبه 04 آبان 1388, 20:25 عصر
در مورد نمایش اعداد فارسی باید از جایگذینی کاراکترهای اعداد انگلیسی با فارسی استفاده کرد، این کار هم می شه سمت سرور هم سمت کلاینت انجام داد، برای سمت سرور که آقای راد کدش گذاشتند، برای سمت کلاینت هم باید از جاوا اسکریپت استفاده کنی


// Farsi keyboard map based on ISIRI-2901
var farsikey = [
0x0020, // " "
0x0021, // "!"
0x061B, // ";"
0x066B, // ","
0x00A4, // " "
0x066A, // "%"
0x060C, // "،"
0x06AF, // "گ"
0x0029, // "("
0x0028, // ")"
0x002A, // "*"
0x002B, // "+"
0x0648, // "و"
0x002D, // "-"
0x002E, // "."
0x002F, // "/"
0x06F0, // "۰"
0x06F1, // "۱"
0x06F2, // "۲"
0x06F3, // "۳"
0x06F4, // "۴"
0x06F5, // "۵"
0x06F6, // "۶"
0x06F7, // "۷"
0x06F8, // "۸"
0x06F9, // "۹"
0x003A, // ":"
//0x0643, // "ك"
0x06A9, // "ک"
0x003E, // "<"
0x003D, // "="
0x003C, // ">"
0x061F, // "?"
0x066C, // "،"
0x0624, // "ؤ"
0x200C, // " "
0x0698, // "ژ"
0x0649, // "ی"
0x064D, // " "
0x0625, // " "
0x0623, // "ًٌٍإ"
0x0622, // " "
0x0651, // " "
0x0629, // "ًٌة"
0x00BB, // "«"
0x00AB, // "»"
0x0621, // "ء"
0x004E, // "N"
0x005D, // "["
0x005B, // "]"
0x0652, // " "
0x064B, // " "
0x0626, // "ئ"
0x064F, // " "
0x064E, // " "
0x0056, // "V"
0x064C, // " "
0x0058, // "X"
0x0650, // " "
0x0643, // "ك"
0x062C, // "ج"
0x005C, // "\"
0x0686, // "چ"
0x00D7, // "x"
0x0640, // "-"
0x200D, // " "
0x0634, // "ش"
0x0630, // "ذ"
0x0632, // "ز"
0x06CC, // "ی"
// 0x064A = ي
0x062B, // "ث"
0x0628, // "ب"
0x0644, // "ل"
0x0627, // "ا"
0x0647, // "ه"
0x062A, // "ت"
0x0646, // "ن"
0x0645, // "م"
//0x067E, // "پ"
0x0626, // "ئ"
0x062F, // "د"
0x062E, // "خ"
0x062D, // "ح"
0x0636, // "ض"
0x0642, // "ق"
0x0633, // "س"
0x0641, // "ف"
0x0639, // "ع"
0x0631, // "ر"
0x0635, // "ص"
0x0637, // "ط"
0x063A, // "غ"
0x0638, // "ظ"
0x007D, // "{"
0x007C, // "|"
0x007B, // "}"
0x007E // "~"
];


var lang = 1; // 1: Farsi, 0: English
function changeLang() {
if (lang == 0) {
lang = 1;
return true;
}
else {
lang = 0;
return true;
}
}

function FKeyDown (txtFrm){
var key = window.event.keyCode;
if (key == 145){
if (lang == 0) {
lang = 1;
return true;
}
else {
lang = 0;
return true;
}
}
}

function FKeyPress(txtFrm) {
var key = window.event.keyCode;

if (key == 13) { window.event.keyCode = 13; return true; }
if (lang == 1) { // If Farsi
if (key == 0x0020 && window.event.shiftKey) // Shift-space -> ZWNJ
window.event.keyCode = 0x200C;
else
window.event.keyCode = farsikey[key - 0x0020];
if (farsikey[key - 0x0020] == 92) {
window.event.keyCode = 0x0698;
}
if (farsikey[key - 0x0020] == 8205) {
window.event.keyCode = 0x067E;
}
}
return true;
}
FKeyPress('')
FKeyDown('')


باید یکمی تغییرات توش بدی اگه خواستی بگو توضیح بدم، این کد برای نوشتن فارسی با keyboard انگیسی نوشته شده ولی کارکردش با کار شما مطابقت داره

majid_darab
سه شنبه 05 آبان 1388, 12:05 عصر
با سلام و عرض تشکر فراوان از توجه همگیه دوستان :
میشه در مورد متدی که در بالا عنوان شد بیشتر توضیح بدید...
با تشکر
مجید داراب

iman_ad
چهارشنبه 06 آبان 1388, 07:44 صبح
کد جاوای فوق دو تا فانکشن داره کافی این دوتا رو با رویدادهای
onkeypress،onkeydown
فراخوانی کنی تا کاراکترهای انگلیسی به فارسی تبدیل کنه برای اعداد هم همین کار می کنه.
شما کافی کد یکم تغییر بدی ولی باید از همین دو فانکشن استفاده کنی