Files
wxWidgets/misc/languages/data/mkwxtables.sql
T
Ulrich Telle 57e1c9e1ee Update wxWidgets language database and improve locale matching
This commit improves the best locale match algorithm by prioritizing
closer matches and add many new tests verifying that this works as
expected.

In order to do this, new information had to be added to the language
database, which was extended with it and updated to use the latest
Unicode CLDR data and latest Windows 11 locale list.

Further, add a set of scripts for maintaining the language database up
to date and a GitHub workflow `genlangdb.yml` which can be run manually
to regenerate the wxWidgets language-related source and header files
from the underlying Windows and Unicode data. It produces 2 artifacts:

- wxLanguageDatabaseDist.zip allows to easily update the
  language-related files in the wxWidgets repository by simply copying
  all files.
- the normal workflow log and wxLanguageDatabaseLog.zip allow to check
  all temporary files of the regeneration process and to detect
  potential issues, before the language-related files are actually
  replaced by the new ones.

Finally, fix wxUILocaleImplName::GetPreferredUILanguages: Under Windows
10 and above the Windows API function ::GetUserPreferredUILanguages()
returns only the primary UI language plus US English. Additional
preferred UI languages installed by the user are ignored, so instead of
using this function read the list of user preferred languages from the
Windows registry.

Closes #24855.
2024-11-18 16:46:25 +01:00

115 lines
6.8 KiB
SQL

-- Create unique wx language mapping
create table if not exists wx_langmapuni (wxlangname char, wxlangid char, wxlocregion char, primary key (wxlangname));
delete from wx_langmapuni;
insert into wx_langmapuni select wxlangname, wxlangid, wxlocregion from wx_langmap;
-- Create mapping between wx and Windows ids
create table if not exists wx2winmapping (wxlocidnew char, wxnamenew char, wxlocidold char, wxnameold char, primary key (wxlocidnew));
delete from wx2winmapping;
insert into wx2winmapping select wt.wxlocid, wt.wxname, ifnull(wm.wxlangid,'-'), ifnull(wm.wxlangname,'-') from win_localetable wt
left join wx_langmapuni wm on wt.wxlocid=wm.wxlangid;
update wx2winmapping set wxlocidold = ifnull((select wxlangid from wx_langmapuni where wx_langmapuni.wxlangname=wx2winmapping.wxnamenew),'-') where wx2winmapping.wxlocidold='-';
-- Create mapping between language and country
create table if not exists lang2iso2 (lang char, iso2 char, wintag char, primary key (lang));
delete from lang2iso2;
insert into lang2iso2 select w.locid, w.locid||'_'||c.iso2, w.locid||'-'||c.iso2 from win_localetable w, uni_territorycodes c where w.locid not like '%-%' and w.country3=c.iso3;
-- Perform checks
.output temp/wxmissing.log
select '*** Missing via wx_langmapuni';
select wxlangname, wxlangid from wx_langmapuni where not exists (select wxnameold from wx2winmapping where wxnameold=wxlangname);
select '*** Missing via wx_langmap';
select wxlangname, wxlangid from wx_langmap where not exists (select wxname from win_localetable where wxname=wxlangname);
select '*** Missing locale tags in likely subtags mapping';
select locid from win_localetable w where length(w.locid) < 4 and not exists (select tagfrom from uni_likelysubtags s where s.tagfrom=w.locid);
.output stdout
select ' #missing wxlangmapuni =', count(wxlangname) from wx_langmapuni where not exists (select wxnameold from wx2winmapping where wxnameold=wxlangname);
select ' #matched wxlangmapuni =', count(wxlangname) from wx_langmapuni where exists (select wxnameold from wx2winmapping where wxnameold=wxlangname);
select ' #matched wx2win =', count(distinct wxnameold) from wx2winmapping where wxnameold <> '-';
select ' #missing likely tags =', count(locid) from win_localetable w where length(w.locid) < 4 and not exists (select tagfrom from uni_likelysubtags s where s.tagfrom=w.locid);
select ' #missing wxlangmap =', count(wxlangname) from wx_langmap where not exists (select wxname from win_localetable where wxname=wxlangname) and not exists (select wxnamesyn from wx_synonyms where wxnamesyn=wxlangname);
select wxlangname from wx_langmap where not exists (select wxname from win_localetable where wxname=wxlangname) and not exists (select wxnamesyn from wx_synonyms where wxnamesyn=wxlangname);
select wxname from win_localetable where exists (select wxnamesyn from wx_synonyms where wxnamesyn = win_localetable.wxname);
-- Generate references to previous wx mappings
update win_localetable set (wxlocidold, wxnameold) =
(select wxlocregion, wxlangname from wx_langmap m1 where m1.wxlangid=win_localetable.wxlocid);
-- Replace NULL values with strings ('-')
update win_localetable set wxlocidold = '-' where wxlocidold is null;
update win_localetable set wxnameold = '-' where wxnameold is null;
-- Adjust Windows language ids
--.changes on
update win_localetable as t1 set (idlang,idsublang) =
(t2.idlang, t2.idsublang) from win_localetable t2
where t1.wxlocid <> '-' and t2.wxlocid = t1.wxlocidold and (t1.idlang <> t2.idlang or t1.idsublang <> t2.idsublang);
--.changes off
-- Adjust canonical reference for language-only entries
update win_localetable as w1 set wxlocidold =
(select m.iso2 from win_localetable w, lang2iso2 m
where w.locid=w1.locid and w.locid=m.lang
and exists (select 1 from win_localetable w2 where w2.locid=m.wintag))
where w1.locid not like '%-%' and (w1.wxlocidold='-' or w1.wxlocidold is null);
update win_localetable set wxlocidold = '-' where wxlocidold is null;
-- Initialize parameter holding the current wx version
.parameter init
.print Set wx version parameter
.parameter set @wxversion "(select version from wx_version)"
.parameter list
-- Generate new list of languages
.output langtabl.txt
select printf('%-55s %-9s %-14s %-25s %-14s %-4s %-4s %s "%s","%s"',
w.wxname, ifnull(x.wxversion,@wxversion), w.locid, w.wxlocid, w.wxlocidold,
w.idlang, w.idsublang, w.layout, w.englishdisplay, w.nativedisplayhex)
from win_localetable w left join wx_langmap x on w.wxlocid = x.wxlangid order by w.wxname;
.output stdout
-- Generate new list of script mappings
-- Special handling for scripts Hans and Hant
update uni_scriptmap set scalias = lower(scalias) where scalias not in ('Hans','Hant');
.output scripttabl.txt
select printf('%-4s %s', sctag, scalias) from uni_scriptmap where scalias <> '-' order by sctag;
.output stdout
-- Generate new list of wxLANGUAGE synonyms
insert into wx_synonyms
select wl.wxnameold, wl.wxname, wl.locid, ifnull(wm.wxversion,@wxversion)
from win_localetable wl left join wx_langmap wm on wl.wxnameold = wm.wxlangname
where wl.wxnameold <> '-' and wl.wxname <> wl.wxnameold;
delete from wx_synonyms where wxnamesyn in (select wxname from win_localetable);
.output synonymtabl.txt
select printf('%-55s %-55s %-14s %s', wxnamesyn, wxnameprim, winlocid, wxversion) from wx_synonyms order by wxnamesyn;
.output stdout
-- Generate list of likely subtags
.output likelytabl.txt
select printf('%-11s %s', tagfrom, tagto) from uni_likelysubtags t where exists (select w.locid from win_localetable w where substr(w.locid,1,iif(instr(w.locid,'-')>0,instr(w.locid,'-')-1,length(w.locid))) = substr(t.tagfrom,1,iif(instr(t.tagfrom,'-')>0,instr(t.tagfrom,'-')-1,length(t.tagfrom)))) order by tagfrom;
.output stdout
-- Generate list of language matches
insert into uni_languagematch select supported, desired, distance, 'true' from uni_languagematch where oneway = 'false' and desired <> supported;
.output matchingtabl.txt
-- First all patterns without asterisks or variables
select printf('%-10s %-10s %3d', desired, supported, distance) from uni_languagematch t where desired not like ('%*%') and desired not like ('%$%') and exists (select w.locid from win_localetable w where substr(w.locid,1,iif(instr(w.locid,'-')>0,instr(w.locid,'-')-1,length(w.locid))) = substr(t.desired,1,iif(instr(t.desired,'-')>0,instr(t.desired,'-')-1,length(t.desired)))) order by desired;
-- Include patterns with asterisks, but without variables
select printf('%-10s %-10s %3d', desired, supported, distance) from uni_languagematch t where desired like ('%*%') and desired not like ('%$%') and supported not like ('%$%') order by desired;
.output stdout
-- Generate list of region groups for selected languages
.output regiongrouptabl.txt
select printf('%-8s %s', language, country) from uni_regiongroups order by language, country;
.output stdout