با سلام،
من سورس برگردان شده به آبجکت پاسکال (بنام FarsiReshaper) رو در پست های قبلی گذاشتم. برای اصلاح جدا جدا بودن حروف می تونید از اون استفاده کنید که پایه کامپوننتی هست که دوستمون برای کنترل TEdit فایرمانکی ایجاد کرده است.
Printable View
با سلام،
من سورس برگردان شده به آبجکت پاسکال (بنام FarsiReshaper) رو در پست های قبلی گذاشتم. برای اصلاح جدا جدا بودن حروف می تونید از اون استفاده کنید که پایه کامپوننتی هست که دوستمون برای کنترل TEdit فایرمانکی ایجاد کرده است.
ممنون
ولی توی کانورتورها فکر میکنم رشته رو اول برعکس میکنن بعدش حروف رو به اول وسط آخر تبدیل می کنن
من نمی خوام کلمه رو برعکس کنم
بعدش هم یه کانورتور که دیدم خیلی حجم کدش زیاد بود ، یه همچین الگروتمی نباید اونقدر زولانی باشه
من تو گیت هاب چیزی ندیدم
میشه دقیقا بگی کجا دیدی
با سلام
دوستان دیدم دارید تلاش می کنید فارسی نویسی در اندروید توسط دلفی رو انجام بدید، گفتم شاید موارد زیر به درد بخوره و کمکتون کنه:
1- از شرکت داده پردازان فراگیر یک سری کامپوننت بازمتن منتشر شده که مشکل رو رفع کردن و از اینجا می تونید به اون دسترسی داشته باشید.(البته با لطف جدید دوستان سورس فورج هم چیلتر شده پس باید با چیز پی ان یا چیلترشکن وارد بشوید.)
2-در لازاروس امکان فارسی نویسی به صورت درست وجود داره. و همون طور که می دونید دلفی هم از این کامپایلر برای آزمون توسعه بر روی بسترهای دیگه استفاده می کنه. اون رو هم یه نگاهی بندازید بد نیست.
البته این دومی یک کم دنگ و فنگ داره که باید طریقه ی تنظیم کردن لازاروس برای چند بستری (Cross-Build) رو بدونید ولی از اینجا می تونید یه چیزهایی در موردش به دست بیارید.
حالا دوستانی که توانایی و وقتش رو دارند بر روی این دو مورد تحقیق و کار کنند.
ما که وقتش رو نداریم. البته سوادش رو هم نداریم.:خجالت:
با تشکر
بله دستشون درد نکنه اما نظر شخصی من اینکه از این مزخرف تر چیز دیگه ای نمی تونستن بنویسن
یعنی حالم از این کامپوننت DPF بهم می خوره ، الکی هم اینترنت رو پر کردن ، همه هم همش دایورت می کنن روش ، به نظر من فقط یک کلام به درد نمی خورههههههههههههههههههه :عصبانی++:
من که نتونستم باهاش کار کنم
اگه کسی کار کرده و مشکل نداشته بیاد بگه
مشکل و دنگ و فنگ نصبش هم که به جای خود
البته کسی که این کامپوننت رو نوشته خیلی زحمت کشیده و ادم با سوادی هم بوده، ولی در کل اشکالاتی داره که استفاده ازش رو سخت می کنه
1-اولین و بزرگترین عیبش اینکه وقتی ازش استفاده می کنی دیگه نمی تونی همزمان از بقیه کامپوننت های دلفی استفاده کنی!! که اصلا خوب نیست.
2-بعضی وقتها هنگ می کنه
3-کامپوننتهاش خیلی محدوده
مثلا شما گرید دلفی رو اینجا ندارید چون این کامپوننت ها از کامپوننت ها استاندارد دلفی مشتق نشدن
دو تا از شعارهای اصلی FMX اینه که از همون کامپوننت های موجود در ویندوز در آندروید هم استفاده کنید و دوم اینکه یک کد بنویسید و روی پلتفرمهای مختلف کامپایل کنید ولی وقتی شما از این کامپوننت استفاده می کنی فقط برای آندروید کامپایل میشه
من خودم یه پروژه رو با این کامپوننتها پیاده کردم ولی وسط کار به مشکل خوردم و بیخیال شدم
در کل برای یه پروژه کوچیک خوبه
متاسفانه باید فرمایشات دوستان رو تایید کنم . این کامپوننت خیلی کاربردی نیست و تقریبا نمیشه روش حساب کرد .
من الان گیر کردم براساس تبلیغات رو نت فکر می کردم با این کامپوننت مشکل حل میشه ولی الان نمیدونم چکار کنم کسی کانورتر و یا امثال اون رو نداره که کارم راه بیفته ؟
اگر ممکنه کمی راجع به توابع موجود در farsireshaper و روش کارتون توضیح بدید تا کمکتون کنیم و زودتر بتونیم مشکل رو حل کنیم .
نه نه نیاز به reverse کردن نیست. اجازه بدید یک توضیح کوتاه پیرامون اینکه Unicode Bidirectional Algorithm و نحوه عمکردش بدم شاید خودتون از اول یکی طراحی کردید.
۱- در ینیکود برای هر حرف یک شناسه اختصاصی وجود دارد و قالبا چهار الی دو شناسه دیگر که حالت های مختلف اون حرف هستند. . فرضا ج دارای ۴ فرم هست. ج ج ج ج که اصطلاحا به ترتیب فرم isol,fina,medi,init نامیده می شوند. یا د فقط دو فرم دارد یکی د و د
۲- هر زمان کلیدی روی کیبورد وارد می شود کدی که ایجاد می شود کد شناسه حرف صادر میشه مثلا در ج کد 062C صادر میشهکد HTML:062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;;
FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;;
FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;;
FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;;
FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;;
۲- این کد به text shaping engine میرسد تا اون حروف رو رندر کنه.
۳- text shaping engine در صورتی که از تمامی جداول اوپن تایپ پشتیبانی کند. میاد فونت رو لود میکنه کد 062C رو به فونت میده و فونت با توجه به موقعیت شناسه ورودی تشخیص میده که که چه فرمی از اون حروف رو برگردونه به موتور بده.
داستان این جدانویسی فونت های فارسی از اینجا شرو میشه و دو حالت دارد :
۱- یا مشکل در فونت هست که جداول gpos,gsub را ندارد یا به درستی تعریف نشده است. مثل این تصویر
ضمیمه 126713
۲- text shaping engine از جداول اوپن تایپ پشتیبانی کامل نمی کند.
کار reshaper این هست که یک رشته رو به صورت ورودی دریافت میکنه یکی حروف رو بررسی میکند. به عنوان مثال هرگاه به حرف ج میرسد با توجه به موقعیت حرف در رشته تشخیص میده که کدام فرم باید نمایش داده شود. پس کد حرف رو با کد فرم جایگزین می کند. اینطوری حروف متصل و صحیح نمایش داده می شود.
یکیش تو گیت من فورک شده. چندتایی هم پیرامون این موضوع ستاره زدم که میتونید بررسی کنید. مشکلی دیگر در این زمینه بود من در خدمتم.
کد HTML:https://github.com/zoghal/persianParser
ممنون به خاطر توضیحت
مشکلم فعلا برعکس بودنشه با جدا بودن موشکل ندارم
البته فعلا گوشی اندرویدی ندارم و 20 روزی میشه که دیگه کار نمی کنم ولی دنبالش هستم
تو هاب شما هم چیزی ندیدم ، البته تو سایتش زیاد وارد هم نیستم
من دقت نکردم به برعکس بودنش. پس نیاز هم هست معکوس کنید.
تو مخزن گه لینک دادم. یک نمونه RESHAPER هست برای جاوا اسکریپت. برای دلفی نیست.
آره برای جاوار رو دیدم
حالا باز سر فرست کار می کنم باهاش
نه تایپ فارسی رو متد دیگه ای کنترل می کنه.نقل قول:
اگه میشه بفرمایید کدوم متد رو تغییر دادید تا ما هم همون کار رو بکنیم.
آیا با این کار تایپ فارسی درست میشه؟
متاسفانه دلفی XE رو ریمو کردم و ندارم، اما با کمک دوست عزیزم حمزه، و ریموت به ایشون، تا جایی که یادم مونده بود مطالب رو بیرون کشیدم.
در یونیت fmx.controls کلاس tstyledcontrol هنگام ست کردن متن شی، متدی رو کال می کنه به نام translate، که در یونیت fmx.types قرار داره، از طرفی در این متد هم متدی کال می شه که اسمش هست CustomTranslateProc، و شما می تونید درونش رو کدنویسی کرده و روال رو تغییر بدید.
می تونید Translate یا CustomTranslateProc رو بازنویسی کرده و در یونیت بطور مجدد اعمال کنید تا تمام اشیا بصورت اتومات برای نمایش متن از روال شما استفاده کنند.
این کار رو کرده بودم و تست هم گرفته بودم، دقت کنید فقط برای نمایش و نه ورود، برای ورود فکر می کنم روشی که دوستان بیان کردند هم مناسب باشه.
اگر این روال ها رو درست کنید و از اصلاح کننده بنده استفاده کنید، (یا هر ترجمه گر دیگه) اون وقت در هنگام ست کردن متن در شی تون می تونید شکل و کاراکتر ست و کاراکتر مپ رو دستکاری کنید.
دقت کنید که استپ بعدی می تونه دستکاری GetText باشه برای بازنشانی به اصل متن فارسی در هنگام کار کردن با اون مثلا در مقام مقایسه با یک رشته.
امیدوارم این اطلاعات بتونه بهتون کمک لازم رو کرده باشه.
مرسی از راهنماییتون.نقل قول:
نه تایپ فارسی رو متد دیگه ای کنترل می کنه.
ولی من با تغییر متد TTextLayout.EndUpdate و استفاده از Converter مشکل تایپ فارسی رو حل کردم. حتی تایپ ترکیبی فارسی و انگلیسی هم مشکل نداره.
برای نمایش هم متد TText.SetText رو تغییر دادم که درست شد.
البته هنوز دارم تست می کنم.
البته Converter هم که دوستان قرار داده بودند یه اشکالاتی داره مثلا حروف فارسی رو برعکس می کنه یا موقع نوشتن کلمات انگلیسی و فارسی مشکل پیش میاد که دارم اون رو هم تغییر می دم.
دوستان لطفا مشارکت کنید تا یه راه حلی پیدا کنیم
سلام دوستان
خیلی ممنون
کل اینترنت رو گشتم و جوابمو اینجا پیدا کردم
ممنون
یه تابع ساده نوشتم که امیدوارم به درد همه بخوره
این تابع تمام کامپوننت هایی رو که متن text داره رو راست چین میکنه
این تابع از کلاس بالا استفاده میکنه
اونو توی پروژتون اد کنید و از این تابع استفاده کنید
Farsi:=TFarsi.Create;
for I := 0 to ComponentCount-1 do
begin
if (Components[i] is TTextControl) Then
(Components[i] as TTextControl).Text:=Farsi.Convert((Components[i] as TTextControl).Text);
end;
بازم تشکر از دوستانی که این کلاس فارسی رو درست کردن جاوا شو پیدا کرده بودم ولی اگه میخواست پاسکالش کنم یه هفته باید وقت میزاشتم
در پناه حق
جواد عادل
ضمن تشکر میشه بفرمایید برای listview , grid چکار باید کرد ؟
من تو oncreate فرم از کد بالا استفاده کردم . ولی گرید درست نشد.
به لطف راهنمایی های دوستان و استفاده از کلاس tfarsi قدمهای خوبی برداشتم , اما هنگام استفاده از convert متون فارسی - لاتین و یا لاتین نوشته شده در edit کلا حذف می شوند . دوستان راهنمایی بفرمایید
با عرض سلام و تشكر به همه دوستاني كه در زمينه فارسي سازي دلفي براي برنامه نويسي موبايل تلاش ميكنند.
من همه كامنتها رو خوندم ولي بلاخره متوجه نشدم كه بايد از كدوم كلاس و به چه نحوي استفاده بكنم تا بشه قارسي نوشت.اگر امكانش هست يه توضيح كاملتر بفرماييد يا يك نمونه كد برنامه و مثال بگداريد تا مشكل برايم حل بشه.
البته من با كامپوننت DPF يه برنامه در خصوص كد هاي مخابراتي نوشتم ولي بقول دوستان اولا خيلي دست آدم باز نيست براي استفذاده از همه كامپوننت ها در ثاني خيلي از ابزارهايي كه بايد براي برنامه ميگذاشتم رو ازش چشم پوشي كردم بخاطر محدوديتهاي استفاده از اين كامپوننت.
خوشحال و مننون ميشم كمكم كنيد تا مشكل فارسي نوشتن حل بشه.
سلام
توی کامنت های قبلی سورس تابع پاسکال گذاشته شده
farsi reshaper
این تابع مشکل نمایش کلمات فارسی رو حل میکنه ضمن اینکه ایرادهای مختصری داره مثلا اگه فارسی ابگلیسی باشه به هم میریزه و یا اگه متن بزرگ باشه
جا داره دوستان با کمک هم این تابع رو کامل کنند
:متفکر:
سلام
برای نمایش فارسی متنهای پروژه در اندروید مراحل زیر را انجام دهید
1-در صفحات قبلی یک کلاس پاسکال گذاشته شده است آن را کپی کنید و در یک یونیت با نام FarsiReshaper.pas ذخیره کنید
2- آن را به پروژه اضافه کنید
3- برای نمایش درست فارسی متن یک text دستورات زیر را بنویسید
var
Farsi:Tfarsi;
Begin
Farsi:=TFarsi.Create;
Button1.text :=Farsi.Convert( Arg1) ;
End
حالا تمام بحث دوستان در نحوه اجرای این کد است
بعضی میگویند در ّFmx.Types یک تابع نام TCustomTranslate وجود دارد و این کانورت را داخل آن فراخوانی کنیم تا همه Text ها اتومات درست شود
بعضی از دوستان میگویند با تغییرTTextLayout.EndUpdate
ولی نکتهمهم اینه که این روش کلا و از اساس با روش استفاده شده آقای یعقوبی (فکر کنم) نویسنده کامپوننت های DPF متفاوت است چون ایشون از یک مسیر متفاوتی این کار را انجام داده است . این کامپوننت ها از این فرضیه که اندروید خود به خود در نسخه های اخیر مشکلی با فارسی نویسی ندارد پس ایشان با ایجاد کامپوننتها از روی کدهای جاوا این مشکل را حل کرده اند . یعنی کامپوننت لیست ویو ایشان از زمین تا آسمان با لیست ویو دلفی متفاوت است و شاید ما دلفی کارها عادت به استفاده از این کامپوننت ها را نداریم و باید یکسری تنظیمات و پیش نیازها را رعایت کنیم
در پناه حق
با سلام و تشكر از توضيحاتتون ..ولي باز هر كاري كه من ميكنم نميشه البته از كم سوادي بنده هستش...لطف ميكنيد يهبرنامه خيلي خيلي ساده مثلا نوشتن در داخل lable يا داخل edit رو برايم بفرستيد تا كامل متوجه بشم.نقل قول:
سلام
برای نمایش فارسی متنهای پروژه در اندروید مراحل زیر را انجام دهید
1-در صفحات قبلی یک کلاس پاسکال گذاشته شده است آن را کپی کنید و در یک یونیت با نام FarsiReshaper.pas ذخیره کنید
2- آن را به پروژه اضافه کنید
3- برای نمایش درست فارسی متن یک text دستورات زیر را بنویسید
var
Farsi:Tfarsi;
Begin
Farsi:=TFarsi.Create;
Button1.text :=Farsi.Convert( Arg1) ;
End
حالا تمام بحث دوستان در نحوه اجرای این کد است
بعضی میگویند در ّFmx.Types یک تابع نام TCustomTranslate وجود دارد و این کانورت را داخل آن فراخوانی کنیم تا همه Text ها اتومات درست شود
بعضی از دوستان میگویند با تغییر TTextLayout.EndUpdate
مثل همين تصوير كه مشاهده ميكنيد مثلا با زدن دكمه داخل EDIT بنويسه " سلام"...ممنون ميشم راهنمايي كنيد
ضمیمه 128529
دوستان نسخه xe8 دلفی امروز منتشر شد. کسی نصب کرده ؟ آیا مشکل فارسی حل شده ؟
هنوز منتشر نشده و پروسه تست هستش ، همونطور هم که یک ماه پیش گفتم هنوز حل نشده
نقل قول: تلاش برای حل مشکل به هم ریختن فارسی نویسی در آندروید
سلام
برای نمایش فارسی متنهای پروژه در اندروید مراحل زیر را انجام دهید
1-در صفحات قبلی یک کلاس پاسکال گذاشته شده است آن را کپی کنید و در یک یونیت با نام FarsiReshaper.pas ذخیره کنید
2- آن را به پروژه اضافه کنید
3- برای نمایش درست فارسی متن یک text دستورات زیر را بنویسید
var
Farsi:Tfarsi;
Begin
Farsi:=TFarsi.Create;
Button1.text :=Farsi.Convert( Arg1) ;
End
حالا تمام بحث دوستان در نحوه اجرای این کد است
بعضی میگویند در ّFmx.Types یک تابع نام TCustomTranslate وجود دارد و این کانورت را داخل آن فراخوانی کنیم تا همه Text ها اتومات درست شود
بعضی از دوستان میگویند با تغییر TTextLayout.EndUpdate
با سلام و تشكر از توضيحاتتون ..ولي باز هر كاري كه من ميكنم نميشه البته از كم سوادي بنده هستش...لطف ميكنيد يهبرنامه خيلي خيلي ساده مثلا نوشتن در داخل lable يا داخل edit رو برايم بفرستيد تا كامل متوجه بشم.
مثل همين تصوير كه مشاهده ميكنيد مثلا با زدن دكمه داخل EDIT بنويسه " سلام"...ممنون ميشم راهنمايي كنيد
https://barnamenevis.org/attachment.p...9&d=1424080340
والا من که نتوسنتم باهاش حال کنم :گریه:نقل قول:
اینم از کامپوننت : یه گزینه داره به نام PersianSupport تیک بزنید حال کنید :لبخند:
شما چطوری با این کامپوننت که درست کار نمیکنه حال می کنید
:متفکر:
اصلا حروف رو درست سر هم نمیکنه
رو اونت کلیک دکمه این کد رو بنویس
var
Farsi:Tfarsi;
Begin
Farsi:=TFarsi.Create;
Button1.text :=Farsi.Convert( Arg1) ;
End;
بجای arg1 میتونی تکست هم بنویسی یا بصورت دیفالت متن فارسیتون رو روی خاصیت تکست دکمه بنویسین و بعد
Button1.text :=Farsi.Convert( Button1.text) ;
رو تو کد بالا بنویسین
البته من از این کد برای تبدیل تمام متن های فارسی روی باتن و لیبل و تکست استفاده میکنم
var
farsi:TFarsi;
begin
Farsi:=TFarsi.Create;
for I := 0 to ComponentCount - 1 do
begin
if (Components[i] is TLabel) Then
(Components[i] as Tlabel).Text:=Farsi.Convert((Components[i] as Tlabel).Text)
else if (Components[i] Is TEdit ) then
(Components[i] as TEdit ).Text:=Farsi.Convert((Components[i] as TEdit).Text)
else if (Components[i] Is TButton ) then
(Components[i] as TButton ).Text:=Farsi.Convert((Components[i] as TButton).Text);
end;
showmessage('سلام و صد سلام');
\\add a text to end of label text
label3.Text:=farsi.Convert( ' سلام ' ) + ' ' + label3.Text;
end;
سلام Sir.V65j و ممنون از جوابتون
من اون كاري كه شما فرموديد انجام دادم ولي باز هم خطا از همون كلاسي ميده كه به برنامه اضفه كردم تصويرش رو ميذارم بي زحمت بفرماييد مشكل كجاست... مننون ميشم
ضمیمه 130391
سلام من رو xe7 و XE8 استفاده کردم کامل جواب داده و ایرادی نداشت
شمام اینا رو پشت سر هم بکن ببین درست میشه یا نه یعنی همه رو یه خط بکن
سلام
ممنون از همگي مخصوصا از nice-boy و Sir.V65j ..مشكلم حل شد با XE8 كامپايل كردم درست شد.
فقط يه راهنمايي ديگه مي خواستم .
ميخواستم ازتون بپرسم چطوري ميتونم اين كار رو روي list view انجام بدم.ممنون ميشم راهنمايي بكنيد.
یک مشکل اساسی توی فانکشم convert وجود داره که وقتی یک عبارت و تبدیل می کنه حروف انگلیسی رو حذف می کنه و در صورتیکه یکبار تبدیل شده باشه رشته خای بر می گردونه . آیا کسی این مشکل رو حل کرده
دسته همگی درد نکنه
من هنوز تست نکردم ولی زحمتاتون جای تشکر داره
ولی برای اینکه اتوماتیک این تبدیل انجام بشه. موقع وارد کردن متن و خوندن متن و... باید تو کدوم متد ازش استفاده کنیم؟ یا اینکه روی یه متن دوبار کانورت انجام نشه
برای override کردنشون میتونی از این روش استفاده کنی
In this place, you can override default action by invoking message handlers
procedure WMGetText(var Message: TWMGetText); message WM_GETTEXT;
procedure WMGetTextLength(var Message: TWMGetTextLength); message WM_GETTEXTLENGTH;
procedure WMSetText(var Message: TWMSetText); message WM_SETTEXT;
Or, override
procedure DefaultHandler(var Message); override;
سلام به دوستان
من تغییراتی در سورس فایرمانکی دادم و مشکل فارسی نویسی رو تا حد زیادی حل کردم
کد نمونه رو اینجا می زارم تا بقیه هم استفاده کنن.
فقط باید فایل ها رو در کنار پروژه تون اضافه کنید.
یکی از فایلها یونیتی هست که قبلا آقای کریم پور نوشته بودند و من برخی تغییرات روی اون دادم.
روی ذلفی XE6 و XE7 تست کردم درست کار می کنه
هنوز روی آندروید 5 تست نکردم
امیدوارم به دردتون بخوره.
اگر کسی اشکالی دید بگه تا اصلاح کنم
ضمیمه 134099
هنوز تست نکردم ، اما همینکه به اشتراک میزارید ارزشمنده.
موفق باشید.
آقا این خیلی عالیه
خدا خیرت بده
فقط نمی دونم چرا گاهی از برنامه می پرید بیرون ؟ مشکل از گوشی منه یا از کد ؟ هنوزنفهمیدم!
text کمبو باکس و LISTBOX هنوز مشکل دارد. ضمنا من در محیط اندروید 5 تست کردم
مشکل از خود نسخه xe5 هست.
برای برنامه های اندریود فعلا xe8 مناسبتر از نسخه های قدیمی تره.