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

Вниз

Работа OGL под ХР   Найти похожие ветки 

 
ПЛОВ   (2004-06-29 11:09) [0]

Доброе время суток! Пижу программу на OGL. Под 98 все работает как надо, но вот под ХР возникают проблеммы - код не работает:

var
 HRC: windows.HGLRC;

//FormCreate
HRC:=windows.wglCreateContext(Form1.Canvas.Handle);

//рисование на wm_paint
windows.wglMakeCurrent(Form1.Canvas.Handle, HRC);
glClearColor(0.5, 0.8, 0, 1);
glViewPort(0, 0, 400, 300);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT);
... // тут есть другие действия, но даже если их исключить - тот же еффект
windows.wglMakeCurrent(0, 0);

// дэстрой
windows.wglDeleteContext(HRC);


 
ПЛОВ   (2004-06-29 11:12) [1]

Собственно, вопрос - что может быть неправильно и какие особенности работы с OGL в NT системмах?


 
ПсихЪ_клон   (2004-06-29 11:13) [2]

1. Забей на канву
2. Забей на TForm
3. Пиши на голом АПИ (форму создавай)
4. Примеров ОЧЕНЬ много
5. Всё очень просто, если немножко с начала разобраться...


 
ПЛОВ   (2004-06-29 11:46) [3]


> ПсихЪ_клон

Забил и писал на апи - то же самое.

> Всё очень просто, если немножко с начала разобраться

у меня были хорошие примеры, но не помогли((((( могу привести код и апи-программы если надо... она в 98 тоже кстати работала на ура


 
Darthman ©   (2004-06-29 11:56) [4]

рисуй не в wmpaint, а в обработчике сообщений.


 
ПсихЪ_клон   (2004-06-29 11:59) [5]

"Проблемы", "код не работает" - это как-то туманно и расплывчато...

И нафиг тебе нужен HGLRC? Я юзаю обычный HDC (DC : HDC).

И вообще, давай-ка лучше код, посмотрим, чё-нить исправим...


 
ПЛОВ   (2004-06-29 12:36) [6]


> рисуй не в wmpaint, а в обработчике сообщений

Это не принципиально... Факт в том что нужно нарисовать картинку по какому-то сообщению (wm_paint OR wm_keydown OR ..что нить другое)


 
ПЛОВ   (2004-06-29 12:39) [7]


> И вообще, давай-ка лучше код, посмотрим, чё-нить исправим

Код:



{$APPTYPE GUI}
{$N+,S-}
{$Q-,R-,T-,I-,X+}

program ogle;

uses Windows, Messages, Gl, Glsed;

const
 WCLASSNAME    = "OGLE1";
 WNAME         = "Demo";

var
 // main window
 Window: HWnd;
 WClass: TWndClassEx;
 Msg: TMsg;
 XWINPOS, YWINPOS: DWORD;

 // main timer
 PTIMER: Cardinal;

 // gl & graphic
 DC: HDC;
 HRC: windows.HGLRC;

 Img: array[0..31, 0..31, 0..2] of GLUbyte;
 x, y: DWORD;

function WindowProc(Wnd: HWnd; Msg, WParam: Word; LParam: LongInt): LongInt; stdcall;
var
 GLERROR: Cardinal;

 I: WORD;

begin
case Msg of
 WM_CREATE:
 begin
 PTIMER:=SetTimer(Wnd, 0, 100, nil);

 DC:=GetDC(Wnd);
 SetDCPixelFormat(DC);
 HRC:=windows.wglCreateContext(DC);

 windows.wglMakeCurrent(DC, HRC);
 glClearColor(0, 0, 0, 1);
 glViewPort(0, 0, 400, 300);
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

 glClear(GL_COLOR_BUFFER_BIT);
 
 end;

 WM_TIMER:
 begin

 .....................................

 // errors
 GLERROR:=glGetError;
 if GLERROR>0 then
   begin
   KillTimer(Wnd, PTIMER);
   GetGLSEDMessage(GetDesktopWindow, GLERROR, 0);
   PostQuitMessage(0);
   Exit;
   end;

 end;

 WM_LBUTTONDOWN:
 begin
 ReleaseCapture;
 WindowProc(Wnd, WM_SYSCOMMAND, $F012, 0);
 end;

 WM_RBUTTONDOWN:
 begin

 end;

 WM_DESTROY:
 begin
 windows.wglMakeCurrent(0, 0);

 ReleaseDC(Wnd, DC);
 DeleteDC(DC);
 KillTimer(Wnd, PTIMER);
 windows.wglDeleteContext(HRC);
 PostQuitMessage(0);
 Exit;
 end;
end;
WindowProc:=DefWindowProc(Wnd, Msg, WParam, LParam);
end;

begin
Window:=FindWindow(WCLASSNAME, WNAME);
if Window<>0 then
 begin
 GetGLSEDMessage(GetDesktopWindow, GL_NO_ERROR, 1);
 Exit;
 end;

WClass.cbSize:=SizeOf(WClass);
WClass.Style:=CS_HREDRAW or CS_VREDRAW;
WClass.lpfnWndProc:=@WindowProc;
WClass.cbClsExtra:=0;
WClass.cbWndExtra:=0;
WClass.hInstance:=hInstance;
WClass.hCursor:=LoadCursor(0, IDC_ARROW);
WClass.lpszClassName:=WCLASSNAME;

if RegisterClassEx(WClass)=0 then Halt(255);

XWINPOS:=GetSystemMetrics(SM_CXFULLSCREEN) div 2 - 200;
YWINPOS:=GetSystemMetrics(SM_CYFULLSCREEN) div 2 - 150;

Window:=CreateWindowEx(0, WCLASSNAME, WNAME, WS_POPUP and (not WS_DLGFRAME), XWINPOS, YWINPOS, 400, 300, 0, 0, hInstance, nil);
ShowWindow(Window, SW_SHOWNORMAL);

while GetMessage(Msg, 0, 0, 0) do
begin
 TranslateMessage(Msg);
 DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.

Кое-чего нет но это не важно...


 
ПсихЪ_клон   (2004-06-29 13:11) [8]

Чё такое GLsed? Где его брать?

В общем вот тебе исходник моего класса для работы с OpenGL, можешь его использовать или выдрать интересующие тебя функции. Всё работет под Win2k, WinXP. Под остальным не тестил, но наверняка работает тоже...


 
ПсихЪ_клон   (2004-06-29 13:12) [9]


unit p7_gfx;

interface
uses
 Messages, Windows, Classes, Types,
 OpenGL,
 p7_types;

type
 PTFNWndProc = ^TFNWndProc;
 
 P7Input = record
   X, Y : int;
   dwX, dwY : DWORD;
   sX, sY, sZ : GLInt;
   But : array[0..2] of bool;
   Keys : array[0..255] of bool;
 end;

 P7PGfx = ^P7Gfx;
 PP7Gfx = ^P7Gfx;
 P7Gfx = class
   Msg : TMSG;
   Wnd : hWnd;
   DC : HDC;
   HRC: HGLRC;
   bActive : bool;
   bFinished : bool;
   ScreenWidth,
   ScreenHeight,
   CaptionBarHeight,
   ScreenBPP : int;
   CoordNow : byte;
   CoordLast : byte;
 private
   szWinName : PChar;
   bFullScreen : bool;
   baseFont : GLuint;
   FPSTickCount : GLFloat;
   FPSCount : GLFloat;
 public
   Input : P7Input;
   WinProc : function(Window: hWnd; Message, wParam: Word; lParam: LongInt): LongInt; stdcall;

 // functions
 private
   // Window
   procedure SetFullscreen( Width, Height, BPP : integer );
   function CreateWin( Width, Height, BPP : int; bFullScreen : bool ) : hWnd;
   procedure DestroyWin( Wnd : hWnd; bFullScreen : bool );
   // OpenGL
   procedure SetPixFormat( HDC: HDC );
   procedure InitGL();
   function Messages() : bool;
 public
   constructor Create();
   procedure Init( WinName : string; Width, Height, BPP : int; FullScreen : bool = false );
   procedure SetPerspective( Width, Height : int );
   procedure ResizeWin( Width, Height : int );
   procedure SetCoord( Flag : byte );
   procedure BuildFont();
   procedure glWrite( X, Y : uint; text : PChar );
   procedure KillFont();
   function gfxBegin() : bool;
   procedure gfxEnd();
   procedure gfxBegin2D();
   procedure gfxEnd2D();
   procedure DrawCoordLine();
   procedure DrawCoordBox();
   destructor Destroy(); virtual;
 end;

implementation

{   PRIVATE FUNCTIONS   }

// Включение полноэкранного режима
procedure P7Gfx.SetFullscreen( Width, Height, BPP : integer );
var DeviceMode: TDevMode;
begin
 with DeviceMode do
 begin
   dmSize := SizeOf(DeviceMode);
   dmPelsWidth := Width;
   dmPelsHeight := Height;
   dmBitsPerPel := BPP;
   dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
 end;
 ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN);
end;

// Создание окна
function P7Gfx.CreateWin( Width, Height, BPP : int; bFullScreen : bool ) : hWnd;
var
 WindowClass: TWndClass;
 hInstance: HINST;
 Style: Cardinal;
begin
 hInstance := GetModuleHandle(nil);

 ZeroMemory(@WindowClass, SizeOf(WindowClass));
 with WindowClass do
 begin
   Style := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
   lpfnWndProc := @WinProc; //@DefWindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := hInstance;
   hIcon := LoadIcon(0, IDI_APPLICATION);
   hCursor := LoadCursor(0, IDC_ARROW);
   hbrBackground := HBRUSH( GetStockObject( WHITE_BRUSH ) );
   lpszMenuName := "";
   lpszClassName := "P7GfxWinClass";
 end;
 Windows.RegisterClass(WindowClass);

 if bFullScreen then
 begin
   Style := WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
   SetFullscreen( Width, Height, BPP );
   CaptionBarHeight := 0;
   // ShowCursor( false );
 end
 else
 begin
   Style := WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
   CaptionBarHeight := 26;
 end;

 Result := CreateWindowEx(WS_EX_APPWINDOW or WS_EX_WINDOWEDGE, "P7GfxWinClass", szWinName, Style, 0, 0, Width, Height + CaptionBarHeight, 0, 0, hInstance, nil);
 ShowWindow( Result, SW_SHOW );
 UpdateWindow( Result );
end;

// Удаление окна
procedure P7Gfx.DestroyWin( Wnd : hWnd; bFullScreen : bool );
begin
if bFullscreen then
 begin
  ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);
  // ShowCursor( true );
 end;
DestroyWindow( Wnd );
Windows.UnregisterClass( "P7GfxWinClass", hInstance );
end;

// Установка формата пикселя
procedure P7Gfx.SetPixFormat( HDC: HDC );
var
 pfd: TPixelFormatDescriptor;
 nPixelFormat: Integer;
begin
 with pfd do
 begin
   nSize := SizeOf(TPixelFormatDescriptor); // размер структуры
   nVersion := 1;                            // номер версии
   dwFlags := PFD_DOUBLEBUFFER or PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; // множество битовых флагов, определяющих устройство и интерфейс
   iPixelType := PFD_TYPE_RGBA; // режим для изображения цветов
   cColorBits := 32;            // число битовых плоскостей в каждом буфере цвета
   cRedBits := 0;               // число битовых плоскостей красного в каждом буфере RGBA
   cRedShift := 0;              // смещение от начала числа битовых плоскостей красного в каждом буфере RGBA
   cGreenBits := 0;             // число битовых плоскостей зелёного в каждом буфере RGBA
   cGreenShift := 0;            // смещение от начала числа битовых плоскостей зелёного в каждом буфере RGBA
   cBlueBits := 0;              // число битовых плоскостей синего в каждом буфере RGBA
   cBlueShift := 0;             // смещение от начала числа битовых плоскостей синего в каждом буфере RGBA
   cAlphaBits := 0;             // число битовых плоскостей альфа в каждом буфере RGBA
   cAlphaShift := 0;            // смещение от начала числа битовых плоскостей альфа в каждом буфере RGBA
   cAccumBits := 0;             // общее число битовых плоскостей в буфере аккумулятора
   cAccumRedBits := 0;          // число битовых плоскостей красного в буфере аккумулятора
   cAccumGreenBits := 0;        // число битовых плоскостей зелёного в буфере аккумулятора
   cAccumBlueBits := 0;         // число битовых плоскостей синего в буфере аккумулятора
   cAccumAlphaBits := 0;        // число битовых плоскостей альфа в буфере аккумулятора
   cDepthBits := 32;            // размер буфера глубины (ось z)
   cStencilBits := 0;           // размер буфера трафарета
   cAuxBuffers := 0;            // число вспомогательных буферов
   iLayerType := PFD_MAIN_PLANE;// тип плоскости
   bReserved := 0;              // число плоскостей переднего и заднего плана
   dwLayerMask := 0;            // игнорируется
   dwVisibleMask := 0;          // индекс или цвет прозрачности нижней плоскости
   dwDamageMask := 0;           // игнорируется
 end;

 nPixelFormat := ChoosePixelFormat( HDC, @pfd ); // запрос системе - поддерживается ли выбранный формат пикселей
 SetPixelFormat( HDC, nPixelFormat, @pfd );      // устанавливаем формат пикселей в контексте устройства
end;


 
ПсихЪ_клон   (2004-06-29 13:12) [10]



// Инициализации OpenGL
procedure P7Gfx.InitGL();
begin
 // GL
 DC := GetDC( Wnd );
 SetPixFormat( DC );
 HRC := wglCreateContext( DC );
 ReleaseDC( Wnd, DC );
 wglMakeCurrent( DC, HRC );

 // Z Buffer
 glClearDepth( 1.0 );
 glEnable( GL_DEPTH_TEST );
 glDepthFunc( GL_LESS );

 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   //Realy Nice perspective calculations

 // Back color
 glClearColor( 0.0, 0.0, 0.0, 0.0 );
end;

function P7Gfx.Messages() : bool;
begin
 Result := false;
 // Подготовка Окна
 if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
 begin
   if Msg.Message = WM_QUIT then bFinished := True
   else
   begin
     TranslateMessage( Msg );
     DispatchMessage( Msg );
   end;
   exit;
 end
 else if not bActive then exit;

 Result := true;
end;

{   PUBLIC FUNCTIONS   }

// Инициализация класса
constructor P7Gfx.Create();
begin
 bFinished := false;
end;

procedure P7Gfx.Init( WinName : string; Width, Height, BPP : int; FullScreen : bool = false );
begin
 szWinName := PChar( WinName );
 ScreenWidth := Width;
 ScreenHeight := Height;
 ScreenBPP := BPP;
 bFullScreen := FullScreen;
 Wnd := CreateWin( Width, Height, BPP, FullScreen );
 InitGL();
 ResizeWin( Width, Height );
end;

// Задаём перспективу
procedure P7Gfx.SetPerspective( Width, Height : int );
begin
 glViewport( 0, 0, Width, Height );
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 gluPerspective( 90.0, Width / Height, 1.0, 1.0 );
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
end;

// Изменение размеров окна
procedure P7Gfx.ResizeWin( Width, Height : int );
begin
 ScreenWidth := Width;
 ScreenHeight := Height;

 glViewport(0, 0, ScreenWidth, ScreenHeight);    // Set the viewport for the OpenGL window
 glMatrixMode(GL_PROJECTION);        // Change Matrix Mode to Projection
 glLoadIdentity();                   // Reset View
 //gluPerspective(45.0, ScreenWidth/ScreenHeight, 0.1, 100.0);  // Do the perspective calculations. Last value = max clipping depth
 glFrustum( -( Width/Height ), ( Width/Height ), -1, 1, 1.0, 100.0 );
 glTranslatef( 0.0, 0.0, -2.0 );
 glMatrixMode(GL_MODELVIEW);         // Return to the modelview matrix
 glLoadIdentity();
 CoordNow := P7_COORD3D;
end;

// Задание кординатной системы
procedure P7Gfx.SetCoord( Flag : byte );
begin
 if CoordNow = Flag then exit;

 Case Flag of
   P7_COORD2D : begin
     glPushMatrix();
     glMatrixMode(GL_PROJECTION);  // Change Matrix Mode to Projection
     glLoadIdentity();             // Reset View
     glOrtho(0, ScreenWidth, 0, ScreenHeight, 0, 100);
     glMatrixMode(GL_MODELVIEW);   // Change Projection to Matrix Mode
     glLoadIdentity;
     glTranslatef(0, 0, -1);
   end;
   P7_COORD3D : begin
     ResizeWin( ScreenWidth, ScreenHeight );
   end;
   P7_COORD_RESTORE : begin
     SetCoord( CoordLast );
   end;
 end;
 if Flag <> P7_COORD_RESTORE then
 begin
   CoordLast := CoordNow;
   CoordNow := Flag;
 end;
end;

// Создаём базовый текст
procedure P7Gfx.BuildFont();
var font : HFONT;
begin
 baseFont := glGenLists( 255 );
 font := CreateFont( -18, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE or DEFAULT_PITCH, "Arial" );
 SelectObject( DC, font );
 wglUseFontBitmaps( DC, 0, 255, baseFont );
end;

// Рисуем текст
procedure P7Gfx.glWrite( X, Y : GLUint; text : PChar );
begin
 glColor3f(1.0, 1.0, 1.0);
 glRasterPos2i(X, Y);
 glPushAttrib(GL_LIST_BIT);
 glListBase( baseFont );
 glCallLists(length(text), GL_UNSIGNED_BYTE, PChar(text));
 glPopAttrib();
end;

// Удаляем базовый текст
procedure P7Gfx.KillFont();
begin
 glDeleteLists( baseFont, 255 );
end;

// Начало рендеринга
function P7Gfx.gfxBegin() : bool;
begin
 Result := false;
 if not Messages() then exit;

 // Подготовка OpenGL
 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 glLoadIdentity();                                       // Reset The View

 Result := true;
end;

// Завершение рендеринга
procedure P7Gfx.gfxEnd();
begin
 //glPopMatrix();
 SwapBuffers(DC);
end;

// Начало двумерного рендеринга
procedure P7Gfx.gfxBegin2D();
begin
 SetCoord( P7_COORD2D );
 glDisable( GL_DEPTH_TEST );
 glTranslatef( 0, 0, -1.0 );
end;

// Конец двумерного рендеринга
procedure P7Gfx.gfxEnd2D();
begin
 glEnable( GL_DEPTH_TEST );
 SetCoord( P7_COORD_RESTORE );
end;

//
procedure P7Gfx.DrawCoordLine();
begin
 glBegin( GL_LINES );
   // Ось X
   glColor3d( 1.0, 0.0, 0.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 1.0, 0.0, 0.0 );
   // Ось Y
   glColor3d( 0.0, 1.0, 0.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 0.0, 1.0, 0.0 );
   // Ось Z
   glColor3d( 0.0, 0.0, 1.0 );
   glVertex3d( 0.0, 0.0, 0.0 );
   glVertex3d( 0.0, 0.0, 1.0 );

   glColor3d( 1.0, 1.0, 1.0 );
 glEnd();
end;

procedure P7Gfx.DrawCoordBox();
begin
 glColor3d( 0.0, 1.0, 0.0 );
 glBegin( GL_LINES );
   glVertex3f(-1.0, -1.0,  1.0);
   glVertex3f( 1.0, -1.0,  1.0);

   glVertex3f( 1.0, -1.0,  1.0);
   glVertex3f( 1.0,  1.0,  1.0);

   glVertex3f( 1.0,  1.0,  1.0);
   glVertex3f(-1.0,  1.0,  1.0);

   glVertex3f(-1.0,  1.0,  1.0);
   glVertex3f(-1.0, -1.0,  1.0);

   //
   glVertex3f(-1.0, -1.0, -1.0);
   glVertex3f(-1.0,  1.0, -1.0);

   glVertex3f(-1.0,  1.0, -1.0);
   glVertex3f( 1.0,  1.0, -1.0);

   glVertex3f( 1.0,  1.0, -1.0);
   glVertex3f( 1.0, -1.0, -1.0);

   glVertex3f( 1.0, -1.0, -1.0);
   glVertex3f(-1.0, -1.0, -1.0);
 glEnd();
 glColor3d( 1.0, 1.0, 1.0 );
end;
// Уничтожение класса
destructor P7Gfx.Destroy();
begin
 //DestroyTheWindow;
 DestroyWin( Wnd, bFullScreen );
end;
end.


 
ПЛОВ   (2004-06-29 13:40) [11]

Спасибо, буду разбираться. Glsed к Gl отношения не имеет там только функции "отекстивания" кодов ошибок и все


 
Darthman ©   (2004-06-29 15:58) [12]

ПЛОВ:
Не нашел в твоем коде заполнение дескриптора пиксела.


 
ПЛОВ   (2004-07-01 12:18) [13]


заполнение дескриптора пиксела

Значит его там нет :) можно чуть подробнее...


 
WondeRu ©   (2004-07-02 09:05) [14]

>Не нашел в твоем коде заполнение дескриптора пиксела.
вот он SetDCPixelFormat(DC);


 
Sphinx   (2004-07-02 11:52) [15]

Есть один простой ответ, но может конечно не та ситуация.
В ХР (про SP1 не скажу) изначально нет библиотеки OGL, то есть под свежеустановленной ОС приложения OGL не работают. К примеру nVidia поставляет эту библиотеку вместе с драйверами. Это проверено, то есть нужно сперва установить файлы opengl32.dll и glum.dll и т.д.


 
ПЛОВ   (2004-07-02 17:20) [16]

Проверил - файлы есть...



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

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

Наверх





Память: 0.53 MB
Время: 0.034 c
3-1096522612
Softamas
2004-09-30 09:36
2004.10.31
Access -> ODBC -> BDE -> Delphi. Проблема с кодировкой


1-1097842230
MegaVolt
2004-10-15 16:10
2004.10.31
Как правильно наследовать свойства?


14-1097412598
Вова
2004-10-10 16:49
2004.10.31
Преобразование файлов AVI в MPG или в MPEG


9-1088492992
ПЛОВ
2004-06-29 11:09
2004.10.31
Работа OGL под ХР


3-1096964741
Григорьев Антон
2004-10-05 12:25
2004.10.31
ADOQuery не хочет работать со строковым параметром





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