Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

Прозрачное STATIC-окно   Найти похожие ветки 

 
Dmitry_177   (2006-11-19 23:50) [0]

Создаю на форме (которое было создано hWindow := CreateWindowEx(WS_EX_LAYERED, WindowName, WindowName, WS_POPUP or WS_SYSMENU, cw_UseDefault, cw_UseDefault, 283, 149, 0, 0, HInstance, nil);) STATIC-окно что бы оно было прозрачным, т.е. Transporent, чтобы прямоугольник был прозрачным кроме текста, но этого почему-то не происходит... Создаю это окно так: CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "00:00:00", SS_LEFT or WS_CHILD or WS_VISIBLE, 18, 34, 168, 52, hWindow, 0, HInstance, nil); Почему оно не прозрачное?


 
Dmitry_177   (2006-11-20 20:21) [1]

Неужели никто с этим не сталкивался раньше? А еще как мне поменять цвет текста?


 
Leonid Troyanovsky ©   (2006-11-20 20:43) [2]


> Dmitry_177   (20.11.06 20:21) [1]

> Неужели никто с этим не сталкивался раньше?


msdn, msdn and MSDN.

--
Regards, LVT.


 
Rouse_ ©   (2006-11-20 20:44) [3]

program Access;

uses
 Windows,
 Messages;

resourcestring
 TXT_CAPTION = "Ввод пароля";
 TXT_INSTALL = "Принять";
 TXT_CANCEL = "Отмена";
 TXT_STATUS = "Введите пароль:";
 TXT_NEWUSER = "Значение пароля: ";

var
 MainWindow    : TWndClassEx;
 Handle,
 hFontNormal,
 btnOk,
 btnCancel,
 Edit,
 Label1        : HWND;
 Msg           : TMsg;
 Left,
 Top,
 Width,
 Height        : Integer;

const
 BTN_APPLY_ID = 100;
 BTN_CANCEL_ID = 105;
 EDIT_ID = 110;

// Центрирование формы
// =============================================================================
procedure CenterMainForm;
var
 ScrWidth, ScrHeight: Cardinal;
begin
 ScrWidth := GetSystemMetrics(SM_CXSCREEN);
 ScrHeight := GetSystemMetrics(SM_CYSCREEN);
 Left := (Integer(ScrWidth) - Width) div 2;
 Top := (Integer(ScrHeight) - Height) div 2;
end;

// Главная оконная процедура
// =============================================================================
function WindowProc(Wnd: HWND; Msg: Integer;
 WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
 S: String;
 Len: Integer;
 DC: HDC;
begin
 Result := 0;
 case Msg of
   WM_DESTROY:
   begin
     PostQuitMessage(0);
     Result:=0;
   end;
   WM_COMMAND:
   begin
     case LoWord(WParam) of
       BTN_APPLY_ID: // Нажатие на кнопку "Принять"
       begin
         Len := SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0);
         Inc(Len);
         SetLength(S, Len);
         SendMessage(Edit, WM_GETTEXT, Len, Integer(@S[1]));
         MessageBox(Handle, PChar(TXT_NEWUSER + S), PChar(TXT_CAPTION), MB_OK);
         PostQuitMessage(0);
         Result := 0;
       end;
       BTN_CANCEL_ID: // Нажатие на кнопку "Отмена"
       begin
         PostQuitMessage(0);
         Result := 0;
       end;
       EDIT_ID: // Обработчик Edit-а
         // В зависимости от кол-ва символов, включаем/отключаем кнопку "Принять"
         EnableWindow(btnOk, Boolean(SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0)));
     end;
   end;
   WM_CTLCOLORSTATIC: // Изменения цвета STATIC
   begin
     if LParam = Label1 then
     begin
       Result := DefWindowProc(Wnd, Msg, WParam, LParam);
       SetTextColor(WParam, $FF0000);
     end;                                  
   end;
 else
   Result := DefWindowProc(Wnd, Msg, WParam, LParam);
 end;
end;

// Здесь программа стартует
// =============================================================================
begin
 // Инициализируем оконный класс
 with MainWindow do
 begin
   cbSize := SizeOf(MainWindow);
   style := CS_HREDRAW or CS_VREDRAW;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hIcon := LoadIcon(0, IDI_APPLICATION);
   hCursor  := LoadCursor(0, IDC_ARROW);
   hbrBackground := COLOR_BTNFACE + 1;
   lpszMenuName := nil;
   lpszClassName := "TAccessForm";
 end;
 MainWindow.hInstance := HInstance;

 // Регистрируем оконный класс
 if RegisterClassEx(MainWindow) = 0 then Exit;

 // Подготавливаем координаты для центрирования формы
 Width := 360;
 Height := 130;
 CenterMainForm;

 // Создаем форму
 Handle := CreateWindow("TAccessForm",
   PChar(TXT_CAPTION), WS_OVERLAPPED or WS_SYSMENU,
   Left, Top, Width, Height, 0, 0, HInstance, nil);

 // Создаем кнопку "Принять"
 btnOk := CreateWindow("BUTTON", PChar(TXT_INSTALL),
   BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
   270, 65, 75, 25, Handle, BTN_APPLY_ID, hInstance, nil);

 // Отключаем ее до ввода пароля
 EnableWindow(btnOk, False);

 // Создаем кнопку "Отмена"
 btnCancel := CreateWindow("BUTTON", PChar(TXT_CANCEL),
   BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE,
   190, 65, 75, 25, Handle, BTN_CANCEL_ID, hInstance, nil);

 // Создаем поле ввода
 Edit := CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", nil, WS_CHILD or WS_VISIBLE,
   10, 30, 335, 21, Handle, EDIT_ID, HInstance, nil);

 // Задаем симфол который будет отображаться ри вводе пароля
 SendMessage(Edit, EM_SETPASSWORDCHAR, Ord("*"), 0);

 // Создаем Label
 Label1 := CreateWindow("STATIC", PChar(TXT_STATUS),
   WS_VISIBLE or WS_CHILD, 10, 13, 230, 14, Handle, 0, hInstance, nil);

 // Создаем нужный шрифт
 hFontNormal := CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
                     OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                     DEFAULT_PITCH or FF_DONTCARE, "MS Sans Serif");

 // назначаем этот шрифт всем оконным элементам
 if hFontNormal <> 0 then
 begin
   SendMessage(btnOk, WM_SETFONT, hFontNormal, 0);
   SendMessage(btnCancel, WM_SETFONT, hFontNormal, 0);
   SendMessage(Edit, WM_SETFONT, hFontNormal, 0);
   SendMessage(Label1, WM_SETFONT, hFontNormal, 0);
 end;

 // Показываем окно
 ShowWindow(Handle, SW_SHOW);
 // Ставим его поверх всех
 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
   SWP_NOSIZE or SWP_NOMOVE);
 // Ставим фокус в поле ввода
 SetFocus(Edit);

 // Начинаем крутить цикл выборки сообщений
 while GetMessage(Msg, 0, 0, 0) do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;
 
end.


 
Dmitry_177   (2006-11-21 15:52) [4]

Спасибо за пример ))) Цвет поменять получилось, а вот Transporent всеже не знаю как сделать, у меня на форме рисуется рисунок, а надись должна быть поверх его...


 
Rouse_ ©   (2006-11-21 17:55) [5]

Сделай так:

на инициализации:
TransparentBrush := GetStockObject(NULL_BRUSH);

в обработчике:

   WM_CTLCOLORSTATIC:
   begin
     SetBkMode(WParam, TRANSPARENT);
     Result := TransparentBrush;
     Exit;
   end;

при разрушении

DeleteObject(TransparentBrush);


 
Dmitry_177   (2006-11-21 19:13) [6]

а переменная TransparentBrush типа HGDIOBJ? или другого какогонибудь типа?


 
Dmitry_177   (2006-11-21 19:45) [7]

а так почему-то не работает перерисовка текста, т.к. он изменяется... Попробовал и так какнибудь:

     WM_CTLCOLORSTATIC: begin
                          Result := DefWindowProc(Window, Message, wParam, lParam);
                          GetWindowRect(WParam, WorkArea);
                          FillRect(WParam, WorkArea, 0);
                          SetTextColor(WParam, $FFFFFF);
                          SetBkMode(WParam, TRANSPARENT);
                        end;


Тоже не работает TRANSPORENT... а текст пишется белым цветом, т.е. это работает...


 
Rouse_ ©   (2006-11-21 21:54) [8]

Мдя... мыши плакали кололись, MSDN то хоть читал?

RC файл: BACKGROUND BITMAP "test.bmp"

program AdvApiForm;

{$R "bitmap.res" "bitmap.rc"}

uses
 Windows,
 Messages;

resourcestring
 TXT_CAPTION = "Ввод пароля";
 TXT_INSTALL = "Принять";
 TXT_CANCEL = "Отмена";
 TXT_STATUS = "Введите пароль:";
 TXT_NEWUSER = "Значение пароля: ";

var
 MainWindow    : TWndClassEx;
 Handle,
 hFontNormal,
 btnOk,
 btnCancel,
 Edit,
 Label1        : HWND;
 Msg           : TMsg;
 Left,
 Top,
 Width,
 Height        : Integer;
 TransparentBrush: HGDIOBJ;

const
 BTN_APPLY_ID = 100;
 BTN_CANCEL_ID = 105;
 EDIT_ID = 110;

// Центрирование формы
// =============================================================================
procedure CenterMainForm;
var
 ScrWidth, ScrHeight: Cardinal;
begin
 ScrWidth := GetSystemMetrics(SM_CXSCREEN);
 ScrHeight := GetSystemMetrics(SM_CYSCREEN);
 Left := (Integer(ScrWidth) - Width) div 2;
 Top := (Integer(ScrHeight) - Height) div 2;
end;

// Определение размеров картинки
// =============================================================================
function PictureSize: TSize;
var
 ResHandle: HWND;
 ResData: HWND;
 BMI: PBitmapInfo;
begin
 Result.cx := 0;
 Result.cy := 0;
 ResHandle := FindResource(HInstance,
   "BACKGROUND", RT_BITMAP);
 if ResHandle <> 0 then
 begin
   ResData := LoadResource(HInstance, ResHandle);
   if ResData <> 0 then
   try
     BMI := LockResource(ResData);
     if Assigned(BMI) then
     try
       Result.cx := BMI.bmiHeader.biWidth;
       Result.cy := BMI.bmiHeader.biHeight;
     finally
       UnlockResource(ResData);
     end;
   finally
     FreeResource(ResData);
   end;
 end;
end;

// Отрисовка картинки на форме
// =============================================================================
procedure ShowPicture;

 function Rect(Left, Top, Right, Bottom: Integer): TRect;
 begin
   Result.Left := Left;
   Result.Top := Top;
   Result.Right := Right;
   Result.Bottom := Bottom;
 end;

var
 Bitmap: HBITMAP;
 BitmapSize: TSize;
 DC, BitmapDC, OldDC: HDC;
 bLeft, bTop: Cardinal;
 _Rect: TRect;
 S: String;
 Pen: HPEN;
begin
 Bitmap := LoadBitmap(HInstance, "BACKGROUND");
 if Bitmap <> 0 then
 try
   BitmapSize := PictureSize;
   DC := GetDC(Handle);
   try
     BitmapDC := CreateCompatibleDC(DC);
     try
       OldDC := SelectObject(BitmapDC, Bitmap);
       try
         bLeft := (Width - BitmapSize.cx);
         BitBlt(DC, bLeft, 0, BitmapSize.cx, BitmapSize.cy, BitmapDC, 0, 0, SRCCOPY);
       finally
       SelectObject(OldDC, Bitmap);
       end;
     finally
       DeleteDC(BitmapDC);
     end;
   finally
     ReleaseDC(Handle, DC);
   end;
 finally
   DeleteObject(Bitmap);
 end;
end;

// Главная оконная процедура
// =============================================================================
function WindowProc(Wnd: HWND; Msg: Integer;
 WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
 S: String;
 Len: Integer;
 DC: HDC;
begin
 Result := 0;
 case Msg of
   WM_DESTROY:
   begin
     PostQuitMessage(0);
     Result:=0;
   end;
   WM_COMMAND:
   begin
     case LoWord(WParam) of
       BTN_APPLY_ID: // Нажатие на кнопку "Принять"
       begin
         Len := SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0);
         Inc(Len);
         SetLength(S, Len);
         SendMessage(Edit, WM_GETTEXT, Len, Integer(@S[1]));
         MessageBox(Handle, PChar(TXT_NEWUSER + S), PChar(TXT_CAPTION), MB_OK);
         PostQuitMessage(0);
         Result := 0;
       end;
       BTN_CANCEL_ID: // Нажатие на кнопку "Отмена"
       begin
         PostQuitMessage(0);
         Result := 0;
       end;
       EDIT_ID: // Обработчик Edit-а
         // В зависимости от кол-ва символов, включаем/отключаем кнопку "Принять"
         EnableWindow(btnOk, Boolean(SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0)));
     end;
   end;
   WM_CTLCOLORSTATIC: // Изменения цвета STATIC
   begin
     if LParam = Label1 then
     begin
       // Выставляем цвет
       SetTextColor(WParam, $FF0000);
       // Делаем фон прозрачным
       SetBkMode(WParam, TRANSPARENT);
       // Возвращаем результатом хэндл кисти
       Result := TransparentBrush;
     end;
   end;
   WM_PAINT:
   begin
     ShowPicture;
     Result := DefWindowProc(Wnd, Msg, WParam, LParam);
   end;
 else
   Result := DefWindowProc(Wnd, Msg, WParam, LParam);
 end;
end;

// Здесь программа стартует
// =============================================================================
begin
 // Инициализируем оконный класс
 with MainWindow do
 begin
   cbSize := SizeOf(MainWindow);
   style := CS_HREDRAW or CS_VREDRAW;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hIcon := LoadIcon(0, IDI_APPLICATION);
   hCursor  := LoadCursor(0, IDC_ARROW);
   hbrBackground := COLOR_BTNFACE + 1;
   lpszMenuName := nil;
   lpszClassName := "TAccessForm";
 end;
 MainWindow.hInstance := HInstance;

 // Регистрируем оконный класс
 if RegisterClassEx(MainWindow) = 0 then Exit;

 // Подготавливаем координаты для центрирования формы
 Width := 360;
 Height := 130;
 CenterMainForm;

 // Создаем форму
 Handle := CreateWindow("TAccessForm",
   PChar(TXT_CAPTION), WS_OVERLAPPED or WS_SYSMENU,
   Left, Top, Width, Height, 0, 0, HInstance, nil);

 // Создаем кнопку "Принять"
 btnOk := CreateWindow("BUTTON", PChar(TXT_INSTALL),
   BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
   270, 65, 75, 25, Handle, BTN_APPLY_ID, hInstance, nil);

 // Отключаем ее до ввода пароля
 EnableWindow(btnOk, False);

 // Создаем кнопку "Отмена"
 btnCancel := CreateWindow("BUTTON", PChar(TXT_CANCEL),
   BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE,
   190, 65, 75, 25, Handle, BTN_CANCEL_ID, hInstance, nil);

 // Создаем поле ввода
 Edit := CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", nil, WS_CHILD or WS_VISIBLE,
   10, 30, 335, 21, Handle, EDIT_ID, HInstance, nil);


 
Rouse_ ©   (2006-11-21 21:54) [9]



 // Задаем симфол который будет отображаться ри вводе пароля
 SendMessage(Edit, EM_SETPASSWORDCHAR, Ord("*"), 0);

 // Создаем Label
 Label1 := CreateWindow("STATIC", PChar(TXT_STATUS),
   WS_VISIBLE or WS_CHILD, 10, 13, 230, 14, Handle, 0, hInstance, nil);

 // Создаем нужный шрифт
 hFontNormal := CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
                    OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
                    DEFAULT_PITCH or FF_DONTCARE, "MS Sans Serif");

 // назначаем этот шрифт всем оконным элементам
 if hFontNormal <> 0 then
 begin
   SendMessage(btnOk, WM_SETFONT, hFontNormal, 0);
   SendMessage(btnCancel, WM_SETFONT, hFontNormal, 0);
   SendMessage(Edit, WM_SETFONT, hFontNormal, 0);
   SendMessage(Label1, WM_SETFONT, hFontNormal, 0);
 end;

 // Создаем пустую кисть
 TransparentBrush := GetStockObject(NULL_BRUSH);

 // Показываем окно
 ShowWindow(Handle, SW_SHOW);
 // Ставим его поверх всех
 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
   SWP_NOSIZE or SWP_NOMOVE);
 // Ставим фокус в поле ввода
 SetFocus(Edit);

 // Начинаем крутить цикл выборки сообщений
 while GetMessage(Msg, 0, 0, 0) do
 begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
 end;

end.


 
Dmitry_177   (2006-11-22 00:23) [10]

Тоже самое, не работает...((( Посмотрел весь код и не работает ((( У меня текст меняется в сообщении WM_TIMER:

var
 str: array [0..25] of Char;
...

WM_TIMER: SendMessage(hLabel, WM_SETTEXT, 0, Integer(PChar(@str)));


Так вот текст то прозрачный, но потом он пишется поверх уже написанного, т.е. не стирается старый и получается неразбериха, т.к. текст на тексте, старый и новый...


 
Rouse_ ©   (2006-11-22 16:04) [11]

репайнт делай WM_PAINT


 
Dmitry_177   (2006-11-22 17:17) [12]

Я так и думал что WM_PAINT... а без него никак? А еще такой вопрос, попробовал я посылать сообщение WM_PAINT, с нулевыми параметрами static-окну после изменения текста, но это ничего не дало... Пробовал слать WM_PAINT и главному окну, тоже самое, также пробовал UpdateWindow, тоже толку не дало... Но у меня вопрос в том, какой WM_PAINT отлавливать? Тот который рисует на форме картинку (Rouse_ ©   (21.11.06 21:54) [8]), т.е. главной формы или WM_PAINT static-окна? Если второе подскажите пожалуйста как это сделать, там же нету callback-функции как в главной форме...


 
Rouse_ ©   (2006-11-22 17:29) [13]

естественно отлавливать в главной оконной процедуре...


 
Dmitry_177   (2006-11-22 17:44) [14]

т.е. в обработке WM_PAINT главной формы, кроме рисования картинки рисовать еще текст? и Static-окно получается уже ненужно?


 
Rouse_ ©   (2006-11-22 17:51) [15]

Не нуно текст рисовать, просто SetText а потом WM_PAINT и будет тебе счастье


 
Dmitry_177   (2006-11-22 18:26) [16]

Что-то я не очень понял,

> Rouse_ ©   (22.11.06 17:51) [15]
> Не нуно текст рисовать, просто SetText


В смысле SetWindowText в WM_TIMER или в WM_PAINT?


> Rouse_ ©   (22.11.06 17:51) [15]
> а потом WM_PAINT и будет тебе счастье


WM_PAINT посылать надо или что? SendMessage(hLabelTime, WM_PAINT, 0, 0);?

делаю так:

var
 DateTime: array [0..7] of Char;

function WindowProc(Window: HWnd; Message: Word; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
 Result := 0;
   case Message of
     WM_TIMER: begin
                 GetTimeFormat(0, 0, nil, "HH:mm:ss", DateTime, 8);
                 SendMessage(hLabelTime, WM_SETTEXT, 0, Integer(PChar(@DateTime)));    // или SetWindowText(hLabelTime, PChar(@DateTime));
                 SendMessage(hLabelTime, WM_PAINT, 0, 0);
               end;

     WM_PAINT: begin
                 //GetTimeFormat(0, 0, nil, "HH:mm:ss", DateTime, 8);
                // SetWindowText(hLabelTime, PChar(@DateTime));   // попробовал и тут эти строки, безрезультатно

                 dc := BeginPaint(window, ps);
                 hMemDC := CreateCompatibleDC(dc);
                 SelectObject(hMemDC, hBMP);
                 GetClientRect(window, rect);
                 BitBlt(dc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
                 DeleteDC(hMemDC);
                 EndPaint(window, ps);
               end;
...


Rouse_, объясни пожалуйста получше что нужно сделать, а то не очень понятно...


 
Rouse_ ©   (2006-11-23 09:43) [17]

SendMessage(Хэндл окна а не лейбла, WM_PAINT, 0, 0);


 
Dmitry_177   (2006-11-23 13:48) [18]

Так у меня почему-то не работает...

 Result := 0;
   case Message of
     WM_PAINT: begin
                 dc := BeginPaint(hWindow, ps);
                 hMemDC := CreateCompatibleDC(dc);
                 SelectObject(hMemDC, hBMP);
                 GetClientRect(hWindow, rect);
                 BitBlt(dc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
                 DeleteDC(hMemDC);
                 EndPaint(hWindow, ps);
               end;

     WM_TIMER: begin
                 GetTimeFormat(0, 0, nil, "HH:mm:ss", DateTime, 8);
                 SendMessage(hLabelTime, WM_SETTEXT, 0, Integer(PChar(@DateTime)));
                 SendMessage(hWindow, WM_PAINT, 0, 0);
               end;


 
Rouse_ ©   (2006-11-23 15:07) [19]

Давайка целиком проект выложи куда нибудь. Что гадать попусту?


 
Dmitry_177   (2006-11-23 15:22) [20]

выложил..


 
Dmitry_177   (2006-11-23 15:25) [21]

он в этой теме тут: http://forum.sources.ru/index.php?showtopic=162329&st=0&#entry1353043


 
Rouse_ ©   (2006-11-23 17:10) [22]

там же и ответил



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.125 c
11-1155395535
parovoZZ
2006-08-12 19:12
2007.04.15
KOL и 64 бит Windows


15-1173955381
Real
2007-03-15 13:43
2007.04.15
Движок + CMS - удобная, простая и надежная


3-1167053354
superlamer
2006-12-25 16:29
2007.04.15
компоненты для работы с базой данных *.cdb


9-1147104863
except 2.0
2006-05-08 20:14
2007.04.15
VCL окно во весь экран.


6-1161634019
Image
2006-10-24 00:06
2007.04.15
Как идентифицировать в локальной сети устройство?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский