# Native Code > برنامه نویسی در Delphi > کامپوننت های سایر شرکت ها، و توسعه کامپوننت > حرفه ای: فارسی سازی کامپوننت cxGrid از سری کامپوننت های شرکت DevExpress

## HosseinSaberi

با عرض سلام خدمت دوستان برنامه نویس
همونطور که همه برنامه نویس های عزیز دلفی میدونند یکی از قویترین شرکتهای کامپوننت نویسی DevExpress هست اما مشکلی که وجود داره اینه که این کامپوننت ها زبانهای راست به چپ رو پشتیبانی نمیکنه. این مشکل برای کامپوننتهایی مثل Edit و ... با راست چین کردن در زمان طراحی و تنظیم BidiMode در زمان اجرا حل میشه.
اما برای کامپوننتهایی مثل جدول CXGrid این مشکل اینطوری حل نمیشه و از طرف دیگه من اینجا رو که خوندم فهمیدم امیدی به شرکت سازنده، برای فارسی سازی کامپوننتها، نیست. توی اینترنت هم که هرچی بیشتر گشتم کمتر یافتم (راه حل این بابا رو هم چک کردم و جواب نگرفتم). بنابراین چاره ای ندیدم جز اینکه خودم دست بکار بشم و مشکلم رو با این کامپوننت CxGrid حل کنم.
ویژگی های کامپوننت CxGrid که من استفاده میکنم به شرح زیره:
1- ستونها از چپ به راست چیده میشه یعنی اولین ستون میره سمت چپ.
 این مشکل رو با تنظیم خاصیت ColumnAotuWidth به مقدار True تقریباً حل کردم. به عبارت دیگه فضای خالی برای جدول نمیمونه که مشخص بشه چینش ستونها از چپ به راسته.
2- متون نوشته شده در سلول های متنی در سمت چپ تراز میشوند.
این مشکل هم اینطوری حل میشه که ستون مربوطه رو ابتدا انتخاب میکنم و بعد خاصیت Properties اون رو به TextEdit تغییر میدم و بعد از زیر مجموعه همون خاصیت Properties خاصیت Alignment و بعد خاصیت Horz رو به taRightJustify تغییر میدم.
با این کار فقط متون از سمت چپ ستون به سمت راست اون منتقل میشه. برای متون انگلیسی هم باید همین روند رو برعکس کرد (taLeftJustify)
3- در مرحله دوم فقط متن (جمله) به سمت راست اومد اما هنوز جملات ما در سطح کلمات دچار مشکل هستند. میتونیم چهار حالت زیر رو برای یک جمله که داخل سلولی هست متصور باشیم:
الف - جمله کاملاً فارسی باشه و بدون هیچ کلمه انگلیسی.
ب- جمله کاملاً انگلیسی باشه و بدون هیچ کلمه فارسی.
ج- جمله انگلیسی باشه که چند کلمه فارسی هم داره.
د- جمله فارسی باشه که چند کلمه انگلیسی هم داره.
با انجام دو مرحله اول پس از اجرای جدول با حالتهای الف و ب مشکلی نداشتم و حالت د هم مربوط به کار من نبود (فکر نمیکنم کلاً خیلی کاربردی باشه) فقط میمونه حالت ج. در حالت ج هم در زمان اجرا با انتخاب سلول مشکل حل میشه و نمایش جمله درست میشه. و با توجه به اینکه خود حال ج هم زیاد مورد استفاده نیست این مورد هم زیاد اذیت نمیکنه و میشه بیخیالش شد.
4- اما با انجام همه مراحل بالا پس از اجرا یک مشکل اساسی وجود داره و اونم اینه که با زدن کلید Tab و یا اینتر بجای حرکت از سلولهای سمت راست به چپ (مطابق فارسی) جهت حرکت برعکسه. یعنی وقتی Tab رو میزنید از سلول سمت چپ میاید سمت راست (یعنی مطابق انگلیسی).
من کمی (چند ساعت) سورس این کامپوننت رو زیر و رو کردم تا تونستم این مشکل رو حل کنم.
سورس رو کمی تغییر دادم و بعد از امتحان و حل مشکل اولاً گفتم شاید بدرد سایر دوستان هم بخوره و ثانیاً گفتم شاید از من وارد تر هم توی تالار باشه و از استارت من استفاده کنه و بتونه مشکل سوم رو هم کاملاً حل کنه که هم بدرد من بخوره هم بدرد سایر دوستان.
فایلی که من ضمیمه کردم رو بجای فایلی با همین نام در سورس کامپوننت های DexExpress ذخیره کنید.
در ضمن برای دوستانی که قصد ادامه کار رو دارند من قسمتهایی از سورس  رو که تغییر دادم با علامت Sab// علامت گذاشتم و اصل ردیف رو هم جلوی همون نوشتم که بدونید قضیه چی بوده.
موفق باشید

منبع تالانت

----------


## AliReza Vafakhah

دوست گرامی باید آفرین گفت که تونستید یه تغییری تو این کامپوننت ایجاد کنید ولی من به دلیل عدم تطبیق با نسخه Dev با این خطا روبه رو شدم.

*[dcc32 Fatal Error] cxGridCustomTableView.pas(4234): F2051 Unit cxGridLevel was compiled with a different version of cxGridCustomTableView.TcxCustomGridRecord

*نسخه 13.1.4

----------


## HosseinSaberi

سلام عزیز
درسته
ورژن من 13.1.2 هست و باید از قبل میگفتم که دوستان اشتباهاً دانلود نکنند
اما شما میتونید همون فایل رو باز کنید و تغییراتی رو که من دادم توی فایل خودتون اعمال کنید.
بگردید دنبال کامنتهایی که با Sab// شروع میشه و تغییرات رو مشاهده کنید.

----------


## HosseinSaberi

مجدداً سلام
یک مشکل دیگه ای که این کامپوننت داشت رو پیدا و رفع کردم.
مشکل مربوط به فشردن کلیدهای Home  و End بود که برای فارسی غلط کار میکرد ولی برای انگلیسی درست بود.
من برعکسش کردم. یعنی الان با تغییری که من دادم برای فارسی درست کار میکنه و برای انگلیسی غلط.
اگر شما هم میل دارید اینکارو کنید فایل پیوست رو جایگزین فایلی با هین نام کنید

----------


## benyaminrahimi

سلام مرصی که وقت پذاشتین سورس ها تون رو دیدم  برای مشکل rtl reading حل نشده و کد tab order هم چنانچه focus on cycle تیک دار بشه درست کار نمیکنه ... اگه خوب سرچ میکردین ما هم یه 1 سالی هست رو این قضیه شسته و رفته کار کردیم 

توضیحات کامل

http://segalpardaz.ir/%D9%81%D8%A7%D...B2-devexpress/

----------


## HosseinSaberi

> سلام مرصی که وقت پذاشتین سورس ها تون رو دیدم  برای مشکل rtl reading حل نشده


این مورد رو که خودم گفتم نتونستم براش کاری کنم



> و کد tab order هم چنانچه focus on cycle تیک دار بشه درست کار نمیکنه


چرا درست کار میکنه
نمیدونم شما امتحان کردی یا همینطوری میگی؟ ولی من روی این قسمتش خیلی وقت گذاشتم که همین تیک رو درست کنم



> اگه خوب سرچ میکردین ما هم یه 1 سالی هست رو این قضیه شسته و رفته کار کردیم


بله دوست عزیز، سرچ کرده بودم و کار شما رو هم دیده بودم ولی این کاری که من انجام دادم کاملاً رایگانه و برای کسایی خوبه که مثل من فقیر و بیچارند و نمیتونند 300000 هزار تومن پول فارسی شده کامپوننتی رو به شما بدهند که خودش رو کرک شده و رایگان دانلود کردند.
البته این چیزی از ارزش کار شما کم نمیکنه ولی شاید چند نفر دیگه هم پیدا شدند و مشکلات کار منو اصلاح کردند و بازار شما رو خراب :قهقهه: 
یه نکته هم خدمت دوستان و شما بگم...
اصول کار من توی اصلاح این کامپوننت اینه که جای Tab رو با Shift+Tab عوض کردم.
فکر میکنم کار خلاقانه ای کردم و خیلی ساده.
تقریباً دوسال و نیم پیش هم یک ایراد دیگه از این کامپوننت رو رفع کردم (اونم فی سبیل الله) که برای خودشونم ایمیل کردم ولی تحویل نگرفتند ولی اگر خواستید اینجا میتونید ببینید.
در ضمن یک فایل فارسی شده برای فیلتر و جدول و کلاً جملات انگلیسی این کامپوننت آماده کردم که اونم به همراه آموزش استفاده و ساخت همینطور رایگان میخوام قرار بدم داخل اینترنت (میخوام حسابی بازار شما رو خراب کنم رفیق :قهقهه: ).
فکر میکنم کاری که من کردم با کار شما فقط از لحاظ RTL reading و تقویم فارسی تفاوت داره که اونم به امید خدا حلش میکنم و رایگان قرار میدم
ان شاءالله
البته از اینکه اینطوری حرف زدم عذر خواهی میکنم ولی من چون خودم توی اینترنت خیلی کم پول میدم چیزهایی رو هم که قرار میدم رایگان میذارم (میتونید توی سایتم نمونه کارهام رو ببینید)
به هر حال ممنون از اینکه ایرادات کارم رو متذکر میشید.

----------


## benyaminrahimi

با  foucus on cycle  برای رفتن به سطر بعد بعد از آخرین سلول رو هم ببینید .....

----------


## HosseinSaberi

شرمنده
نمیتونم فایل رو اینجا آپلود کنم
فکر کنم بخاطر حجمشه که کمی بیشتر از 10 مگه
ولی بهر حال توی سیستم من که مشکلی نداره
یعنی با زدن تب و اینتر از سمت راست حرکت میکنه و میاد سمت راست و در نهایت (از آخرین سلول) میره به سلول اول (سمت راست) سطر پایین

----------


## HosseinSaberi

سلام
اینم لینک فایل
گذاشتم توی گوگل درایو خودم
دانلود کنید نتیجه اش رو بگید

----------


## AliReza Vafakhah

> سلام
> اینم لینک فایل
> گذاشتم توی گوگل درایو خودم
> دانلود کنید نتیجه اش رو بگید


دوست گرامی حجم فایل اجرایی خیلی بالا هست ، لطفا نسخه Release رو فشرده کنید بعد آپلود . شما الآن نسخه Debug رو گذاشتین که حجم خیلی بالایی داره که حتما خودتون دلیلش رو در نسخه های XE دلفی می دونید.  اما من باز خواستم دانلود کنم با این پیغام رو به رو شدم.

----------


## AliReza Vafakhah

تو تصویر کادر قرمز رنگ

delphi-x64-platforms.jpg




> پیغام خطا با استفاده از فیلتر شکن احتمالاً رفع میشه


نه ، با فی شکن هم رفع نشد اما فایل ini رو راحت دانلود کرد.

----------


## AliReza Vafakhah

> ممنون از نکته مفیدتون
> ولی باز هم 8 مگ شد تقریباً


خواهش می کنم

اگر CnWizard رو در IDE دلفیتون نصب دارید به منو Unused Unit Clean (دقیقا نام منو خاطرم نیست و الآن سرکار دلفی نصب ندارم.) بروید. این ابزار یونیت هایی که در پروژتون نیاز نیست رو حذف می کنه و این کار باعث کاهش حجم فایل اجرایی میشه.

راستی اگر مجددا فایل اجرایی رو با winrar یا 7zip فشرده کنید مجددا کاهش حجم تا درصد خوبی خواهید داشت.

----------


## HosseinSaberi

> خواهش می کنم
> 
> اگر CnWizard رو در IDE دلفیتون نصب دارید به منو Unused Unit Clean (دقیقا نام منو خاطرم نیست و الآن سرکار دلفی نصب ندارم.) بروید. این ابزار یونیت هایی که در پروژتون نیاز نیست رو حذف می کنه و این کار باعث کاهش حجم فایل اجرایی میشه.
> 
> راستی اگر مجددا فایل اجرایی رو با winrar یا 7zip فشرده کنید مجددا کاهش حجم تا درصد خوبی خواهید داشت.


بله CnWizard رو نصب دارم و یونیتهای اضافه رو هم حذف کردم
با چند بار فشرده سازی هم فرقی نکرد

----------


## HosseinSaberi

شاید ورژن کامپوننت شما با مال من یکی نیست.
چه خطایی میده.
بگید شاید بفهمیم چی میگه.

----------


## HosseinSaberi

> آقای سایه ظهور خیلی زحمت کشیدین .. فایلتون رو با فایل خودم که مقایسه میکنم از یک قضیه تعجب میکنم ولنم اینه که نوع ترجمتون خیلی شبیه ترجمه های بندست و جالب تر اینکه ترجمه های اشتباهی رو که بنده از قصد در این فایل درج کردم تو فایل شما هم مشاهده میشه .... ای کاش حد اقل مینوشتین که فایلیو از کجا گیر اوردین و کمی تغییر دادین ... بعد اون بسم ال... قهرمانانه رو درج میکردین ....


سلام دوست عزیز
من فایل ترجمه شما رو ندیدم و نمیتونم قضاوت کنم که حق با شماست یا نه. اگر کار شما باشه که واقعاً جای تاسف داره.
اما من خودم یه فایل رو تا نصفه ترجمه کردم که مطمئنم کار خودمه و اونو برای دوستان میذارم که اگر خواستند از اونم استفاده کنند.
البته مال خیلی وقت پیشه (تقریباً یکسال پیش) و ناقصمیخواستم وقتی کامل شد بذارم اینجا که دیگه وقت نکردم. امیدوارم که دوستان به بزرگی خودشون ببخشند.

----------


## HosseinSaberi

جناب benyaminrahimi!
شما کد منو امتحان کردی و جواب داد؟ (چون یادمه شما ویکی دیگه از دوستان اول گفتید با زدن کلید اینتر وقتی در ستون آخر هستیم درست کار نمیکنه یعنی نمیاد ستون اول سطر بعد)
چون من فکر میکنم ساده تر از کار شما باشه (راستش من این فلگ رو نمیفهمم یعنی چه؟) ولی از لحاظ تب اوردر متد من هم داره توی سیستمم جواب میده. و فکر میکنم قابلیت چند زبانه بودن رو هم بتونم بهش اضافه کنم(فقط برای تب اوردر).
اما هنوز نفهمیدم برای قابلیت RTL کجاش رو باید دستکاری کنم.
لطفاً نظرتون رو راجع به کار من بدید.

----------


## SayeyeZohor

یک ترفند جالب :

البته برای من جالبه

کسایی که با cxgrid کار کردند می دونند که group by box آن شاهکاره حالا زمانی که فیلد ها رو در اون پنل برای گروه بندی رها می کنیم و بعد دوباره بخوایم فیلدها به ترتیب اول چیده بشند دردسره  چرا که ممکنه مکان فیلد ها رو حفظ نباشیم


این کد به کمکمون میاد


unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters,
  cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, DB,
  cxDBData, dxmdaset, cxGridLevel, cxGridCustomTableView, cxGridTableView,
  cxGridDBTableView, cxClasses, cxGridCustomView, cxGrid, StdCtrls, cxGridDBDataDefinitions,
  dxSkinsCore, dxSkinBlack, dxSkinBlue, dxSkinBlueprint, dxSkinCaramel,
  dxSkinCoffee, dxSkinDarkRoom, dxSkinDarkSide, dxSkinDevExpressDarkStyle,
  dxSkinDevExpressStyle, dxSkinFoggy, dxSkinGlassOceans, dxSkinHighContrast,
  dxSkiniMaginary, dxSkinLilian, dxSkinLiquidSky, dxSkinLondonLiquidSky,
  dxSkinMcSkin, dxSkinMoneyTwins, dxSkinOffice2007Black, dxSkinOffice2007Blue,
  dxSkinOffice2007Green, dxSkinOffice2007Pink, dxSkinOffice2007Silver,
  dxSkinOffice2010Black, dxSkinOffice2010Blue, dxSkinOffice2010Silver,
  dxSkinOffice2013White, dxSkinPumpkin, dxSkinSeven, dxSkinSevenClassic,
  dxSkinSharp, dxSkinSharpPlus, dxSkinSilver, dxSkinSpringTime, dxSkinStardust,
  dxSkinSummer2008, dxSkinTheAsphaltWorld, dxSkinsDefaultPainters,
  dxSkinValentine, dxSkinVS2010, dxSkinWhiteprint, dxSkinXmas2008Blue,
  dxSkinscxPCPainter, cxNavigator;






//------------------------------------------------- بازگشت فیلد ها بعد از گروه بندی به جای اصلی خود --------------------------
type
  TMyGridDBTableView = class(TcxGridDBTableView)
  protected
    function GetViewInfoClass: TcxCustomGridViewInfoClass; override;
  end;


  TMyGridSite = class(TcxGridSite)
  public
    procedure EndDragAndDrop(Accepted: Boolean); override;
  end;


  TMyGridTableViewInfo = class(TcxGridTableViewInfo)
  protected
    function GetSiteClass: TcxGridSiteClass; override;
  end;


  TmyGridColumnHeaderMovingObject = class(TcxGridColumnHeaderMovingObject);


  TcxGridDBTableView = class(TMyGridDBTableView);
//------------------------------------------------- بازگشت فیلد ها بعد از گروه بندی به جای اصلی خود --------------------------






  TForm1 = class(TForm)
    cxGrid1: TcxGrid;
    
  private
  public
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


//------------------------------------------------- بازگشت فیلد ها بعد از گروه بندی به جای اصلی خود --------------------------
{ TMyGridTableViewInfo }
function TMyGridTableViewInfo.GetSiteClass: TcxGridSiteClass;
begin
  Result := TMyGridSite;
end;


{ TMyGridDBTableView }
function TMyGridDBTableView.GetViewInfoClass: TcxCustomGridViewInfoClass;
begin
  Result := TMyGridTableViewInfo;
end;


{ TMyGridSite }
procedure TMyGridSite.EndDragAndDrop(Accepted: Boolean);
begin
    with (TMyGridColumnHeaderMovingObject(DragAndDropObject  ).SourceItem as TcxGridDBColumn) do
    begin
      Tag := Index;
      inherited;
        Index := Tag;
    end;
end;
//------------------------------------------------- بازگشت فیلد ها بعد از گروه بندی به جای اصلی خود --------------------------


end.

----------


## AliReza Vafakhah

*دوستان آخرش کسی نتونست RTL رو پیاده سازی کنه؟ پس کو؟*

----------


## HosseinSaberi

فعلاً که خبری نیست
من تا همینجا بیشتر بلد نبودم
بقیش دست دوستان رو میبوشه

----------


## مرد مباح

دوست عزیز.
ممنون از زحماتی که کشیدی. من متاسفانه نتونستم برنامه نمونت رو اجرا کنم. خطا میده :
provider cannot be found. it may not be properly installed
ظاهرا از پروایدر روتین jet استفاده نکردی برای کانکت به اکسس برای همین مشکل داره.
ضمنا برنامه فایل farsi.ini رو توی c: میگرده. تعریفش کن کنار exe اصلی پیداش کنه.

من روی 12.1.6 سورس را امتحانش کرده بودم که مشکل در اجرا داشت. البته خیلی هم دیگه باهاش ور نرفتم ببینم چطور درست میشه.
دلیل سنگین بودن فایل exe هم همین مجموعه DevEx هست که خیلی سر بار داره. (البته یک برنامه کامل با 12.1.6 نوشتم با اسکیناش شد 28.5 مگ)
شاید سربارها 13.1.2 الکی بیشتر هم شده باشه. چون شنیدم کلی آیکون و تصویر به پک 13 اضافه شدن و مهمترین تفاوتش در این بوده.

حالا اصل مطلب :
من هم دنبال این داستان که شما میگید هستم. متاسفانه توی ترک کردن در کامپوننت خیلی ضعیف هستم. (چون اصلا توی این مقوله وقت نگذاشتم)
ولی توی کد زدن بد نیستم و راهش رو پیدا میکنم.
اگر بتونیم ریشه اصلی رو پیدا کنیم و از اونجا اصلاح انجام بگیره مطمئنا بسیار بهتر خواهد بود و در واقع کل پکیج رو درست کردیم.
من قابلیت BidiMode رو توی ریشه اضافه کردم. ولی عمل نکرد.
حال اگر شما بتونین منو راهنمایی کنی که کجای ریشه باید کد رو وارد کرد تا تکثیر بشه، با کمک هم به این نتیجه خواهیم رسید.
هدف های من :
    1. راست به چپ شدن شکل گرید ها و درخت ها وقتی RTL میکنیش
    2. حرکت درست در گریدها مطابق RTL
    3. نمایش  درست فارسی.

که اینا هم به نظر من باید توی ریشه اصلاح بشه. نه توی خود گرید. چون برای مثال بجای TableView بخوای از CardView استفاده کنی. دوباره باید کد بنویسی؟
اگر مایل به همکاری هستید، لطفا پیغام بهم بدین؛ چون کم وقت میکنم بیام تو سایت، یادم میره اینجا رو هم چک کنم.
امیدوارم با هم بتونیم کل پکیج رو فارسی و تکمیل کنیم. البته یکی دو نفر دیگه از دوستان همین انجمن هم هستند که اگر وقت کنن کمک میکنن که میشیم یک تیم کامل.

----------


## golbafan

این هم ترجمه من: مجانیه

----------


## golbafan

اگر فقط کاراییش رو لازم دارید
کامپوننت ehlib همه قابلیتهای cxgrid رو با حالت راستچین داره
اما به اون قشنگی نیست

----------


## golbafan

این رو هم امتحان کنید: کلیه چیزهای داخل فرم رو راست چین میکنه:


function SetLayout(hdc: HDC; dwLayout: DWORD): DWORD; stdcall;
  external 'gdi32' name 'SetLayout';

const
  LAYOUT_RTL = $00000001;

----------


## golbafan

راه ساده تر برای ترفند جالب شما:

ابتدا:
cxGridTableView1.StoreToIniFile('x.ini')
سپس
cxGridTableView1.ReStoreFromIniFile('x.ini')

----------


## HosseinSaberi

> راه ساده تر برای ترفند جالب شما:
> 
> ابتدا:
> cxGridTableView1.StoreToIniFile('x.ini')
> سپس
> cxGridTableView1.ReStoreToIniFile('x.ini')


سلام بر شما و منون بابت زحماتتون
این فایل x.ini چیه اونوقت؟

----------


## golbafan

> سلام بر شما و منون بابت زحماتتون
> این فایل x.ini چیه اونوقت؟


نام فایل جهت ذخیره سازی خواص (نام دلخواه من x گزاشتم)

----------


## golbafan

یک حرکت جالب:
بدون نیاز به تغییر سورس cxgridtableview


procedure Tform1.cxGrid1DBTableView1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
    if cxGrid1DBTableView1.Controller.FocusedColumnIndex = 0 then
// بجای رفتن به ستون اول میتونید اول یک رکورد ایجاد کنید //
      cxGrid1DBTableView1.Controller.FocusedColumnIndex := cxGrid1DBTableView1.ColumnCount - 1
    else
      cxGrid1DBTableView1.Controller.FocusedColumnIndex :=
        cxGrid1DBTableView1.Controller.FocusedColumnIndex - 1;
  end;
end;

----------


## ebrahim.rayatparvar

سلام دوستان من این پست قدیمی رو آبردم بالا ولی من دارم با کامپوننت دلفی تو دلفی کار میکنم ولی کنترالاش راست به چپ نیستن بر عکس دات نت که این کار رو انجام دادن. مثلا من الان تو برنامه خودم از tcxShellListView و tcxShellTreeView استفاده میکنم ولی راست به چپ نمیشن. برای اینکه این عمل رو انجام داد چه میشه کرد قبلا تو دات نت تو ایونت های کاستوم دراوویی که داره این تغییرات رو انجام داد تو دلفی چون مبتدی هستم نمیدونم به چه صورت میشه این کارا رو کرد.

با تشکر

----------


## benyaminrahimi

در نسخه 18.2.1  راست به چپ و rtl reading اضافه شد ... توسط خود شرکت

----------


## soorenco

سلام
وقت تون بخیر اصلا تک sub// رو من توی سورس شما ندیدم  :متفکر: 
میشه راهنمایی بفرمایید
ممنونم

----------


## HosseinSaberi

> سلام
> وقت تون بخیر اصلا تک sub// رو من توی سورس شما ندیدم 
> میشه راهنمایی بفرمایید
> ممنونم


سلام
تگ //sab هست
اشتباه تایپی دارید برادر

----------

