/*! * \brief メッセージの翻訳 * \param[in] message メッセージID * \return 翻訳後のメッセージ */ std::string const& gettext( std::string const& message ) { static bool f = load_msgcat( get_global< std::string >( "cfg-directory" ) ); if ( !msgcat_loaded ) { return message; } std::map< std::string, std::string >::const_iterator iter( msgcat.find( message ) ), last( msgcat.end() ); if ( iter != last ) { std::string const& result( iter->second ); return result; } return message; }
/* ARGSUSED */ nl_catd _catopen(const char *name, int oflag) { char tmppath[PATH_MAX]; char *nlspath; char *lang; char *s, *t, *sep, *dot; const char *u; nl_catd catd; if (name == NULL || *name == '\0') return (nl_catd) -1; /* absolute or relative path? */ if (strchr(name, '/')) return load_msgcat(name); if (issetugid() != 0 || (nlspath = getenv("NLSPATH")) == NULL) nlspath = NLS_DEFAULT_PATH; lang = NULL; if (oflag & NL_CAT_LOCALE) { lang = getenv("LC_ALL"); if (lang == NULL) lang = getenv("LC_MESSAGES"); } if (lang == NULL) lang = getenv("LANG"); if (lang == NULL) lang = NLS_DEFAULT_LANG; if (strcmp(lang, "POSIX") == 0) lang = NLS_DEFAULT_LANG; s = nlspath; t = tmppath; /* * Locale names are of the form language[_territory][.codeset]. * See POSIX-1-2008 "8.2 Internationalization Variables" */ sep = strchr(lang, '_'); dot = strrchr(lang, '.'); if (dot && sep && dot < sep) dot = NULL; /* ignore dots preceeding _ */ if (dot == NULL) lang = NLS_DEFAULT_LANG; /* no codeset specified */ do { while (*s && *s != ':') { if (*s == '%') { switch (*(++s)) { case 'L': /* LANG or LC_MESSAGES */ u = lang; while (*u && t < tmppath + PATH_MAX-1) *t++ = *u++; break; case 'N': /* value of name parameter */ u = name; while (*u && t < tmppath + PATH_MAX-1) *t++ = *u++; break; case 'l': /* language part */ u = lang; while (*u && t < tmppath + PATH_MAX-1) { *t++ = *u++; if (sep && u >= sep) break; if (dot && u >= dot) break; } break; case 't': /* territory part */ if (sep == NULL) break; u = sep + 1; while (*u && t < tmppath + PATH_MAX-1) { *t++ = *u++; if (dot && u >= dot) break; } break; case 'c': /* codeset part */ if (dot == NULL) break; u = dot + 1; while (*u && t < tmppath + PATH_MAX-1) *t++ = *u++; break; default: if (t < tmppath + PATH_MAX-1) *t++ = *s; } } else { if (t < tmppath + PATH_MAX-1) *t++ = *s; } s++; } *t = '\0'; catd = load_msgcat(tmppath); if (catd != (nl_catd) -1) return catd; if (*s) s++; t = tmppath; } while (*s); return (nl_catd) -1; }
nl_catd catopen (const char *name, int type) { int spcleft, saverr; char path[PATH_MAX]; char *nlspath, *lang, *base, *cptr, *pathP, *tmpptr; char *cptr1, *plang, *pter, *pcode; struct stat sbuf; if (name == NULL || *name == '\0') { errno = EINVAL; return NULL; } /* is it absolute path ? if yes, load immediately */ if (strchr (name, '/') != NULL) { return load_msgcat (name); } if (type == NL_CAT_LOCALE) { lang = setlocale (LC_MESSAGES, NULL); } else { lang = getenv ("CHARSET"); } if (lang == NULL || *lang == '\0' || strlen (lang) > ENCODING_LEN || (lang[0] == '.' && (lang[1] == '\0' || (lang[1] == '.' && lang[2] == '\0'))) || strchr (lang, '/') != NULL) { lang = (char *) "C"; } plang = cptr1 = strdup (lang); if (cptr1 == NULL) { return NULL; } cptr = strchr (cptr1, '@'); if (cptr != NULL) { *cptr = '\0'; } pter = pcode = (char *) ""; cptr = strchr (cptr1, '_'); if (cptr != NULL) { *cptr++ = '\0'; pter = cptr1 = cptr; } cptr = strchr (cptr1, '.'); if (cptr != NULL) { *cptr++ = '\0'; pcode = cptr; } nlspath = getenv ("NLSPATH"); if (nlspath == NULL) { nlspath = (char *) DEFAULT_NLS_PATH; } base = cptr = strdup (nlspath); if (cptr == NULL) { saverr = errno; free (plang); errno = saverr; return NULL; } while ((nlspath = strsep (&cptr, ":")) != NULL) { pathP = path; if (*nlspath) { for (; *nlspath; ++nlspath) { if (*nlspath == '%') { switch (*(nlspath + 1)) { case 'l': tmpptr = plang; break; case 't': tmpptr = pter; break; case 'c': tmpptr = pcode; break; case 'L': tmpptr = lang; break; case 'N': tmpptr = (char *) name; break; case '%': ++nlspath; /* fallthrough */ default: if (pathP - path >= PATH_MAX - 1) { goto too_long; } *(pathP++) = *nlspath; continue; } ++nlspath; put_tmpptr: spcleft = PATH_MAX - (CAST_STRLEN (pathP - path)) - 1; if (strlcpy (pathP, tmpptr, spcleft) >= (size_t) spcleft) { too_long: free (plang); free (base); errno = ENAMETOOLONG; return NULL; } pathP += strlen (tmpptr); } else { if (pathP - path >= PATH_MAX - 1) { goto too_long; } *(pathP++) = *nlspath; } } *pathP = '\0'; if (stat (path, &sbuf) == 0) { free (plang); free (base); return load_msgcat (path); } } else { tmpptr = (char *) name; --nlspath; goto put_tmpptr; } } free (plang); free (base); errno = ENOENT; return NULL; }