diff --git a/Makefile b/Makefile index e147140..56d2327 100644 --- a/Makefile +++ b/Makefile @@ -23,21 +23,71 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA. +VERSION := 0.2 +PROJECT := davadmin +SRCFILES := $(wildcard admin/*.php) +APISRC := $(SRCFILES:,= ) +TEMPDIR := $(shell mktemp -t -d davadmin.XXXXXXXXXX) +XSRCFILES := $(patsubst %,$(TEMPDIR)/%,$(SRCFILES)) +TRANSLANG := de +POSRC := po +POFILES := $(foreach lang,$(TRANSLANG),$(POSRC)/$(lang).po) +MOFILES := $(patsubst %.po,%.mo,$(POFILES)) +POT=$(POSRC)/$(PROJECT).pot + +.PHONY: all +all: $(POT) $(MOFILES) $(TEMPDIR)/delete + +$(MOFILES): %.mo: %.po + @echo "msgfmt: $@" + msgfmt -o$@ $< + +$(POFILES): %: $(POT) + @echo "msgmerge: $@" + msgmerge -U $@ $(POT) + touch $@ + +$(POT): $(XSRCFILES) po/pot.sed + @echo "xgettext: $@" + cd $(TEMPDIR) && \ + xgettext --default-domain=$(PROJECT) --language=php \ + --from-code=UTF-8 \ + --msgid-bugs-address="jan@dittberner.info" -o- $(SRCFILES) \ + | sed -f $(CURDIR)/po/pot.sed \ + > $(CURDIR)/$@ + for pofile in $(POFILES); do \ + if test ! -f $(CURDIR)/$${pofile}; then \ + cp $(CURDIR)/$@ $(CURDIR)/$${pofile}; \ + fi; \ + done + +.INTERMEDIATE: $(XSRCFILES) +$(XSRCFILES): $(TEMPDIR)/%: % + @echo "processing: $<" + mkdir -p $(@D) + cp $< $@ + +$(TEMPDIR)/delete: + rm -rf $(TEMPDIR) + .PHONY: apidoc - -VERSION=0.2 -PROJECT=webdavadmin -SRCFILES=admin/common.inc.php,admin/directories.php,admin/getgroups.php,admin/index.php,admin/users.php - apidoc: if [ -d apidoc ]; then rm -r apidoc; fi - phpdoc -f $(SRCFILES) -t apidoc --undocumentedelements on -s + phpdoc -f $(APISRC) -t apidoc --undocumentedelements on -s -clean: +.PHONY: clean distclean +clean: $(TEMPDIR)/delete find -name '*~' -type f -exec rm {} \; distclean: clean if [ -d apidoc ]; then rm -r apidoc; fi +RELPREFIX := $(PROJECT)-$(VERSION) dist: distclean - cd .. ; tar czf $(PROJECT)-$(VERSION).tar.gz $(PROJECT)-$(VERSION) + cd .. ; if test ! -d $(RELPREFIX); then \ + ln -s trunk $(RELPREFIX)-dev; \ + tar czh --exclude=.svn -f $(RELPREFIX)-dev.tar.gz $(RELPREFIX)-dev; \ + rm -f $(RELPREFIX)-dev; \ + else \ + tar czhf $(PROJECT)-$(VERSION).tar.gz $(PROJECT)-$(VERSION); \ + fi diff --git a/admin/common.inc.php b/admin/common.inc.php index 3b9949e..739a579 100644 --- a/admin/common.inc.php +++ b/admin/common.inc.php @@ -27,6 +27,9 @@ * 02110-1301 USA. */ +/** Include common internationalization code. */ +require_once("i18n.inc.php"); + if (!isset($_SERVER['DavAdminConfDir'])) { header('HTTP/1.0 500 Internal Server Error'); header('Status: 500 Internal Server Error'); @@ -79,7 +82,7 @@ function getFullPath($dirname) { $errmsgs = array(); if (!isset($davconfig['digest.file'])) { array_push($errmsgs, - _("digest.file is not defined.")); + sprintf(_("%s is not defined."), "digest.file")); } elseif (!is_readable($davconfig['digest.file']) || !is_writable($davconfig['digest.file'])) { array_push($errmsgs, @@ -87,7 +90,7 @@ if (!isset($davconfig['digest.file'])) { } if (!isset($davconfig['group.file'])) { array_push($errmsgs, - _("group.file is not defined.")); + sprintf(_("%s is not defined."), "group.file")); } elseif (!is_readable($davconfig['group.file']) || !is_writable($davconfig['group.file'])) { array_push($errmsgs, @@ -95,7 +98,7 @@ if (!isset($davconfig['group.file'])) { } if (!isset($davconfig['namemap.file'])) { array_push($errmsgs, - _("namemap.file is not defined.")); + sprintf(_("%s is not defined."), "namemap.file")); } elseif (!is_readable($davconfig['namemap.file']) || !is_writable($davconfig['namemap.file'])) { array_push($errmsgs, @@ -103,7 +106,7 @@ if (!isset($davconfig['namemap.file'])) { } if (!isset($davconfig['dav.dir'])) { array_push($errmsgs, - _("dav.dir is not defined.")); + sprintf(_("%s is not defined."), "dav.dir")); } elseif (!is_dir($davconfig['dav.dir']) || !is_readable($davconfig['dav.dir']) || !is_writable($davconfig['dav.dir'])) { @@ -112,11 +115,11 @@ if (!isset($davconfig['dav.dir'])) { } if (empty($davconfig['dav.realm'])) { array_push($errmsgs, - _("dav.realm is not defined.")); + sprintf(_("%s is not defined."), "dav.realm")); } if (empty($davconfig['dav.uri'])) { array_push($errmsgs, - _("dav.uri is not defined.")); + sprintf(_("%s is not defined."), "dav.uri")); } if (!empty($errmsgs)) { errorAsHtml(implode("
", $errmsgs)); diff --git a/admin/getgroups.php b/admin/getgroups.php index 1690d12..59237f8 100644 --- a/admin/getgroups.php +++ b/admin/getgroups.php @@ -27,6 +27,9 @@ * 02110-1301 USA. */ +/** Include common internationalization code. */ +require_once("i18n.inc.php"); + if (!isset($_SERVER['DavAdminConfDir'])) { header('HTTP/1.0 500 Internal Server Error'); header('Status: 500 Internal Server Error'); diff --git a/admin/i18n.inc.php b/admin/i18n.inc.php new file mode 100644 index 0000000..34500bd --- /dev/null +++ b/admin/i18n.inc.php @@ -0,0 +1,144 @@ + + * @version $Id$ + * @license GPL + * @package DAVAdmin + * + * Copyright (c) 2007 Jan Dittberner + * + * This file is part of DAVAdmin. + * + * 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; either version 2 of the + * License, or (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA. + */ + +/** + * Gets the language data. + */ +function get_language_data() { + static $supportedLanguages = array(); + static $defaultCountry = array(); + + if (empty($supportedLanguages)) { + /* English */ + $supportedLanguages['en']['US']['description'] = 'English (US)'; + $supportedLanguages['en']['GB']['description'] = 'English (UK)'; + $defaultCountry['en'] = 'US'; + + /* German */ + $supportedLanguages['de']['DE']['description'] = 'Deutsch'; + $defaultCountry['de'] = 'DE'; + } + + return array($supportedLanguages, $defaultCountry); +} + +function _setlocale($category, $locale) { + if (($ret = setlocale($category, $locale)) !== false) { + return $ret; + } + /* Try just selecting the language */ + if (($i = strpos($locale, '_')) !== false + && ($ret = setlocale($category, substr($locale, 0, $i))) !== false) { + return $ret; + } else if (($i = strpos($locale, '_')) === false) { + list($languages, $defcountries) = get_language_data(); + $locale = $locale . "_" . $defcountries[$locale]; + if (($ret = setlocale($category, substr($locale, 0, $i))) !== false) { + return $ret; + } + } + /* + * Try appending some character set names; some systems (like FreeBSD) + * need this. Some require a format with hyphen (eg. Gentoo) and others + * without (eg. FreeBSD). + */ + foreach (array('UTF-8', 'UTF8', 'utf8', + 'ISO8859-1', 'ISO8859-2', 'ISO8859-5', 'ISO8859-7', + 'ISO8859-9', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-5', + 'ISO-8859-7', 'ISO-8859-9', 'ISO-8859-15', + 'EUC', 'Big5') as $charset) { + if (($ret = setlocale($category, $locale . '.' . $charset)) !== false) { + return $ret; + } + } + echo "unable to select a valid locale code"; + return false; +} + +function _get_supported_language_code($code, $fallback = true) { + static $supportedLanguages; + static $defaultCountry; + if (!isset($supportedLanguages)) { + list($supportedLanguages, $defaultCountry) = get_language_data(); + } + + list ($language, $country) = preg_split('/[-_]/', "${code}_"); + $country = strtoupper($country); + if ((empty($country) || !isset($supportedLanguages[$language][$country])) + && isset($defaultCountry[$language])) { + /* Use default country if none specified or particular country not + * supported */ + $country = $defaultCountry[$language]; + } + if (isset($supportedLanguages[$language][$country])) { + return "${language}_${country}"; + } + + if ($fallback) { + return 'en_US'; + } else { + return null; + } +} + +function _http_negotiate_locale() { + $accepted = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + if (!empty($accepted)) { + foreach(explode(",", $accepted) as $code) { + $languageCode = _get_supported_language_code($code, false); + if (isset($languageCode)) { + return $languageCode; + } + } + } + return null; +} + +session_start(); +$project = "davadmin"; + +if (isset($_GET["language"])) { + $languageCode = _get_supported_language_code($_GET["language"], false); + if (isset($languageCode)) { + $_SESSION["language"] = $languageCode; + } +} +if ($_SESSION["language"]) { + $language = $_SESSION["language"]; +} else { + $language = _http_negotiate_locale(); + $_SESSION["language"] = $language; +} +putenv(sprintf("LANG=%s", $_SESSION["language"])); +putenv(sprintf("LANGUAGE=%s", $_SESSION["language"])); +$_SESSION["locale"] = _setlocale(LC_ALL, $_SESSION["language"]); +bindtextdomain($project, realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . + ".." . DIRECTORY_SEPARATOR . "po")); +textdomain($project); +?> \ No newline at end of file diff --git a/po/davadmin.pot b/po/davadmin.pot new file mode 100644 index 0000000..60920b0 --- /dev/null +++ b/po/davadmin.pot @@ -0,0 +1,100 @@ +# DAVAdmin. +# Copyright (C) 2007, Jan Dittberner +# This file is distributed under the same license as the davadmin package. +# Jan Dittberner , 2007. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: davadmin 0.2\n" +"Report-Msgid-Bugs-To: jan@dittberner.info\n" +"POT-Creation-Date: 2007-11-30 22:16+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: admin/common.inc.php:37 admin/getgroups.php:37 +msgid "" +"The Server is not configured correctly. Please tell your Administrator to " +"set the DavAdminConfDir environment variable." +msgstr "" + +#: admin/common.inc.php:57 +msgid "Invalid call!" +msgstr "" + +#: admin/common.inc.php:85 admin/common.inc.php:93 admin/common.inc.php:101 +#: admin/common.inc.php:109 admin/common.inc.php:118 admin/common.inc.php:122 +#, php-format +msgid "%s is not defined." +msgstr "" + +#: admin/common.inc.php:89 +msgid "The specified digest file is not readable and writable." +msgstr "" + +#: admin/common.inc.php:97 +msgid "The specified group file is not readable and writable." +msgstr "" + +#: admin/common.inc.php:105 +msgid "The specified name mapping file is not readable and writable." +msgstr "" + +#: admin/common.inc.php:114 +msgid "The specified DAV directory is no directory or not accessable." +msgstr "" + +#: admin/directories.php:114 +#, php-format +msgid "%d kBytes" +msgstr "" + +#: admin/directories.php:130 admin/directories.php:236 +#: admin/directories.php:275 +#, php-format +msgid "Invalid directory name %s!" +msgstr "" + +#: admin/directories.php:227 +#, php-format +msgid "There already is a directory entry named %s, but it's not a directory!" +msgstr "" + +#: admin/directories.php:286 admin/directories.php:307 admin/users.php:344 +#: admin/users.php:365 admin/users.php:369 +#, php-format +msgid "Unexpected values %s!" +msgstr "" + +#: admin/directories.php:303 +msgid "Delete failed!" +msgstr "" + +#: admin/users.php:64 admin/users.php:84 admin/users.php:327 +#, php-format +msgid "Invalid user id %s" +msgstr "" + +#: admin/users.php:105 +msgid "Uid must be numeric." +msgstr "" + +#: admin/users.php:108 admin/users.php:115 +msgid "Password must be at least 8 characters long." +msgstr "" + +#: admin/users.php:112 +msgid "" +"Username must be at least 2 characters long and must contain letters and " +"digits only." +msgstr "" + +#: admin/users.php:125 +msgid "" +"Groups must be a list of group names separated by commas. Group names must " +"consist of letters and digits." +msgstr "" diff --git a/po/pot.sed b/po/pot.sed new file mode 100644 index 0000000..96d5728 --- /dev/null +++ b/po/pot.sed @@ -0,0 +1,30 @@ +# Copyright (c) 2007 Jan Dittberner. $Revision$ +# +# inspired by Alex Tingle's pot.sed from +# http://blogs.admissions.buffalo.edu/news/wp-content/plugins/eventcalendar3/gettext/pot.sed +# +# 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; either version 2 +# of the License, or (at your option) any later version. +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +# Fills in some details in the ec3.pot file. +1,/^$/ { + s/SOME DESCRIPTIVE TITLE/DAVAdmin/ + s/YEAR THE PACKAGE.S COPYRIGHT HOLDER/2007, Jan Dittberner/ + s/PACKAGE/davadmin/ + s/FIRST AUTHOR , YEAR./Jan Dittberner , 2007./ + s/VERSION/0.2/ + s/CHARSET/UTF-8/ +} +