diff options
author | danglassey <danglassey> | 2002-08-14 09:57:17 +0000 |
---|---|---|
committer | danglassey <danglassey> | 2002-08-14 09:57:17 +0000 |
commit | c9458897ebbb739d8db83c80e06512d8a612f743 (patch) | |
tree | f8c5381045887e34388cc6b26cfccc254bf766dc /src/mgr/localemgr.cpp | |
download | sword-sf-cvs-c9458897ebbb739d8db83c80e06512d8a612f743.tar.gz |
*** empty log message ***
Diffstat (limited to 'src/mgr/localemgr.cpp')
-rw-r--r-- | src/mgr/localemgr.cpp | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/src/mgr/localemgr.cpp b/src/mgr/localemgr.cpp new file mode 100644 index 0000000..bc12f4c --- /dev/null +++ b/src/mgr/localemgr.cpp @@ -0,0 +1,184 @@ +/****************************************************************************** + * localemgr.cpp - implementation of class LocaleMgr used to interact with + * registered locales for a sword installation + * + * $Id: localemgr.cpp,v 1.12 2002/06/19 09:24:44 scribe Exp $ + * + * Copyright 1998 CrossWire Bible Society (http://www.crosswire.org) + * CrossWire Bible Society + * P. O. Box 2528 + * Tempe, AZ 85280-2528 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> + +#ifndef __GNUC__ +#include <io.h> +#else +#include <unistd.h> +#include <unixstr.h> +#endif +#include <sys/stat.h> +#include <dirent.h> + +#include <swmgr.h> +#include <utilfuns.h> + +#include <localemgr.h> +#include <filemgr.h> + + +LocaleMgr LocaleMgr::systemLocaleMgr; + + +LocaleMgr::LocaleMgr(const char *iConfigPath) { + char *prefixPath = 0; + char *configPath = 0; + char configType = 0; + string path; + + defaultLocaleName = 0; + + char *lang = getenv ("LANG"); + if (lang) { + if (strlen(lang) > 0) + setDefaultLocaleName(lang); + else setDefaultLocaleName("en_us"); + } + else setDefaultLocaleName("en_us"); + + if (!iConfigPath) + SWMgr::findConfig(&configType, &prefixPath, &configPath); + else configPath = (char *)iConfigPath; + + if (prefixPath) { + switch (configType) { + case 2: + int i; + for (i = strlen(configPath)-1; ((i) && (configPath[i] != '/') && (configPath[i] != '\\')); i--); + configPath[i] = 0; + path = configPath; + path += "/"; + break; + default: + path = prefixPath; + if ((prefixPath[strlen(prefixPath)-1] != '\\') && (prefixPath[strlen(prefixPath)-1] != '/')) + path += "/"; + + break; + } + if (FileMgr::existsDir(path.c_str(), "locales.d")) { + path += "locales.d"; + loadConfigDir(path.c_str()); + } + } + + if (prefixPath) + delete [] prefixPath; + + if (configPath) + delete [] configPath; +} + + +LocaleMgr::~LocaleMgr() { + if (defaultLocaleName) + delete [] defaultLocaleName; + deleteLocales(); +} + + +void LocaleMgr::loadConfigDir(const char *ipath) { + DIR *dir; + struct dirent *ent; + string newmodfile; + LocaleMap::iterator it; + + if ((dir = opendir(ipath))) { + rewinddir(dir); + while ((ent = readdir(dir))) { + if ((strcmp(ent->d_name, ".")) && (strcmp(ent->d_name, ".."))) { + newmodfile = ipath; + if ((ipath[strlen(ipath)-1] != '\\') && (ipath[strlen(ipath)-1] != '/')) + newmodfile += "/"; + newmodfile += ent->d_name; + SWLocale *locale = new SWLocale(newmodfile.c_str()); + if (locale->getName()) { + it = locales.find(locale->getName()); + if (it != locales.end()) { + *((*it).second) += *locale; + delete locale; + } + else locales.insert(LocaleMap::value_type(locale->getName(), locale)); + } + else delete locale; + } + } + closedir(dir); + } +} + + +void LocaleMgr::deleteLocales() { + + LocaleMap::iterator it; + + for (it = locales.begin(); it != locales.end(); it++) + delete (*it).second; + + locales.erase(locales.begin(), locales.end()); +} + + +SWLocale *LocaleMgr::getLocale(const char *name) { + LocaleMap::iterator it; + + it = locales.find(name); + if (it != locales.end()) + return (*it).second; + + return 0; +} + + +list <string> LocaleMgr::getAvailableLocales() { + list <string> retVal; + for (LocaleMap::iterator it = locales.begin(); it != locales.end(); it++) + retVal.push_back((*it).second->getName()); + + return retVal; +} + + +const char *LocaleMgr::translate(const char *text, const char *localeName) { + SWLocale *target; + if (!localeName) { + localeName = getDefaultLocaleName(); + } + target = getLocale(localeName); + if (target) + return target->translate(text); + return text; +} + + +const char *LocaleMgr::getDefaultLocaleName() { + return defaultLocaleName; +} + + +void LocaleMgr::setDefaultLocaleName(const char *name) { + stdstr(&defaultLocaleName, name); +} |