1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

Xtn.Cldr: Check CldrNames for IsKnownLanguageTag [#388]

This commit is contained in:
gnosygnu
2019-06-11 06:49:06 -04:00
parent 8ab9bc5444
commit 70d845f438
9 changed files with 104 additions and 38 deletions

View File

@@ -0,0 +1,49 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.xtns.cldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.tests.*;
import gplx.langs.jsons.*;
public class Cldr_name_loader_fxt {
private static final String Dir_name = "mem/CldrNames/";
private final Cldr_name_loader name_loader = new Cldr_name_loader(Io_url_.mem_dir_(Dir_name));
public void Clear() {name_loader.Clear();}
public void Init__file(String fil_name, String txt) {
Io_mgr.Instance.SaveFilStr(Io_url_.new_fil_(Dir_name + fil_name), txt);
}
public void Test__load_file_is_empty(boolean expd, String lang_key) {
Cldr_name_file name_file = name_loader.Load_or_empty(lang_key);
Gftest.Eq__bool(expd, name_file == Cldr_name_file.Empty);
}
public static void Create_file_w_langs(String lang_name, Keyval... lang_ary) {
String root_dir = "mem/xowa/bin/any/xowa/xtns/cldr/CldrNames/";
String file = String_.Concat(root_dir, "CldrNames", lang_name, ".json");
Json_doc_wtr wtr = new Json_doc_wtr();
wtr.Nde_bgn();
wtr.Key(Bool_.N, "languageNames");
wtr.Nde_bgn();
for (int i = 0; i < lang_ary.length; i++) {
Keyval lang = lang_ary[i];
wtr.Kv(i != 0, Bry_.new_u8(lang.Key()), Bry_.new_u8(lang.Val_to_str_or_null()));
}
wtr.Nde_end();
wtr.Nde_end();
String json = wtr.Bld_as_str();
Io_mgr.Instance.SaveFilStr(file, json);
}
}

View File

@@ -29,16 +29,3 @@ public class Cldr_name_loader_tst {
fxt.Test__load_file_is_empty(Bool_.Y, "en_gb");
}
}
class Cldr_name_loader_fxt {
private static final String Dir_name = "mem/CldrNames/";
private final Cldr_name_loader name_loader = new Cldr_name_loader(Io_url_.mem_dir_(Dir_name));
public void Clear() {name_loader.Clear();}
public void Init__file(String fil_name, String txt) {
Io_mgr.Instance.SaveFilStr(Io_url_.new_fil_(Dir_name + fil_name), txt);
}
public void Test__load_file_is_empty(boolean expd, String lang_key) {
Cldr_name_file name_file = name_loader.Load_or_empty(lang_key);
Gftest.Eq__bool(expd, name_file == Cldr_name_file.Empty);
}
}

View File

@@ -28,4 +28,6 @@ public class Language_name implements gplx.core.brys.Bry_bfr_able {
bfr.Add(name).Add_byte_pipe();
bfr.Add(note);
}
public static final Language_name[] Ary_empty = new Language_name[0];
}

View File

@@ -43,6 +43,7 @@ public class Language_name_loader {
List_adp list = List_adp_.New();
Json_doc jdoc = parser.Parse(json);
if (jdoc == null) return Language_name.Ary_empty;
Json_ary root = jdoc.Root_ary();
int len = root.Len();
for (int i = 0; i < len; i++) {

View File

@@ -53,12 +53,12 @@ public class Language_names_converter_tst {
, "]"
));
}
@Test public void Convert() {
Language_names_converter converter = new Language_names_converter();
Language_name[] names = converter.Parse_fil(Io_url_.new_dir_("C:\\000\\100_bin\\200_server\\200_http\\100_apache\\100_v2.4\\htdocs\\mediawiki\\v1.29.1\\languages\\data\\Names.php"));
String json = converter.To_json(names);
Io_mgr.Instance.SaveFilStr(Io_url_.new_fil_("C:\\xowa\\bin\\any\\xowa\\cfg\\lang\\data\\names.json"), json);
}
// @Test public void Convert() {
// Language_names_converter converter = new Language_names_converter();
// Language_name[] names = converter.Parse_fil(Io_url_.new_dir_("C:\\000\\100_bin\\200_server\\200_http\\100_apache\\100_v2.4\\htdocs\\mediawiki\\v1.29.1\\languages\\data\\Names.php"));
// String json = converter.To_json(names);
// Io_mgr.Instance.SaveFilStr(Io_url_.new_fil_("C:\\xowa\\bin\\any\\xowa\\cfg\\lang\\data\\names.json"), json);
// }
}
class Language_names_converter_fxt {
private final Language_names_converter converter = new Language_names_converter();

View File

@@ -14,7 +14,7 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*;
import gplx.xowa.langs.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.names.*;
import gplx.xowa.mediawiki.*;
import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.langs.numbers.*; import gplx.xowa.xtns.pfuncs.numbers.*; import gplx.xowa.langs.durations.*;
import gplx.xowa.xtns.scribunto.procs.*;
@@ -82,14 +82,26 @@ public class Scrib_lib_language implements Scrib_lib {
public void Notify_lang_changed() {if (notify_lang_changed_fnc != null) core.Interpreter().CallFunction(notify_lang_changed_fnc.Id(), Keyval_.Ary_empty);}
public boolean GetContLangCode(Scrib_proc_args args, Scrib_proc_rslt rslt) {return rslt.Init_obj(core.Ctx().Lang().Key_str());}
public boolean IsSupportedLanguage(Scrib_proc_args args, Scrib_proc_rslt rslt) {return IsKnownLanguageTag(args, rslt);}// NOTE: checks if "MessagesXX.php" exists; note that xowa has all "MessagesXX.php"; for now, assume same functionality as IsKnownLanguageTag (worst case is that a small wiki depends on a lang not being there; will need to put in a "wiki.Langs()" then)
public boolean IsKnownLanguageTag(Scrib_proc_args args, Scrib_proc_rslt rslt) { // NOTE: checks if in languages/Names.php; TODO: support foreign translations; EX: Englische is en in de.w
public boolean IsKnownLanguageTag(Scrib_proc_args args, Scrib_proc_rslt rslt) { // NOTE: checks if in languages/data/Names.php; TODO: support foreign translations; EX: Englische is en in de.w
String lang_code = args.Cast_str_or_null(0);
boolean exists = false;
// TODO:create literal equivalent of Language.php|isValidBuiltInCode; WHEN:refactor
// * REF: https://github.com/wikimedia/mediawiki-extensions-Scribunto/blob/master/includes/engines/LuaCommon/LanguageLibrary.php#L86
// * REF: https://github.com/wikimedia/mediawiki/blob/master/languages/Language.php#L427
// check lang stubs which correlates roughly to languages/data/Names.php;
if ( lang_code != null // null check; protecting against Module passing in nil from lua
&& String_.Eq(lang_code, String_.Lower(lang_code)) // must be lower-case; REF.MW: $code === strtolower( $code )
&& Xol_lang_stub_.Exists(Bry_.new_a7(lang_code))
)
exists = true;
// check cldr names; ISSUE#:388; EX:goh in CldrNamesEn.json; DATE:2019-06-11
if (!exists) {
String lang_name = core.App().Lang_mgr().Name_mgr().fetchLanguageName(lang_code, core.Lang().Key_str(), Xol_name_mgr.Scope__str__all, core.Page_url());
exists = String_.Len_gt_0(lang_name); // NOTE: missing langs will come back as empty String
}
return rslt.Init_obj(exists);
}
public boolean IsValidCode(Scrib_proc_args args, Scrib_proc_rslt rslt) { // REF.MW: Language.php!isValidCode

View File

@@ -17,6 +17,7 @@ package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import
import org.junit.*;
import gplx.langs.jsons.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.numbers.*;
import gplx.xowa.xtns.cldrs.*;
public class Scrib_lib_language_tst {
@Before public void init() {
fxt.Clear_for_lib();
@@ -34,6 +35,11 @@ public class Scrib_lib_language_tst {
fxt.Test_scrib_proc_bool(lib, Scrib_lib_language.Invk_isKnownLanguageTag, Object_.Ary("fr"), true);
fxt.Test_scrib_proc_bool(lib, Scrib_lib_language.Invk_isKnownLanguageTag, Object_.Ary("qq"), false);
}
@Test public void IsKnownLanguageTag_cldr() {
Io_mgr.Instance.InitEngine_mem();
Cldr_name_loader_fxt.Create_file_w_langs(fxt.Core().Lang().Key_str(), Keyval_.Ary(Keyval_.new_("goh", "goh_name")));
fxt.Test_scrib_proc_bool(lib, Scrib_lib_language.Invk_isKnownLanguageTag, Object_.Ary("goh"), true);
}
@Test public void IsValidCode() {
fxt.Test_scrib_proc_bool(lib, Scrib_lib_language.Invk_isValidCode, Object_.Ary("a,b"), true);
fxt.Test_scrib_proc_bool(lib, Scrib_lib_language.Invk_isValidCode, Object_.Ary("a'b"), false);