Exemplo n.º 1
0
  /*!
   *  \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;
  }
Exemplo n.º 2
0
/* 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;
}
Exemplo n.º 3
0
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;
}