summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2008-04-13 15:48:24 +0200
committerJonas Smedegaard <dr@jones.dk>2008-04-13 15:48:24 +0200
commitb50d4c1f4cd2aa88440f5d01465f73aa987210c2 (patch)
tree8cd60f696344817ff563c5a9e27094a49a8a381e
parent4e8adf29ab24fec68a1e5ac8ccb5553a3ff25133 (diff)
parentf2ef77fe6c56e979a64f307ff44b9b575b9d12f2 (diff)
Merge branch 'master' of debian@coreander:/srv/git/source.jones.dk/ikiwiki
Manually resolved conflicts: .gitignore Makefile ikiwiki.setup
-rw-r--r--.gitignore6
-rw-r--r--Makefile184
-rw-r--r--README112
-rw-r--r--TODO11
-rw-r--r--ikiwiki.setup4
-rw-r--r--perl/Locale/Po4a/Text.pm260
-rw-r--r--po/smiley.da.po258
-rw-r--r--po/smiley.pot246
8 files changed, 1066 insertions, 15 deletions
diff --git a/.gitignore b/.gitignore
index d90cd26..8b1728e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,8 @@
+/basewiki
+/basewiki_l10n
+/smiley
+/smiley_l10n
+/templates
+/templates_l10n
/content
/content_dummy
diff --git a/Makefile b/Makefile
index c4e33b2..e388f0b 100644
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,171 @@
-#underlays = basewiki smiley templates
-underlays = templates
-#locale = danish
-master = master
-#master = master-LOCALE
-
-all: $(underlays)
-
-$(underlays):
- mkdir $@
- cd $@ && git init
- cd $@ && git remote add -f -t $(master:LOCALE=$(locale)) -m $(master:LOCALE=$(locale)) origin http://source.jones.dk/sukker_$@.git
- cd $@ && git merge origin
+SOURCES = ikiwiki
+
+ikiwiki_ORIGIN = git://source.jones.dk/ikiwiki_MODULE
+ikiwiki_MODULES = templates basewiki smiley
+ikiwiki_POMODULES = smiley
+ikiwiki_BRANCH = master-LOCALE
+ikiwiki_LOCALES = da
+#ikiwiki_POLOCALES = da
+
+#dummy_MODULES = content_dummy
+
+# uncomment this when ikiwiki.setup is configured for the local environment
+#CONFIGS = ikiwiki.setup
+
+# Everything after this is generic
+
+# FIXME: Not all of these are used within templates
+masterdir = $(module)
+l10ndir = $(module)_l10n/$(locale)
+podir = po
+
+all: $(SOURCES)
+
+install::
+ifeq ($(strip $(CONFIGS)),)
+ $(error Please configure ikiwiki.setup and then uncomment it at the top of the Makefile!)
+endif
+
+
+
+# 1:source 2:locales
+define SOURCE_template
+$(1): $$($(1)_MODULES) $(dummy_MODULES)
+
+.PHONY: $(1)
+endef
+$(foreach source,$(SOURCES),$(eval $(call SOURCE_template,$(source),$($(source)_LOCALES))))
+
+
+
+# 1:moduledir 2:locale 3:mastermodule 4:source
+define MODULE_template
+$(4): $(1)
+
+$(1): origin = $$(subst MODULE,$(3),$$($(4)_ORIGIN))
+$(1): master = $$(subst -LOCALE,$(2:%=-$(2)),$$($(4)_BRANCH))
+$(1):
+ mkdir -p $$@
+ @if [ -d "$$@/.git" ]; then \
+ cd $$@ && \
+ git pull; \
+ else \
+ cd $$@ && \
+ git init && \
+ git remote add -f -t $$(master) -m $$(master) origin $$(origin) && \
+ git merge origin && \
+ git config remote.origin.push +refs/heads/master:refs/heads/$$(master); \
+ fi
+
+
+# WARNING: this may wipe unrelated files too!
+ultraclean::
+ rm -rf "$(1)"
+ifneq ($(2),)
+ rm -rf "$(dir $(1))"
+endif
+
+.PHONY: $(1)
+endef
+$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(eval $(call MODULE_template,$(masterdir),,$(module),$(source)))))
+$(foreach source,$(SOURCES),$(foreach module,$($(source)_MODULES),$(foreach locale,$($(source)_LOCALES),$(eval $(call MODULE_template,$(l10ndir),$(locale),$(module),$(source))))))
+
+
+
+# 1:moduledir 2:locale 3:mastermodule 4:source
+define POT_template
+fileformat = $(if $(filter templates,$(3)),htmltemplate,text)
+filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
+ALL_POTFILES += $(podir)/$(3).pot
+$(3)_L10NFILES = $$(patsubst $(1)/%,%,$$(shell find $(1) -type f -name '*.$$(filetype)'))
+MASTER_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))
+
+$(podir)/$(3).pot: $(1)
+ cd "$(1)" && PERL5LIB="$(CURDIR)/perl" po4a-gettextize -M UTF-8 -L UTF-8 -f $$(fileformat) -o markdown $$(patsubst %,-m %,$$($(3)_L10NFILES)) -p $(CURDIR)/$$@
+
+.PHONY: $(1)
+endef
+$(foreach source,$(SOURCES),$(foreach module,$($(source)_POMODULES),$(eval $(call POT_template,$(masterdir),,$(module),$(source)))))
+
+
+
+# 1:moduledir 2:locale 3:mastermodule 4:source 5:originmodule
+define INITPO_template
+fileformat = $(if $(filter templates,$(3)),htmltemplate,text)
+filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
+ALL_POFILES += $(podir)/$(3).$(2).po
+LOCALE_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))
+
+$(4)_POMODULES := $(filter-out $(3),$$($(4)_POMODULES))
+$(4)_POLOCALES := $(filter-out $(2),$$($(4)_POLOCALES))
+
+$(podir)/$(3).$(2).po: $(3) $(5)
+ cd "$(3)" && PERL5LIB="$(CURDIR)/perl" po4a-gettextize -M UTF-8 -L UTF-8 -f $$(fileformat) -o markdown $$(patsubst %,-m %,$$($(3)_L10NFILES)) $$(patsubst %,-l $$(CURDIR)/$(1)/%,$($(3)_L10NFILES)) -p $(CURDIR)/$$@
+
+# TODO: Implement the below for automated tests, after unfuzzing the above like this:
+# grep -v '^#, fuzzy$' | sed 's/^#, fuzzy,/#,/'
+#
+# FIXME: needs to depend also on its masterfile
+#$$(patsubst %,$(1)/%,$$($(3)_L10NFILES)): $(podir)/$(3).$(2).po
+# mkdir -p $(1)
+# cd "$(1)" && PERL5LIB="$(CURDIR)/perl" po4a-translate -M UTF-8 -L UTF-8 -k 0 -f $(fileformat) -o markdown $$(patsubst $(1)/%,-m $(CURDIR)/$(3)/%,$$@) -p $(CURDIR)/$(podir)/$(3).$(locale).po -l $(CURDIR)/$$@
+endef
+$(foreach source,$(SOURCES),$(foreach module,$(po-init-modules),$(foreach locale,$(po-init-locales),$(eval $(call INITPO_template,$(l10ndir),$(locale),$(module),$(source),$(if $(po-init-fromlocale),$(module)_l10n/$(po-init-fromlocale),$(module)))))))
+
+
+
+# 1:moduledir 2:locale 3:mastermodule 4:source
+define PO_template
+fileformat = $(if $(filter templates,$(3)),htmltemplate,text)
+filetype = $(if $(filter templates,$(3)),tmpl,mdwn)
+ALL_POFILES += $(podir)/$(3).$(2).po
+LOCALE_L10NFILES += $$(patsubst %,$(1)/%,$$($(3)_L10NFILES))
+
+$(podir)/$(3).$(2).po: $(3)
+ cd "$(3)" && PERL5LIB="$(CURDIR)/perl" po4a-updatepo -M UTF-8 -f $(fileformat) -o markdown $$(patsubst %,-m %,$$($(3)_L10NFILES)) -p $(CURDIR)/$$@
+
+$$(patsubst %,$(1)/%,$$($(3)_L10NFILES)): $(podir)/$(3).$(2).po
+ mkdir -p $(1)
+ cd "$(1)" && PERL5LIB="$(CURDIR)/perl" po4a-translate -M UTF-8 -L UTF-8 -k 100 -f $(fileformat) -o markdown $$(patsubst $(1)/%,-m $$(CURDIR)/$(3)/%,$$@) -p $(CURDIR)/$(podir)/$(3).$(locale).po -l $(CURDIR)/$$@
+endef
+# Only update if not initializing - can't do both at once
+ifeq ($(po-init-modules),)
+$(foreach source,$(SOURCES),$(foreach module,$($(source)_POMODULES),$(foreach locale,$($(source)_POLOCALES),$(eval $(call PO_template,$(l10ndir),$(locale),$(module),$(source))))))
+endif
+
+
+
+# 1:dummydir
+define DUMMYMODULE_template
+$(1):
+ mkdir -p $$@
+
+# WARNING: this may wipe unrelated files too!
+ultraclean::
+ rm -rf "$(1)"
+endef
+$(foreach module,$(dummy_MODULES),$(eval $(call DUMMYMODULE_template,$(masterdir))))
+
+
+
+# 1:configfile
+define CONFIG_template
+$(1):
+ mkdir -p $$@
+
+# WARNING: this may wipe unrelated files too!
+install::
+ ikiwiki --setup $(1) --rebuild
+endef
+$(foreach config,$(CONFIGS),$(eval $(call CONFIG_template,$(config))))
+
+
+
+pot: $(ALL_POTFILES)
+po: $(ALL_POFILES)
+$(LOCALE_L10NFILES): $(MASTER_L10NFILES)
+translations: po $(LOCALE_L10NFILES)
+
+
+
+.PHONY: all $(SOURCES) pot po translations install ultraclean
diff --git a/README b/README
new file mode 100644
index 0000000..3becd90
--- /dev/null
+++ b/README
@@ -0,0 +1,112 @@
+Ikiwiki w/ translations
+=======================
+
+Ikiwiki[1] is a perl-based wiki compiler.
+
+This is routines to manage translatable parts of Ikiwiki and translations into
+the following locales:
+
+ * danish (da) by Jonas Smedegaard <dr@jones.dk>
+
+
+Getting the source
+------------------
+
+This README file is available at http://source.jones.dk/ together with a GIT
+repository with source of the translation routines. Pull it like this:
+
+ git clone git://source.jones.dk/ikiwiki
+
+
+Installation
+------------
+
+To pull in all translatable and translated parts, do this:
+
+ make
+
+If you have write access to one or more GIT repositories, you can override
+their locations like this:
+
+ make ikiwiki_ORIGIN=debian@source.jones.dk:/srv/git/source.jones.dk/ikiwiki_MODULE.git
+
+To remove all translatable and translated parts, and anything else below those
+directories without warning, do this:
+
+ make ultraclean
+
+
+Customizing
+-----------
+
+To publish your own forked repository through web, you first need to create a
+special public repository that you "push" your changes into from your private
+working repository - like this:
+
+ GIT_DIR=public_dir/repository_name.git git --bare init --shared
+ chmod +x public_dir/repository_name.git/hooks/post-update
+
+To actually use your newly created public repository created above, you need to
+populate it with your current working repository (the --all option is only this
+once, not on subsequent pushes) - like this:
+
+ git config remote.origin.url git-reference-to-public-repository
+ git push --all
+
+To instead populate your newly created public repository with a multi-branched
+local repository, first make a complete clone with all branches setup locally,
+and push it all - like this for repository with master and master-da branches:
+
+ git clone git-reference-to-old-public-repository some-temp-dir
+ cd some-temp-dir
+ git checkout -b master-da origin/master-da
+ git config remote.origin.url git-reference-to-public-repository
+ git push --all
+
+To resyncronize an older fork of the repository with newer upstream changes, do
+like this (skip first command on subsequent updates):
+
+ git remote add ikiwiki git://source.jones.dk/ikiwiki
+ git pull ikiwiki master
+
+
+Translation
+-----------
+
+Some modules (markdown files - template files are not yet supported by po4a) is
+translatable through the gettext system using PO files.
+
+To update PO templates for all modules marked as supporting gettext, do this:
+
+ make pot
+
+To update PO files for all supported locales of all supported modules, do this:
+
+ make po
+
+To update all gettext-supported modules based on newer PO files, do this:
+
+ make translations
+
+To initialize new locales, do like this (all on one line):
+
+ make po po-init-modules="module1 module2" po-init-locales="da sv no"
+
+If you want to initialize based on an existing locale rather than the master,
+add the origin locale to the above make command similar to this:
+
+ make po [...] po-init-fromlocale=de
+
+To add new modules and locales as gettext supported, add them to *_POMODULES
+and *_POLOCALES. Keep them alse in *_MODULES and *_LOCALES to support pulling
+final translations without recreating from PO files.
+
+Please beware that the automated po4a process is not perfected yet, so check
+the result before use.
+
+
+----
+
+References:
+
+[1] http://ikiwiki.info/
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..0ba1699
--- /dev/null
+++ b/TODO
@@ -0,0 +1,11 @@
+Stuff that ought to be changed
+==============================
+
+Restructure l10n directories
+----------------------------
+
+Current l10n directory structure was made to mimic that of the 3rd party lang
+plugin.
+
+Some plugins, notably the smiley plugin, however, expect to find its add-on
+underlay beside the core underlay directory, which breaks currently.
diff --git a/ikiwiki.setup b/ikiwiki.setup
index 379a163..8a9b8ac 100644
--- a/ikiwiki.setup
+++ b/ikiwiki.setup
@@ -96,9 +96,9 @@ use IkiWiki::Setup::Standard {
],
# Default to generating rss feeds for blogs?
- rss => 1,
+ #rss => 1,
# Default to generating atom feeds for blogs?
- atom => 1,
+ #atom => 1,
# Allow generating feeds even if not generated by default?
#allowrss => 1,
#allowatom => 1,
diff --git a/perl/Locale/Po4a/Text.pm b/perl/Locale/Po4a/Text.pm
new file mode 100644
index 0000000..ae62667
--- /dev/null
+++ b/perl/Locale/Po4a/Text.pm
@@ -0,0 +1,260 @@
+#!/usr/bin/perl -w
+
+# Po4a::Text.pm
+#
+# extract and translate translatable strings from a text documents
+#
+# 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
+#
+########################################################################
+
+=head1 NAME
+
+Locale::Po4a::Text - Convert text documents from/to PO files
+
+=head1 DESCRIPTION
+
+The po4a (po for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+Locale::Po4a::Text is a module to help the translation of text documents into
+other [human] languages.
+
+Paragraphs are splitted on empty lines (or lines containing only spaces or
+tabulations).
+
+If a paragraph contains a line starting by a space (or tabulation), this
+paragraph won't be rewrapped.
+
+=cut
+
+package Locale::Po4a::Text;
+
+use 5.006;
+use strict;
+use warnings;
+
+require Exporter;
+use vars qw(@ISA @EXPORT);
+@ISA = qw(Locale::Po4a::TransTractor);
+@EXPORT = qw();
+
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+=head1 OPTIONS ACCEPTED BY THIS MODULE
+
+These are this module's particular options:
+
+=over
+
+=item B<nobullet>
+
+Deactivate detection of bullets.
+
+By default, when a bullet is detected, the bullet paragraph is not considered
+as a verbatim paragraph (with the no-wrap flag in the PO file), but the module
+rewrap this paragraph in the generated PO file and in the translation.
+
+=cut
+
+my $bullets = 1;
+
+=item B<debianchangelog>
+
+Handle the header and footer of
+released versions, which only contain non translatable informations.
+
+=cut
+
+my $debianchangelog = 0;
+
+=item B<markdown>
+
+Handle some special markup in Markdown-formatted texts.
+
+=cut
+
+my $markdown = 0;
+
+sub initialize {
+ my $self = shift;
+ my %options = @_;
+
+ $self->{options}{'nobullets'}='';
+
+ if (defined $options{'nobullets'}) {
+ $bullets = 0;
+ }
+
+ if (defined $options{'debianchangelog'}) {
+ $debianchangelog=1;
+ }
+
+ if (defined $options{'markdown'}) {
+ $markdown=1;
+ }
+}
+
+sub parse {
+ my $self = shift;
+ my ($line,$ref);
+ my $paragraph="";
+ my $wrapped_mode = 1;
+ my $expect_header = 1;
+ ($line,$ref)=$self->shiftline();
+ while (defined($line)) {
+ chomp($line);
+ $self->{ref}="$ref";
+ if ($debianchangelog and
+ $expect_header and
+ $line =~ /^(\w[-+0-9a-z.]*)\ \(([^\(\) \t]+)\) # src, version
+ \s+([-+0-9a-z.]+); # distribution
+ \s*urgency\s*\=\s*(.*\S)\s*$/ix) { #
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ $paragraph="";
+ $self->pushline("$line\n");
+ $expect_header=0;
+ } elsif ($debianchangelog and
+ $line =~ m/^ \-\- (.*) <(.*)> ((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}(\s+\([^\\\(\)]\))?)$/) {
+ # Found trailer
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ $paragraph="";
+ $self->pushline("$line\n");
+ $expect_header=1;
+ } elsif ($line =~ /^\s*$/) {
+ # Break paragraphs on lines containing only spaces
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ $self->pushline("\n") unless ( $wrapped_mode == 0
+ or $paragraph eq "");
+ $paragraph="";
+ $wrapped_mode = 1;
+ $self->pushline($line."\n");
+ } elsif ( $line =~ /^=*$/
+ or $line =~ /^_*$/
+ or $line =~ /^-*$/) {
+ $wrapped_mode = 0;
+ $paragraph .= $line."\n";
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ $paragraph="";
+ $wrapped_mode = 1;
+ } elsif ($markdown and
+ ( $line =~ m/^#/ # headline
+ or $line =~ m/^>/ # blockquote
+ or $line =~ m/[<>]/ # maybe html
+ or $line =~ m/^"""/ # textblock inside macro end
+ or $line =~ m/"""$/)) { # textblock inside macro begin
+ # Found headline
+ $wrapped_mode = 0;
+ $paragraph .= $line."\n";
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ $paragraph="";
+ $wrapped_mode = 1;
+ } else {
+ if ($line =~ /^\s/) {
+ # A line starting by a space indicates a non-wrap
+ # paragraph
+ $wrapped_mode = 0;
+ }
+ $paragraph .= $line."\n";
+ }
+ # paragraphs starting by a bullet, or numbered
+ # or paragraphs with a line containing many consecutive spaces
+ # (more than 3)
+ # are considered as verbatim paragraphs
+ $wrapped_mode = 0 if ( $paragraph =~ m/^(\*|[0-9]+[.)] )/s
+ or $paragraph =~ m/[ \t][ \t][ \t]/s);
+ ($line,$ref)=$self->shiftline();
+ }
+ if (length $paragraph) {
+ do_paragraph($self,$paragraph,$wrapped_mode);
+ }
+}
+
+sub do_paragraph {
+ my ($self, $paragraph, $wrap) = (shift, shift, shift);
+ return if ($paragraph eq "");
+
+ if ($bullets) {
+ # Detect bullets
+ # | * blah blah
+ # |<spaces> blah
+ # | ^-- aligned
+ # <empty line>
+ #
+ # Other bullets supported:
+ # - blah o blah + blah
+ # 1. blah 1) blah (1) blah
+TEST_BULLET:
+ if ($paragraph =~ m/^(\s*)((?:[-*o+]|([0-9]+[.\)])|\([0-9]+\))\s+)([^\n]*\n)(.*)$/s) {
+ my $para = $5;
+ my $bullet = $2;
+ my $indent1 = $1;
+ my $indent2 = "$1".(' ' x length $bullet);
+ my $text = $4;
+ while ($para !~ m/$indent2(?:[-*o+]|([0-9]+[.\)])|\([0-9]+\))\s+/
+ and $para =~ s/^$indent2(\S[^\n]*\n)//s) {
+ $text .= $1;
+ }
+ # TODO: detect if a line starts with the same bullet
+ if ($text !~ m/\S[ \t][ \t][ \t]+\S/s) {
+ my $bullet_regex = quotemeta($indent1.$bullet);
+ $bullet_regex =~ s/[0-9]+/\\d\+/;
+ if ($para eq '' or $para =~ m/^$bullet_regex\S/s) {
+ my $trans = $self->translate($text,
+ $self->{ref},
+ "Bullet: '$indent1$bullet'",
+ "wrap" => 1,
+ "wrapcol" => - (length $indent2));
+ $trans =~ s/^/$indent1$bullet/s;
+ $trans =~ s/\n(.)/\n$indent2$1/sg;
+ $self->pushline( $trans."\n" );
+ if ($para eq '') {
+ return;
+ } else {
+ # Another bullet
+ $paragraph = $para;
+ goto TEST_BULLET;
+ }
+ }
+ }
+ }
+ }
+ # TODO: detect indented paragraphs
+
+ $self->pushline( $self->translate($paragraph,
+ $self->{ref},
+ "Plain text",
+ "wrap" => $wrap) );
+}
+
+1;
+
+=head1 STATUS OF THIS MODULE
+
+Tested successfully on simple text files and NEWS.Debian files.
+
+=head1 AUTHORS
+
+ Nicolas François <nicolas.francois@centraliens.net>
+
+=head1 COPYRIGHT AND LICENSE
+
+ Copyright 2005,2007 by Nicolas FRANÇOIS <nicolas.francois@centraliens.net>.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL (see the COPYING file).
diff --git a/po/smiley.da.po b/po/smiley.da.po
new file mode 100644
index 0000000..0b21ccc
--- /dev/null
+++ b/po/smiley.da.po
@@ -0,0 +1,258 @@
+# Danish translation of smiley pages for ikiwiki.
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the ikiwiki package.
+# Jonas Smedegaard <dr@jones.dk>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ikiwiki smiley 2.30\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-02-03 14:52-0500\n"
+"PO-Revision-Date: 2008-02-11 00:12+0100\n"
+"Last-Translator: Jonas Smedegaard <dr@jones.dk>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Danish\n"
+"X-Poedit-Country: DENMARK\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+# type: Plain text
+#: smileys.mdwn:3
+msgid ""
+"This page is used to control what smileys are supported by the wiki. Just "
+"write the text of a smiley to display it."
+msgstr ""
+"Denne side bruges til at styre hvilke smileys denne wiki understøtter. "
+"Skriv blot smiley-teksten for at vise den."
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:)\t[[smileys/smile.png]]"
+msgstr "\\:)\t[[smileys/smile.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-)\t[[smileys/smile.png]]"
+msgstr "\\:-)\t[[smileys/smile.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:D\t[[smileys/biggrin.png]]"
+msgstr "\\:D\t[[smileys/biggrin.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-D\t[[smileys/biggrin.png]]"
+msgstr "\\:-D\t[[smileys/biggrin.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\B)\t[[smileys/smile2.png]]"
+msgstr "\\B)\t[[smileys/smile2.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\B-)\t[[smileys/smile2.png]]"
+msgstr "\\B-)\t[[smileys/smile2.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:))\t[[smileys/smile3.png]]"
+msgstr "\\:))\t[[smileys/smile3.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-))\t[[smileys/smile3.png]]"
+msgstr "\\:-))\t[[smileys/smile3.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\;)\t[[smileys/smile4.png]]"
+msgstr "\\;)\t[[smileys/smile4.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\;-)\t[[smileys/smile4.png]]"
+msgstr "\\;-)\t[[smileys/smile4.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:\\\t[[smileys/ohwell.png]]"
+msgstr "\\:\\\t[[smileys/ohwell.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-\\\t[[smileys/ohwell.png]]"
+msgstr "\\:-\\\t[[smileys/ohwell.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:/\t[[smileys/ohwell.png]]"
+msgstr "\\:/\t[[smileys/ohwell.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-/\t[[smileys/ohwell.png]]"
+msgstr "\\:-/\t[[smileys/ohwell.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:|\t[[smileys/neutral.png]]"
+msgstr "\\:|\t[[smileys/neutral.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-|\t[[smileys/neutral.png]]"
+msgstr "\\:-|\t[[smileys/neutral.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\>:>\t[[smileys/devil.png]]"
+msgstr "\\>:>\t[[smileys/devil.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:22
+msgid "\\X-(\t[[smileys/angry.png]]"
+msgstr "\\X-(\t[[smileys/angry.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:22
+msgid "\\<:(\t[[smileys/frown.png]]"
+msgstr "\\<:(\t[[smileys/frown.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:(\t[[smileys/sad.png]]"
+msgstr "\\:(\t[[smileys/sad.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-(\t[[smileys/sad.png]]"
+msgstr "\\:-(\t[[smileys/sad.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-?\t[[smileys/tongue.png]]"
+msgstr "\\:-?\t[[smileys/tongue.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-P\t[[smileys/tongue.png]]"
+msgstr "\\:-P\t[[smileys/tongue.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:o\t[[smileys/redface.png]]"
+msgstr "\\:o\t[[smileys/redface.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\|)\t[[smileys/tired.png]]"
+msgstr "\\|)\t[[smileys/tired.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\|-)\t[[smileys/tired.png]]"
+msgstr "\\|-)\t[[smileys/tired.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{OK}\t[[smileys/thumbs-up.png]]"
+msgstr "\\{OK}\t[[smileys/thumbs-up.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{X}\t[[smileys/icon-error.png]]"
+msgstr "\\{X}\t[[smileys/icon-error.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{i}\t[[smileys/icon-info.png]]"
+msgstr "\\{i}\t[[smileys/icon-info.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(./)\t[[smileys/checkmark.png]]"
+msgstr "\\(./)\t[[smileys/checkmark.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(!)\t[[smileys/idea.png]]"
+msgstr "\\(!)\t[[smileys/idea.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\[!]\t[[smileys/attention.png]]"
+msgstr "\\[!]\t[[smileys/attention.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\/!\\\t[[smileys/alert.png]]"
+msgstr "\\/!\\\t[[smileys/alert.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(?)\t[[smileys/question.png]]"
+msgstr "\\(?)\t[[smileys/question.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{*}\t[[smileys/star_on.png]]"
+msgstr "\\{*}\t[[smileys/star_on.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{o}\t[[smileys/star_off.png]]"
+msgstr "\\{o}\t[[smileys/star_off.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{1} [[smileys/prio1.png]]"
+msgstr "\\{1} [[smileys/prio1.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{2} [[smileys/prio2.png]]"
+msgstr "\\{2} [[smileys/prio2.png]]"
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{3} [[smileys/prio3.png]]"
+msgstr "\\{3} [[smileys/prio3.png]]"
+
+# type: Plain text
+#: smileys.mdwn:45
+msgid "For example: {*} B) {*}"
+msgstr "Eksempel: {*} B) {*}"
+
+# type: Plain text
+#: smileys.mdwn:46
+#, no-wrap
+msgid "----\n"
+msgstr "----\n"
+
+# type: Plain text
+#: smileys.mdwn:52
+msgid ""
+"To change the supported smileys, just edit the lists on this page. Note "
+"that the format is important; each list item should start with the text that "
+"is turned into the smiley, escaped so that users can see what produces it, "
+"followed by a [[ikiwiki/WikiLink]] to the image to display."
+msgstr ""
+"Redigér listen på denne side for at ændre understøttede smileys. Bemærk at "
+"formatet er vigtigt: hvert listeemne skal begynde med teksten der skal "
+"omdannes til en smiley, omskrevet så brugere kan se hvordan det dannes, "
+"efterfulgt af en [[ikiwiki/WikiLink]] til billedet der skal vises."
+
+# type: Plain text
+#: smileys.mdwn:55
+msgid ""
+"/!\\ Bear in mind that the link to the image needs to be written in a way "
+"that will work if it's copied to other pages on the wiki. So be sure to "
+"include the smileys directory in the path to the file."
+msgstr ""
+"/!\\ Tænk på at det er nødvendigt at skrive henvisningen til billedet på en "
+"måde så det virker hvis det kopieres til andre sider på wikien. Sørg derfor "
+"for at medtage smileys direkte i stien til filen."
diff --git a/po/smiley.pot b/po/smiley.pot
new file mode 100644
index 0000000..e4f2c95
--- /dev/null
+++ b/po/smiley.pot
@@ -0,0 +1,246 @@
+# LOCALE translation of smiley pages for ikiwiki.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the ikiwiki package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: ikiwiki smiley 2.30\n"
+"POT-Creation-Date: 2008-02-19 00:42+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING"
+
+# type: Plain text
+#: smileys.mdwn:3
+msgid ""
+"This page is used to control what smileys are supported by the wiki. Just "
+"write the text of a smiley to display it."
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:)\t[[smileys/smile.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-)\t[[smileys/smile.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:D\t[[smileys/biggrin.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-D\t[[smileys/biggrin.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\B)\t[[smileys/smile2.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\B-)\t[[smileys/smile2.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:))\t[[smileys/smile3.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-))\t[[smileys/smile3.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\;)\t[[smileys/smile4.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\;-)\t[[smileys/smile4.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:\\\t[[smileys/ohwell.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-\\\t[[smileys/ohwell.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:/\t[[smileys/ohwell.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-/\t[[smileys/ohwell.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:|\t[[smileys/neutral.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\:-|\t[[smileys/neutral.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:20
+msgid "\\>:>\t[[smileys/devil.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:22
+msgid "\\X-(\t[[smileys/angry.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:22
+msgid "\\<:(\t[[smileys/frown.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:(\t[[smileys/sad.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-(\t[[smileys/sad.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-?\t[[smileys/tongue.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:-P\t[[smileys/tongue.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\:o\t[[smileys/redface.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\|)\t[[smileys/tired.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\|-)\t[[smileys/tired.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{OK}\t[[smileys/thumbs-up.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{X}\t[[smileys/icon-error.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{i}\t[[smileys/icon-info.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(./)\t[[smileys/checkmark.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(!)\t[[smileys/idea.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\[!]\t[[smileys/attention.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\/!\\\t[[smileys/alert.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\(?)\t[[smileys/question.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{*}\t[[smileys/star_on.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{o}\t[[smileys/star_off.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{1} [[smileys/prio1.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{2} [[smileys/prio2.png]]"
+msgstr ""
+
+# type: Bullet: '* '
+#: smileys.mdwn:43
+msgid "\\{3} [[smileys/prio3.png]]"
+msgstr ""
+
+# type: Plain text
+#: smileys.mdwn:45
+msgid "For example: {*} B) {*}"
+msgstr ""
+
+# type: Plain text
+#: smileys.mdwn:46
+#, no-wrap
+msgid "----\n"
+msgstr ""
+
+# type: Plain text
+#: smileys.mdwn:52
+msgid ""
+"To change the supported smileys, just edit the lists on this page. Note "
+"that the format is important; each list item should start with the text that "
+"is turned into the smiley, escaped so that users can see what produces it, "
+"followed by a [[ikiwiki/WikiLink]] to the image to display."
+msgstr ""
+
+# type: Plain text
+#: smileys.mdwn:55
+msgid ""
+"/!\\ Bear in mind that the link to the image needs to be written in a way "
+"that will work if it's copied to other pages on the wiki. So be sure to "
+"include the smileys directory in the path to the file."
+msgstr ""