mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-08-17 17:02:51 +08:00
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.
115 lines
6.8 KiB
SQL
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
|