# HG changeset patch # User Paul Boddie # Date 1446764455 -3600 # Node ID 6df45ddd56d115dafb6e3854c40064879ab776f1 # Parent 3273c34ff13c36f677565ae7808eab6274b48d26 Added various missing translations plus a rough Norwegian translations file. Refined the production of the .pot file and fixed the installation of the .mo files for new languages. Added installation of translations to the install script. Updated the profile preferences documentation script to work with the gettext-wrapped strings. diff -r 3273c34ff13c -r 6df45ddd56d1 docs/tools/profile_prefs.sh --- a/docs/tools/profile_prefs.sh Thu Nov 05 20:00:51 2015 +0100 +++ b/docs/tools/profile_prefs.sh Fri Nov 06 00:00:55 2015 +0100 @@ -10,8 +10,8 @@ echo "|| '''Label''' || '''Setting''' ||" grep '^ \+("' "$PROFILE" \ -| sed 's/^ \+("\(.*\)".*, \+"\(.*\)"),$/|| \2 || [[..\/Preferences#\1|\1]] ||/' +| sed 's/^ \+("\(.*\)".*, \+_("\(.*\)")),$/|| \2 || [[..\/Preferences#\1|\1]] ||/' # Convert from... to... -# ("setting" , "label"), +# ("setting" , _("label")), # || label || [[../Preferences#setting|setting]] || diff -r 3273c34ff13c -r 6df45ddd56d1 imipweb/calendar.py --- a/imipweb/calendar.py Thu Nov 05 20:00:51 2015 +0100 +++ b/imipweb/calendar.py Fri Nov 06 00:00:55 2015 +0100 @@ -228,7 +228,7 @@ page.div(id="pending-requests") if requests: - page.p("Pending requests:") + page.p(_("Pending requests:")) page.ul() diff -r 3273c34ff13c -r 6df45ddd56d1 imipweb/event.py --- a/imipweb/event.py Thu Nov 05 20:00:51 2015 +0100 +++ b/imipweb/event.py Fri Nov 06 00:00:55 2015 +0100 @@ -27,6 +27,10 @@ from imipweb.data import EventPeriod, event_period_from_period, FormPeriod, PeriodError from imipweb.resource import DateTimeFormUtilities, FormUtilities, ResourceClientForObject +# Fake gettext method for strings to be translated later. + +_ = lambda s: s + class EventPageFragment(ResourceClientForObject, DateTimeFormUtilities, FormUtilities): "A resource presenting the details of an event." @@ -37,20 +41,20 @@ # Various property values and labels. property_items = [ - ("SUMMARY", "Summary"), - ("DTSTART", "Start"), - ("DTEND", "End"), - ("ORGANIZER", "Organiser"), - ("ATTENDEE", "Attendee"), + ("SUMMARY", _("Summary")), + ("DTSTART", _("Start")), + ("DTEND", _("End")), + ("ORGANIZER", _("Organiser")), + ("ATTENDEE", _("Attendee")), ] partstat_items = [ - ("NEEDS-ACTION", "Not confirmed"), - ("ACCEPTED", "Attending"), - ("TENTATIVE", "Tentatively attending"), - ("DECLINED", "Not attending"), - ("DELEGATED", "Delegated"), - (None, "Not indicated"), + ("NEEDS-ACTION", _("Not confirmed")), + ("ACCEPTED", _("Attending")), + ("TENTATIVE", _("Tentatively attending")), + ("DECLINED", _("Not attending")), + ("DELEGATED", _("Delegated")), + (None, _("Not indicated")), ] def can_remove_recurrence(self, recurrence): @@ -244,7 +248,7 @@ continue page.tr() - page.th(label, class_="objectheading %s%s" % (field, errors and field in errors and " error" or ""), rowspan=rowspan) + page.th(_(label), class_="objectheading %s%s" % (field, errors and field in errors and " error" or ""), rowspan=rowspan) # Handle datetimes specially. @@ -389,8 +393,10 @@ # Show participation status, editable for the current user. + partstat_items = [(key, _(partstat_label)) for (key, partstat_label) in self.partstat_items] + if attendee_uri == self.user: - self.menu("partstat", partstat, self.partstat_items, class_="partstat") + self.menu("partstat", partstat, partstat_items, class_="partstat") # Allow the participation indicator to act as a submit # button in order to refresh the page and show a control for @@ -398,12 +404,12 @@ elif self.is_organiser() and self.attendee_is_new(attendee_uri): self.control("partstat-refresh", "submit", "refresh", id="partstat-%d" % i, class_="refresh") - page.label(dict(self.partstat_items).get(partstat, ""), for_="partstat-%s" % i, class_="partstat") + page.label(dict(partstat_items).get(partstat, ""), for_="partstat-%s" % i, class_="partstat") # Otherwise, just show a label with the participation status. else: - page.span(dict(self.partstat_items).get(partstat, ""), class_="partstat") + page.span(dict(partstat_items).get(partstat, ""), class_="partstat") page.td.close() page.td() diff -r 3273c34ff13c -r 6df45ddd56d1 imipweb/profile.py --- a/imipweb/profile.py Thu Nov 05 20:00:51 2015 +0100 +++ b/imipweb/profile.py Fri Nov 06 00:00:55 2015 +0100 @@ -21,6 +21,10 @@ from imipweb.resource import FormUtilities, ResourceClient +# Fake gettext method for strings to be translated later. + +_ = lambda s: s + class ProfilePage(ResourceClient, FormUtilities): "A request handler for the user profile page." @@ -31,18 +35,18 @@ # See: docs/tools/profile_prefs.sh pref_labels = [ - ("participating" , "Participate in the calendar system"), - ("CN" , "Your common name"), - ("LANG" , "Language"), - ("TZID" , "Time zone/regime"), - ("incoming" , "How to present incoming calendar messages"), - ("freebusy_sharing" , "Share free/busy information"), - ("freebusy_bundling" , "Bundle free/busy details with messages"), - ("freebusy_publishing" , "Publish free/busy details via the Web"), - ("freebusy_messages" , "Deliver details of received free/busy messages"), - ("add_method_response" , "How to respond to messages adding events"), - ("event_refreshing" , "How to handle event refresh requests"), - ("organiser_replacement" , "Recognise whom as a new organiser of an event?"), + ("participating" , _("Participate in the calendar system")), + ("CN" , _("Your common name")), + ("LANG" , _("Language")), + ("TZID" , _("Time zone/regime")), + ("incoming" , _("How to present incoming calendar messages")), + ("freebusy_sharing" , _("Share free/busy information")), + ("freebusy_bundling" , _("Bundle free/busy details with messages")), + ("freebusy_publishing" , _("Publish free/busy details via the Web")), + ("freebusy_messages" , _("Deliver details of received free/busy messages")), + ("add_method_response" , _("How to respond to messages adding events")), + ("event_refreshing" , _("How to handle event refresh requests")), + ("organiser_replacement" , _("Recognise whom as a new organiser of an event?")), ] def handle_request(self): @@ -143,7 +147,7 @@ page.tr() page.th(class_="profileheading %s%s" % (name, errors and name in errors and " error" or "")) - page.label(label, for_=name) + page.label(_(label), for_=name) page.th.close() page.td() @@ -156,7 +160,7 @@ # menu control. else: - choices = [(key, _(label)) for (key, label) in choices.items()] + choices = [(key, _(value_label)) for (key, value_label) in choices.items()] choices.sort() self.menu(name, default, choices, value is not None and [value] or None, class_="preference") @@ -170,11 +174,13 @@ "Show controls for performing actions." + _ = self.get_translator() + page = self.page page.p(class_="controls") - page.input(name="save", type="submit", value="Save") - page.input(name="cancel", type="submit", value="Cancel") + page.input(name="save", type="submit", value=_("Save")) + page.input(name="cancel", type="submit", value=_("Cancel")) page.p.close() # Full page output methods. @@ -189,7 +195,9 @@ if not errors: return True - self.new_page(title="Profile") + _ = self.get_translator() + + self.new_page(title=_("Profile")) page.form(method="POST") self.show_preferences(errors) self.show_controls() diff -r 3273c34ff13c -r 6df45ddd56d1 messages/en_GB.imip-agent.po --- a/messages/en_GB.imip-agent.po Thu Nov 05 20:00:51 2015 +0100 +++ b/messages/en_GB.imip-agent.po Fri Nov 06 00:00:55 2015 +0100 @@ -3,58 +3,20 @@ # This file is distributed under the same license as the imip-agent package. # Paul Boddie , 2015. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: 4bc73eb1e076+\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-05 00:55+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" +"POT-Creation-Date: 2015-11-05 23:53+0100\n" +"PO-Revision-Date: 2015-11-05 22:50+0100\n" +"Last-Translator: Paul Boddie \n" +"Language-Team: English\n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" -msgid "Calendar system message" -msgstr "" - -msgid "" -"This message contains several different parts, one of which will contain\n" -"calendar information that will only be understood by a suitable program.\n" -msgstr "" - -msgid "An addition to an event has been received." -msgstr "" - -msgid "An event cancellation has been received." -msgstr "" - -msgid "A counter proposal to an event invitation has been received." -msgstr "" - -msgid "Your counter proposal to an event invitation has been declined." -msgstr "" - -msgid "Details of an event have been received." -msgstr "" - -msgid "A request for updated event details has been received." -msgstr "" - -msgid "A reply to an event invitation has been received." -msgstr "" - -msgid "An event invitation has been received." -msgstr "" - -msgid "A free/busy update has been received." -msgstr "" - -msgid "A reply to a free/busy request has been received." -msgstr "" - +#: imiptools/handlers/__init__.py:77 #, python-format msgid "" "If your mail program cannot handle this message, you may view the details " @@ -63,247 +25,473 @@ "%s" msgstr "" +#: imiptools/handlers/person.py:248 +msgid "An addition to an event has been received." +msgstr "" + +#: imiptools/handlers/person.py:257 +msgid "An event cancellation has been received." +msgstr "" + +#: imiptools/handlers/person.py:266 +msgid "A counter proposal to an event invitation has been received." +msgstr "" + +#: imiptools/handlers/person.py:275 +msgid "Your counter proposal to an event invitation has been declined." +msgstr "" + +#: imiptools/handlers/person.py:284 +msgid "Details of an event have been received." +msgstr "" + +#: imiptools/handlers/person.py:295 +msgid "A request for updated event details has been received." +msgstr "" + +#: imiptools/handlers/person.py:304 +msgid "A reply to an event invitation has been received." +msgstr "" + +#: imiptools/handlers/person.py:313 +msgid "An event invitation has been received." +msgstr "" + +#: imiptools/handlers/person.py:330 +msgid "A free/busy update has been received." +msgstr "" + +#: imiptools/handlers/person.py:343 +msgid "A reply to a free/busy request has been received." +msgstr "" + +#: imiptools/mail.py:32 +msgid "Calendar system message" +msgstr "" + +#: imiptools/mail.py:34 +msgid "" +"This message contains several different parts, one of which will contain\n" +"calendar information that will only be understood by a suitable program.\n" +msgstr "" + +#: imiptools/profile.py:63 msgid "Add events" msgstr "" +#: imiptools/profile.py:64 msgid "Ignore requests" msgstr "" +#: imiptools/profile.py:65 msgid "Ask for refreshed event details" msgstr "" +#: imiptools/profile.py:68 msgid "Do not respond" msgstr "" +#: imiptools/profile.py:69 msgid "Always respond" msgstr "" +#: imiptools/profile.py:72 msgid "Never" msgstr "" +#: imiptools/profile.py:73 msgid "Always" msgstr "" +#: imiptools/profile.py:76 msgid "Do not notify" msgstr "" +#: imiptools/profile.py:77 msgid "Notify" msgstr "" +#: imiptools/profile.py:80 msgid "Publish" msgstr "" +#: imiptools/profile.py:81 msgid "Do not publish" msgstr "" +#: imiptools/profile.py:84 msgid "Share" msgstr "" +#: imiptools/profile.py:85 msgid "Do not share" msgstr "" +#: imiptools/profile.py:88 msgid "Original message only" msgstr "" +#: imiptools/profile.py:89 msgid "Original message followed by a separate summary message" msgstr "" +#: imiptools/profile.py:90 msgid "Summary message followed by the original message" msgstr "" +#: imiptools/profile.py:91 msgid "Summary message only" msgstr "" +#: imiptools/profile.py:92 msgid "Summary message wrapping the original message" msgstr "" +#: imiptools/profile.py:95 msgid "Anyone" msgstr "" +#: imiptools/profile.py:96 msgid "Existing attendees only" msgstr "" +#: imiptools/profile.py:97 msgid "Never allow organiser replacement" msgstr "" +#: imiptools/profile.py:100 msgid "Participate" msgstr "" +#: imiptools/profile.py:101 msgid "Do not participate" msgstr "" +#: imipweb/calendar.py:133 #, python-format msgid "New event at %s" msgstr "" +#: imipweb/calendar.py:231 +msgid "Pending requests:" +msgstr "" + +#: imipweb/calendar.py:253 msgid "There are no pending requests." msgstr "" +#: imipweb/calendar.py:270 msgid "Participants for scheduling:" msgstr "" +#: imipweb/calendar.py:275 imipweb/event.py:426 imipweb/event.py:525 msgid "Remove" msgstr "" +#: imipweb/calendar.py:280 msgid "Add" msgstr "" +#: imipweb/calendar.py:304 msgid "Select days or periods for a new event." msgstr "" +#: imipweb/calendar.py:305 msgid "Hide busy time periods" msgstr "" +#: imipweb/calendar.py:306 msgid "Show busy time periods" msgstr "" +#: imipweb/calendar.py:307 msgid "Show empty days" msgstr "" +#: imipweb/calendar.py:308 msgid "Hide empty days" msgstr "" +#: imipweb/calendar.py:309 imipweb/calendar.py:846 msgid "Clear selections" msgstr "" +#: imipweb/calendar.py:339 msgid "Show earlier events" msgstr "" +#: imipweb/calendar.py:345 msgid "Show earlier" msgstr "" +#: imipweb/calendar.py:354 msgid "Show later" msgstr "" +#: imipweb/calendar.py:361 msgid "Show later events" msgstr "" +#: imipweb/calendar.py:440 #, python-format msgid "Showing events from %(start)s until %(end)s" msgstr "" +#: imipweb/calendar.py:444 #, python-format msgid "Showing events from %s" msgstr "" +#: imipweb/calendar.py:446 #, python-format msgid "Showing events until %s" msgstr "" +#: imipweb/calendar.py:470 msgid "Pending requests" msgstr "" +#: imipweb/calendar.py:470 msgid "Your schedule" msgstr "" +#: imipweb/calendar.py:589 msgid "Calendar" msgstr "" +#: imipweb/calendar.py:840 msgid "Summary:" msgstr "" +#: imipweb/calendar.py:842 msgid "New event" msgstr "" +#: imipweb/calendar.py:993 msgid "(Participant is busy)" msgstr "" +#: imipweb/calendar.py:1076 msgid "Select/deselect period" msgstr "" +#: imipweb/event.py:44 +msgid "Summary" +msgstr "" + +#: imipweb/event.py:45 imipweb/event.py:629 imipweb/event.py:742 +msgid "Start" +msgstr "" + +#: imipweb/event.py:46 imipweb/event.py:630 imipweb/event.py:743 +msgid "End" +msgstr "" + +#: imipweb/event.py:47 +msgid "Organiser" +msgstr "" + +#: imipweb/event.py:48 imipweb/event.py:595 +msgid "Attendee" +msgstr "" + +#: imipweb/event.py:52 +msgid "Not confirmed" +msgstr "" + +#: imipweb/event.py:53 +msgid "Attending" +msgstr "" + +#: imipweb/event.py:54 +msgid "Tentatively attending" +msgstr "" + +#: imipweb/event.py:55 +msgid "Not attending" +msgstr "" + +#: imipweb/event.py:56 +msgid "Delegated" +msgstr "" + +#: imipweb/event.py:57 +msgid "Not indicated" +msgstr "" + +#: imipweb/event.py:154 msgid "This event has not been shared." msgstr "" +#: imipweb/event.py:159 msgid "An action is required for this request:" msgstr "" +#: imipweb/event.py:162 msgid "Send reply" msgstr "" +#: imipweb/event.py:164 imipweb/event.py:183 msgid "Discard event" msgstr "" +#: imipweb/event.py:166 imipweb/event.py:186 msgid "Return to the calendar" msgstr "" +#: imipweb/event.py:170 msgid "As organiser, you can perform the following:" msgstr "" +#: imipweb/event.py:173 msgid "Update event" msgstr "" +#: imipweb/event.py:177 msgid "Ignore counter-proposals" msgstr "" +#: imipweb/event.py:181 msgid "Cancel event" msgstr "" +#: imipweb/event.py:188 msgid "Save without sending" msgstr "" +#: imipweb/event.py:227 imipweb/event.py:741 imipweb/event.py:1290 msgid "Event" msgstr "" +#: imipweb/event.py:274 msgid "First occurrence replaced by a separate event" msgstr "" +#: imipweb/event.py:283 msgid "First occurrence excluded" msgstr "" +#: imipweb/event.py:294 msgid "Add a recurrence" msgstr "" +#: imipweb/event.py:335 msgid "Add attendee" msgstr "" +#: imipweb/event.py:428 msgid "(Uninvited)" msgstr "" +#: imipweb/event.py:429 msgid "Re-invite" msgstr "" +#: imipweb/event.py:453 msgid "This event modifies a recurring event." msgstr "" +#: imipweb/event.py:463 #, python-format msgid "This event occurs on the following occasions within the next %d days:" msgstr "" -msgid "Occurrence from rule" -msgstr "" - +#: imipweb/event.py:494 msgid "Occurrence" msgstr "" +#: imipweb/event.py:494 +msgid "Occurrence from rule" +msgstr "" + +#: imipweb/event.py:527 msgid "(Removed)" msgstr "" +#: imipweb/event.py:528 msgid "Re-add" msgstr "" +#: imipweb/event.py:590 msgid "The following attendees have been suggested for this event:" msgstr "" -msgid "Attendee" -msgstr "" - +#: imipweb/event.py:596 imipweb/event.py:626 msgid "Suggested by..." msgstr "" +#: imipweb/event.py:620 msgid "The following periods have been suggested for this event:" msgstr "" +#: imipweb/event.py:625 msgid "Periods" msgstr "" -msgid "Start" -msgstr "" - -msgid "End" -msgstr "" - +#: imipweb/event.py:736 msgid "This event conflicts with others:" msgstr "" +#: imipweb/event.py:763 msgid "(Unspecified event)" msgstr "" + +#: imipweb/profile.py:38 +msgid "Participate in the calendar system" +msgstr "" + +#: imipweb/profile.py:39 +msgid "Your common name" +msgstr "" + +#: imipweb/profile.py:40 +msgid "Language" +msgstr "" + +#: imipweb/profile.py:41 +msgid "Time zone/regime" +msgstr "" + +#: imipweb/profile.py:42 +msgid "How to present incoming calendar messages" +msgstr "" + +#: imipweb/profile.py:43 +msgid "Share free/busy information" +msgstr "" + +#: imipweb/profile.py:44 +msgid "Bundle free/busy details with messages" +msgstr "" + +#: imipweb/profile.py:45 +msgid "Publish free/busy details via the Web" +msgstr "" + +#: imipweb/profile.py:46 +msgid "Deliver details of received free/busy messages" +msgstr "" + +#: imipweb/profile.py:47 +msgid "How to respond to messages adding events" +msgstr "" + +#: imipweb/profile.py:48 +msgid "How to handle event refresh requests" +msgstr "" + +#: imipweb/profile.py:49 +msgid "Recognise whom as a new organiser of an event?" +msgstr "" + +#: imipweb/profile.py:182 +msgid "Save" +msgstr "" + +#: imipweb/profile.py:183 +msgid "Cancel" +msgstr "" + +#: imipweb/profile.py:200 +msgid "Profile" +msgstr "" diff -r 3273c34ff13c -r 6df45ddd56d1 messages/nb_NO.imip-agent.po --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messages/nb_NO.imip-agent.po Fri Nov 06 00:00:55 2015 +0100 @@ -0,0 +1,504 @@ +# Translations for imip-agent. +# Copyright (C) 2015 Paul Boddie +# This file is distributed under the same license as the imip-agent package. +# Paul Boddie , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: 71b35ab1f0bd+\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-05 23:53+0100\n" +"PO-Revision-Date: 2015-11-04 18:18+0100\n" +"Last-Translator: Paul Boddie \n" +"Language-Team: Norwegian Bokmål\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: imiptools/handlers/__init__.py:77 +#, python-format +msgid "" +"If your mail program cannot handle this message, you may view the details " +"here:\n" +"\n" +"%s" +msgstr "" +"Hvis e-postprogrammet ditt ikke kan vise denne meldingen, kan du se " +"detaljene her:\n" +"\n" +"%s" + +#: imiptools/handlers/person.py:248 +msgid "An addition to an event has been received." +msgstr "En tilleggshendelse er blitt mottatt." + +#: imiptools/handlers/person.py:257 +msgid "An event cancellation has been received." +msgstr "Et avbud er blitt mottatt." + +#: imiptools/handlers/person.py:266 +msgid "A counter proposal to an event invitation has been received." +msgstr "Et motforslag for en hendelse er blitt mottatt." + +#: imiptools/handlers/person.py:275 +msgid "Your counter proposal to an event invitation has been declined." +msgstr "Ditt motforslag for en hendelse er blitt avvist." + +#: imiptools/handlers/person.py:284 +msgid "Details of an event have been received." +msgstr "Detaljer for en hendelse er blitt mottatt." + +#: imiptools/handlers/person.py:295 +msgid "A request for updated event details has been received." +msgstr "En forespørsel for oppdaterte hendelsesdetaljer er blitt mottatt." + +#: imiptools/handlers/person.py:304 +msgid "A reply to an event invitation has been received." +msgstr "Et svar til en invitasjon er blitt mottatt." + +#: imiptools/handlers/person.py:313 +msgid "An event invitation has been received." +msgstr "En invitasjon er blitt mottatt." + +#: imiptools/handlers/person.py:330 +msgid "A free/busy update has been received." +msgstr "En oppdatering om ledige/opptatte perioder er blitt mottatt." + +#: imiptools/handlers/person.py:343 +msgid "A reply to a free/busy request has been received." +msgstr "Din forespørsel om ledige/opptatte perioder er blitt behandlet." + +#: imiptools/mail.py:32 +msgid "Calendar system message" +msgstr "Melding fra kalendersystemet" + +#: imiptools/mail.py:34 +msgid "" +"This message contains several different parts, one of which will contain\n" +"calendar information that will only be understood by a suitable program.\n" +msgstr "" +"Denne meldingen inneholder seksjoner med kalenderdata som krever et " +"passende\n" +"e-postprogram.\n" + +#: imiptools/profile.py:63 +msgid "Add events" +msgstr "Legge til hendelser" + +#: imiptools/profile.py:64 +msgid "Ignore requests" +msgstr "Overse forespørsler" + +#: imiptools/profile.py:65 +msgid "Ask for refreshed event details" +msgstr "Be om oppdaterte hendelsesdetaljer" + +#: imiptools/profile.py:68 +msgid "Do not respond" +msgstr "Ikke svare på forespørsler" + +#: imiptools/profile.py:69 +msgid "Always respond" +msgstr "Alltid svare på forespørsler" + +#: imiptools/profile.py:72 +msgid "Never" +msgstr "Aldri" + +#: imiptools/profile.py:73 +msgid "Always" +msgstr "Alltid" + +#: imiptools/profile.py:76 +msgid "Do not notify" +msgstr "Ikke varsle" + +#: imiptools/profile.py:77 +msgid "Notify" +msgstr "Varsle" + +#: imiptools/profile.py:80 +msgid "Publish" +msgstr "Publisere" + +#: imiptools/profile.py:81 +msgid "Do not publish" +msgstr "Ikke publisere" + +#: imiptools/profile.py:84 +msgid "Share" +msgstr "Dele" + +#: imiptools/profile.py:85 +msgid "Do not share" +msgstr "Ikke dele" + +#: imiptools/profile.py:88 +msgid "Original message only" +msgstr "Kun den opprinnelige meldingen" + +#: imiptools/profile.py:89 +msgid "Original message followed by a separate summary message" +msgstr "Den opprinnelige meldingen og så en sammendragsmelding" + +#: imiptools/profile.py:90 +msgid "Summary message followed by the original message" +msgstr "En sammendragsmelding og så den opprinnelige meldingen" + +#: imiptools/profile.py:91 +msgid "Summary message only" +msgstr "Kun en sammendragsmelding" + +#: imiptools/profile.py:92 +msgid "Summary message wrapping the original message" +msgstr "En sammendragsmelding som inneholder den opprinnelige meldingen" + +#: imiptools/profile.py:95 +msgid "Anyone" +msgstr "Alle" + +#: imiptools/profile.py:96 +msgid "Existing attendees only" +msgstr "Kun eksisterende deltakere" + +#: imiptools/profile.py:97 +msgid "Never allow organiser replacement" +msgstr "Aldri tillate utbytting av arrangører" + +#: imiptools/profile.py:100 +msgid "Participate" +msgstr "Delta" + +#: imiptools/profile.py:101 +msgid "Do not participate" +msgstr "Ikke delta" + +#: imipweb/calendar.py:133 +#, python-format +msgid "New event at %s" +msgstr "Ny hendelse på %s" + +#: imipweb/calendar.py:231 +msgid "Pending requests:" +msgstr "Forespørsler som venter" + +#: imipweb/calendar.py:253 +msgid "There are no pending requests." +msgstr "Ingen forespørsler" + +#: imipweb/calendar.py:270 +msgid "Participants for scheduling:" +msgstr "Deltakere for gruppeplanlegging:" + +#: imipweb/calendar.py:275 imipweb/event.py:426 imipweb/event.py:525 +msgid "Remove" +msgstr "Fjerne" + +#: imipweb/calendar.py:280 +msgid "Add" +msgstr "Legge til" + +#: imipweb/calendar.py:304 +msgid "Select days or periods for a new event." +msgstr "Velg dager eller perioder for en ny hendelse." + +#: imipweb/calendar.py:305 +msgid "Hide busy time periods" +msgstr "Skjule opptatte perioder" + +#: imipweb/calendar.py:306 +msgid "Show busy time periods" +msgstr "Vise opptatte perioder" + +#: imipweb/calendar.py:307 +msgid "Show empty days" +msgstr "Vise ledige dager" + +#: imipweb/calendar.py:308 +msgid "Hide empty days" +msgstr "Skjule ledige dager" + +#: imipweb/calendar.py:309 imipweb/calendar.py:846 +msgid "Clear selections" +msgstr "Nullstille valgte perioder" + +#: imipweb/calendar.py:339 +msgid "Show earlier events" +msgstr "Tidligere hendelser" + +#: imipweb/calendar.py:345 +msgid "Show earlier" +msgstr "Tidligere" + +#: imipweb/calendar.py:354 +msgid "Show later" +msgstr "Senere" + +#: imipweb/calendar.py:361 +msgid "Show later events" +msgstr "Senere hendelser" + +#: imipweb/calendar.py:440 +#, python-format +msgid "Showing events from %(start)s until %(end)s" +msgstr "Viser hendelser fra %(start)s frem til %(end)s" + +#: imipweb/calendar.py:444 +#, python-format +msgid "Showing events from %s" +msgstr "Viser hendelser fra %s" + +#: imipweb/calendar.py:446 +#, python-format +msgid "Showing events until %s" +msgstr "Viser hendelser frem til %s" + +#: imipweb/calendar.py:470 +msgid "Pending requests" +msgstr "Forespørsler som venter" + +#: imipweb/calendar.py:470 +msgid "Your schedule" +msgstr "Din tidsplan" + +#: imipweb/calendar.py:589 +msgid "Calendar" +msgstr "Kalender" + +#: imipweb/calendar.py:840 +msgid "Summary:" +msgstr "Sammendrag:" + +#: imipweb/calendar.py:842 +msgid "New event" +msgstr "Ny hendelse" + +#: imipweb/calendar.py:993 +msgid "(Participant is busy)" +msgstr "(Deltaker er opptatt)" + +#: imipweb/calendar.py:1076 +msgid "Select/deselect period" +msgstr "Velge/nullstille periode" + +#: imipweb/event.py:44 +msgid "Summary" +msgstr "Sammendrag" + +#: imipweb/event.py:45 imipweb/event.py:629 imipweb/event.py:742 +msgid "Start" +msgstr "Start" + +#: imipweb/event.py:46 imipweb/event.py:630 imipweb/event.py:743 +msgid "End" +msgstr "Slutt" + +#: imipweb/event.py:47 +msgid "Organiser" +msgstr "Arrangør" + +#: imipweb/event.py:48 imipweb/event.py:595 +msgid "Attendee" +msgstr "Deltaker" + +#: imipweb/event.py:52 +msgid "Not confirmed" +msgstr "Ikke bekreftet" + +#: imipweb/event.py:53 +msgid "Attending" +msgstr "Deltar" + +#: imipweb/event.py:54 +msgid "Tentatively attending" +msgstr "Delta kanskje" + +#: imipweb/event.py:55 +msgid "Not attending" +msgstr "Deltar ikke" + +#: imipweb/event.py:56 +msgid "Delegated" +msgstr "Har delegert til en annen" + +#: imipweb/event.py:57 +msgid "Not indicated" +msgstr "Ikke angitt" + +#: imipweb/event.py:154 +msgid "This event has not been shared." +msgstr "Detaljer for en hendelse er blitt mottatt." + +#: imipweb/event.py:159 +msgid "An action is required for this request:" +msgstr "Et valg må tas med denne forespørselen:" + +#: imipweb/event.py:162 +msgid "Send reply" +msgstr "Send svar" + +#: imipweb/event.py:164 imipweb/event.py:183 +msgid "Discard event" +msgstr "Kaste hendelsen" + +#: imipweb/event.py:166 imipweb/event.py:186 +msgid "Return to the calendar" +msgstr "Tilbake til kalenderen" + +#: imipweb/event.py:170 +msgid "As organiser, you can perform the following:" +msgstr "Som arrangør kan du utføre følgende:" + +#: imipweb/event.py:173 +msgid "Update event" +msgstr "Oppdatere hendelsen" + +#: imipweb/event.py:177 +msgid "Ignore counter-proposals" +msgstr "Overse motforslag" + +#: imipweb/event.py:181 +msgid "Cancel event" +msgstr "Send avbud for hendelsen" + +#: imipweb/event.py:188 +msgid "Save without sending" +msgstr "Lagre uten å sende" + +#: imipweb/event.py:227 imipweb/event.py:741 imipweb/event.py:1290 +msgid "Event" +msgstr "Hendelse" + +#: imipweb/event.py:274 +msgid "First occurrence replaced by a separate event" +msgstr "Den første perioden er erstattet med en annen hendelse" + +#: imipweb/event.py:283 +msgid "First occurrence excluded" +msgstr "Den første perioden ble fjernet" + +#: imipweb/event.py:294 +msgid "Add a recurrence" +msgstr "Legge til en ny periode" + +#: imipweb/event.py:335 +msgid "Add attendee" +msgstr "Legge til en deltaker" + +#: imipweb/event.py:428 +msgid "(Uninvited)" +msgstr "(Ikke invitert)" + +#: imipweb/event.py:429 +msgid "Re-invite" +msgstr "Invitere på nytt" + +#: imipweb/event.py:453 +msgid "This event modifies a recurring event." +msgstr "Denne hendelsen endrer en period i en hendelse som gjentar seg." + +#: imipweb/event.py:463 +#, python-format +msgid "This event occurs on the following occasions within the next %d days:" +msgstr "Denne hendelsen forekommer på følgende anledninger innen %d dager:" + +#: imipweb/event.py:494 +msgid "Occurrence" +msgstr "Forekomst" + +#: imipweb/event.py:494 +msgid "Occurrence from rule" +msgstr "Forekomst fra regel" + +#: imipweb/event.py:527 +msgid "(Removed)" +msgstr "(Fjernet)" + +#: imipweb/event.py:528 +msgid "Re-add" +msgstr "Legge til på nytt" + +#: imipweb/event.py:590 +msgid "The following attendees have been suggested for this event:" +msgstr "Følgende deltakere er blitt foreslått for denne hendelsen:" + +#: imipweb/event.py:596 imipweb/event.py:626 +msgid "Suggested by..." +msgstr "Foreslått av..." + +#: imipweb/event.py:620 +msgid "The following periods have been suggested for this event:" +msgstr "Følgende perioder er blitt foreslått for denne hendelsen:" + +#: imipweb/event.py:625 +msgid "Periods" +msgstr "Perioder" + +#: imipweb/event.py:736 +msgid "This event conflicts with others:" +msgstr "Hendelsen er i konflikt med andre i tidsplanen:" + +#: imipweb/event.py:763 +msgid "(Unspecified event)" +msgstr "(Ikke angitt hendelse)" + +#: imipweb/profile.py:38 +msgid "Participate in the calendar system" +msgstr "Delta i kalendersystemet" + +#: imipweb/profile.py:39 +msgid "Your common name" +msgstr "Ditt navn" + +#: imipweb/profile.py:40 +msgid "Language" +msgstr "Språk" + +#: imipweb/profile.py:41 +msgid "Time zone/regime" +msgstr "Tidssone" + +#: imipweb/profile.py:42 +msgid "How to present incoming calendar messages" +msgstr "Hvordan fremstille kalendermeldinger" + +#: imipweb/profile.py:43 +msgid "Share free/busy information" +msgstr "Dele ledige og opptatte perioder med andre" + +#: imipweb/profile.py:44 +msgid "Bundle free/busy details with messages" +msgstr "Legge dine ledige og opptatte perioder ved meldinger til andre" + +#: imipweb/profile.py:45 +msgid "Publish free/busy details via the Web" +msgstr "Publisere dine ledige og opptatte perioder på Web" + +#: imipweb/profile.py:46 +msgid "Deliver details of received free/busy messages" +msgstr "Varsle om mottatte meldinger med ledige og opptatte perioder" + +#: imipweb/profile.py:47 +msgid "How to respond to messages adding events" +msgstr "Hvordan svare på meldinger som vil legge inn nye hendelser" + +#: imipweb/profile.py:48 +msgid "How to handle event refresh requests" +msgstr "Hvordan håndtere oppdateringsforespørsler" + +#: imipweb/profile.py:49 +msgid "Recognise whom as a new organiser of an event?" +msgstr "Hvem får bli ny arrangør for en hendelse?" + +#: imipweb/profile.py:182 +msgid "Save" +msgstr "Lagre" + +#: imipweb/profile.py:183 +msgid "Cancel" +msgstr "Tilbake" + +#: imipweb/profile.py:200 +msgid "Profile" +msgstr "Brukerprofil" diff -r 3273c34ff13c -r 6df45ddd56d1 tools/i18n_format.sh --- a/tools/i18n_format.sh Thu Nov 05 20:00:51 2015 +0100 +++ b/tools/i18n_format.sh Fri Nov 06 00:00:55 2015 +0100 @@ -4,5 +4,6 @@ for FILENAME in messages/*.po ; do LOCALE_ID=`basename "$FILENAME" ".$DOMAIN.po"` + mkdir -p "locale/$LOCALE_ID/LC_MESSAGES" msgfmt -o "locale/$LOCALE_ID/LC_MESSAGES/$DOMAIN.mo" "$FILENAME" done diff -r 3273c34ff13c -r 6df45ddd56d1 tools/i18n_messages.sh --- a/tools/i18n_messages.sh Thu Nov 05 20:00:51 2015 +0100 +++ b/tools/i18n_messages.sh Fri Nov 06 00:00:55 2015 +0100 @@ -1,14 +1,23 @@ #!/bin/sh -find imiptools imipweb -type f -name '*.py' | xargs xgettext -d imip-agent --no-location +# Obtain messages from the Python files. + + find imiptools imipweb -type f -name '*.py' \ +| xargs xgettext -d imip-agent --sort-by-file \ + --copyright-holder="Paul Boddie " \ + --package-name="imip-agent" --package-version=`hg id | cut -d ' ' -f 1` + +# Set the default charset. - sed "s/SOME DESCRIPTIVE TITLE/Translations for imip-agent/" imip-agent.po \ -| sed "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2015 Paul Boddie /" \ -| sed "s/FIRST AUTHOR , YEAR/Paul Boddie , 2015/" \ -| sed "s/PACKAGE VERSION/`hg id | cut -d ' ' -f 1`/" \ -| sed "s/PACKAGE/imip-agent/" \ + sed "s/CHARSET/iso-8859-1/" imip-agent.po \ > imip-agent.pot +# Remove the original file. + +rm imip-agent.po + +# Merge messages with the existing translations. + for FILENAME in messages/*.po ; do msgmerge --update "$FILENAME" imip-agent.pot done diff -r 3273c34ff13c -r 6df45ddd56d1 tools/install.sh --- a/tools/install.sh Thu Nov 05 20:00:51 2015 +0100 +++ b/tools/install.sh Fri Nov 06 00:00:55 2015 +0100 @@ -8,6 +8,12 @@ . /etc/imip-agent/config.sh fi +if [ "$1" = "--no-locale-dir" ]; then + NO_LOCALE_DIR=$1 +else + NO_LOCALE_DIR= +fi + # Agents and modules. AGENTS="imip_person.py imip_person_outgoing.py imip_resource.py" @@ -91,3 +97,12 @@ fi cp imipweb/*.py "$WEB_INSTALL_DIR/imipweb/" + +# Locale directory. + +if [ ! "$NO_LOCALE_DIR" ] && [ -e "locale" ]; then + for DIR in "locale/"*"/LC_MESSAGES" ; do + mkdir -p "$INSTALL_DIR/$DIR" + cp "$DIR/"*.mo "$INSTALL_DIR/$DIR/" + done +fi