Главная страница
    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.158 c
2-1174499483
так себе
2007-03-21 20:51
2007.04.15
Длина поля в SELECT


2-1174907524
IceBeerg
2007-03-26 15:12
2007.04.15
Особенности DLL для winlogon


15-1174479101
ilopX
2007-03-21 15:11
2007.04.15
Изменение звука в Windows Vista


15-1174373137
Чапаев
2007-03-20 09:45
2007.04.15
А ты уже обновил клаву?


2-1174504496
White Barsik
2007-03-21 22:14
2007.04.15
TFileStream - чтение в динамический массив





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский