From f2ad935e19338a29113492150f0c5a5fd5befd75 Mon Sep 17 00:00:00 2001 From: Sascha Brawer Date: Sun, 28 Jun 2015 03:29:47 +0200 Subject: [PATCH] Handle language tags that indicate phonetic IPA transcription The BCP-47 registry defines a variant subtag "fonipa" that can be used in combination with arbitrary other language tags. For example, "rm-CH-fonipa-sursilv" indicates the Sursilvan dialect of Romansh as used in Switzerland, transcribed used the International Phonetic Alphabet. http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry --- src/hb-ot-tag.cc | 15 ++++++++++++++- test/api/test-ot-tag.c | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-tag.cc b/src/hb-ot-tag.cc index 376042909..a2e5728fc 100644 --- a/src/hb-ot-tag.cc +++ b/src/hb-ot-tag.cc @@ -733,7 +733,6 @@ static const LangTag ot_languages[] = { /*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */ /*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */ /*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */ -/*{"fonipa", HB_TAG('I','P','P','H')},*/ /* Phonetic transcription—IPA conventions */ /*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */ /*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */ /*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */ @@ -832,6 +831,14 @@ hb_ot_tag_from_language (hb_language_t language) } } + /* + * The International Phonetic Alphabet is a variant tag in BCP-47, + * which can be applied to any language. + */ + if (strstr (lang_str, "-fonipa")) { + return HB_TAG('I','P','P','H'); /* Phonetic transcription—IPA conventions */ + } + /* Find a language matching in the first component */ { const LangTag *lang_tag; @@ -901,6 +908,12 @@ hb_ot_tag_to_language (hb_tag_t tag) } } + /* struct LangTag has only room for 3-letter language tags. */ + switch (tag) { + case HB_TAG('I','P','P','H'): /* Phonetic transcription—IPA conventions */ + return hb_language_from_string ("und-fonipa", -1); + } + /* Else return a custom language in the form of "x-hbotABCD" */ { unsigned char buf[11] = "x-hbot"; diff --git a/test/api/test-ot-tag.c b/test/api/test-ot-tag.c index b667c7d93..29e0aa225 100644 --- a/test/api/test-ot-tag.c +++ b/test/api/test-ot-tag.c @@ -222,6 +222,13 @@ test_ot_tag_language (void) test_tag_from_language ("XYZ", "xyz"); /* Unknown ISO 639-3 */ test_tag_from_language ("XYZ", "xyz-qw"); /* Unknown ISO 639-3 */ + /* International Phonetic Alphabet */ + test_tag_from_language ("IPPH", "en-fonipa"); + test_tag_from_language ("IPPH", "rm-CH-fonipa-sursilv-x-foobar"); + test_tag_from_language ("IPPH", "und-fonipa"); + test_tag_from_language ("IPPH", "zh-fonipa"); + test_tag_to_language ("IPPH", "und-fonipa"); + /* Test that x-hbot overrides the base language */ test_tag_from_language ("ABC", "fa-x-hbotabc-zxc"); test_tag_from_language ("ABC", "fa-ir-x-hbotabc-zxc");