X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Flanguage.c;h=168a27e46aa3e2cf748f2325e0f5b951f2cae906;hb=f853f44b40ad4a71ba13a6489e91bca1218a2f02;hp=449736b8111ea8ed4412460af95cb94e11f06cfe;hpb=83a9c822e560441cfb31f81326d4f41a425f004d;p=m17n%2Fm17n-lib.git diff --git a/src/language.c b/src/language.c index 449736b..168a27e 100644 --- a/src/language.c +++ b/src/language.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include "m17n.h" #include "m17n-misc.h" @@ -91,6 +92,57 @@ init_script_list (void) return 0; } +static MPlist * +load_lang_name (MSymbol target3, MSymbol target2) +{ + MPlist *plist, *pl, *p; + + plist = mplist (); + mplist_add (plist, Msymbol, target3); + pl = mdatabase_list (Mlanguage, Mname, target3, Mnil); + if (! pl && target2 != Mnil) + pl = mdatabase_list (Mlanguage, Mname, target2, Mnil); + if (pl) + { + MPLIST_DO (p, pl) + { + MDatabase *mdb = MPLIST_VAL (p); + MPlist *p0 = mdatabase_load (mdb), *p1, *territories; + MSymbol script = mdatabase_tag (mdb)[3]; + + if (MPLIST_PLIST_P (p0)) + { + p1 = MPLIST_PLIST (p0); + if (MPLIST_SYMBOL_P (p1) && MPLIST_SYMBOL (p1) == Mlanguage) + { + p1 = MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (p1)))); + territories = p1; + while (! MPLIST_TAIL_P (p1)) + { + if (MPLIST_SYMBOL_P (p1)) + p1 = MPLIST_NEXT (p1); + else + mplist__pop_unref (p1); + } + M17N_OBJECT_REF (territories); + mplist__pop_unref (p0); + } + else + territories = mplist (); + mplist_push (p0, Mplist, territories); + M17N_OBJECT_UNREF (territories); + mplist_push (p0, Msymbol, script); + mplist_add (plist, Mplist, p0); + M17N_OBJECT_UNREF (p0); + } + } + M17N_OBJECT_UNREF (pl); + } + mplist_push (langname_list, Mplist, plist); + M17N_OBJECT_UNREF (plist); + return plist; +} + /* Internal API */ @@ -180,9 +232,9 @@ mlanguage__info (MSymbol language) MText *mt = MPLIST_MTEXT (pl); if (mtext_nbytes (mt) == MSYMBOL_NAMELEN (language) - && memcmp (MTEXT_DATA (MPLIST_MTEXT (pl)), - MSYMBOL_NAME (language), - MSYMBOL_NAMELEN (language)) == 0) + && strncasecmp ((char *) MTEXT_DATA (MPLIST_MTEXT (pl)), + MSYMBOL_NAME (language), + MSYMBOL_NAMELEN (language)) == 0) return MPLIST_PLIST (plist); } } @@ -299,15 +351,15 @@ MSymbol Miso639_1, Miso639_2; mscript_list (). */ /***ja - @brief 3$BJ8;z8@8l%3!<%I$r%j%9%H$9$k(B. + @brief 3ʸ»ú¸À¸ì¥³¡¼¥É¤ò¥ê¥¹¥È¤¹¤ë. - $B4X?t(B mlanguage_list () $B$O!"@07A<0(B (well-formed) plist $B$rJV$9!#3F%-!<(B - $B$O(B #Msymbol $B$G$"$j!"8D!9$NCM$O(B ISO639-2 $B$KDj$a$i$l$?(B3$BJ8;z8@8l%3!<(B - $B%I$rL>A0$H$9$k%7%s%\%k$G$"$k!#(B + ´Ø¿ô mlanguage_list () ¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥­¡¼ + ¤Ï #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃÍ¤Ï ISO639-2 ¤ËÄê¤á¤é¤ì¤¿3ʸ»ú¸À¸ì¥³¡¼ + ¥É¤ò̾Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ @return - $B$3$N4X?t$,JV$9(B plist $B$O!"8F$S=P$7B&$,(B m17n_object_unref () $B$r;H$C(B - $B$F2rJ|$9$kI,MW$,$"$k!#(B + ¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ plist ¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤¬ m17n_object_unref () ¤ò»È¤Ã + ¤Æ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£ @seealso mscript_list (). */ @@ -350,25 +402,25 @@ mlanguage_list (void) symbol. Otherwise, it returns #Mnil. @seealso - mlanguage_names (), mlanguage_text (). */ + mlanguage_name_list (), mlanguage_text (). */ /***ja - @brief $B8@8l%3!<%I$rF@$k(B. + @brief ¸À¸ì¥³¡¼¥É¤òÆÀ¤ë. - $B4X?t(B mlanguage_code () $B$O!"(B$LANGUAGE $B$KBP1~$7$?(B ISO-639 $B8@8l%3!<%I(B - $B$,L>A0$G$"$k$h$&$J%7%s%\%k$rJV$9!#(B$LANGUAGE $B$O%7%s%\%k$G$"$j!"$=$N(B - $BL>A0$O!"(BISO639-2 3$BJ8;z8@8l%3!<%I!"(BISO639-1 2$BJ8;z8@8l%3!<%I!"1Q8lL>!"(B - $B$N$$$:$l$+$G$"$k!#(B + ´Ø¿ô mlanguage_code () ¤Ï¡¢$LANGUAGE ¤ËÂбþ¤·¤¿ ISO-639 ¸À¸ì¥³¡¼¥É + ¤¬Ì¾Á°¤Ç¤¢¤ë¤è¤¦¤Ê¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£$LANGUAGE ¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤½¤Î + ̾Á°¤Ï¡¢ISO639-2 3ʸ»ú¸À¸ì¥³¡¼¥É¡¢ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¡¢±Ñ¸ì̾¡¢ + ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£ - $LEN $B$OJV$5$l$k8@8l%3!<%I$Nl9g$O(B - ISO639-2 3$BJ8;z8@8l%3!<%I$,JV$5$l$k!#(B2$B$N>l9g$O!"$b$7Dj5A$5$l$F$$$l(B - $B$P(B ISO639-1 2$BJ8;z8@8l%3!<%I$,!"$=$&$G$J$1$l$P(B #Mnil $B$,JV$5$l$k!#(B0 - $B$N>l9g$O!"$b$7Dj5A$5$l$F$$$l$P(B2$BJ8;z%3!<%I$,!"$=$&$G$J$1$l$P(B3$BJ8;z%3!<(B - $B%I$,JV$5$l$k!#(B + $LEN ¤ÏÊÖ¤µ¤ì¤ë¸À¸ì¥³¡¼¥É¤Î¼ïÎà¤ò·èÄꤹ¤ë¡£$LEN ¤¬3¤Î¾ì¹ç¤Ï + ISO639-2 3ʸ»ú¸À¸ì¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤ë¡£2¤Î¾ì¹ç¤Ï¡¢¤â¤·ÄêµÁ¤µ¤ì¤Æ¤¤¤ì + ¤Ð ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¤¬¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤¬ÊÖ¤µ¤ì¤ë¡£0 + ¤Î¾ì¹ç¤Ï¡¢¤â¤·ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð2ʸ»ú¥³¡¼¥É¤¬¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð3ʸ»ú¥³¡¼ + ¥É¤¬ÊÖ¤µ¤ì¤ë¡£ @return - $B$b$7>pJs$,F@$i$l$l$P!"$3$N4X?t$O(B #Mnil $B0J30$N%7%s%\%k$rJV$9!#$=$&(B - $B$G$J$1$l$P(B #Mnil $B$rJV$9!#(B + ¤â¤·¾ðÊó¤¬ÆÀ¤é¤ì¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ï #Mnil °Ê³°¤Î¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£¤½¤¦ + ¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤òÊÖ¤¹¡£ @seealso mlanguage_name (), mlanguage_text (). */ @@ -398,78 +450,153 @@ mlanguage_code (MSymbol language, int len) @brief Return the language names written in the specified language. The mlanguage_name_list () function returns a plist of LANGUAGE's - names written in TARGET language. + names written in TARGET language. SCRIPT and TERRITORY, if not #Mnil, + specifies which script and territory to concern at first. LANGUAGE and TARGET must be a symbol whose name is an ISO639-2 3-letter language code or an ISO639-1 2-letter language codes. TARGET may be #Mnil, in which case, the language of the current locale is used. If locale is not set or is C, English is used. + SCRIPT and TERRITORY must be a symbol whose name is a script and + territory name of a locale (e.g. "TW", "SG") respectively. + @return - If the information is available, this function returns a non-empty - plist whose keys are #Mtext and values are M-texts of the - translated language names. Otherwise, @c NULL is returned. + If the translation is available, this function returns a non-empty + plist. The first element has key #MText and the value is an + M-text of a translated language name. If the succeeding elements + also have key #MText, their values are M-texts of alternate + translations. + + If no translation is available, @c NULL is returned. + The returned plist should not be modified nor freed. @seealso mlanguage_code (), mlanguage_text (). */ MPlist * -mlanguage_name_list (MSymbol language, MSymbol target) +mlanguage_name_list (MSymbol language, MSymbol target, + MSymbol script, MSymbol territory) { - MPlist *plist; + MPlist *plist, *pl; + MSymbol language2, target2; plist = mlanguage__info (language); if (! plist) return NULL; - language = mplist_value (plist); + language = MPLIST_SYMBOL (plist); + language2 = MPLIST_SYMBOL (MPLIST_NEXT (plist)); if (target != Mnil) { plist = mlanguage__info (target); if (! plist) return NULL; - target = mplist_value (plist); + target = MPLIST_SYMBOL (plist); + target2 = MPLIST_SYMBOL (MPLIST_NEXT (plist)); } else { MLocale *locale = mlocale_set (LC_MESSAGES, NULL); if (! locale) - target = msymbol ("eng"); + { + target = msymbol ("eng"); + target2 = msymbol ("en"); + script = territory = Mnil; + } else { target = mlocale_get_prop (locale, Mlanguage); plist = mlanguage__info (target); if (! plist) return NULL; - target = mplist_value (plist); + target = MPLIST_SYMBOL (plist); + target2 = MPLIST_SYMBOL (MPLIST_NEXT (plist)); + script = mlocale_get_prop (locale, Mscript); + territory = mlocale_get_prop (locale, Mterritory); } } - /* Now both LANGUAGE and TARGET are 3-letter codes. */ - if (langname_list) - plist = mplist_get (langname_list, target); + /* Now both LANGUAGE and TARGET are 3-letter codes. */ + if (! langname_list) + langname_list = mplist (); + plist = mplist__assq (langname_list, target); + if (plist) + plist = MPLIST_PLIST (plist); else - langname_list = mplist (), plist = NULL; - if (! plist) + plist = load_lang_name (target, target2); + + /* PLIST = (TARGET (SCRIPT (TERRITORY ...) (LANG-CODE NAME ...) ...) ...) */ + plist = MPLIST_NEXT (plist); + if (MPLIST_TAIL_P (plist)) + return NULL; + + MPLIST_DO (pl, plist) + { + MPlist *p = MPLIST_PLIST (pl), *p0; + + if (MPLIST_SYMBOL (p) == script + && (territory == Mnil + || mplist_find_by_value (MPLIST_PLIST (MPLIST_NEXT (p)), + territory)) + && (p = MPLIST_NEXT (MPLIST_NEXT (p))) + && ((p0 = mplist__assq (p, language)) + || (p0 = mplist__assq (p, language2)))) + { + plist = p0; + break; + } + } + if (MPLIST_TAIL_P (pl)) { - MDatabase *mdb = mdatabase_find (Mlanguage, Mname, target, Mnil); + MPLIST_DO (pl, plist) + { + MPlist *p = MPLIST_NEXT (MPLIST_PLIST (pl)), *p0; + + if ((territory == Mnil + || mplist_find_by_value (MPLIST_VAL (p), territory)) + && (p = MPLIST_NEXT (MPLIST_NEXT (p))) + && ((p0 = mplist__assq (p, language)) + || (p0 = mplist__assq (p, language2)))) + { + plist = p0; + break; + } + } + if (MPLIST_TAIL_P (pl)) + { + MPLIST_DO (pl, plist) + { + MPlist *p = MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (pl))), *p0; + + if ((p0 = mplist__assq (p, language)) + || (p0 = mplist__assq (p, language2))) + { + plist = p0; + break; + } + } + if (MPLIST_TAIL_P (pl)) + return NULL; + } + } - if (! mdb - || ! (plist = mdatabase_load (mdb))) - plist = mplist (); - else - mplist__pop_unref (plist); - langname_list = mplist_push (langname_list, target, plist); - MPLIST_SET_NESTED_P (langname_list); + plist = MPLIST_NEXT (MPLIST_PLIST (plist)); + if (territory != Mnil) + { + MPLIST_DO (pl, MPLIST_NEXT (plist)) + if (MPLIST_SYMBOL_P (pl) && MPLIST_SYMBOL (pl) == territory) + break; + if (! MPLIST_TAIL_P (pl) + && (pl = MPLIST_NEXT (pl)) + && MPLIST_MTEXT_P (pl)) + return pl; } - /* PLIST == ((LANGUAGE TRANSLATED) ...) */ - plist = mplist__assq (plist, language); - if (! plist || MPLIST_TAIL_P (plist)) - return NULL; - plist = MPLIST_PLIST (plist); - plist = MPLIST_NEXT (plist); - return plist; + MPLIST_DO (plist, plist) + if (MPLIST_MTEXT_P (plist)) + break; + return (MPLIST_MTEXT_P (plist) ? plist : NULL); } /*=*/ @@ -493,16 +620,16 @@ mlanguage_name_list (MSymbol language, MSymbol target) mlanguage_code (), mlanguage_name (). */ /***ja - @brief $BM?$($i$l$?8@8l<+?H$G=q$+$l$?8@8lL>$rJV$9(B. + @brief Í¿¤¨¤é¤ì¤¿¸À¸ì¼«¿È¤Ç½ñ¤«¤ì¤¿¸À¸ì̾¤òÊÖ¤¹. - $B4X?t(B mlanguage_text () $B$O!"8@8l(B $LANGUAGE $B$G=q$+$l$?(B $LANGUAGE $B$N(B - $BL>A0$r(B M-text $B$N7A<0$GJV$9!#$=$N8@8l$NBeI=E*$JJ8;z$,$o$+$C$F$$$k>l(B - $B9g$O!"JV$5$l$k(B M-text $B$N3FJ8;z$K!"%-!<$,(B #Mtext $B$GCM$,$=$NBeI=E*$J(B - $BJ8;z$r4^$`(B M-text $B$G$"$k$h$&$J%F%-%9%H%W%m%Q%F%#$,IU2C$5$l$k!#(B + ´Ø¿ô mlanguage_text () ¤Ï¡¢¸À¸ì $LANGUAGE ¤Ç½ñ¤«¤ì¤¿ $LANGUAGE ¤Î + ̾Á°¤ò M-text ¤Î·Á¼°¤ÇÊÖ¤¹¡£¤½¤Î¸À¸ì¤ÎÂåɽŪ¤Êʸ»ú¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì + ¹ç¤Ï¡¢ÊÖ¤µ¤ì¤ë M-text ¤Î³Æʸ»ú¤Ë¡¢¥­¡¼¤¬ #Mtext ¤ÇÃͤ¬¤½¤ÎÂåɽŪ¤Ê + ʸ»ú¤ò´Þ¤à M-text ¤Ç¤¢¤ë¤è¤¦¤Ê¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬Éղ䵤ì¤ë¡£ @return - $B5a$a$k>pJs$,F@$i$l$?>l9g!"$3$N4X?t$,JV$9(B M-text $B$rJQ99$7$?$j2rJ|$7(B - $B$?$j$7$F$O$$$1$J$$!#>pJs$,F@$i$l$J$+$C$?>l9g$O(B @c NULL $B$,JV$5$l$k!#(B + µá¤á¤ë¾ðÊó¤¬ÆÀ¤é¤ì¤¿¾ì¹ç¡¢¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ M-text ¤òÊѹ¹¤·¤¿¤ê²òÊü¤· + ¤¿¤ê¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¡£¾ðÊó¤¬ÆÀ¤é¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï @c NULL ¤¬ÊÖ¤µ¤ì¤ë¡£ @seealso mlanguage_code (), mlanguage_name (). */ @@ -549,15 +676,15 @@ mlanguage_text (MSymbol language) mscript_language_list (), mlanguage_list (). */ /***ja - @brief $B%9%/%j%W%HL>$r%j%9%H$9$k(B. + @brief ¥¹¥¯¥ê¥×¥È̾¤ò¥ê¥¹¥È¤¹¤ë. - $B4X?t(B mscript_list () $B$O!"@07A<0(B (well-formed) plist $B$rJV$9!#3F%-!<(B - $B$O(B #Msymbol $B$G$"$j!"8D!9$NCM$O%9%/%j%W%HL>$rL>A0$H$9$k%7%s%\%k$G$"(B - $B$k!#(B + ´Ø¿ô mscript_list () ¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥­¡¼ + ¤Ï #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃͤϥ¹¥¯¥ê¥×¥È̾¤ò̾Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢ + ¤ë¡£ @return - $B$3$N4X?t$,JV$9(B plist $B$O!"8F$S=P$7B&$,(B m17n_object_unref () $B$r;H$C(B - $B$F2rJ|$9$kI,MW$,$"$k!#(B + ¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ plist ¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤¬ m17n_object_unref () ¤ò»È¤Ã + ¤Æ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£ @seealso mscript_language_list (), mlanguage_list (). */ @@ -601,17 +728,18 @@ mscript_list (void) mscript_list (), mlanguage_list (). */ /***ja - @brief $BM?$($i$l$?%9%/%j%W%H$rMQ$$$k8@8l$r%j%9%H$9$k(B. + @brief Í¿¤¨¤é¤ì¤¿¥¹¥¯¥ê¥×¥È¤òÍѤ¤¤ë¸À¸ì¤ò¥ê¥¹¥È¤¹¤ë. - $B4X?t(B mscript_language_list () $B$O!"(B$SCRIPT $B$rMQ$$$k8@8l$r%j%9%H$9$k!#(B - $SCRIPT $B$O%7%s%\%k$G!"$=$NL>A0$O(B Unicode Character Database $B$K<($5(B - $B$l$F$$$k%9%/%j%W%HL>$r$9$Y$F>.J8;z$K$7$?$b$N$G$"$k!#(B + ´Ø¿ô mscript_language_list () ¤Ï¡¢$SCRIPT ¤òÍѤ¤¤ë¸À¸ì¤ò¥ê¥¹¥È¤¹¤ë¡£ + $SCRIPT ¤Ï¥·¥ó¥Ü¥ë¤Ç¡¢¤½¤Î̾Á°¤Ï Unicode Character Database ¤Ë¼¨¤µ + ¤ì¤Æ¤¤¤ë¥¹¥¯¥ê¥×¥È̾¤ò¤¹¤Ù¤Æ¾®Ê¸»ú¤Ë¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£ - @return $B$3$N4X?t$O!"@07A<0(B (well-formed) plist $B$rJV$9!#3F%-!<$O(B - #Msymbol $B$G$"$j!"8D!9$NCM$O(B ISO639-1 $B$KDj$a$i$l$?(B2$BJ8;z8@8l%3!<%I(B - ($BDj5A$5$l$F$$$J$$>l9g$O(B ISO639-2 $B$KDj$a$i$l$?(B3$BJ8;z8@8l%3!<%I(B) $B$rL>(B - $BA0$H$9$k%7%s%\%k$G$"$k!#JV$5$l$k(B plist $B$OJQ99$7$?$j2rJ|$7$?$j$7$F(B - $B$O$J$i$J$$!#(B$SCRIPT $B$,L$CN$N>l9g$O(B @c NULL $B$,JV$5$l$k!#(B + @return + ¤³¤Î´Ø¿ô¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥­¡¼¤Ï + #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃÍ¤Ï ISO639-1 ¤ËÄê¤á¤é¤ì¤¿2ʸ»ú¸À¸ì¥³¡¼¥É + (ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï ISO639-2 ¤ËÄê¤á¤é¤ì¤¿3ʸ»ú¸À¸ì¥³¡¼¥É) ¤ò̾ + Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ÊÖ¤µ¤ì¤ë plist ¤ÏÊѹ¹¤·¤¿¤ê²òÊü¤·¤¿¤ê¤·¤Æ + ¤Ï¤Ê¤é¤Ê¤¤¡£$SCRIPT ¤¬Ì¤ÃΤξì¹ç¤Ï @c NULL ¤¬ÊÖ¤µ¤ì¤ë¡£ @seealso mscript_list (), mlanguage_list (). */ @@ -635,7 +763,7 @@ mscript_language_list (MSymbol script) @name Obsolete functions */ /***ja - @name Obsolete $B$J4X?t(B + @name Obsolete ¤Ê´Ø¿ô */ /*** @{ */ @@ -657,15 +785,15 @@ mscript_language_list (MSymbol script) mlanguage_code (), mlanguage_text (). */ /***ja - @brief $B8@8l$N1Q8lL>$rF@$k(B. + @brief ¸À¸ì¤Î±Ñ¸ì̾¤òÆÀ¤ë. - $B4X?t(B mlanguage_name () $B$O!"(B$LANGUAGE $B$N1Q8lL>$rL>A0$H$9$k$h$&$J%7(B - $B%s%\%k$rJV$9!#(B$LANGUAGE $B$O%7%s%\%k$G$"$j!"$=$NL>A0$O!"(BISO639-2 3$BJ8(B - $B;z8@8l%3!<%I!"(BISO639-1 2$BJ8;z8@8l%3!<%I!"1Q8lL>!"$N$$$:$l$+$G$"$k!#(B + ´Ø¿ô mlanguage_name () ¤Ï¡¢$LANGUAGE ¤Î±Ñ¸ì̾¤ò̾Á°¤È¤¹¤ë¤è¤¦¤Ê¥· + ¥ó¥Ü¥ë¤òÊÖ¤¹¡£$LANGUAGE ¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤½¤Î̾Á°¤Ï¡¢ISO639-2 3ʸ + »ú¸À¸ì¥³¡¼¥É¡¢ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¡¢±Ñ¸ì̾¡¢¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£ @return - $B5a$a$F$$$k>pJs$,F@$i$l$k$J$i!"$3$N4X?t$O(B #Mnil $B0J30$N%7%s%\%k$rJV(B - $B$9!#$=$&$G$J$1$l$P(B #Mnil $B$rJV$9!#(B + µá¤á¤Æ¤¤¤ë¾ðÊó¤¬ÆÀ¤é¤ì¤ë¤Ê¤é¡¢¤³¤Î´Ø¿ô¤Ï #Mnil °Ê³°¤Î¥·¥ó¥Ü¥ë¤òÊÖ + ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤òÊÖ¤¹¡£ @seealso mlanguage_code (), mlanguage_text (). */ @@ -675,6 +803,7 @@ mlanguage_name (MSymbol language) { MPlist *plist = mlanguage__info (language); MText *mt; + char *str; if (! plist) /* 3-letter code */ return Mnil; @@ -682,16 +811,19 @@ mlanguage_name (MSymbol language) if (MPLIST_TAIL_P (plist)) return Mnil; plist = MPLIST_NEXT (plist); /* english name */ - if (MPLIST_MTEXT_P (plist)) + if (! MPLIST_MTEXT_P (plist)) return Mnil; mt = MPLIST_MTEXT (plist); - if (mtext_nbytes (mt) != MSYMBOL_NAMELEN (language) - || memcmp (MTEXT_DATA (MPLIST_MTEXT (plist)), - MSYMBOL_NAME (language), - MSYMBOL_NAMELEN (language))) - return Mnil; - return language; + str = alloca (mtext_nbytes (mt)); + memcpy (str, MTEXT_DATA (mt), mtext_nbytes (mt)); + str[0] = tolower (str[0]); + return msymbol__with_len (str, mtext_nbytes (mt)); } /*=*/ +/* + Local Variables: + coding: euc-japan + End: +*/