1 /* language.c -- language (and script) module.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
29 #include "m17n-misc.h"
36 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
38 static MPlist *language_list;
39 static MPlist *script_list;
40 static MPlist *langname_list;
43 load_lang_script_list (MSymbol tag0, MSymbol tag1, MSymbol tag2, MSymbol tag3)
45 MDatabase *mdb = mdatabase_find (tag0, tag1, tag2, tag3);
46 MPlist *plist, *pl, *p;
49 || ! (plist = mdatabase_load (mdb)))
51 /* Check at least if the plist is ((SYMBOL ...) ...). */
52 for (pl = plist; ! MPLIST_TAIL_P (pl);)
54 if (! MPLIST_PLIST_P (pl))
55 mplist__pop_unref (pl);
58 p = MPLIST_PLIST (pl);
59 if (! MPLIST_SYMBOL_P (p))
60 mplist__pop_unref (pl);
62 pl = MPLIST_NEXT (pl);
69 init_language_list (void)
71 language_list = load_lang_script_list (msymbol ("standard"), Mlanguage,
72 msymbol ("iso639"), Mnil);
75 language_list = mplist ();
76 MERROR (MERROR_DB, -1);
83 init_script_list (void)
85 script_list = load_lang_script_list (msymbol ("standard"), Mscript,
86 msymbol ("unicode"), Mnil);
89 script_list = mplist ();
90 MERROR (MERROR_DB, -1);
96 load_lang_name (MSymbol target3, MSymbol target2)
98 MPlist *plist, *pl, *p;
101 mplist_add (plist, Msymbol, target3);
102 pl = mdatabase_list (Mlanguage, Mname, target3, Mnil);
103 if (! pl && target2 != Mnil)
104 pl = mdatabase_list (Mlanguage, Mname, target2, Mnil);
109 MDatabase *mdb = MPLIST_VAL (p);
110 MPlist *p0 = mdatabase_load (mdb), *p1, *territories;
111 MSymbol script = mdatabase_tag (mdb)[3];
113 if (MPLIST_PLIST_P (p0))
115 p1 = MPLIST_PLIST (p0);
116 if (MPLIST_SYMBOL_P (p1) && MPLIST_SYMBOL (p1) == Mlanguage)
118 p1 = MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (MPLIST_NEXT (p1))));
120 while (! MPLIST_TAIL_P (p1))
122 if (MPLIST_SYMBOL_P (p1))
123 p1 = MPLIST_NEXT (p1);
125 mplist__pop_unref (p1);
127 M17N_OBJECT_REF (territories);
128 mplist__pop_unref (p0);
131 territories = mplist ();
132 mplist_push (p0, Mplist, territories);
133 M17N_OBJECT_UNREF (territories);
134 mplist_push (p0, Msymbol, script);
135 mplist_add (plist, Mplist, p0);
136 M17N_OBJECT_UNREF (p0);
139 M17N_OBJECT_UNREF (pl);
141 mplist_push (langname_list, Mplist, plist);
142 M17N_OBJECT_UNREF (plist);
152 msymbol_put_func (Mlanguage, Mtext_prop_serializer,
153 M17N_FUNC (msymbol__serializer));
154 msymbol_put_func (Mlanguage, Mtext_prop_deserializer,
155 M17N_FUNC (msymbol__deserializer));
156 Miso639_2 = msymbol ("iso639-2");
157 Miso639_1 = msymbol ("iso639-1");
159 language_list = script_list = langname_list = NULL;
166 M17N_OBJECT_UNREF (language_list);
167 M17N_OBJECT_UNREF (script_list);
168 M17N_OBJECT_UNREF (langname_list);
174 @brief Get information about a language.
176 The mlanguage_info () function returns a well-formed @e plist that
177 contains information about $LANGUAGE. $LANGUAGE is a symbol whose
178 name is an ISO639-2 3-letter language code, an ISO639-1 2-letter
179 language codes, or an English word.
181 The format of the plist is:
184 (ISO639-2 [ISO639-1 | nil] ENGLISH-NAME ["NATIVE-NAME" | nil]
185 ["REPRESENTATIVE-CHARACTERS"])
188 where, ISO639-2 is a symbol whose name is 3-letter language code
189 of ISO639-2, ISO639-1 is a symbol whose name is 2-letter language
190 code of ISO639-1, ENGLISH-NAME is a symbol whose name is the
191 English name of the language, "NATIVE-NAME" is an M-text written
192 by the most natural way in the language,
193 "REPRESENTATIVE-CHARACTERS" is an M-text that contains
194 representative characters used by the language.
196 It is assured that the formats of both M-texts are
200 If the information is available, this function returns a plist
201 that should not be modified nor freed. Otherwise, it returns
208 mlanguage__info (MSymbol language)
213 && init_language_list () < 0)
216 MPLIST_DO (plist, language_list)
218 MPlist *pl = MPLIST_PLIST (plist);
220 if (MPLIST_SYMBOL (pl) == language)
222 if (MPLIST_TAIL_P (pl))
224 pl = MPLIST_NEXT (pl);
225 if (MPLIST_SYMBOL_P (pl) && MPLIST_SYMBOL (pl) == language)
226 return MPLIST_PLIST (plist);
227 if (MPLIST_TAIL_P (pl))
229 pl = MPLIST_NEXT (pl);
230 if (MPLIST_MTEXT_P (pl))
232 MText *mt = MPLIST_MTEXT (pl);
234 if (mtext_nbytes (mt) == MSYMBOL_NAMELEN (language)
235 && strncasecmp ((char *) MTEXT_DATA (MPLIST_MTEXT (pl)),
236 MSYMBOL_NAME (language),
237 MSYMBOL_NAMELEN (language)) == 0)
238 return MPLIST_PLIST (plist);
245 mscript__info (MSymbol script)
250 && init_script_list () < 0)
252 MPLIST_DO (plist, script_list)
254 MPlist *pl = MPLIST_PLIST (plist);
256 if (MPLIST_SYMBOL (pl) == script)
263 mscript__char_list (MSymbol name)
265 MPlist *plist = mscript__info (name);
267 if (plist /* script name */
268 && (plist = MPLIST_NEXT (plist)) /* language list */
269 && ! MPLIST_TAIL_P (plist)
270 && (plist = MPLIST_NEXT (plist)) /* char list */
271 && MPLIST_PLIST_P (plist))
272 return MPLIST_PLIST (plist);
277 mscript__otf_tag (MSymbol script)
279 MPlist *plist = mscript__info (script);
281 if (plist /* script name */
282 && (plist = MPLIST_NEXT (plist)) /* language list */
283 && ! MPLIST_TAIL_P (plist)
284 && (plist = MPLIST_NEXT (plist)) /* char list */
285 && ! MPLIST_TAIL_P (plist)
286 && (plist = MPLIST_NEXT (plist)) /* otf tag */
287 && MPLIST_SYMBOL_P (plist))
288 return MPLIST_SYMBOL (plist);
293 mscript__from_otf_tag (MSymbol otf_tag)
296 /* As it is expected that this function is called in a sequence with
297 the same argument, we use a cache. */
298 static MSymbol last_otf_tag, script;
302 last_otf_tag = script = Mnil;
303 if (init_script_list () < 0)
306 if (otf_tag == last_otf_tag)
308 last_otf_tag = otf_tag;
310 MPLIST_DO (plist, script_list)
312 MPlist *pl = MPLIST_PLIST (plist), *p;
314 if (pl /* script name */
315 && (p = MPLIST_NEXT (pl)) /* language tag */
316 && ! MPLIST_TAIL_P (p)
317 && (p = MPLIST_NEXT (p)) /* char list */
318 && ! MPLIST_TAIL_P (p)
319 && (p = MPLIST_NEXT (p)) /* otf tag */
320 && ! MPLIST_TAIL_P (p))
322 if (MPLIST_SYMBOL_P (p))
324 if (otf_tag == MPLIST_SYMBOL (p))
325 return MPLIST_SYMBOL (pl);
327 else if (MPLIST_PLIST (p))
331 MPLIST_DO (p0, MPLIST_PLIST (p))
332 if (MPLIST_SYMBOL_P (p0) && otf_tag == MPLIST_SYMBOL (p0))
333 return MPLIST_SYMBOL (pl);
340 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
345 MSymbol Miso639_1, Miso639_2;
350 @brief List 3-letter language codes.
352 The mlanguage_list () funciton returns a well-formed plist whose
353 keys are #Msymbol and values are symbols whose names are ISO639-2
354 3-letter language codes.
357 This function returns a plist. The caller should free it by
358 m17n_object_unref ().
364 @brief 3ʸ»ú¸À¸ì¥³¡¼¥É¤ò¥ê¥¹¥È¤¹¤ë.
366 ´Ø¿ô mlanguage_list () ¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥¡¼
367 ¤Ï #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃÍ¤Ï ISO639-2 ¤ËÄê¤á¤é¤ì¤¿3ʸ»ú¸À¸ì¥³¡¼
368 ¥É¤ò̾Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£
371 ¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ plist ¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤¬ m17n_object_unref () ¤ò»È¤Ã
372 ¤Æ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£
378 mlanguage_list (void)
380 MPlist *plist, *pl, *p, *p0;
383 && init_language_list () < 0)
385 plist = pl = mplist ();
386 MPLIST_DO (p, language_list)
388 p0 = MPLIST_PLIST (p);
389 pl = mplist_add (pl, Msymbol, MPLIST_VAL (p0));
397 @brief Get a language code.
399 The mlanguage_code () function returns a symbol whose name is the
400 ISO639 language code of $LANGUAGE. $LANGUAGE is a symbol whose
401 name is an ISO639-2 3-letter language code, an ISO639-1 2-letter
402 language codes, or an English word.
404 $LEN specifies the type of the returned language code. If it is
405 3, an ISO639-2 3-letter language code is returned. If it is 2, an
406 ISO639-1 2-letter language code is returned when defined;
407 otherwise #Mnil is returned. If it is 0, a 2-letter code is
408 returned when defined; otherwise a 3-letter code is returned.
411 If the information is available, this function returns a non-#Mnil
412 symbol. Otherwise, it returns #Mnil.
415 mlanguage_name_list (), mlanguage_text (). */
418 @brief ¸À¸ì¥³¡¼¥É¤òÆÀ¤ë.
420 ´Ø¿ô mlanguage_code () ¤Ï¡¢$LANGUAGE ¤ËÂбþ¤·¤¿ ISO-639 ¸À¸ì¥³¡¼¥É
421 ¤¬Ì¾Á°¤Ç¤¢¤ë¤è¤¦¤Ê¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£$LANGUAGE ¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤½¤Î
422 ̾Á°¤Ï¡¢ISO639-2 3ʸ»ú¸À¸ì¥³¡¼¥É¡¢ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¡¢±Ñ¸ì̾¡¢
425 $LEN ¤ÏÊÖ¤µ¤ì¤ë¸À¸ì¥³¡¼¥É¤Î¼ïÎà¤ò·èÄꤹ¤ë¡£$LEN ¤¬3¤Î¾ì¹ç¤Ï
426 ISO639-2 3ʸ»ú¸À¸ì¥³¡¼¥É¤¬ÊÖ¤µ¤ì¤ë¡£2¤Î¾ì¹ç¤Ï¡¢¤â¤·ÄêµÁ¤µ¤ì¤Æ¤¤¤ì
427 ¤Ð ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¤¬¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤¬ÊÖ¤µ¤ì¤ë¡£0
428 ¤Î¾ì¹ç¤Ï¡¢¤â¤·ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð2ʸ»ú¥³¡¼¥É¤¬¡¢¤½¤¦¤Ç¤Ê¤±¤ì¤Ð3ʸ»ú¥³¡¼
432 ¤â¤·¾ðÊó¤¬ÆÀ¤é¤ì¤ì¤Ð¡¢¤³¤Î´Ø¿ô¤Ï #Mnil °Ê³°¤Î¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡£¤½¤¦
433 ¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤òÊÖ¤¹¡£
436 mlanguage_name (), mlanguage_text (). */
439 mlanguage_code (MSymbol language, int len)
441 MPlist *plist = mlanguage__info (language);
446 if (! MPLIST_SYMBOL_P (plist))
448 code = MPLIST_SYMBOL (plist);
451 plist = MPLIST_NEXT (plist);
452 return ((MPLIST_SYMBOL_P (plist) && MPLIST_SYMBOL (plist) != Mnil)
453 ? MPLIST_SYMBOL (plist)
454 : len == 0 ? code : Mnil);
460 @brief Return the language names written in the specified language.
462 The mlanguage_name_list () function returns a plist of LANGUAGE's
463 names written in TARGET language. SCRIPT and TERRITORY, if not #Mnil,
464 specifies which script and territory to concern at first.
466 LANGUAGE and TARGET must be a symbol whose name is an ISO639-2
467 3-letter language code or an ISO639-1 2-letter language codes.
468 TARGET may be #Mnil, in which case, the language of the current
469 locale is used. If locale is not set or is C, English is used.
471 SCRIPT and TERRITORY must be a symbol whose name is a script and
472 territory name of a locale (e.g. "TW", "SG") respectively.
475 If the translation is available, this function returns a non-empty
476 plist. The first element has key #MText and the value is an
477 M-text of a translated language name. If the succeeding elements
478 also have key #MText, their values are M-texts of alternate
481 If no translation is available, @c NULL is returned.
483 The returned plist should not be modified nor freed.
486 mlanguage_code (), mlanguage_text (). */
489 mlanguage_name_list (MSymbol language, MSymbol target,
490 MSymbol script, MSymbol territory)
493 MSymbol language2, target2;
495 plist = mlanguage__info (language);
498 language = MPLIST_SYMBOL (plist);
499 language2 = MPLIST_SYMBOL (MPLIST_NEXT (plist));
502 plist = mlanguage__info (target);
505 target = MPLIST_SYMBOL (plist);
506 target2 = MPLIST_SYMBOL (MPLIST_NEXT (plist));
510 MLocale *locale = mlocale_set (LC_MESSAGES, NULL);
514 target = msymbol ("eng");
515 target2 = msymbol ("en");
516 script = territory = Mnil;
520 target = mlocale_get_prop (locale, Mlanguage);
521 plist = mlanguage__info (target);
524 target = MPLIST_SYMBOL (plist);
525 target2 = MPLIST_SYMBOL (MPLIST_NEXT (plist));
526 script = mlocale_get_prop (locale, Mscript);
527 territory = mlocale_get_prop (locale, Mterritory);
531 /* Now both LANGUAGE and TARGET are 3-letter codes. */
533 langname_list = mplist ();
534 plist = mplist__assq (langname_list, target);
536 plist = MPLIST_PLIST (plist);
538 plist = load_lang_name (target, target2);
540 /* PLIST = (TARGET (SCRIPT (TERRITORY ...) (LANG-CODE NAME ...) ...) ...) */
541 plist = MPLIST_NEXT (plist);
542 if (MPLIST_TAIL_P (plist))
545 MPLIST_DO (pl, plist)
547 MPlist *p = MPLIST_PLIST (pl), *p0;
549 if (MPLIST_SYMBOL (p) == script
550 && (territory == Mnil
551 || mplist_find_by_value (MPLIST_PLIST (MPLIST_NEXT (p)),
553 && (p = MPLIST_NEXT (MPLIST_NEXT (p)))
554 && ((p0 = mplist__assq (p, language))
555 || (p0 = mplist__assq (p, language2))))
561 if (MPLIST_TAIL_P (pl))
563 MPLIST_DO (pl, plist)
565 MPlist *p = MPLIST_NEXT (MPLIST_PLIST (pl)), *p0;
567 if ((territory == Mnil
568 || mplist_find_by_value (MPLIST_VAL (p), territory))
569 && (p = MPLIST_NEXT (MPLIST_NEXT (p)))
570 && ((p0 = mplist__assq (p, language))
571 || (p0 = mplist__assq (p, language2))))
577 if (MPLIST_TAIL_P (pl))
579 MPLIST_DO (pl, plist)
581 MPlist *p = MPLIST_NEXT (MPLIST_NEXT (MPLIST_PLIST (pl))), *p0;
583 if ((p0 = mplist__assq (p, language))
584 || (p0 = mplist__assq (p, language2)))
590 if (MPLIST_TAIL_P (pl))
595 plist = MPLIST_NEXT (MPLIST_PLIST (plist));
596 if (territory != Mnil)
598 MPLIST_DO (pl, MPLIST_NEXT (plist))
599 if (MPLIST_SYMBOL_P (pl) && MPLIST_SYMBOL (pl) == territory)
601 if (! MPLIST_TAIL_P (pl)
602 && (pl = MPLIST_NEXT (pl))
603 && MPLIST_MTEXT_P (pl))
606 MPLIST_DO (plist, plist)
607 if (MPLIST_MTEXT_P (plist))
609 return (MPLIST_MTEXT_P (plist) ? plist : NULL);
615 @brief Return the language name written in that language.
617 The mlanguage_text () function returns, in the form of M-text, the
618 language name of $LANGUAGE written in $LANGUAGE. If the
619 representative characters of the language are known, the
620 characters of the returned M-text has a text property whose key is
621 #Mtext and whose value is an M-text that contains the
622 representative characters.
625 If the information is available, this function returns an M-text
626 that should not be modified nor freed. Otherwise, it returns @c
630 mlanguage_code (), mlanguage_name (). */
633 @brief Í¿¤¨¤é¤ì¤¿¸À¸ì¼«¿È¤Ç½ñ¤«¤ì¤¿¸À¸ì̾¤òÊÖ¤¹.
635 ´Ø¿ô mlanguage_text () ¤Ï¡¢¸À¸ì $LANGUAGE ¤Ç½ñ¤«¤ì¤¿ $LANGUAGE ¤Î
636 ̾Á°¤ò M-text ¤Î·Á¼°¤ÇÊÖ¤¹¡£¤½¤Î¸À¸ì¤ÎÂåɽŪ¤Êʸ»ú¤¬¤ï¤«¤Ã¤Æ¤¤¤ë¾ì
637 ¹ç¤Ï¡¢ÊÖ¤µ¤ì¤ë M-text ¤Î³Æʸ»ú¤Ë¡¢¥¡¼¤¬ #Mtext ¤ÇÃͤ¬¤½¤ÎÂåɽŪ¤Ê
638 ʸ»ú¤ò´Þ¤à M-text ¤Ç¤¢¤ë¤è¤¦¤Ê¥Æ¥¥¹¥È¥×¥í¥Ñ¥Æ¥£¤¬Éղ䵤ì¤ë¡£
641 µá¤á¤ë¾ðÊó¤¬ÆÀ¤é¤ì¤¿¾ì¹ç¡¢¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ M-text ¤òÊѹ¹¤·¤¿¤ê²òÊü¤·
642 ¤¿¤ê¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¡£¾ðÊó¤¬ÆÀ¤é¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï @c NULL ¤¬ÊÖ¤µ¤ì¤ë¡£
645 mlanguage_code (), mlanguage_name (). */
648 mlanguage_text (MSymbol language)
650 MPlist *plist = mlanguage__info (language);
655 plist = MPLIST_NEXT (plist);
656 if (MPLIST_TAIL_P (plist))
658 plist = MPLIST_NEXT (plist);
659 if (MPLIST_TAIL_P (plist))
661 plist = MPLIST_NEXT (plist);
662 if (! MPLIST_MTEXT_P (plist))
664 mt = MPLIST_MTEXT (plist);
665 if (mtext_nchars (mt) == 0)
667 plist = MPLIST_NEXT (plist);
668 if (MPLIST_MTEXT_P (plist)
669 && ! mtext_get_prop (mt, 0, Mtext))
670 mtext_put_prop (mt, 0, mtext_nchars (mt), Mtext, MPLIST_MTEXT (plist));
675 @brief List script names.
677 The mscript_list () funciton returns a well-formed plist whose
678 keys are #Msymbol and values are symbols whose names are script
682 This function returns a plist. The caller should free it by
683 m17n_object_unref ().
686 mscript_language_list (), mlanguage_list (). */
689 @brief ¥¹¥¯¥ê¥×¥È̾¤ò¥ê¥¹¥È¤¹¤ë.
691 ´Ø¿ô mscript_list () ¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥¡¼
692 ¤Ï #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃͤϥ¹¥¯¥ê¥×¥È̾¤ò̾Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢
696 ¤³¤Î´Ø¿ô¤¬ÊÖ¤¹ plist ¤Ï¡¢¸Æ¤Ó½Ð¤·Â¦¤¬ m17n_object_unref () ¤ò»È¤Ã
697 ¤Æ²òÊü¤¹¤ëɬÍפ¬¤¢¤ë¡£
700 mscript_language_list (), mlanguage_list (). */
705 MPlist *plist, *pl, *p, *p0;
708 && init_script_list () < 0)
710 plist = pl = mplist ();
711 MPLIST_DO (p, script_list)
713 p0 = MPLIST_PLIST (p);
714 pl = mplist_add (pl, Msymbol, MPLIST_VAL (p0));
722 @brief List languages that use a specified script.
724 The mscript_language_list () function lists languages that use
725 $SCRIPT. $SCRIPT is a symbol whose name is the lower-cased
726 version of a script name that appears in the Unicode Character
731 This function returns a well-formed plist whose keys are #Msymbol
732 and values are symbols whose names are ISO639-1 2-letter codes (or
733 ISO639-2 3-letter codes, if the former is not available). The
734 caller should not modify nor free it. If the m17n library does
735 not know about $SCRIPT, it returns @ c NULL.
738 mscript_list (), mlanguage_list (). */
741 @brief Í¿¤¨¤é¤ì¤¿¥¹¥¯¥ê¥×¥È¤òÍѤ¤¤ë¸À¸ì¤ò¥ê¥¹¥È¤¹¤ë.
743 ´Ø¿ô mscript_language_list () ¤Ï¡¢$SCRIPT ¤òÍѤ¤¤ë¸À¸ì¤ò¥ê¥¹¥È¤¹¤ë¡£
744 $SCRIPT ¤Ï¥·¥ó¥Ü¥ë¤Ç¡¢¤½¤Î̾Á°¤Ï Unicode Character Database ¤Ë¼¨¤µ
745 ¤ì¤Æ¤¤¤ë¥¹¥¯¥ê¥×¥È̾¤ò¤¹¤Ù¤Æ¾®Ê¸»ú¤Ë¤·¤¿¤â¤Î¤Ç¤¢¤ë¡£
748 ¤³¤Î´Ø¿ô¤Ï¡¢À°·Á¼° (well-formed) plist ¤òÊÖ¤¹¡£³Æ¥¡¼¤Ï
749 #Msymbol ¤Ç¤¢¤ê¡¢¸Ä¡¹¤ÎÃÍ¤Ï ISO639-1 ¤ËÄê¤á¤é¤ì¤¿2ʸ»ú¸À¸ì¥³¡¼¥É
750 (ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï ISO639-2 ¤ËÄê¤á¤é¤ì¤¿3ʸ»ú¸À¸ì¥³¡¼¥É) ¤ò̾
751 Á°¤È¤¹¤ë¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ÊÖ¤µ¤ì¤ë plist ¤ÏÊѹ¹¤·¤¿¤ê²òÊü¤·¤¿¤ê¤·¤Æ
752 ¤Ï¤Ê¤é¤Ê¤¤¡£$SCRIPT ¤¬Ì¤ÃΤξì¹ç¤Ï @c NULL ¤¬ÊÖ¤µ¤ì¤ë¡£
755 mscript_list (), mlanguage_list (). */
759 mscript_language_list (MSymbol script)
761 MPlist *plist = mscript__info (script);
763 if (plist /* script name */
764 && (plist = MPLIST_NEXT (plist)) /* language list */
765 && MPLIST_PLIST_P (plist))
766 return MPLIST_PLIST (plist);
773 @name Obsolete functions
776 @name Obsolete ¤Ê´Ø¿ô
781 @brief Get an English language name.
783 This function is obsolete. Use mlanguage_name_list () instead.
785 The mlanguage_name () function returns a symbol whose name is an
786 English name of $LANGUAGE. $LANGUAGE is a symbol whose name is an
787 ISO639-2 3-letter language code, an ISO639-1 2-letter language
788 codes, or an English word.
791 If the information is available, this function returns a non-#Mnil
792 symbol. Otherwise, it returns #Mnil.
795 mlanguage_code (), mlanguage_text (). */
798 @brief ¸À¸ì¤Î±Ñ¸ì̾¤òÆÀ¤ë.
800 ´Ø¿ô mlanguage_name () ¤Ï¡¢$LANGUAGE ¤Î±Ñ¸ì̾¤ò̾Á°¤È¤¹¤ë¤è¤¦¤Ê¥·
801 ¥ó¥Ü¥ë¤òÊÖ¤¹¡£$LANGUAGE ¤Ï¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤½¤Î̾Á°¤Ï¡¢ISO639-2 3ʸ
802 »ú¸À¸ì¥³¡¼¥É¡¢ISO639-1 2ʸ»ú¸À¸ì¥³¡¼¥É¡¢±Ñ¸ì̾¡¢¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
805 µá¤á¤Æ¤¤¤ë¾ðÊó¤¬ÆÀ¤é¤ì¤ë¤Ê¤é¡¢¤³¤Î´Ø¿ô¤Ï #Mnil °Ê³°¤Î¥·¥ó¥Ü¥ë¤òÊÖ
806 ¤¹¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð #Mnil ¤òÊÖ¤¹¡£
809 mlanguage_code (), mlanguage_text (). */
812 mlanguage_name (MSymbol language)
814 MPlist *plist = mlanguage__info (language);
818 if (! plist) /* 3-letter code */
820 plist = MPLIST_NEXT (plist); /* 2-letter code */
821 if (MPLIST_TAIL_P (plist))
823 plist = MPLIST_NEXT (plist); /* english name */
824 if (! MPLIST_MTEXT_P (plist))
826 mt = MPLIST_MTEXT (plist);
827 str = alloca (mtext_nbytes (mt));
828 memcpy (str, MTEXT_DATA (mt), mtext_nbytes (mt));
829 str[0] = tolower (str[0]);
830 return msymbol__with_len (str, mtext_nbytes (mt));