View Full Version : سوال: تغییر رنگ اعراب متون عربی
md3848
سه شنبه 25 آذر 1399, 19:40 عصر
سلام، من هرچی ور رفتم و سرچ کردم چیز درست و در مونی پیدا نکردم، من تو RichTextBox متنو انتخاب میکنم و حرف حرف میخونمش ولی هیچ اعرابی پیدا نمیکنم، کسی کدی چیزی، یا روشی پیشنهادی هرچیزی که کمک کنه ارائه بده ممنون میشم.:لبخند:
152662
for (int i = 0; i < textLength; i++){
var textRange = rtbQuranTranslate.Selection;
TextPointer start = quranRuns[0].ContentStart.GetPositionAtOffset(i);
TextPointer end = quranRuns[0].ContentStart.GetPositionAtOffset(i+1);
rtbQuranTranslate.Selection.Select(start, end);
if (rtbQuranTranslate.Selection.Text.Length == 0) continue;
if (rtbQuranTranslate.Selection.Text.Contains('ُ'))
{
textRange.ApplyPropertyValue(TextElement.Foregroun dProperty, new SolidColorBrush(Colors.Blue));
}
}
---------
فک کنم فهمیدم، من کاراکترها رو به صورت utf8 میخونم که هر کاراکتر 8 بیت هستش در حالی که کدهای فتحه و کسره و .... که مثلا مقدارشون 1500-1600 هستش یه عدد 2 بایتی هستش و باید از unicode استفاده کنم.؛ به نتیجه رسیدم اینجا پیوست میکنم :لبخند:
---------
مشکلی که الان دارم اینه که کاراکترها رو میخونم، درست هم میخونم، الف ب پ و... فتحه کسره تشدید و... ولی نمیتونم رنگشون رو تغییر بدم، کدم درست کار نمیکنه
private void ColorRtbText(){
string text = quranRuns[0].ContentStart.GetTextInRun(LogicalDirection.Forwar d);
int textLength = text.Length;
byte[] bytes = Encoding.Unicode.GetBytes(text);
for (int i = 0; i < textLength; i++)
{
TextPointer start = quranRuns[0].ContentStart.GetPositionAtOffset(i + 0, LogicalDirection.Forward);
TextPointer end = quranRuns[0].ContentStart.GetPositionAtOffset(i + 1, LogicalDirection.Backward);
var textRange = new TextRange(start, end);
byte[] characterByte = new byte[] { bytes[2 * i], bytes[2 * i + 1] };
int I = BitConverter.ToInt16(characterByte, 0); // int I = (bytes[2 * i + 1] << 8 | bytes[2 * i + 0]);
string S = Encoding.Unicode.GetString(characterByte);
//---
MessageBox.Show(">" + S + ">" + ">" + I + ">");
textRange.ApplyPropertyValue(TextElement.Foregroun dProperty, Brushes.Red);
}
}
md3848
سه شنبه 09 دی 1399, 23:11 عصر
کسی نظری؟ ایده یی راه حلی چیزی نداره؟ :گریه:
SajjadKhati
چهارشنبه 10 دی 1399, 15:21 عصر
سلام
با RichTextBox کار نکردم اما یه تستی که کردم ، انگار حرف های "اِعراب" (مثل فتحه و ضمه و کسره و کلا کاراکترهای سجادوندی) را حداقل در تست کد من ، نمیتونه بصورت جداگانه انتخاب کنه (همراه با کلمه ای که اون اِعراب براش بکار برده شد ، انتخاب میکنه) :
<RichTextBox Name="MyRichTextBox" Loaded="MyRichTextBox_Loaded" Margin="10" Width="300" Height="150" FontSize="35">
<FlowDocument Name="myDoc">
<Paragraph>
<Run Text="تکرارِ متن"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
و
this.MyRichTextBox.Focus();
TextPointer myTextPointer1 = this.MyRichTextBox.Document.ContentStart.GetPositi onAtOffset(1, LogicalDirection.Backward);
TextPointer myTextPointer2 = this.MyRichTextBox.Document.ContentStart.GetPositi onAtOffset(7, LogicalDirection.Backward);
TextRange textRange = new TextRange(myTextPointer1, myTextPointer2);
this.MyRichTextBox.Selection.Select(myTextPointer1 , myTextPointer2);
textRange.ApplyPropertyValue(TextElement.Foregroun dProperty, Brushes.Red);
منتظر جواب دوستان باشید .
barnamenevisjavan
چهارشنبه 10 دی 1399, 16:49 عصر
ساده ترین راه استفاده از فونت شخصی سازی شده هست که داخل اون فونت کاراکترهای موردنظر رو رنگی کنید.
md3848
چهارشنبه 10 دی 1399, 19:08 عصر
ممنون از شما؛ خب من میتونم هر کاراکتر ( حرف و اعراب ) رو جدا جدا بخونم، مشکل اصلی اینه که نمیشه اعراب رو به صورت مجزا Select اش کرد؛ هر کاری هم کردم نشد که نشد، آخرش هم به نتیجه شما رسیدم.
اما بحث طراحی فونت، فک نکنم راه حلش این باشه، هر چند این باشه هم کار طراحی فونت در قد و قواره من نی، من فونت های زیادی رو تست کردم، تو همشون همین مشکل بود.
تو اندروید استدیو که دیدم ( حداقل تو نرمافزاراش APK ) این مشکل وجود نداره ( حتی با همون فونت هایی که من تو WPF باهاشون به مشکل خوردم )، چون فونت هایی که برا متن قرآن استفاده میشن، معلومن و بیشتر از 5-10 تا نیستن.
md3848
دوشنبه 15 دی 1399, 19:12 عصر
این روشو پیدا کردم، که دو تا متن رو روی هم قرار بدی ( کد فوق html هستش ولی خب میشه html رو هم تو wpf استفاده کرد )
1-متن با اعراب - قرمز ( پایین )
2-متن بدون اعراب سیاه ( بالا )
اینطوری متن با رنگ سیاه و اعراب با رنگ قرمز نمایش داده میشه ولی بنا به فونت مورد استفاده و اندازه صفحه، مشکلاتی ایجاد میکنه که بیخیالش شدم.
https://jsfiddle.net/8mfgmovj/
من نمیدونم چطوریه تو ورد میشه این کارو کرد، تو اندروید میشه اما تو این Visual Studio نمیشه:گریه:
SajjadKhati
دوشنبه 15 دی 1399, 20:06 عصر
این روشو پیدا کردم، که دو تا متن رو روی هم قرار بدی ( کد فوق html هستش ولی خب میشه html رو هم تو wpf استفاده کرد )
1-متن با اعراب - قرمز ( پایین )
2-متن بدون اعراب سیاه ( بالا )
اینطوری متن با رنگ سیاه و اعراب با رنگ قرمز نمایش داده میشه ولی بنا به فونت مورد استفاده و اندازه صفحه، مشکلاتی ایجاد میکنه که بیخیالش شدم.
https://jsfiddle.net/8mfgmovj/
من نمیدونم چطوریه تو ورد میشه این کارو کرد، تو اندروید میشه اما تو این Visual Studio نمیشه:گریه:
بله ، روش جالبه .
فونت چه مشکلی بوجود میاره؟
اندازه ی فونت هر دو متن را به یک مقدار بگیرید دیگه .
md3848
دوشنبه 15 دی 1399, 20:38 عصر
اندازه متن با اعراب با متن بدون اعراب یکسان نمیشه، سر همین داستان میشه، با اکثر فونتا تست کردم، تو بعضیاشون این مشکل کم بود ولی بود!
SajjadKhati
دوشنبه 15 دی 1399, 20:53 عصر
اندازه متن با اعراب با متن بدون اعراب یکسان نمیشه، سر همین داستان میشه، با اکثر فونتا تست کردم، تو بعضیاشون این مشکل کم بود ولی بود!
کد کامل تون را بذارید .
md3848
دوشنبه 15 دی 1399, 21:34 عصر
این کد xaml که کنترل WebBrowser داخلش هستش ( نمایش فایل های وب در wpf ) :
<Grid> <WebBrowser Name="myWebBrowser"></WebBrowser>
</Grid>
کدهای html/css/js و کتابخونه jquery v1.7.2 هم در زیر پیوست کردم ( هر چند همون لینک بالا هم کفایت میکرد بنظرم )؛ فایل های فوق رو اضافه کردید به پروژه، قسمت Copy to output directory رو، روی Copy always تنظیمشون کنید :
152837
اینم نتیجه، البته این دقیق نی ولی خب یه تست ساده که کردم نتیجش شد این، یه متن عربی طولانی رو تست کردم داستان شد
152838
SajjadKhati
دوشنبه 15 دی 1399, 23:23 عصر
این کد xaml که کنترل WebBrowser داخلش هستش ( نمایش فایل های وب در wpf ) :
<Grid> <WebBrowser Name="myWebBrowser"></WebBrowser>
</Grid>
.
.
.
من که ناهماهنگی ای ندیدم .
md3848
دوشنبه 15 دی 1399, 23:28 عصر
اندازه صفحه رو تغییر بدید، هماهنگی! رو میبینید :لبخند:
152839
md3848
سه شنبه 16 دی 1399, 01:30 صبح
خب مشکلو با یکم css بازی حل کردم :لبخند:، خصوصیت position: absolute رو به هر دو span اعمال کردم، اون لینکی که گزاشتم اینکارو نکرده بود:گریه:، منم توجه نکردم سر همین این مشکل ایجاد میشد:لبخندساده:؛ حالا باز ور برم ببینم چی میشه به نتیجه خوبی رسیدم پیوست میکنم.
md3848
چهارشنبه 17 دی 1399, 21:31 عصر
سلام
با RichTextBox کار نکردم اما یه تستی که کردم ، انگار حرف های "اِعراب" (مثل فتحه و ضمه و کسره و کلا کاراکترهای سجادوندی) را حداقل در تست کد من ، نمیتونه بصورت جداگانه انتخاب کنه (همراه با کلمه ای که اون اِعراب براش بکار برده شد ، انتخاب میکنه) :
این مشکل تو کدنویسی html هم هستش :
<div id="highlight">
<span style=" color: black; ">ک</span><span style="color: red;">َ</span><span style=" color: black; ">ت</span><span style="color: green;">َ</span><span style=" color: black; ">ب</span><span style="color: green;">َ</span>
</div>
152860
------------------------
انواع روش ها :
0) تغییر مستقیم رنگ اعراب ها مقدور نی فلذا میریم سراغ روش های دیگه :
1) دوستمون گفتن فونت شخصی سازی شده ( فونت رنگی )
خب این روشو من یه تحقیق کوتاه کردم چیز جابیه ولی حالا حالا ها فک کنم کار داره، مشکلاتش :
1) همه جا پشتیبانی نمیشه، مثلا تو همین کروم تست کردم جواب نداد ( حالا شاید نکته ای چیزی داره که من رعایت نمیکنم )
2) تو هم که رنگی بودنش نمایش داده نمیشد.
3) تو ورد رنگی بودنشون نمایش داده میشه.
4) اما مشکل اصلی : الان من به ازای هر رنگی، باید یه فونت جداگونه طراحی کنم!؟ اینطوری که خیلی داستان میشه، من میخوام این قابلیت رو به کاربر بدم که بتونه رنگ متن و فونت، هر چی دلش خواست تنظیم کنه، نمیخوام محدودیتی از این جهت باشه.
در زیر 3 تا فونت رنگی قرار دادم، یکی پرچم، یکی نام سوره ها فک کنم، و دیگری متن عربی که 3 تا font family style داره : دانلود (https://s16.picofile.com/file/8420414968/Color_Fonts.rar.html)
152865
با نرم افزار FontLab 7، فونت نبی، رو 4 تا از کاراکتر های پرانتز باز و بسته و فتحه و کسره رو رنگی کردم، نتیجه رو در زیر میبینید، در ضمن فقط رو فوتوشاپ اونم فقط فرمت فونت otf / ttf اونم فقط svg ییش جواب گرفتم :لبخند: ولی خب فک کنم داستان زیاد داره، به قسمت ترکیب تشدید و فتحه دقت کنید! بحث تغییر رنگ توسط کاربر رو هنوز راهی پیدا نکردم براش ( به غیر از این که شونصد تا فونت به رنگ های مختلف ایجاد کنم؛ منظورم یه روش بهتر از اینه، هنوز پیدا نکردم )
152875
سوال : یه مشکل بزرگ، من تو WPF نتونستم از این فونت ها استفاده کنم، رنگ متن سیاه میشه، اصلا رنگی نشون داده نمیشه، چیکار کنم؟
2) نمایش 2 متن روی همدیگه که یکی متن بدون اعرابه و بالا قرار داره و رنگش سیاهه، یکی متن با اعراب و زیر قرار داره و قرمزه، اینطوری کاربر فک میکنه ( میبینه ) یه متنی رو که متنش سیاهه و اعرابش قرمز؛ مشکل این روش اینه که بایت فونت مورد استفاده بهینه باشه، مثلا فونتی داریم که یه اعراب از کاراکتراش حذف بشه، عرض متن تغییر میکنه و یا بعضا روی یه کلمه 2 تا اعراب داریم که اگه اعراب پایینی رو حذف کنیم، اعراب بالایی، میاد پایین و همون جای قبلی نمیمونه و جاش عوض میشه.
3) تبدیل متن به svg ( این الان به ذهنم رسید، میرم بررسی میکنم )
4) این بحث تغییر رنگ اعراب ها رو من فک کنم فقط تو اندروید دیدم، حالا نمیدونم اونجا این مشکل وجود نداره یا اونجا هم از روش جاگزینی چیزی استفاده میکنن، در این باره هم سعی میکنم تحقیق کنم ( البته اگه در موارد بالا به نتیجه نرسیدم )؛
barnamenevisjavan
شنبه 20 دی 1399, 19:28 عصر
اینکه wpf نمیتونه فونت رو به خوبی رندر کنه مربوط میشه به تکنولوژی رندر توی wpf و uwp که خوب کاملا مشخصه uwp امکانات بهتری رو داره
به عنوان راه حل من الان 2 تا چیز به ذهنم میرسه:
یک اینکه حروف رو بصورت کد اسکی و یونیکد و این جور داستان ها بخونی و تغییر رنگ بدی
دو اینکه از متن فرمت بندی شده استفاده کنی یه نمونه براتون مینویسم البته این مثال کل متن رو تغییر میده ولی بنظرم اگر کمی باهاش تمرین کنید شاید بتونید چیزی که میخواید رو بدست بیارید
private Drawing DrawMyText(string textString)
{
DrawingGroup drawingGroup = new DrawingGroup();
using (DrawingContext drawingContext = drawingGroup.Open())
{
FormattedText formattedText = new FormattedText(
textString,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Comic Sans MS Bold"),
48,
System.Windows.Media.Brushes.Black // This brush does not matter since we use the geometry of the text.
);
Geometry textGeometry = formattedText.BuildGeometry(new System.Windows.Point(20, 0));
drawingContext.DrawRoundedRectangle(System.Windows .Media.Brushes.PapayaWhip, null, new Rect(new System.Windows.Size(formattedText.Width + 50, formattedText.Height + 5)), 5.0, 5.0);
drawingContext.DrawGeometry(System.Windows.Media.B rushes.Gold, new System.Windows.Media.Pen(System.Windows.Media.Brus hes.Maroon, 1.5), textGeometry);
return drawingGroup;
}
}
نحوه استفاده هم به این صورت هست که یه کنترل بزارید روی فرمتون (مثل textblock یا هر کنترل دیگه) :
xx.Background = new DrawingBrush(DrawMyText("مُحَمّد"));
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.