———————————————————————————————–
  ZFrame Quick Help
  Sample Query
  Java script
  Language Tag
———————————————————————————————–
Query Parameter Type
@str   str => setString
@bya   bya => setBytes
@lng   lng => setLong
@int   int => setInt
@bln   bln => setBoolean
@dat   dat => dd/MM/yyyy => setDate
@tis   tis => dd/MM/yyyy:hh:mm:ss => setTimestamp
@tim   tim => hh:mm:ss => setTime
@dec   dec => setBigDecimal
@byt   byt => setByte
@sho   sho => setShort
@dbl   dbl => setDouble
@flt   flt => setfloat
@clo   clo => setAsciiStream
———————————————————————————————————
———————————————-Form Query————————————————-
———————————————————————————————————
———————————————————————————————————
— Grid Source Query
— in this query you can user where keyword and order
— for big data table you must user search form for access to record data
 SELECT
               DBO.ACCOUNT.ACCOUNT_ID
               , DBO.ACCOUNT.ACCOUNT_NAME
               , DBO.ACCOUNT.ACCOUNT_CODE
               , DBO.ACCOUNT.ACCOUNTTITLE_COMPLETE
               , DBO.ACCOUNT.DEBIT_TOTAL
               , DBO.ACCOUNT.CREDIT_TOTAL
               , DBO.ACCOUNT.ACCOUNT_GROUP_ID
            FROM    DBO.ACCOUNT
— Record Source Query
— in this query you can’t use where query
— zframe database access engine make where condition on your data set
— your query must cover all data object in your form
 SELECT * FROM  DBO.ACCOUNT
 ———————————————————————————————————
 ———————————————————————————————————
 ———————————————————————————————————
 ———————————————————————————————————
———————————————————————————————————-
———————————————-Control Query———————————————–
———————————————————————————————————-
———————————————————————————————————-
— DataSource
— Data Combo Control
—-DataSource :
SELECT   DBO.LT_CURRENCY.LT_CURRENCY_ID
, DBO.LT_CURRENCY.CURRENCY
FROM    DBO.LT_CURRENCY
———————————————————————————————————-
———————————————————————————————————-
— FindObjectBox
SELECT PARTIES_ENTITIES_ID,PARTIES_ENTITIES_NAME FROM PARTIES_ENTITIES WHERE PARTIES_ENTITIES_ID =
———————————————————————————————————-
———————————————————————————————————-
–DropDownTreeView
— Like As TableID , ParentID , ObjectName
—-DataSource :
SELECT  DBO.ACCOUNT_GROUP.ACCOUNT_GROUP_ID
, DBO.ACCOUNT_GROUP.PARENT_CODE
, DBO.ACCOUNT_GROUP.ACCOUNT_GROUP_NAME
FROM    DBO.ACCOUNT_GROUP
———————————————————————————————————-
———————————————————————————————————-
— CheckBoxList
—-DataSource :
SELECT SYS_USERGROUP_ID,USERGROUPNAME FROM  SYS_USERGROUP
———————————————————————————————————-
—-Delete Query :
DELETE  FROM  SYS_USERGROUPLIST WHERE  SYS_USER_ID =
———————————————————————————————————-
—-Fill Query   :
SELECT SYS_USERGROUP_ID FROM  SYS_USERGROUPLIST WHERE  SYS_USER_ID =
———————————————————————————————————-
—-Update Query :
INSERT INTO  SYS_USERGROUPLIST
(SYS_USER_ID , SYS_USERGROUP_ID)
VALUES
( @KEY , @ID )
———————————————————————————————————-
———————————————————————————————————-
———————————————————————————————————-
—- Binding Form DataSource In Parent Form  — you need to Define Access Form And DataBase Key
—-DataSource :
SELECT     DBO.ACCOUNTING_DOCU_DETAIL.ACCOUNTING_DOCU_DETAIL_ID
, DBO.ACCOUNTING_DOCU_DETAIL.ACCOUNTING_DOCU_ID
FROM    DBO.ACCOUNTING_DOCU_DETAIL
———————————————————————————————————-
———————————————————————————————————-
—– On Change Event Query
IF (LEN(@STRACCOUNT)>0)
BEGIN
SELECT   DBO.ACCOUNT.ACCOUNT_ID
, ACCOUNT_CODE + ‘ — ‘ + ACCOUNT_NAME
, DBO.ACCOUNT.ACCOUNT_DESCRIPTION
, DBO.ACCOUNT.CREAT_DATE
   FROM    DBO.ACCOUNT
   WHERE ACCOUNT_CODE LIKE N’%’ + @STRACCOUNT + ‘%’
   OR ACCOUNT_NAME LIKE N’%’ + @STRACCOUNT + ‘%’
END
ELSE IF (LEN(@INTACCOUNT_GROUP_ID)>0)
   BEGIN
SELECT   DBO.ACCOUNT.ACCOUNT_ID
   , ACCOUNT_CODE + ‘  ‘ + ACCOUNT_NAME
   , DBO.ACCOUNT.ACCOUNT_DESCRIPTION
   , DBO.ACCOUNT.CREAT_DATE
FROM    DBO.ACCOUNT
WHERE ACCOUNT_GROUP_ID = @INTACCOUNT_GROUP_ID
END
———————————————————————————————————-
———————————————————————————————————-
—- Child Form ( Query Model )
SELECT
DBO.COMPANY.COMPANY_ID,
DBO.COMPANY.DATE_OF_ESTABLISHMENT,
DBO.COMPANY.REGISTER_DATE,
DBO.COMPANY.REGISTERNUMBER
FROM
DBO.COMPANY
WHERE
PARTIES_ENTITIES_ID =
———————————————————————————————————
———————————————————————————————————
———————————————————————————————————
———————————————————————————————————
— Insert  Query
INSERT INTO ACCOUNT
(
ACCOUNT_GROUP_ID
, ACCOUNT_NAME
, ACCOUNT_CODE
, ACCOUNTTITLE_COMPLETE
, ACCOUNT_DESCRIPTION
, CREAT_DATE
, DEBIT_VERIFY
)
VALUES
(
@INTACCOUNT_GROUP_ID
, @STRACCOUNT_NAME
, @STRACCOUNT_CODE
, @STRACCOUNTTITLE_COMPLETE
, @STRACCOUNT_DESCRIPTION
, @STRCREAT_DATE
, @LNGDEBIT_VERIFY
)
———————————————————————————————————
———————————————————————————————————
— Update Query
UPDATE ACCOUNT
     SET
          ACCOUNT_GROUP_ID = @INTACCOUNT_GROUP_ID
        , ACCOUNT_NAME = @STRACCOUNT_NAME
        , ACCOUNT_CODE = @STRACCOUNT_CODE
        , ACCOUNTTITLE_COMPLETE = @STRACCOUNTTITLE_COMPLETE
        , ACCOUNT_DESCRIPTION = @STRACCOUNT_DESCRIPTION
        , CREAT_DATE = @STRCREAT_DATE
       WHERE
           ACCOUNT_ID = @INTACCOUNT_ID
———————————————————————————————————
———————————————————————————————————
— Delete Query
    DELETE FROM ACCOUNT
   WHERE
   ACCOUNT_ID = @INTACCOUNT_ID
———————————————————————————————————
———————————————————————————————————
— Constraint Query
SELECT * FROM Account WHERE
  [ACCOUNT_CODE] = @STRACCOUNT_CODE
———————————————————————————————————
———————————————————————————————————
— In Repeat From Set DataSource Query For Form Control
— RepeatForm Quey  -> This Query Use In Parent Form
Select
AR.AssessmentResultID,
AF.AssessmentFormID  ,
Q.QuestionID ,
CAST( Q.QuestionNumber AS NVARCHAR(50)) AS QuestionNumber ,
Q.QuestionText ,
AC.ComponentName ,
CM.ModuleName ,
AR.Description ,
ISNULL(  AR.FormPersonnelID ,#ENTITY_ID ) AS  FormPersonnelID,
ISNULL( AR.ToPresonnelID, @intPersonnelID ) AS ToPresonnelID ,
AR.AnswerID
from [dbo].[AssessmentForm] AS AF
Inner join Question AS Q
On Q.AssessmentFormID = AF.AssessmentFormID
inner join [dbo].[ComponentModule] AS CM
On CM.ComponentModuleID = Q.ComponentModuleID
Inner Join AssessmentComponent  AS AC
on AC.AssessmentComponentID = CM.AssessmentComponentID
LEFT  OUTER JOIN AssessmentResult AS AR
On AF.AssessmentFormID = AR.AssessmentFormID  And Q.QuestionID = AR.QuestionID AND    AR.ToPresonnelID = @intPersonnelID And AR.FormPersonnelID = #ENTITY_ID
Where
AF.AssessmentFormID = #KEYID
And  ( AR.FormPersonnelID = #ENTITY_ID Or AR.FormPersonnelID is null )
And  ( AR.ToPresonnelID = @intPersonnelID  Or AR.ToPresonnelID is null )
— #KEYID     is Value From Parent Form Select In Child Form Object  #KEYID  Is Not Session Value
— #ENTITY_ID Is Session Value
— @intPersonnelID is Value From Object
— Repeat From In Curent Form Use Select Recored_Source Query if Value is Not 0
================================================================================
— In Tab From
–Set DataSource for Form Control
Select
   dbo.Parties_Entities.Parties_Entities_ID
From    dbo.Parties_Entities
Where
( dbo.Parties_Entities.Parties_Entities_ID= #MUSER )
         — #MUSER is Session Value
================================================================================
/* CSS Class
   PriceMode Text Box  = PriceText
   Form Child Grid  = FROMCGRID
   Left Text Align = InputTextLeft
*/
–Query For Get All WorkFlow (Menu) With User_Id
================================================================================
–Start
SELECT DISTINCT W.* FROM SYS_WORKFLOW W
INNER JOIN SYS_WORKFLOWUSERGROUP WU
ON W.SYS_WORKFLOW_ID = WU.SYS_WORKFLOW_ID
INNER JOIN SYS_USERGROUPLIST UG
ON UG.SYS_USERGROUP_ID = WU.SYS_USERGROUP_ID
WHERE UG.SYS_USER_ID = #USER_ID
— End
================================================================================
— Query For Get All WorkFlowForm Access With User_ID
–Start
SELECT DISTINCT WF.* FROM SYS_WORKFLOW W
Inner Join Sys_WorkflowForm WF
on WF.Sys_Workflow_ID = W.Sys_Workflow_ID
INNER JOIN SYS_WORKFLOWUSERGROUP WU
ON W.SYS_WORKFLOW_ID = WU.SYS_WORKFLOW_ID
INNER JOIN SYS_USERGROUPLIST UG
ON UG.SYS_USERGROUP_ID = WU.SYS_USERGROUP_ID
WHERE UG.SYS_USER_ID = 1
–End
================================================================================
–Call Rest Function In SQL Query
–Start
REST
http://localhost:8080/ZWCEE/info/getfp.zjs
or
http://{PROXY:1}/ZWCEE/info/getfp.zjs
POST
V1 = @LNGTEXT1
V2 = #USER_ID
V3 = Test
V4 = {sql=> select 5*4 from dual }
–End
//
================================================================================
–PLSQL Call In Zframe
–Sample Query (Only In Rest And ResultSet Data )
–Start
plsql
declare
            p_id varchar2(20) :=  null  ;
            l_rc sys_refcursor ;
         begin
            p_id := @STRVALUEID  ;
            if ( p_id = ’12’ ) then
             open l_rc for
                select 1 id, ‘Test Value 1’ name from dual
                union
                select 2, ‘Data1’ from dual;
            else
              open l_rc for
                select 1 id, ‘Test Value 2’ name from dual
                union
                select 2, ‘Data2’ from dual;
            end if ;
            ? := l_rc ;
         end;
–End
================================================================================
–PLSQL Call In Zframe With Parameter
–Sample Query (Only In Rest And ResultSet Data )
–Start
ppsql
CALL PROC1( @ILNGIDV , @OLNGAMOUNT )
–End
================================================================================
// ZFrame Engine Management Address
//attention! This Url List  Active When In Config.Xml  (Debug = 1)
ZFrameDiagnostic.jsp?KeyID=Remove&CashName=All //Remove All Cashe Data
ZFrameDiagnostic.jsp?KeyID=cash //View Cash
ZFrameDiagnostic.jsp?KeyID=terminaltrace&value=0        //View Terminal  Log
ZFrameDiagnostic.jsp?KeyID=terminaltrace&value=10000    //Stop Terminal Log
ZFrameDiagnostic.jsp?KeyID=session                      //View User Activity
ZFrameDiagnostic.jsp?KeyID=Trace&Active=0               //Disable  User Activity With Action Information
ZFrameDiagnostic.jsp?KeyID=Trace&Active=1               //Enable User Activity With Action Information
================================================================================
// Sample Code for Grid Datasource and Create Control
SELECT GUILD_ID, GUILD_CODE, GUILD_NAME, MAIN_GUILD_NAME, ALIAS, OFFICE_ADDRESS ,
       TEL, WEBSITE  FROM  GUILD
START_GRID_STYLE
GUILD_CODE:<input type=”button” value=”@GUILD_CODE@” class=”InputText”>#
MAIN_GUILD_NAME:<input type=”text” value=”@MAIN_GUILD_NAME@” style=”width:300px” class=”InputText”>#
ALIAS:<span class=”title”> @ALIAS@ </span>#
RECIVED_COUNT:<input type=”text” id=”txtid@INVENTORY_ORDER_ITEM_ID@” onchange=”changeData(this,@INVENTORY_ORDER_ITEM_ID@)” value =”@RECIVED_COUNT@” style=”width:100px;”  >#
SERIAL : <input type=”button”  value =”ثبت سریال”  onclick=”saveserial(@SERIAL@)” class=”command” ZVS=@IS_SERIAL_TRACKING@  > #
INSPECTION_REQUIRED : <span class=”qccheck” value=”@INSPECTION_REQUIRED@”>@INSPECTION_REQUIRED@</span>#
SAMPLE_QUANTITY:<input type=”text” id=”txtidSAMPLE@INVENTORY_ORDER_ITEM_ID@” onchange=”changeDataSample(this,@INVENTORY_ORDER_ITEM_ID@)” value =”@SAMPLE_QUANTITY@” style=”width:100px;” >#
LOT_LOCATION: <hidden id=”location_lot_id@INVENTORY_ORDER_ITEM_ID@” value=”0″><hidden id=”location_lot_id@INVENTORY_ORDER_ITEM_ID@txt” value=”0″><input type=”button” class=”command” value= “موقعیت مکانی در انبار” onclick=”select_location_io( @LOT_LOCATION@ , @INVENTORY_ORDER_ITEM_ID@ ,’location_lot_id@INVENTORY_ORDER_ITEM_ID@’)” ZVS=@IS_LOT_LOCATION@  >#
IS_SERIAL_TRACKING: ZVS=false #
IS_LOT_LOCATION : ZVS=false #
================================================================================
Related Control Management
Control Datasource :
Select
           SmallPart_ID, Goods_Code
            From    dbo.VIEW_EXTERNAL_SMALLPART
Related Condition Query:
Select SmallPart_ID,Goods_Code FROM DBO.FX_SOURCE_GOOD(@LNGActivity_Action_ID , @LNGWork_Report_ID , @INTGoods_ID , 1) where Goods_Code like @STRCODE
Related Control Property:
      Activity_Action_ID,Work_Report_ID,Goods_ID
================================================================================
//ZFrame Rest Api For Get Form Data Structure
GetFormDataSource
Url  : formdatasource.ZF_DataSource
Param
{
param.push({name:’id’, value:FormId});
param.push({name:’key_Id’, value:KeyId});
}
================================================================================
getDataComboDataSourceSolver
Url : Control.ZF_CDS
Param
{
param.push({name:’id’, value:FormId});
param.push({name:’control_id’, value:Control_Id});
}
================================================================================
GetFormStruct
Url : formstruct.ZF_Control
Param
{
param.push({name:’id’, value:FormId});
}
================================================================================
GetControl_Relation
Url: formstruct.ZF_LCM
Param
{
param.push({name:’id’, value:FormId});
}
================================================================================
FillFindObjectBoxAndTextSearch
Url: Search.ZF_COMPLEX
Param
{
param.push({name:’rule_id’, value:”0″});
param.push({name:’form_id’, value:form_id});
param.push({name:’control_id’, value:control_id});
param.push({name:’content’, value:value});
param.push({name:’te’, value:”null”});
}
================================================================================
GetContenetWithID
Url:Search.ZF_COMPLEX
Param
{
param.push({name:’rule_id’, value:”2″});
param.push({name:’form_id’, value:form_id});
param.push({name:’control_id’, value:control_id});
param.push({name:’content’, value:value});
param.push({name:’te’, value:”null”});
}
================================================================================
Get_BinddingForm_Raw_DataSource
Url:Search.ZF_COMPLEX
{
param.push({name:’rule_id’, value:”3″});
param.push({name:’form_id’, value:form_id});
param.push({name:’control_id’, value:control_id});
param.push({name:’content’, value:value});
param.push({name:’te’, value:”null”});
}
================================================================================
GetFormInformation
Url:info.ZF_Form
param
{
/*
         * Mode = 0  form Information sys_object
         * Mode = 1  Sys_Object_Rule
         * Mode = 2  ZFrameFormRuleControl
         * Mode = 3  JavaScript Need to convert Base64
         * Mode = 4  Template
         */
var param= [];
param.push({name:’id’, value:FormID});
param.push({name:’mode’, value:ModeID});
}
================================================================================
Rest Service Query In ZFrame
================================================================================
async function  GetFormDataSource (FormId , KeyId){
    try
    {
        var param= [];
    param.push({name:’id’, value:FormId});
        param.push({name:’key_Id’, value:KeyId});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        baseapplicationsrc = pototcol+”//”+ hostname+”//”;
        var fucname = “formdatasource.ZF_DataSource”;
        var address =pototcol+”//”+ hostname + “/getformdatasource/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
        return null;
    }
}
================================================================================
async function  getDataComboDataSourceSolver (FormId , Control_Id,fn){
    try
    {
        var param= [];
    param.push({name:’id’, value:FormId});
        param.push({name:’control_id’, value:Control_Id});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “Control.ZF_CDS”;
        var address =pototcol+”//”+ hostname + “/getcontroldatasource/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        fn(s);
        return s;
    }
    catch (e)
    {
        return null;
    }
}
================================================================================
async function  GetFormStruct (FormId){
    try
    {
        var param= [];
    param.push({name:’id’, value:FormId});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “formstruct.ZF_Control”;
        var address =pototcol+”//”+ hostname + “/getformstaruct/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
        return null;
    }
}
================================================================================
async function  GetControl_Relation (FormId){
    try
    {
        var param= [];
    param.push({name:’id’, value:FormId});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “formstruct.ZF_LCM”;
        var address =pototcol+”//”+ hostname + “/getformstaruct/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
        return null;
    }
}
================================================================================
async function FillFindObjectBoxAndTextSearch(control_id,content)
{
     try
    {
        var form_id = GetUrlParameter(‘ID’);
        var value  = content.value;
        var param= [];
    param.push({name:’rule_id’, value:”0″});
        param.push({name:’form_id’, value:form_id});
        param.push({name:’control_id’, value:control_id});
        param.push({name:’content’, value:value});
        param.push({name:’te’, value:”null”});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “Search.ZF_COMPLEX”;
        var address =pototcol+”//”+ hostname + “/searchEngine/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
        return null;
    }
}
================================================================================
async function GetContenetWithID(control_id,content_id)
{
     try
    {
        var form_id = GetUrlParameter(‘ID’);
        var value  = content_id;
        var param= [];
    param.push({name:’rule_id’, value:”2″});
        param.push({name:’form_id’, value:form_id});
        param.push({name:’control_id’, value:control_id});
        param.push({name:’content’, value:value});
        param.push({name:’te’, value:”null”});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “Search.ZF_COMPLEX”;
        var address =pototcol+”//”+ hostname + “/searchEngine/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
            var keys = Object.keys(s[0]);
            var Key_Id  = keys[0];
            var key_value = keys[1];
            return s[0][key_value];
    }
    catch (e)
    {
    }
    return null;
}
================================================================================
async function Get_BinddingForm_Raw_DataSource(control_id,content_id)
{
     try
    {
        var form_id = GetUrlParameter(‘ID’);
        var value  = content_id;
        var param= [];
    param.push({name:’rule_id’, value:”3″});
        param.push({name:’form_id’, value:form_id});
        param.push({name:’control_id’, value:control_id});
        param.push({name:’content’, value:value});
        param.push({name:’te’, value:”null”});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “Search.ZF_COMPLEX”;
        var address =pototcol+”//”+ hostname + “/searchEngine/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
    }
    return null;
}
================================================================================
async function GetFormInformation(FormID,ModeID)
{
     try
    {
        /*
         * Mode = 0  form Information sys_object
         * Mode = 1  Sys_Object_Rule
         * Mode = 2  ZFrameFormRuleControl
         * Mode = 3  JavaScript Need to convert Base64
         * Mode = 4  Template
         */
        var param= [];
    param.push({name:’id’, value:FormID});
        param.push({name:’mode’, value:ModeID});
        var pototcol = window.location.protocol;
        var hostname= window.location.host+ ApplicationName
        var fucname = “info.ZF_Form”;
        var address =pototcol+”//”+ hostname + “/FormInfo/”+ fucname;
        let s= await  nativecallZf_jslib(address,param,2);
        return s;
    }
    catch (e)
    {
    }
    return null;
}
================================================================================
ZFrame Standard package ;
package ZFrame_FormRuleCode;            // Form UI  Rule
package ZFrame_RestApiRuleCode;         // Rest API Rule Code
package ZFrame_CustomControlRuleCode;   // Custom Control Rule Code
package ZFrame_InitRule;                // Init Rule Code
================================================================================
package ZFrame_InitRule;
/**
 *
 * @author Siavash Rafiei
 */
public class TestStart  extends  Z_Framework.Rule.Engine_Init_Rule
{
     public TestStart()
     {
     }
     @Override
     public void Start()
     {
         System.out.println(“Start My Application With This Line “);
     }
}
================================================================================
Regular Expression
Fix len For TextBox
=>^(?=.{10,15}$).*
====
language tags
hl=af          Afrikaans
hl=ak          Akan
hl=sq          Albanian
hl=am          Amharic
hl=ar          Arabic
hl=hy          Armenian
hl=az          Azerbaijani
hl=eu          Basque
hl=be          Belarusian
hl=bem         Bemba
hl=bn          Bengali
hl=bh          Bihari
hl=xx-bork     Bork, bork, bork!
hl=bs          Bosnian
hl=br          Breton
hl=bg          Bulgarian
hl=km          Cambodian
hl=ca          Catalan
hl=chr         Cherokee
hl=ny          Chichewa
hl=zh-CN       Chinese (Simplified)
hl=zh-TW       Chinese (Traditional)
hl=co          Corsican
hl=hr          Croatian
hl=cs          Czech
hl=da          Danish
hl=nl          Dutch
hl=xx-elmer    Elmer Fudd
hl=en          English
hl=eo          Esperanto
hl=et          Estonian
hl=ee          Ewe
hl=fo          Faroese
hl=tl          Filipino
hl=fi          Finnish
hl=fr          French
hl=fy          Frisian
hl=gaa         Ga
hl=gl          Galician
hl=ka          Georgian
hl=de          German
hl=el          Greek
hl=gn          Guarani
hl=gu          Gujarati
hl=xx-hacker   Hacker
hl=ht          Haitian Creole
hl=ha          Hausa
hl=haw         Hawaiian
hl=iw          Hebrew
hl=hi          Hindi
hl=hu          Hungarian
hl=is          Icelandic
hl=ig          Igbo
hl=id          Indonesian
hl=ia          Interlingua
hl=ga          Irish
hl=it          Italian
hl=ja          Japanese
hl=jw          Javanese
hl=kn          Kannada
hl=kk          Kazakh
hl=rw          Kinyarwanda
hl=rn          Kirundi
hl=xx-klingon  Klingon
hl=kg          Kongo
hl=ko          Korean
hl=kri         Krio (Sierra Leone)
hl=ku          Kurdish
hl=ckb         Kurdish (Soranî)
hl=ky          Kyrgyz
hl=lo          Laothian
hl=la          Latin
hl=lv          Latvian
hl=ln          Lingala
hl=lt          Lithuanian
hl=loz         Lozi
hl=lg          Luganda
hl=ach         Luo
hl=mk          Macedonian
hl=mg          Malagasy
hl=ms          Malay
hl=ml          Malayalam
hl=mt          Maltese
hl=mi          Maori
hl=mr          Marathi
hl=mfe         Mauritian Creole
hl=mo          Moldavian
hl=mn          Mongolian
hl=sr-ME       Montenegrin
hl=ne          Nepali
hl=pcm         Nigerian Pidgin
hl=nso         Northern Sotho
hl=no          Norwegian
hl=nn          Norwegian (Nynorsk)
hl=oc          Occitan
hl=or          Oriya
hl=om          Oromo
hl=ps          Pashto
hl=fa          Persian
hl=xx-pirate   Pirate
hl=pl          Polish
hl=pt-BR       Portuguese (Brazil)
hl=pt-PT       Portuguese (Portugal)
hl=pa          Punjabi
hl=qu          Quechua
hl=ro          Romanian
hl=rm          Romansh
hl=nyn         Runyakitara
hl=ru          Russian
hl=gd          Scots Gaelic
hl=sr          Serbian
hl=sh          Serbo-Croatian
hl=st          Sesotho
hl=tn          Setswana
hl=crs         Seychellois Creole
hl=sn          Shona
hl=sd          Sindhi
hl=si          Sinhalese
hl=sk          Slovak
hl=sl          Slovenian
hl=so          Somali
hl=es          Spanish
hl=es-419      Spanish (Latin American)
hl=su          Sundanese
hl=sw          Swahili
hl=sv          Swedish
hl=tg          Tajik
hl=ta          Tamil
hl=tt          Tatar
hl=te          Telugu
hl=th          Thai
hl=ti          Tigrinya
hl=to          Tonga
hl=lua         Tshiluba
hl=tum         Tumbuka
hl=tr          Turkish
hl=tk          Turkmen
hl=tw          Twi
hl=ug          Uighur
hl=uk          Ukrainian
hl=ur          Urdu
hl=uz          Uzbek
hl=vi          Vietnamese
hl=cy          Welsh
hl=wo          Wolof
hl=xh          Xhosa
hl=yi          Yiddish
hl=yo          Yoruba
hl=zu          Zulu
best tracker