<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[3310] CalendarServer/branches/users/sagen/localization-3308</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/calendarserver/changeset/3310">3310</a></dd>
<dt>Author</dt> <dd>sagen@apple.com</dd>
<dt>Date</dt> <dd>2008-11-03 09:01:16 -0800 (Mon, 03 Nov 2008)</dd>
</dl>

<h3>Log Message</h3>
<pre>Bringing localization changes forward to new branch</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308confcaldavdtestplist">CalendarServer/branches/users/sagen/localization-3308/conf/caldavd-test.plist</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavconfigpy">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/config.py</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavicalpy">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/ical.py</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavmailpy">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/mail.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/en/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/fr/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/pig/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavlocalizationpy">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/localization.py</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtesttest_localizationpy">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/test_localization.py</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/en/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/fr/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/pig/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po</a></li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/</li>
<li>CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/</li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarservermo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.mo</a></li>
<li><a href="#CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarserverpo">CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="CalendarServerbranchesuserssagenlocalization3308confcaldavdtestplist"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/localization-3308/conf/caldavd-test.plist (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/conf/caldavd-test.plist        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/conf/caldavd-test.plist        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -638,6 +638,13 @@
</span><span class="cx">       &lt;string&gt;logs/caldavd-pydir.sock&lt;/string&gt;
</span><span class="cx">     &lt;/dict&gt;
</span><span class="cx"> 
</span><ins>+    &lt;key&gt;Localization&lt;/key&gt;
+    &lt;dict&gt;
+      &lt;key&gt;LocalesDirectory&lt;/key&gt;
+      &lt;string&gt;locales&lt;/string&gt;
+      &lt;key&gt;Language&lt;/key&gt;
+      &lt;string&gt;en&lt;/string&gt;
+    &lt;/dict&gt;
</ins><span class="cx"> 
</span><span class="cx">   &lt;/dict&gt;
</span><span class="cx"> &lt;/plist&gt;
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarservermofromrev3309CalendarServerbranchesuserssagenlocalization3280localesenLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.mo (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/en/LC_MESSAGES/calendarserver.mo)</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarserverpo"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3280/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1,260 +0,0 @@
</span><del>-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
-#
-msgid &quot;&quot;
-msgstr &quot;&quot;
-&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
-&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
-&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
-&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
-&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
-&quot;MIME-Version: 1.0\n&quot;
-&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
-&quot;Content-Transfer-Encoding: 8bit\n&quot;
-&quot;Generated-By: pygettext.py 1.5\n&quot;
-
-
-#: localization.py:171
-msgid &quot;All day&quot;
-msgstr &quot;&quot;
-
-#: localization.py:177
-msgid &quot;%(startTime)s to %(endTime)s&quot;
-msgstr &quot;&quot;
-
-#: localization.py:191
-msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-msgstr &quot;&quot;
-
-#: localization.py:207
-msgid &quot;AM&quot;
-msgstr &quot;&quot;
-
-#: localization.py:207
-msgid &quot;PM&quot;
-msgstr &quot;&quot;
-
-#: localization.py:213
-msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-msgstr &quot;&quot;
-
-#: localization.py:236
-msgid &quot;Monday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:237
-msgid &quot;Tuesday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:238
-msgid &quot;Wednesday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:239
-msgid &quot;Thursday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:240
-msgid &quot;Friday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:241
-msgid &quot;Saturday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:242
-msgid &quot;Sunday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:246
-msgid &quot;Mon&quot;
-msgstr &quot;&quot;
-
-#: localization.py:247
-msgid &quot;Tue&quot;
-msgstr &quot;&quot;
-
-#: localization.py:248
-msgid &quot;Wed&quot;
-msgstr &quot;&quot;
-
-#: localization.py:249
-msgid &quot;Thu&quot;
-msgstr &quot;&quot;
-
-#: localization.py:250
-msgid &quot;Fri&quot;
-msgstr &quot;&quot;
-
-#: localization.py:251
-msgid &quot;Sun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:252
-msgid &quot;Sat&quot;
-msgstr &quot;&quot;
-
-#: localization.py:257
-msgid &quot;January&quot;
-msgstr &quot;&quot;
-
-#: localization.py:258
-msgid &quot;February&quot;
-msgstr &quot;&quot;
-
-#: localization.py:259
-msgid &quot;March&quot;
-msgstr &quot;&quot;
-
-#: localization.py:260
-msgid &quot;April&quot;
-msgstr &quot;&quot;
-
-#: localization.py:261 localization.py:277
-msgid &quot;May&quot;
-msgstr &quot;&quot;
-
-#: localization.py:262
-msgid &quot;June&quot;
-msgstr &quot;&quot;
-
-#: localization.py:263
-msgid &quot;July&quot;
-msgstr &quot;&quot;
-
-#: localization.py:264
-msgid &quot;August&quot;
-msgstr &quot;&quot;
-
-#: localization.py:265
-msgid &quot;September&quot;
-msgstr &quot;&quot;
-
-#: localization.py:266
-msgid &quot;October&quot;
-msgstr &quot;&quot;
-
-#: localization.py:267
-msgid &quot;November&quot;
-msgstr &quot;&quot;
-
-#: localization.py:268
-msgid &quot;December&quot;
-msgstr &quot;&quot;
-
-#: localization.py:273
-msgid &quot;Jan&quot;
-msgstr &quot;&quot;
-
-#: localization.py:274
-msgid &quot;Feb&quot;
-msgstr &quot;&quot;
-
-#: localization.py:275
-msgid &quot;Mar&quot;
-msgstr &quot;&quot;
-
-#: localization.py:276
-msgid &quot;Apr&quot;
-msgstr &quot;&quot;
-
-#: localization.py:278
-msgid &quot;Jun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:279
-msgid &quot;Jul&quot;
-msgstr &quot;&quot;
-
-#: localization.py:280
-msgid &quot;Aug&quot;
-msgstr &quot;&quot;
-
-#: localization.py:281
-msgid &quot;Sep&quot;
-msgstr &quot;&quot;
-
-#: localization.py:282
-msgid &quot;Oct&quot;
-msgstr &quot;&quot;
-
-#: localization.py:283
-msgid &quot;Nov&quot;
-msgstr &quot;&quot;
-
-#: localization.py:284
-msgid &quot;Dec&quot;
-msgstr &quot;&quot;
-
-#: mail.py:726 mail.py:755 mail.py:792
-msgid &quot;Event cancelled&quot;
-msgstr &quot;&quot;
-
-#: mail.py:727
-msgid &quot;Event invitation: %(summary)s&quot;
-msgstr &quot;&quot;
-
-#: mail.py:736
-msgid &quot;Event Invitation&quot;
-msgstr &quot;&quot;
-
-#: mail.py:737
-msgid &quot;Date&quot;
-msgstr &quot;&quot;
-
-#: mail.py:738
-msgid &quot;Time&quot;
-msgstr &quot;&quot;
-
-#: mail.py:739
-msgid &quot;Description&quot;
-msgstr &quot;&quot;
-
-#: mail.py:740
-msgid &quot;Organizer&quot;
-msgstr &quot;&quot;
-
-#: mail.py:741
-msgid &quot;Attendees&quot;
-msgstr &quot;&quot;
-
-#: mail.py:742
-msgid &quot;Location&quot;
-msgstr &quot;&quot;
-
-msgid &quot;Duration&quot;
-msgstr &quot;&quot;
-
-msgid &quot;Occurs&quot;
-msgstr &quot;&quot;
-
-msgid &quot;Repeating&quot;
-msgstr &quot;&quot;
-
-msgid &quot;Once&quot;
-msgstr &quot;&quot;
-
-msgid &quot;1 day&quot;
-msgstr
-
-msgid &quot;%(dayCount)d days&quot;
-msgstr
-
-msgid &quot;1 hour&quot;
-
-msgid &quot;%(hourCount)d hours&quot;
-msgstr
-
-msgid &quot;1 minute&quot;
-msgstr
-
-msgid &quot;%(minuteCount)d minutes&quot;
-msgstr
-
-msgid &quot;1 second&quot;
-msgstr
-
-msgid &quot;%(secondCount)d seconds&quot;
-msgstr
-
</del></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesenLC_MESSAGEScalendarserverpofromrev3309CalendarServerbranchesuserssagenlocalization3280localesenLC_MESSAGEScalendarserverpo"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/en/LC_MESSAGES/calendarserver.po) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,260 @@
</span><ins>+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
+#
+msgid &quot;&quot;
+msgstr &quot;&quot;
+&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
+&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
+&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
+&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
+&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
+&quot;MIME-Version: 1.0\n&quot;
+&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
+&quot;Content-Transfer-Encoding: 8bit\n&quot;
+&quot;Generated-By: pygettext.py 1.5\n&quot;
+
+
+#: localization.py:171
+msgid &quot;All day&quot;
+msgstr &quot;&quot;
+
+#: localization.py:177
+msgid &quot;%(startTime)s to %(endTime)s&quot;
+msgstr &quot;&quot;
+
+#: localization.py:191
+msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+msgstr &quot;&quot;
+
+#: localization.py:207
+msgid &quot;AM&quot;
+msgstr &quot;&quot;
+
+#: localization.py:207
+msgid &quot;PM&quot;
+msgstr &quot;&quot;
+
+#: localization.py:213
+msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+msgstr &quot;&quot;
+
+#: localization.py:236
+msgid &quot;Monday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:237
+msgid &quot;Tuesday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:238
+msgid &quot;Wednesday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:239
+msgid &quot;Thursday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:240
+msgid &quot;Friday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:241
+msgid &quot;Saturday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:242
+msgid &quot;Sunday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:246
+msgid &quot;Mon&quot;
+msgstr &quot;&quot;
+
+#: localization.py:247
+msgid &quot;Tue&quot;
+msgstr &quot;&quot;
+
+#: localization.py:248
+msgid &quot;Wed&quot;
+msgstr &quot;&quot;
+
+#: localization.py:249
+msgid &quot;Thu&quot;
+msgstr &quot;&quot;
+
+#: localization.py:250
+msgid &quot;Fri&quot;
+msgstr &quot;&quot;
+
+#: localization.py:251
+msgid &quot;Sun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:252
+msgid &quot;Sat&quot;
+msgstr &quot;&quot;
+
+#: localization.py:257
+msgid &quot;January&quot;
+msgstr &quot;&quot;
+
+#: localization.py:258
+msgid &quot;February&quot;
+msgstr &quot;&quot;
+
+#: localization.py:259
+msgid &quot;March&quot;
+msgstr &quot;&quot;
+
+#: localization.py:260
+msgid &quot;April&quot;
+msgstr &quot;&quot;
+
+#: localization.py:261 localization.py:277
+msgid &quot;May&quot;
+msgstr &quot;&quot;
+
+#: localization.py:262
+msgid &quot;June&quot;
+msgstr &quot;&quot;
+
+#: localization.py:263
+msgid &quot;July&quot;
+msgstr &quot;&quot;
+
+#: localization.py:264
+msgid &quot;August&quot;
+msgstr &quot;&quot;
+
+#: localization.py:265
+msgid &quot;September&quot;
+msgstr &quot;&quot;
+
+#: localization.py:266
+msgid &quot;October&quot;
+msgstr &quot;&quot;
+
+#: localization.py:267
+msgid &quot;November&quot;
+msgstr &quot;&quot;
+
+#: localization.py:268
+msgid &quot;December&quot;
+msgstr &quot;&quot;
+
+#: localization.py:273
+msgid &quot;Jan&quot;
+msgstr &quot;&quot;
+
+#: localization.py:274
+msgid &quot;Feb&quot;
+msgstr &quot;&quot;
+
+#: localization.py:275
+msgid &quot;Mar&quot;
+msgstr &quot;&quot;
+
+#: localization.py:276
+msgid &quot;Apr&quot;
+msgstr &quot;&quot;
+
+#: localization.py:278
+msgid &quot;Jun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:279
+msgid &quot;Jul&quot;
+msgstr &quot;&quot;
+
+#: localization.py:280
+msgid &quot;Aug&quot;
+msgstr &quot;&quot;
+
+#: localization.py:281
+msgid &quot;Sep&quot;
+msgstr &quot;&quot;
+
+#: localization.py:282
+msgid &quot;Oct&quot;
+msgstr &quot;&quot;
+
+#: localization.py:283
+msgid &quot;Nov&quot;
+msgstr &quot;&quot;
+
+#: localization.py:284
+msgid &quot;Dec&quot;
+msgstr &quot;&quot;
+
+#: mail.py:726 mail.py:755 mail.py:792
+msgid &quot;Event cancelled&quot;
+msgstr &quot;&quot;
+
+#: mail.py:727
+msgid &quot;Event invitation: %(summary)s&quot;
+msgstr &quot;&quot;
+
+#: mail.py:736
+msgid &quot;Event Invitation&quot;
+msgstr &quot;&quot;
+
+#: mail.py:737
+msgid &quot;Date&quot;
+msgstr &quot;&quot;
+
+#: mail.py:738
+msgid &quot;Time&quot;
+msgstr &quot;&quot;
+
+#: mail.py:739
+msgid &quot;Description&quot;
+msgstr &quot;&quot;
+
+#: mail.py:740
+msgid &quot;Organizer&quot;
+msgstr &quot;&quot;
+
+#: mail.py:741
+msgid &quot;Attendees&quot;
+msgstr &quot;&quot;
+
+#: mail.py:742
+msgid &quot;Location&quot;
+msgstr &quot;&quot;
+
+msgid &quot;Duration&quot;
+msgstr &quot;&quot;
+
+msgid &quot;Occurs&quot;
+msgstr &quot;&quot;
+
+msgid &quot;Repeating&quot;
+msgstr &quot;&quot;
+
+msgid &quot;Once&quot;
+msgstr &quot;&quot;
+
+msgid &quot;1 day&quot;
+msgstr
+
+msgid &quot;%(dayCount)d days&quot;
+msgstr
+
+msgid &quot;1 hour&quot;
+
+msgid &quot;%(hourCount)d hours&quot;
+msgstr
+
+msgid &quot;1 minute&quot;
+msgstr
+
+msgid &quot;%(minuteCount)d minutes&quot;
+msgstr
+
+msgid &quot;1 second&quot;
+msgstr
+
+msgid &quot;%(secondCount)d seconds&quot;
+msgstr
+
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarservermofromrev3309CalendarServerbranchesuserssagenlocalization3280localesfrLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.mo (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/fr/LC_MESSAGES/calendarserver.mo)</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarserverpo"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3280/locales/fr/LC_MESSAGES/calendarserver.po        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1,252 +0,0 @@
</span><del>-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
-#
-msgid &quot;&quot;
-msgstr &quot;&quot;
-&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
-&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
-&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
-&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
-&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
-&quot;MIME-Version: 1.0\n&quot;
-&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
-&quot;Content-Transfer-Encoding: 8bit\n&quot;
-&quot;Generated-By: pygettext.py 1.5\n&quot;
-
-
-#: localization.py:171
-msgid &quot;All day&quot;
-msgstr &quot;Toute la journée&quot;
-
-#: localization.py:177
-msgid &quot;%(startTime)s to %(endTime)s&quot;
-msgstr &quot;%(startTime)s jusqu'à ce que %(endTime)s&quot;
-
-#: localization.py:191
-msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-
-#: localization.py:213
-msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-msgstr &quot;%(hour24Number)d:%(minuteNumber)02d&quot;
-
-#: mail.py:726 mail.py:755 mail.py:792
-msgid &quot;Event cancelled&quot;
-msgstr &quot;Événement annulé&quot;
-
-#: mail.py:727
-msgid &quot;Event invitation: %(summary)s&quot;
-msgstr &quot;Invitation: %(summary)s&quot;
-
-#: mail.py:736
-msgid &quot;Event Invitation&quot;
-msgstr &quot;Invitation&quot;
-
-#: mail.py:737
-msgid &quot;Date&quot;
-msgstr &quot;Date&quot;
-
-#: mail.py:738
-msgid &quot;Time&quot;
-msgstr &quot;Heure&quot;
-
-#: mail.py:739
-msgid &quot;Description&quot;
-msgstr &quot;Description&quot;
-
-#: mail.py:740
-msgid &quot;Organizer&quot;
-msgstr &quot;Organisateur&quot;
-
-#: mail.py:741
-msgid &quot;Attendees&quot;
-msgstr &quot;Participants&quot;
-
-#: mail.py:742
-msgid &quot;Location&quot;
-msgstr &quot;Emplacement&quot;
-
-msgid &quot;Duration&quot;
-msgstr &quot;Durée&quot;
-
-msgid &quot;Occurs&quot;
-msgstr &quot;Se produit&quot;
-
-msgid &quot;(Repeating)&quot;
-msgstr &quot;(Répétition)&quot;
-
-msgid &quot;Once&quot;
-msgstr &quot;Une fois&quot;
-
-#: twistedcaldav/localization.py:131
-msgid &quot;Monday&quot;
-msgstr &quot;Lundi&quot;
-
-#: twistedcaldav/localization.py:132
-msgid &quot;Tuesday&quot;
-msgstr &quot;Mardi&quot;
-
-#: twistedcaldav/localization.py:133
-msgid &quot;Wednesday&quot;
-msgstr &quot;Mercredi&quot;
-
-#: twistedcaldav/localization.py:134
-msgid &quot;Thursday&quot;
-msgstr &quot;Jeudi&quot;
-
-#: twistedcaldav/localization.py:135
-msgid &quot;Friday&quot;
-msgstr &quot;Vendredi&quot;
-
-#: twistedcaldav/localization.py:136
-msgid &quot;Saturday&quot;
-msgstr &quot;Samedi&quot;
-
-#: twistedcaldav/localization.py:137
-msgid &quot;Sunday&quot;
-msgstr &quot;Dimanche&quot;
-
-#: twistedcaldav/localization.py:141
-msgid &quot;Mon&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:142
-msgid &quot;Tue&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:143
-msgid &quot;Wed&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:144
-msgid &quot;Thu&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:145
-msgid &quot;Fri&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:146
-msgid &quot;Sun&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:147
-msgid &quot;Sat&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:152
-msgid &quot;January&quot;
-msgstr &quot;Janvier&quot;
-
-#: twistedcaldav/localization.py:153
-msgid &quot;February&quot;
-msgstr &quot;Février&quot;
-
-#: twistedcaldav/localization.py:154
-msgid &quot;March&quot;
-msgstr &quot;Mars&quot;
-
-#: twistedcaldav/localization.py:155
-msgid &quot;April&quot;
-msgstr &quot;Avril&quot;
-
-#: twistedcaldav/localization.py:156 twistedcaldav/localization.py:172
-msgid &quot;May&quot;
-msgstr &quot;Mai&quot;
-
-#: twistedcaldav/localization.py:157
-msgid &quot;June&quot;
-msgstr &quot;Juin&quot;
-
-#: twistedcaldav/localization.py:158
-msgid &quot;July&quot;
-msgstr &quot;Juillet&quot;
-
-#: twistedcaldav/localization.py:159
-msgid &quot;August&quot;
-msgstr &quot;Août&quot;
-
-#: twistedcaldav/localization.py:160
-msgid &quot;September&quot;
-msgstr &quot;Septembre&quot;
-
-#: twistedcaldav/localization.py:161
-msgid &quot;October&quot;
-msgstr &quot;Octobre&quot;
-
-#: twistedcaldav/localization.py:162
-msgid &quot;November&quot;
-msgstr &quot;Novembre&quot;
-
-#: twistedcaldav/localization.py:163
-msgid &quot;December&quot;
-msgstr &quot;Décembre&quot;
-
-#: twistedcaldav/localization.py:168
-msgid &quot;Jan&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:169
-msgid &quot;Feb&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:170
-msgid &quot;Mar&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:171
-msgid &quot;Apr&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:173
-msgid &quot;Jun&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:174
-msgid &quot;Jul&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:175
-msgid &quot;Aug&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:176
-msgid &quot;Sep&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:177
-msgid &quot;Oct&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:178
-msgid &quot;Nov&quot;
-msgstr &quot;&quot;
-
-#: twistedcaldav/localization.py:179
-msgid &quot;Dec&quot;
-msgstr &quot;&quot;
-
-msgid &quot;1 day&quot;
-msgstr
-
-msgid &quot;%(dayCount)d days&quot;
-msgstr
-
-msgid &quot;1 hour&quot;
-msgstr &quot;1 jour&quot;
-
-msgid &quot;%(hourCount)d hours&quot;
-msgstr &quot;%(hourCount)d jours&quot;
-
-msgid &quot;1 minute&quot;
-msgstr &quot;1 minute&quot;
-
-msgid &quot;%(minuteCount)d minutes&quot;
-msgstr &quot;%(minuteCount)d minutes&quot;
-
-msgid &quot;1 second&quot;
-msgstr &quot;1 seconde&quot;
-
-msgid &quot;%(secondCount)d seconds&quot;
-msgstr &quot;%(secondCount)d secondes&quot;
</del></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localesfrLC_MESSAGEScalendarserverpofromrev3309CalendarServerbranchesuserssagenlocalization3280localesfrLC_MESSAGEScalendarserverpo"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/fr/LC_MESSAGES/calendarserver.po) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/fr/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,252 @@
</span><ins>+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
+#
+msgid &quot;&quot;
+msgstr &quot;&quot;
+&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
+&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
+&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
+&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
+&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
+&quot;MIME-Version: 1.0\n&quot;
+&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
+&quot;Content-Transfer-Encoding: 8bit\n&quot;
+&quot;Generated-By: pygettext.py 1.5\n&quot;
+
+
+#: localization.py:171
+msgid &quot;All day&quot;
+msgstr &quot;Toute la journée&quot;
+
+#: localization.py:177
+msgid &quot;%(startTime)s to %(endTime)s&quot;
+msgstr &quot;%(startTime)s jusqu'à ce que %(endTime)s&quot;
+
+#: localization.py:191
+msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+
+#: localization.py:213
+msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+msgstr &quot;%(hour24Number)d:%(minuteNumber)02d&quot;
+
+#: mail.py:726 mail.py:755 mail.py:792
+msgid &quot;Event cancelled&quot;
+msgstr &quot;Événement annulé&quot;
+
+#: mail.py:727
+msgid &quot;Event invitation: %(summary)s&quot;
+msgstr &quot;Invitation: %(summary)s&quot;
+
+#: mail.py:736
+msgid &quot;Event Invitation&quot;
+msgstr &quot;Invitation&quot;
+
+#: mail.py:737
+msgid &quot;Date&quot;
+msgstr &quot;Date&quot;
+
+#: mail.py:738
+msgid &quot;Time&quot;
+msgstr &quot;Heure&quot;
+
+#: mail.py:739
+msgid &quot;Description&quot;
+msgstr &quot;Description&quot;
+
+#: mail.py:740
+msgid &quot;Organizer&quot;
+msgstr &quot;Organisateur&quot;
+
+#: mail.py:741
+msgid &quot;Attendees&quot;
+msgstr &quot;Participants&quot;
+
+#: mail.py:742
+msgid &quot;Location&quot;
+msgstr &quot;Emplacement&quot;
+
+msgid &quot;Duration&quot;
+msgstr &quot;Durée&quot;
+
+msgid &quot;Occurs&quot;
+msgstr &quot;Se produit&quot;
+
+msgid &quot;(Repeating)&quot;
+msgstr &quot;(Répétition)&quot;
+
+msgid &quot;Once&quot;
+msgstr &quot;Une fois&quot;
+
+#: twistedcaldav/localization.py:131
+msgid &quot;Monday&quot;
+msgstr &quot;Lundi&quot;
+
+#: twistedcaldav/localization.py:132
+msgid &quot;Tuesday&quot;
+msgstr &quot;Mardi&quot;
+
+#: twistedcaldav/localization.py:133
+msgid &quot;Wednesday&quot;
+msgstr &quot;Mercredi&quot;
+
+#: twistedcaldav/localization.py:134
+msgid &quot;Thursday&quot;
+msgstr &quot;Jeudi&quot;
+
+#: twistedcaldav/localization.py:135
+msgid &quot;Friday&quot;
+msgstr &quot;Vendredi&quot;
+
+#: twistedcaldav/localization.py:136
+msgid &quot;Saturday&quot;
+msgstr &quot;Samedi&quot;
+
+#: twistedcaldav/localization.py:137
+msgid &quot;Sunday&quot;
+msgstr &quot;Dimanche&quot;
+
+#: twistedcaldav/localization.py:141
+msgid &quot;Mon&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:142
+msgid &quot;Tue&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:143
+msgid &quot;Wed&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:144
+msgid &quot;Thu&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:145
+msgid &quot;Fri&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:146
+msgid &quot;Sun&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:147
+msgid &quot;Sat&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:152
+msgid &quot;January&quot;
+msgstr &quot;Janvier&quot;
+
+#: twistedcaldav/localization.py:153
+msgid &quot;February&quot;
+msgstr &quot;Février&quot;
+
+#: twistedcaldav/localization.py:154
+msgid &quot;March&quot;
+msgstr &quot;Mars&quot;
+
+#: twistedcaldav/localization.py:155
+msgid &quot;April&quot;
+msgstr &quot;Avril&quot;
+
+#: twistedcaldav/localization.py:156 twistedcaldav/localization.py:172
+msgid &quot;May&quot;
+msgstr &quot;Mai&quot;
+
+#: twistedcaldav/localization.py:157
+msgid &quot;June&quot;
+msgstr &quot;Juin&quot;
+
+#: twistedcaldav/localization.py:158
+msgid &quot;July&quot;
+msgstr &quot;Juillet&quot;
+
+#: twistedcaldav/localization.py:159
+msgid &quot;August&quot;
+msgstr &quot;Août&quot;
+
+#: twistedcaldav/localization.py:160
+msgid &quot;September&quot;
+msgstr &quot;Septembre&quot;
+
+#: twistedcaldav/localization.py:161
+msgid &quot;October&quot;
+msgstr &quot;Octobre&quot;
+
+#: twistedcaldav/localization.py:162
+msgid &quot;November&quot;
+msgstr &quot;Novembre&quot;
+
+#: twistedcaldav/localization.py:163
+msgid &quot;December&quot;
+msgstr &quot;Décembre&quot;
+
+#: twistedcaldav/localization.py:168
+msgid &quot;Jan&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:169
+msgid &quot;Feb&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:170
+msgid &quot;Mar&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:171
+msgid &quot;Apr&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:173
+msgid &quot;Jun&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:174
+msgid &quot;Jul&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:175
+msgid &quot;Aug&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:176
+msgid &quot;Sep&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:177
+msgid &quot;Oct&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:178
+msgid &quot;Nov&quot;
+msgstr &quot;&quot;
+
+#: twistedcaldav/localization.py:179
+msgid &quot;Dec&quot;
+msgstr &quot;&quot;
+
+msgid &quot;1 day&quot;
+msgstr
+
+msgid &quot;%(dayCount)d days&quot;
+msgstr
+
+msgid &quot;1 hour&quot;
+msgstr &quot;1 jour&quot;
+
+msgid &quot;%(hourCount)d hours&quot;
+msgstr &quot;%(hourCount)d jours&quot;
+
+msgid &quot;1 minute&quot;
+msgstr &quot;1 minute&quot;
+
+msgid &quot;%(minuteCount)d minutes&quot;
+msgstr &quot;%(minuteCount)d minutes&quot;
+
+msgid &quot;1 second&quot;
+msgstr &quot;1 seconde&quot;
+
+msgid &quot;%(secondCount)d seconds&quot;
+msgstr &quot;%(secondCount)d secondes&quot;
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarservermofromrev3309CalendarServerbranchesuserssagenlocalization3280localespigLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.mo (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/pig/LC_MESSAGES/calendarserver.mo)</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarserverpo"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3280/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1,262 +0,0 @@
</span><del>-# Pig Latin Translation
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
-#
-msgid &quot;&quot;
-msgstr &quot;&quot;
-&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
-&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
-&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
-&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
-&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
-&quot;MIME-Version: 1.0\n&quot;
-&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
-&quot;Content-Transfer-Encoding: 8bit\n&quot;
-&quot;Generated-By: pygettext.py 1.5\n&quot;
-
-
-#: localization.py:171
-msgid &quot;All day&quot;
-msgstr &quot;Allway ayday&quot;
-
-#: localization.py:177
-msgid &quot;%(startTime)s to %(endTime)s&quot;
-msgstr &quot;%(startTime)s otay %(endTime)s&quot;
-
-#: localization.py:191
-msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-
-#: localization.py:207
-msgid &quot;AM&quot;
-msgstr &quot;AMWAY&quot;
-
-#: localization.py:207
-msgid &quot;PM&quot;
-msgstr &quot;PMAY&quot;
-
-#: localization.py:213
-msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-msgstr &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-
-#: localization.py:236
-msgid &quot;Monday&quot;
-msgstr &quot;Ondaymay&quot;
-
-#: localization.py:237
-msgid &quot;Tuesday&quot;
-msgstr &quot;Uesdaytay&quot;
-
-#: localization.py:238
-msgid &quot;Wednesday&quot;
-msgstr &quot;Ednesdayway&quot;
-
-#: localization.py:239
-msgid &quot;Thursday&quot;
-msgstr &quot;Ursdaythay&quot;
-
-#: localization.py:240
-msgid &quot;Friday&quot;
-msgstr &quot;Idayfray&quot;
-
-#: localization.py:241
-msgid &quot;Saturday&quot;
-msgstr &quot;Aturdaysay&quot;
-
-#: localization.py:242
-msgid &quot;Sunday&quot;
-msgstr &quot;Undaysay&quot;
-
-#: localization.py:246
-msgid &quot;Mon&quot;
-msgstr &quot;&quot;
-
-#: localization.py:247
-msgid &quot;Tue&quot;
-msgstr &quot;&quot;
-
-#: localization.py:248
-msgid &quot;Wed&quot;
-msgstr &quot;&quot;
-
-#: localization.py:249
-msgid &quot;Thu&quot;
-msgstr &quot;&quot;
-
-#: localization.py:250
-msgid &quot;Fri&quot;
-msgstr &quot;&quot;
-
-#: localization.py:251
-msgid &quot;Sun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:252
-msgid &quot;Sat&quot;
-msgstr &quot;&quot;
-
-#: localization.py:257
-msgid &quot;January&quot;
-msgstr &quot;Anuaryjay&quot;
-
-#: localization.py:258
-msgid &quot;February&quot;
-msgstr &quot;Ebruaryfay&quot;
-
-#: localization.py:259
-msgid &quot;March&quot;
-msgstr &quot;Archmay&quot;
-
-#: localization.py:260
-msgid &quot;April&quot;
-msgstr &quot;Aprilway&quot;
-
-#: localization.py:261 localization.py:277
-msgid &quot;May&quot;
-msgstr &quot;Aymay&quot;
-
-#: localization.py:262
-msgid &quot;June&quot;
-msgstr &quot;Unejay&quot;
-
-#: localization.py:263
-msgid &quot;July&quot;
-msgstr &quot;Ulyjay&quot;
-
-#: localization.py:264
-msgid &quot;August&quot;
-msgstr &quot;Augustway&quot;
-
-#: localization.py:265
-msgid &quot;September&quot;
-msgstr &quot;Eptembersay&quot;
-
-#: localization.py:266
-msgid &quot;October&quot;
-msgstr &quot;Octoberway&quot;
-
-#: localization.py:267
-msgid &quot;November&quot;
-msgstr &quot;Ovembernay&quot;
-
-#: localization.py:268
-msgid &quot;December&quot;
-msgstr &quot;Ecemberday&quot;
-
-#: localization.py:273
-msgid &quot;Jan&quot;
-msgstr &quot;&quot;
-
-#: localization.py:274
-msgid &quot;Feb&quot;
-msgstr &quot;&quot;
-
-#: localization.py:275
-msgid &quot;Mar&quot;
-msgstr &quot;&quot;
-
-#: localization.py:276
-msgid &quot;Apr&quot;
-msgstr &quot;&quot;
-
-#: localization.py:278
-msgid &quot;Jun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:279
-msgid &quot;Jul&quot;
-msgstr &quot;&quot;
-
-#: localization.py:280
-msgid &quot;Aug&quot;
-msgstr &quot;&quot;
-
-#: localization.py:281
-msgid &quot;Sep&quot;
-msgstr &quot;&quot;
-
-#: localization.py:282
-msgid &quot;Oct&quot;
-msgstr &quot;&quot;
-
-#: localization.py:283
-msgid &quot;Nov&quot;
-msgstr &quot;&quot;
-
-#: localization.py:284
-msgid &quot;Dec&quot;
-msgstr &quot;&quot;
-
-#: mail.py:726 mail.py:755 mail.py:792
-msgid &quot;Event cancelled&quot;
-msgstr &quot;Eventway ancelledcay&quot;
-
-#: mail.py:727
-msgid &quot;Event invitation: %(summary)s&quot;
-msgstr &quot;Eventway invitationway: %(summary)s&quot;
-
-#: mail.py:736
-msgid &quot;Event Invitation&quot;
-msgstr &quot;Eventway invitationway&quot;
-
-#: mail.py:737
-msgid &quot;Date&quot;
-msgstr &quot;Ateday&quot;
-
-#: mail.py:738
-msgid &quot;Time&quot;
-msgstr &quot;Imetay&quot;
-
-#: mail.py:739
-msgid &quot;Description&quot;
-msgstr &quot;Escriptionday&quot;
-
-#: mail.py:740
-msgid &quot;Organizer&quot;
-msgstr &quot;Organizerway&quot;
-
-#: mail.py:741
-msgid &quot;Attendees&quot;
-msgstr &quot;Attendeesway&quot;
-
-#: mail.py:742
-msgid &quot;Location&quot;
-msgstr &quot;Ocationlay&quot;
-
-msgid &quot;Duration&quot;
-msgstr &quot;Urationday&quot;
-
-msgid &quot;Occurs&quot;
-msgstr &quot;Occursway&quot;
-
-msgid &quot;(Repeating)&quot;
-msgstr &quot;(Epeatingray)&quot;
-
-msgid &quot;Once&quot;
-msgstr &quot;Onceway&quot;
-
-
-msgid &quot;1 day&quot;
-msgstr &quot;1 ayday&quot;
-
-msgid &quot;%(dayCount)d days&quot;
-msgstr &quot;%(dayCount)d aysday&quot;
-
-msgid &quot;1 hour&quot;
-msgstr &quot;1 ourhay&quot;
-
-msgid &quot;%(hourCount)d hours&quot;
-msgstr &quot;%(hourCount)d ourshay&quot;
-
-msgid &quot;1 minute&quot;
-msgstr &quot;1 inutemay&quot;
-
-msgid &quot;%(minuteCount)d minutes&quot;
-msgstr &quot;%(minuteCount)d inutesmay&quot;
-
-msgid &quot;1 second&quot;
-msgstr &quot;1 econdsay&quot;
-
-msgid &quot;%(secondCount)d seconds&quot;
-msgstr &quot;%(secondCount)d econdsay&quot;
-
</del></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308localespigLC_MESSAGEScalendarserverpofromrev3309CalendarServerbranchesuserssagenlocalization3280localespigLC_MESSAGEScalendarserverpo"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/locales/pig/LC_MESSAGES/calendarserver.po) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,262 @@
</span><ins>+# Pig Latin Translation
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
+#
+msgid &quot;&quot;
+msgstr &quot;&quot;
+&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
+&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
+&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
+&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
+&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
+&quot;MIME-Version: 1.0\n&quot;
+&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
+&quot;Content-Transfer-Encoding: 8bit\n&quot;
+&quot;Generated-By: pygettext.py 1.5\n&quot;
+
+
+#: localization.py:171
+msgid &quot;All day&quot;
+msgstr &quot;Allway ayday&quot;
+
+#: localization.py:177
+msgid &quot;%(startTime)s to %(endTime)s&quot;
+msgstr &quot;%(startTime)s otay %(endTime)s&quot;
+
+#: localization.py:191
+msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+
+#: localization.py:207
+msgid &quot;AM&quot;
+msgstr &quot;AMWAY&quot;
+
+#: localization.py:207
+msgid &quot;PM&quot;
+msgstr &quot;PMAY&quot;
+
+#: localization.py:213
+msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+msgstr &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+
+#: localization.py:236
+msgid &quot;Monday&quot;
+msgstr &quot;Ondaymay&quot;
+
+#: localization.py:237
+msgid &quot;Tuesday&quot;
+msgstr &quot;Uesdaytay&quot;
+
+#: localization.py:238
+msgid &quot;Wednesday&quot;
+msgstr &quot;Ednesdayway&quot;
+
+#: localization.py:239
+msgid &quot;Thursday&quot;
+msgstr &quot;Ursdaythay&quot;
+
+#: localization.py:240
+msgid &quot;Friday&quot;
+msgstr &quot;Idayfray&quot;
+
+#: localization.py:241
+msgid &quot;Saturday&quot;
+msgstr &quot;Aturdaysay&quot;
+
+#: localization.py:242
+msgid &quot;Sunday&quot;
+msgstr &quot;Undaysay&quot;
+
+#: localization.py:246
+msgid &quot;Mon&quot;
+msgstr &quot;&quot;
+
+#: localization.py:247
+msgid &quot;Tue&quot;
+msgstr &quot;&quot;
+
+#: localization.py:248
+msgid &quot;Wed&quot;
+msgstr &quot;&quot;
+
+#: localization.py:249
+msgid &quot;Thu&quot;
+msgstr &quot;&quot;
+
+#: localization.py:250
+msgid &quot;Fri&quot;
+msgstr &quot;&quot;
+
+#: localization.py:251
+msgid &quot;Sun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:252
+msgid &quot;Sat&quot;
+msgstr &quot;&quot;
+
+#: localization.py:257
+msgid &quot;January&quot;
+msgstr &quot;Anuaryjay&quot;
+
+#: localization.py:258
+msgid &quot;February&quot;
+msgstr &quot;Ebruaryfay&quot;
+
+#: localization.py:259
+msgid &quot;March&quot;
+msgstr &quot;Archmay&quot;
+
+#: localization.py:260
+msgid &quot;April&quot;
+msgstr &quot;Aprilway&quot;
+
+#: localization.py:261 localization.py:277
+msgid &quot;May&quot;
+msgstr &quot;Aymay&quot;
+
+#: localization.py:262
+msgid &quot;June&quot;
+msgstr &quot;Unejay&quot;
+
+#: localization.py:263
+msgid &quot;July&quot;
+msgstr &quot;Ulyjay&quot;
+
+#: localization.py:264
+msgid &quot;August&quot;
+msgstr &quot;Augustway&quot;
+
+#: localization.py:265
+msgid &quot;September&quot;
+msgstr &quot;Eptembersay&quot;
+
+#: localization.py:266
+msgid &quot;October&quot;
+msgstr &quot;Octoberway&quot;
+
+#: localization.py:267
+msgid &quot;November&quot;
+msgstr &quot;Ovembernay&quot;
+
+#: localization.py:268
+msgid &quot;December&quot;
+msgstr &quot;Ecemberday&quot;
+
+#: localization.py:273
+msgid &quot;Jan&quot;
+msgstr &quot;&quot;
+
+#: localization.py:274
+msgid &quot;Feb&quot;
+msgstr &quot;&quot;
+
+#: localization.py:275
+msgid &quot;Mar&quot;
+msgstr &quot;&quot;
+
+#: localization.py:276
+msgid &quot;Apr&quot;
+msgstr &quot;&quot;
+
+#: localization.py:278
+msgid &quot;Jun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:279
+msgid &quot;Jul&quot;
+msgstr &quot;&quot;
+
+#: localization.py:280
+msgid &quot;Aug&quot;
+msgstr &quot;&quot;
+
+#: localization.py:281
+msgid &quot;Sep&quot;
+msgstr &quot;&quot;
+
+#: localization.py:282
+msgid &quot;Oct&quot;
+msgstr &quot;&quot;
+
+#: localization.py:283
+msgid &quot;Nov&quot;
+msgstr &quot;&quot;
+
+#: localization.py:284
+msgid &quot;Dec&quot;
+msgstr &quot;&quot;
+
+#: mail.py:726 mail.py:755 mail.py:792
+msgid &quot;Event cancelled&quot;
+msgstr &quot;Eventway ancelledcay&quot;
+
+#: mail.py:727
+msgid &quot;Event invitation: %(summary)s&quot;
+msgstr &quot;Eventway invitationway: %(summary)s&quot;
+
+#: mail.py:736
+msgid &quot;Event Invitation&quot;
+msgstr &quot;Eventway invitationway&quot;
+
+#: mail.py:737
+msgid &quot;Date&quot;
+msgstr &quot;Ateday&quot;
+
+#: mail.py:738
+msgid &quot;Time&quot;
+msgstr &quot;Imetay&quot;
+
+#: mail.py:739
+msgid &quot;Description&quot;
+msgstr &quot;Escriptionday&quot;
+
+#: mail.py:740
+msgid &quot;Organizer&quot;
+msgstr &quot;Organizerway&quot;
+
+#: mail.py:741
+msgid &quot;Attendees&quot;
+msgstr &quot;Attendeesway&quot;
+
+#: mail.py:742
+msgid &quot;Location&quot;
+msgstr &quot;Ocationlay&quot;
+
+msgid &quot;Duration&quot;
+msgstr &quot;Urationday&quot;
+
+msgid &quot;Occurs&quot;
+msgstr &quot;Occursway&quot;
+
+msgid &quot;(Repeating)&quot;
+msgstr &quot;(Epeatingray)&quot;
+
+msgid &quot;Once&quot;
+msgstr &quot;Onceway&quot;
+
+
+msgid &quot;1 day&quot;
+msgstr &quot;1 ayday&quot;
+
+msgid &quot;%(dayCount)d days&quot;
+msgstr &quot;%(dayCount)d aysday&quot;
+
+msgid &quot;1 hour&quot;
+msgstr &quot;1 ourhay&quot;
+
+msgid &quot;%(hourCount)d hours&quot;
+msgstr &quot;%(hourCount)d ourshay&quot;
+
+msgid &quot;1 minute&quot;
+msgstr &quot;1 inutemay&quot;
+
+msgid &quot;%(minuteCount)d minutes&quot;
+msgstr &quot;%(minuteCount)d inutesmay&quot;
+
+msgid &quot;1 second&quot;
+msgstr &quot;1 econdsay&quot;
+
+msgid &quot;%(secondCount)d seconds&quot;
+msgstr &quot;%(secondCount)d econdsay&quot;
+
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavconfigpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/config.py (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/config.py        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/config.py        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -233,6 +233,8 @@
</span><span class="cx">                 &quot;Password&quot;      : &quot;&quot;,    # For account receving mail
</span><span class="cx">             },
</span><span class="cx">             &quot;AddressPatterns&quot;   : [],    # Reg-ex patterns to match iMIP-able calendar user addresses
</span><ins>+            &quot;MailTemplatesDirectory&quot;: &quot;/usr/share/caldavd/templates&quot;, # Directory containing HTML templates for email invitations (invite.html, cancel.html)
+            &quot;MailIconsDirectory&quot;: &quot;/usr/share/caldavd/images&quot;, # Directory containing date-specific icons for email invitations (cal-icon-mm-dd.tiff)
</ins><span class="cx">         },
</span><span class="cx"> 
</span><span class="cx">     },
</span><span class="lines">@@ -288,7 +290,17 @@
</span><span class="cx">     &quot;IdleConnectionTimeOut&quot;: 15,
</span><span class="cx">     &quot;UIDReservationTimeOut&quot;: 30 * 60,
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">     #
</span><ins>+    # Localization
+    #
+    &quot;Localization&quot; : {
+        &quot;LocalesDirectory&quot; : &quot;/usr/share/caldavd/locales&quot;,
+        &quot;Language&quot; : &quot;en&quot;,
+    },
+
+
+    #
</ins><span class="cx">     # Implementation details
</span><span class="cx">     #
</span><span class="cx">     #    The following are specific to how the server is built, and useful
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavicalpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/ical.py (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/ical.py        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/ical.py        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1255,6 +1255,25 @@
</span><span class="cx"> 
</span><span class="cx">         return results
</span><span class="cx"> 
</span><ins>+    def getAllAttendeeProperties(self):
+        &quot;&quot;&quot;
+        Yield all attendees as Property objects.  Works on either a VCALENDAR or
+        on a component.
+        @return: a generator yielding Property objects
+        &quot;&quot;&quot;
+
+        # Extract appropriate sub-component if this is a VCALENDAR
+        if self.name() == &quot;VCALENDAR&quot;:
+            for component in self.subcomponents():
+                if component.name() != &quot;VTIMEZONE&quot;:
+                    for attendee in component.getAllAttendeeProperties():
+                        yield attendee
+        else:
+            # Find the primary subcomponent
+            for attendee in self.properties(&quot;ATTENDEE&quot;):
+                yield attendee
+
+
</ins><span class="cx">     def getMaskUID(self):
</span><span class="cx">         &quot;&quot;&quot;
</span><span class="cx">         Get the X-CALENDARSEREVR-MASK-UID value. Works on either a VCALENDAR or on a component.
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavlocalizationpyfromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavlocalizationpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/localization.py (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/localization.py) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/localization.py                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/localization.py        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,332 @@
</span><ins>+##
+# Copyright (c) 2005-2008 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+&quot;&quot;&quot;
+Localization module
+
+How to use:
+
+    from __future__ import with_statement
+    from localization import translationTo
+
+    with translationTo('de'):
+        print _(&quot;Hello&quot;)
+        print _(&quot;The event will last %(days)d days&quot;) % { 'days' : 4 }
+
+    ... Hallo
+    ... Die Veranstaltung dauert 4 Tage
+
+Before you can actually get translated text, you need to:
+
+    1) Choose a &quot;domain&quot; for your code, such as 'calendarserver'
+    2) Run pygettext.py on your source to generate a &lt;domain&gt;.pot file.
+       pygettext.py scans the source for _( ) and copies those strings to the
+       .pot.
+    3) For each language, copy the .pot file to .po and give it to the person
+       who is doing the translation for editing
+    4) Run msgfmt.py on the translated .po to generate a binary .mo
+    5) Put the .mo into locales/&lt;lang&gt;/LC_MESSAGES/&lt;domain&gt;.mo
+
+The German .po file for the above example would look like:
+
+    msgid &quot;Hello&quot;
+    msgstr &quot;Hallo&quot;
+
+    msgid &quot;The event will last %(days)d days&quot;
+    msgstr &quot;Die Veranstaltung dauert %(days)d Tage&quot;
+
+The transationTo class automatically binds '_' to the appropriate translation
+function for the duration of the &quot;with&quot; context.  It's smart enough to allow
+nesting of &quot;with&quot; contexts, as in:
+
+    with translationTo('de'):
+        print _(&quot;Hello&quot;) # in German
+
+        with translationTo('fr'):
+            print _(&quot;Hello&quot;) # in French
+
+        print _(&quot;Hello&quot;) # in German
+
+If a translation file cannot be found for the specified language, it will fall
+back to 'en'.  If 'en' can't be found, gettext will raise IOError.
+
+If you use the with/as form, you will get an object that implements some
+helper methods for date formatting:
+
+    with translationTo('en') as trans:
+        print trans.dtDate(datetime.today())
+
+    ... Thursday, October 23, 2008
+
+    with translationTo('fr') as trans:
+        print trans.dtDate(datetime.today())
+
+    ... Jeudi, Octobre 23, 2008
+
+The .po files contain localizable strings for month and day names, as well as
+date format strings, in case a locale likes these values in a different order
+or with different punctuation.
+
+
+TODO: recurrence
+&quot;&quot;&quot;
+
+
+import gettext
+import inspect
+import datetime
+from twistedcaldav.config import config
+
+
+class translationTo(object):
+
+    translations = {}
+
+    def __init__(self, lang, domain='calendarserver', localeDir=None):
+
+        if localeDir is None:
+            localeDir = config.Localization[&quot;LocalesDirectory&quot;]
+
+        # Cache gettext translation objects in class.translations
+        key = (lang, domain, localeDir)
+        self.translation = self.translations.get(key, None)
+        if self.translation is None:
+            self.translation = gettext.translation(domain=domain,
+                localedir=localeDir, languages=[lang, 'en'], fallback=True)
+            self.translations[key] = self.translation
+
+    def __enter__(self):
+        # Get the caller's globals so we can rebind their '_' to our translator
+        caller_globals = inspect.stack()[1][0].f_globals
+
+        # Store whatever '_' is already bound to so we can restore it later
+        if caller_globals.has_key('_'):
+            self.prev = caller_globals['_']
+
+        # Rebind '_' to our translator
+        caller_globals['_'] = self.translation.ugettext
+
+        # What we return here is accessible to the caller via the 'as' clause
+        return self
+
+    def __exit__(self, type, value, traceback):
+        # Restore '_' if it previously had a value
+        if hasattr(self, 'prev'):
+            inspect.stack()[1][0].f_globals['_'] = self.prev
+
+        # Don't swallow exceptions
+        return False
+
+    def date(self, component):
+        dtStart = component.propertyNativeValue(&quot;DTSTART&quot;)
+        return self.dtDate(dtStart)
+
+    def time(self, component):
+        &quot;&quot;&quot;
+        Examples:
+
+        3:30 PM to 4:30 PM PDT
+        All day
+        3:30 PM PDT
+        3:30 PM PDT to 7:30 PM EDT
+
+        1 day
+        2 days
+        1 day 1 hour
+        1 day 4 hours 18 minutes
+        &quot;&quot;&quot;
+
+        # Bind to '_' so pygettext.py will pick this up for translation
+        _ = self.translation.ugettext
+
+        tzStart = tzEnd = None
+        dtStart = component.propertyNativeValue(&quot;DTSTART&quot;)
+        if isinstance(dtStart, datetime.datetime):
+            tzStart = dtStart.tzname()
+        else:
+            return (&quot;&quot;, _(&quot;All day&quot;))
+
+        # tzStart = component.getProperty(&quot;DTSTART&quot;).params().get(&quot;TZID&quot;, &quot;UTC&quot;)
+
+        dtEnd = component.propertyNativeValue(&quot;DTEND&quot;)
+        if dtEnd:
+            if isinstance(dtEnd, datetime.datetime):
+                tzEnd = dtEnd.tzname()
+            # tzEnd = component.getProperty(&quot;DTEND&quot;).params().get(&quot;TZID&quot;, &quot;UTC&quot;)
+            duration = dtEnd - dtStart
+        else:
+            tzEnd = tzStart
+            duration = component.propertyNativeValue(&quot;DURATION&quot;)
+            if duration:
+                dtEnd = dtStart + duration
+            else:
+                if isinstance(dtStart, datetime.date):
+                    dtEnd = None
+                    duration = datetime.timedelta(days=1)
+                else:
+                    dtEnd = dtStart + datetime.timedelta(days=1)
+                    dtEnd.hour = dtEnd.minute = dtEnd.second = 0
+                    duration = dtEnd - dtStart
+
+        if dtStart == dtEnd:
+            return (self.dtTime(dtStart), &quot;&quot;)
+
+        return (
+            _(&quot;%(startTime)s to %(endTime)s&quot;)
+            % {
+                'startTime'      : self.dtTime(dtStart,
+                                    includeTimezone=(tzStart != tzEnd)),
+                'endTime'        : self.dtTime(dtEnd),
+            },
+            self.dtDuration(duration)
+        )
+
+
+    def dtDate(self, val):
+        # Bind to '_' so pygettext.py will pick this up for translation
+        _ = self.translation.ugettext
+
+        return (
+            _(&quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;)
+            % {
+                'dayName'    : _(daysFull[val.weekday()]),
+                'monthName'  : _(monthsFull[val.month]),
+                'dayNumber'  : val.day,
+                'yearNumber' : val.year,
+            }
+        )
+
+    def dtTime(self, val, includeTimezone=True):
+        if not isinstance(val, (datetime.datetime, datetime.time)):
+            return &quot;&quot;
+
+        # Bind to '_' so pygettext.py will pick this up for translation
+        _ = self.translation.ugettext
+
+        ampm = _(&quot;AM&quot;) if val.hour &lt; 12 else _(&quot;PM&quot;)
+        hour12 = val.hour % 12
+        if hour12 == 0:
+            hour12 = 12
+
+        result = (
+            _(&quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;)
+            % {
+                'hour24Number' : val.hour, # 0-23
+                'hour12Number' : hour12, # 1-12
+                'minuteNumber' : val.minute, # 0-59
+                'ampm'         : _(ampm),
+            }
+        )
+
+        if includeTimezone and val.tzname():
+            result += &quot; %s&quot; % (val.tzname())
+
+        return result
+
+    def dtDuration(self, val):
+
+        # Bind to '_' so pygettext.py will pick this up for translation
+        _ = self.translation.ugettext
+
+        parts = []
+
+        if val.days == 1:
+            parts.append(_(&quot;1 day&quot;))
+        elif val.days &gt; 1:
+            parts.append(_(&quot;%(dayCount)d days&quot; %
+                { 'dayCount' : val.days }))
+
+        hours = val.seconds / 3600
+        minutes = divmod(val.seconds / 60, 60)[1]
+        seconds = divmod(val.seconds, 60)[1]
+
+        if hours == 1:
+            parts.append(_(&quot;1 hour&quot;))
+        elif hours &gt; 1:
+            parts.append(_(&quot;%(hourCount)d hours&quot;) %
+                { 'hourCount' : hours })
+
+        if minutes == 1:
+            parts.append(_(&quot;1 minute&quot;))
+        elif minutes &gt; 1:
+            parts.append(_(&quot;%(minuteCount)d minutes&quot;) %
+                { 'minuteCount' : minutes })
+
+        if seconds == 1:
+            parts.append(_(&quot;1 second&quot;))
+        elif seconds &gt; 1:
+            parts.append(_(&quot;%(secondCount)d seconds&quot;) %
+                { 'secondCount' : seconds })
+
+        return &quot; &quot;.join(parts)
+
+
+# The strings below are wrapped in _( ) for the benefit of pygettext.  We don't
+# actually want them translated until they're used.
+
+_ = lambda x: x
+
+daysFull = [
+    _(&quot;Monday&quot;),
+    _(&quot;Tuesday&quot;),
+    _(&quot;Wednesday&quot;),
+    _(&quot;Thursday&quot;),
+    _(&quot;Friday&quot;),
+    _(&quot;Saturday&quot;),
+    _(&quot;Sunday&quot;),
+]
+
+daysAbbrev = [
+    _(&quot;Mon&quot;),
+    _(&quot;Tue&quot;),
+    _(&quot;Wed&quot;),
+    _(&quot;Thu&quot;),
+    _(&quot;Fri&quot;),
+    _(&quot;Sun&quot;),
+    _(&quot;Sat&quot;),
+]
+
+monthsFull = [
+    &quot;datetime.month is 1-based&quot;,
+    _(&quot;January&quot;),
+    _(&quot;February&quot;),
+    _(&quot;March&quot;),
+    _(&quot;April&quot;),
+    _(&quot;May&quot;),
+    _(&quot;June&quot;),
+    _(&quot;July&quot;),
+    _(&quot;August&quot;),
+    _(&quot;September&quot;),
+    _(&quot;October&quot;),
+    _(&quot;November&quot;),
+    _(&quot;December&quot;),
+]
+
+monthsAbbrev = [
+    &quot;datetime.month is 1-based&quot;,
+    _(&quot;Jan&quot;),
+    _(&quot;Feb&quot;),
+    _(&quot;Mar&quot;),
+    _(&quot;Apr&quot;),
+    _(&quot;May&quot;),
+    _(&quot;Jun&quot;),
+    _(&quot;Jul&quot;),
+    _(&quot;Aug&quot;),
+    _(&quot;Sep&quot;),
+    _(&quot;Oct&quot;),
+    _(&quot;Nov&quot;),
+    _(&quot;Dec&quot;),
+]
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavmailpy"></a>
<div class="modfile"><h4>Modified: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/mail.py (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/mail.py        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/mail.py        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -18,6 +18,7 @@
</span><span class="cx"> Mail Gateway for Calendar Server
</span><span class="cx"> 
</span><span class="cx"> &quot;&quot;&quot;
</span><ins>+from __future__ import with_statement
</ins><span class="cx"> 
</span><span class="cx"> from email.mime.image import MIMEImage
</span><span class="cx"> from email.mime.multipart import MIMEMultipart
</span><span class="lines">@@ -41,7 +42,9 @@
</span><span class="cx"> from twistedcaldav.log import Logger, LoggingMixIn
</span><span class="cx"> from twistedcaldav.resource import CalDAVResource
</span><span class="cx"> from twistedcaldav.scheduling.scheduler import IMIPScheduler
</span><ins>+from twistedcaldav.scheduling.cuaddress import normalizeCUAddr
</ins><span class="cx"> from twistedcaldav.sql import AbstractSQLDatabase
</span><ins>+from twistedcaldav.localization import translationTo
</ins><span class="cx"> 
</span><span class="cx"> from zope.interface import implements
</span><span class="cx"> 
</span><span class="lines">@@ -260,6 +263,8 @@
</span><span class="cx">     log.debug(&quot;Injecting to %s: %s %s&quot; % (url, str(headers), data))
</span><span class="cx">     factory = client.HTTPClientFactory(url, method='POST', headers=headers,
</span><span class="cx">         postdata=data, agent=&quot;iMIP gateway&quot;)
</span><ins>+    factory.noisy = False
+
</ins><span class="cx">     if useSSL:
</span><span class="cx">         reactor.connectSSL(host, port, factory, ssl.ClientContextFactory())
</span><span class="cx">     else:
</span><span class="lines">@@ -480,8 +485,9 @@
</span><span class="cx">             # Compute token, add to db, generate email and send it
</span><span class="cx">             calendar = ical.Component.fromString(request.content.read())
</span><span class="cx">             headers = request.getAllHeaders()
</span><ins>+            language = config.Localization[&quot;Language&quot;]
</ins><span class="cx">             self.mailer.outbound(headers['originator'], headers['recipient'],
</span><del>-                calendar)
</del><ins>+                calendar, language=language)
</ins><span class="cx"> 
</span><span class="cx">             # TODO: what to return?
</span><span class="cx">             return &quot;&quot;&quot;
</span><span class="lines">@@ -576,7 +582,7 @@
</span><span class="cx">             # TODO: what to do in this case?
</span><span class="cx">             pass
</span><span class="cx"> 
</span><del>-        self.log_error(&quot;Mail gateway processing DSN %s&quot; % (msgId,))
</del><ins>+        self.log_warn(&quot;Mail gateway processing DSN %s&quot; % (msgId,))
</ins><span class="cx">         return fn(organizer, attendee, calendar, msgId)
</span><span class="cx"> 
</span><span class="cx">     def processReply(self, msg, fn):
</span><span class="lines">@@ -627,39 +633,63 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def inbound(self, message, fn=injectMessage):
</span><del>-        msg = email.message_from_string(message)
</del><ins>+        try:
+            msg = email.message_from_string(message)
</ins><span class="cx"> 
</span><del>-        isDSN, action, calBody = self.checkDSN(msg)
-        if isDSN:
-            if action == 'failed' and calBody:
-                # This is a DSN we can handle
-                return self.processDSN(calBody, msg['Message-ID'], fn)
-            else:
-                # It's a DSN without enough to go on
-                self.log_error(&quot;Mail gateway can't process DSN %s&quot; % (msg['Message-ID'],))
-                return
</del><ins>+            isDSN, action, calBody = self.checkDSN(msg)
+            if isDSN:
+                if action == 'failed' and calBody:
+                    # This is a DSN we can handle
+                    return self.processDSN(calBody, msg['Message-ID'], fn)
+                else:
+                    # It's a DSN without enough to go on
+                    self.log_error(&quot;Mail gateway can't process DSN %s&quot; % (msg['Message-ID'],))
+                    return
</ins><span class="cx"> 
</span><del>-        self.log_info(&quot;Mail gateway received message %s from %s to %s&quot; %
-            (msg['Message-ID'], msg['From'], msg['To']))
</del><ins>+            self.log_info(&quot;Mail gateway received message %s from %s to %s&quot; %
+                (msg['Message-ID'], msg['From'], msg['To']))
</ins><span class="cx"> 
</span><del>-        return self.processReply(msg, fn)
</del><ins>+            return self.processReply(msg, fn)
</ins><span class="cx"> 
</span><ins>+        except Exception, e:
+            # Don't let a failure of any kind stop us
+            self.log_error(&quot;Failed to process message: %s&quot; % (e,))
</ins><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def outbound(self, organizer, attendee, calendar):
</del><ins>+
+
+    def outbound(self, organizer, attendee, calendar, language='en'):
</ins><span class="cx">         # create token, send email
</span><span class="cx">         token = self.db.getToken(organizer, attendee)
</span><span class="cx">         if token is None:
</span><span class="cx">             token = self.db.createToken(organizer, attendee)
</span><del>-            self.log_info(&quot;Mail gateway created token %s for %s (organizer) and %s (attendee)&quot; % (token, organizer, attendee))
</del><ins>+            self.log_debug(&quot;Mail gateway created token %s for %s (organizer) and %s (attendee)&quot; % (token, organizer, attendee))
</ins><span class="cx">         else:
</span><del>-            self.log_info(&quot;Mail gateway reusing token %s for %s (organizer) and %s (attendee)&quot; % (token, organizer, attendee))
</del><ins>+            self.log_debug(&quot;Mail gateway reusing token %s for %s (organizer) and %s (attendee)&quot; % (token, organizer, attendee))
</ins><span class="cx"> 
</span><span class="cx">         settings = config.Scheduling['iMIP']['Sending']
</span><span class="cx">         fullServerAddress = settings['Address']
</span><span class="cx">         name, serverAddress = email.utils.parseaddr(fullServerAddress)
</span><span class="cx">         pre, post = serverAddress.split('@')
</span><span class="cx">         addressWithToken = &quot;%s+%s@%s&quot; % (pre, token, post)
</span><ins>+
+        attendees = []
+        for attendeeProp in calendar.getAllAttendeeProperties():
+            params = attendeeProp.params()
+            cutype = params.get('CUTYPE', (None,))[0]
+            if cutype == &quot;INDIVIDUAL&quot;:
+                cn = params.get(&quot;CN&quot;, (None,))[0]
+                cuaddr = normalizeCUAddr(attendeeProp.value())
+                if cuaddr.startswith(&quot;mailto:&quot;):
+                    mailto = cuaddr[7:]
+                    if not cn:
+                        cn = mailto
+                else:
+                    mailto = None
+
+                if cn or mailto:
+                    attendees.append( (cn, mailto) )
+
</ins><span class="cx">         calendar.getOrganizerProperty().setValue(&quot;mailto:%s&quot; %
</span><span class="cx">             (addressWithToken,))
</span><span class="cx"> 
</span><span class="lines">@@ -667,29 +697,34 @@
</span><span class="cx">         if organizerAttendee is not None:
</span><span class="cx">             organizerAttendee.setValue(&quot;mailto:%s&quot; % (addressWithToken,))
</span><span class="cx"> 
</span><del>-        msgId, message = self._generateTemplateMessage(calendar, organizer)
</del><span class="cx"> 
</span><span class="cx">         # The email's From will include the organizer's real name email
</span><span class="cx">         # address if available.  Otherwise it will be the server's email
</span><span class="cx">         # address (without # + addressing)
</span><span class="cx">         if organizer.startswith(&quot;mailto:&quot;):
</span><del>-            fromAddr = organizer[7:]
</del><ins>+            orgEmail = fromAddr = organizer[7:]
</ins><span class="cx">         else:
</span><span class="cx">             fromAddr = serverAddress
</span><del>-        cn = calendar.getOrganizerProperty().params().get('CN',
-            ['Calendar Server'])[0]
</del><ins>+            orgEmail = None
+        cn = calendar.getOrganizerProperty().params().get('CN', (None,))[0]
+        if cn is None:
+            cn = 'Calendar Server'
+            orgCN = orgEmail
+        else:
+            orgCN = cn
</ins><span class="cx">         formattedFrom = &quot;%s &lt;%s&gt;&quot; % (cn, fromAddr)
</span><del>-        message = message.replace(&quot;${fromaddress}&quot;, formattedFrom)
</del><span class="cx"> 
</span><span class="cx">         # Reply-to address will be the server+token address
</span><del>-        message = message.replace(&quot;${replytoaddress}&quot;, addressWithToken)
</del><span class="cx"> 
</span><span class="cx">         toAddr = attendee
</span><span class="cx">         if not attendee.startswith(&quot;mailto:&quot;):
</span><span class="cx">             raise ValueError(&quot;ATTENDEE address '%s' must be mailto: for iMIP operation.&quot; % (attendee,))
</span><span class="cx">         attendee = attendee[7:]
</span><del>-        message = message.replace(&quot;${toaddress}&quot;, attendee)
</del><span class="cx"> 
</span><ins>+        msgId, message = self.generateEmail(calendar, orgEmail, orgCN,
+            attendees, formattedFrom, addressWithToken, attendee,
+            language=language)
+
</ins><span class="cx">         self.log_debug(&quot;Sending: %s&quot; % (message,))
</span><span class="cx">         def _success(result, msgId, fromAddr, toAddr):
</span><span class="cx">             self.log_info(&quot;Mail gateway sent message %s from %s to %s&quot; %
</span><span class="lines">@@ -706,57 +741,181 @@
</span><span class="cx">         deferred.addErrback(_failure, msgId, fromAddr, toAddr)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _generateTemplateMessage(self, calendar, organizer):
</del><ins>+    def generateEmail(self, calendar, orgEmail, orgCN, attendees, fromAddress,
+        replyToAddress, toAddress, language='en'):
</ins><span class="cx"> 
</span><del>-        title, summary = self._generateCalendarSummary(calendar, organizer)
</del><ins>+        details = self.getEventDetails(calendar, language=language)
</ins><span class="cx"> 
</span><del>-        msg = MIMEMultipart()
-        msg[&quot;From&quot;] = &quot;${fromaddress}&quot;
-        msg[&quot;Reply-To&quot;] = &quot;${replytoaddress}&quot;
-        msg[&quot;To&quot;] = &quot;${toaddress}&quot;
-        msg[&quot;Date&quot;] = rfc822date()
-        msgId = messageid()
-        msg[&quot;Message-ID&quot;] = msgId
</del><ins>+        iconDir = config.Scheduling[&quot;iMIP&quot;][&quot;MailIconsDirectory&quot;].rstrip(&quot;/&quot;)
+        iconName = &quot;cal-icon-%02d-%02d.tiff&quot; % (details['month'],
+            details['day'])
+        iconPath = os.path.join(iconDir, iconName)
</ins><span class="cx"> 
</span><del>-        msgAlt = MIMEMultipart(&quot;alternative&quot;)
-        msg.attach(msgAlt)
</del><ins>+        with translationTo(language):
+            msg = MIMEMultipart()
+            msg[&quot;From&quot;] = fromAddress
+            msg[&quot;Reply-To&quot;] = replyToAddress
+            msg[&quot;To&quot;] = toAddress
+            msg[&quot;Date&quot;] = rfc822date()
+            msgId = messageid()
+            msg[&quot;Message-ID&quot;] = msgId
</ins><span class="cx"> 
</span><del>-        # plain text version
-        if calendar.propertyValue(&quot;METHOD&quot;) == &quot;CANCEL&quot;:
-            msg[&quot;Subject&quot;] = &quot;Event cancelled&quot;
-            plainText = u&quot;An event has been cancelled.  Click the link below.\n&quot;
-        else:
-            msg[&quot;Subject&quot;] = &quot;Event invitation: %s&quot; % (title,)
-            plainText = u&quot;You've been invited to the following event:  %s To accept or decline this invitation, click the link below.\n&quot; % (summary,)
</del><ins>+            cancelled = (calendar.propertyValue(&quot;METHOD&quot;) == &quot;CANCEL&quot;)
+            formatString = (_(&quot;Event cancelled: %(summary)s&quot;) if cancelled else
+                _(&quot;Event invitation: %(summary)s&quot;))
+            details['subject'] = msg['Subject'] = formatString % {
+                'summary' : details['summary']
+            }
</ins><span class="cx"> 
</span><del>-        msgPlain = MIMEText(plainText.encode(&quot;UTF-8&quot;), &quot;plain&quot;, &quot;UTF-8&quot;)
-        msgAlt.attach(msgPlain)
</del><ins>+            msgAlt = MIMEMultipart(&quot;alternative&quot;)
+            msg.attach(msgAlt)
</ins><span class="cx"> 
</span><del>-        # html version
-        msgHtmlRelated = MIMEMultipart(&quot;related&quot;, type=&quot;text/html&quot;)
-        msgAlt.attach(msgHtmlRelated)
-        htmlText = u&quot;&quot;&quot;
-&lt;html&gt;&lt;body&gt;&lt;div&gt;
-&lt;img src=&quot;cid:ical.jpg&quot;&gt;
-%s
-&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;
-&quot;&quot;&quot; % plainText
</del><ins>+            # Get localized labels
+            details['inviteLabel'] = _(&quot;Event Invitation&quot;)
+            details['dateLabel'] = _(&quot;Date&quot;)
+            details['timeLabel'] = _(&quot;Time&quot;)
+            details['durationLabel'] = _(&quot;Duration&quot;)
+            details['recurrenceLabel'] = _(&quot;Occurs&quot;)
+            details['descLabel'] = _(&quot;Description&quot;)
+            details['orgLabel'] = _(&quot;Organizer&quot;)
+            details['attLabel'] = _(&quot;Attendees&quot;)
+            details['locLabel'] = _(&quot;Location&quot;)
+
+
+            plainAttendeeList = []
+            for cn, mailto in attendees:
+                if cn:
+                    plainAttendeeList.append(cn if not mailto else
+                        &quot;%s &lt;%s&gt;&quot; % (cn, mailto))
+                elif mailto:
+                    plainAttendeeList.append(&quot;&lt;%s&gt;&quot; % (mailto,))
+
+            details['plainAttendees'] = &quot;, &quot;.join(plainAttendeeList)
+
+            details['plainOrganizer'] = (orgCN if not orgEmail else
+                &quot;%s &lt;%s&gt;&quot; % (orgCN, orgEmail))
+
+            # plain text version
+            if cancelled:
+                plainTemplate = u&quot;&quot;&quot;%(subject)s
+
+%(orgLabel)s: %(plainOrganizer)s
+%(dateLabel)s: %(dateInfo)s %(recurrenceInfo)s
+%(timeLabel)s: %(timeInfo)s %(durationInfo)s
+&quot;&quot;&quot;
+            else:
+                plainTemplate = u&quot;&quot;&quot;%(subject)s
+
+%(orgLabel)s: %(plainOrganizer)s
+%(locLabel)s: %(location)s
+%(dateLabel)s: %(dateInfo)s %(recurrenceInfo)s
+%(timeLabel)s: %(timeInfo)s %(durationInfo)s
+%(descLabel)s: %(description)s
+%(attLabel)s: %(plainAttendees)s
+&quot;&quot;&quot;
+
+            plainText = plainTemplate % details
+
+            msgPlain = MIMEText(plainText.encode(&quot;UTF-8&quot;), &quot;plain&quot;, &quot;UTF-8&quot;)
+            msgAlt.attach(msgPlain)
+
+            # html version
+            msgHtmlRelated = MIMEMultipart(&quot;related&quot;, type=&quot;text/html&quot;)
+            msgAlt.attach(msgHtmlRelated)
+
+
+            htmlAttendees = []
+            for cn, mailto in attendees:
+                if mailto:
+                    htmlAttendees.append('&lt;a href=&quot;mailto:%s&quot;&gt;%s&lt;/a&gt;' %
+                        (mailto, cn))
+                else:
+                    htmlAttendees.append(cn)
+
+            details['htmlAttendees'] = &quot;, &quot;.join(htmlAttendees)
+
+            if orgEmail:
+                details['htmlOrganizer'] = '&lt;a href=&quot;mailto:%s&quot;&gt;%s&lt;/a&gt;' % (
+                    orgEmail, orgCN)
+            else:
+                details['htmlOrganizer'] = orgCN
+
+            details['iconName'] = iconName
+
+            templateDir = config.Scheduling[&quot;iMIP&quot;][&quot;MailTemplatesDirectory&quot;].rstrip(&quot;/&quot;)
+            templateName = &quot;cancel.html&quot; if cancelled else &quot;invite.html&quot;
+            templatePath = os.path.join(templateDir, templateName)
+
+            if not os.path.exists(templatePath):
+                # Fall back to built-in simple templates:
+                if cancelled:
+
+                    htmlTemplate = u&quot;&quot;&quot;&lt;html&gt;
+    &lt;body&gt;&lt;div&gt;
+
+    &lt;h1&gt;%(subject)s&lt;/h1&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(orgLabel)s:&lt;/h3&gt; %(htmlOrganizer)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(dateLabel)s:&lt;/h3&gt; %(dateInfo)s %(recurrenceInfo)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(timeLabel)s:&lt;/h3&gt; %(timeInfo)s %(durationInfo)s
+    &lt;/p&gt;
+
+    &quot;&quot;&quot;
+
+                else:
+
+                    htmlTemplate = u&quot;&quot;&quot;&lt;html&gt;
+    &lt;body&gt;&lt;div&gt;
+    &lt;p&gt;%(inviteLabel)s&lt;/p&gt;
+
+    &lt;h1&gt;%(summary)s&lt;/h1&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(orgLabel)s:&lt;/h3&gt; %(htmlOrganizer)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(locLabel)s:&lt;/h3&gt; %(location)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(dateLabel)s:&lt;/h3&gt; %(dateInfo)s %(recurrenceInfo)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(timeLabel)s:&lt;/h3&gt; %(timeInfo)s %(durationInfo)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(descLabel)s:&lt;/h3&gt; %(description)s
+    &lt;/p&gt;
+    &lt;p&gt;
+    &lt;h3&gt;%(attLabel)s:&lt;/h3&gt; %(htmlAttendees)s
+    &lt;/p&gt;
+
+    &quot;&quot;&quot;
+            else: # HTML template file exists
+
+                with open(templatePath) as templateFile:
+                    htmlTemplate = templateFile.read()
+
+            htmlText = htmlTemplate % details
+
</ins><span class="cx">         msgHtml = MIMEText(htmlText.encode(&quot;UTF-8&quot;), &quot;html&quot;, &quot;UTF-8&quot;)
</span><span class="cx">         msgHtmlRelated.attach(msgHtml)
</span><span class="cx"> 
</span><span class="cx">         # an image for html version
</span><del>-        imageName = &quot;ical.jpg&quot;
-        imageFile = open(os.path.join(os.path.dirname(__file__),
-            &quot;images&quot;, &quot;mail&quot;, imageName))
-        msgImage = MIMEImage(imageFile.read(),
-            _subtype='jpeg;x-apple-mail-type=stationery;name=&quot;%s&quot;' %
-            (imageName,))
-        imageFile.close()
-        msgImage.add_header(&quot;Content-ID&quot;, &quot;&lt;%s&gt;&quot; % (imageName,))
-        msgImage.add_header(&quot;Content-Disposition&quot;, &quot;inline;filename=%s&quot; %
-            (imageName,))
-        msgHtmlRelated.attach(msgImage)
</del><ins>+        if os.path.exists(iconPath) and htmlTemplate.find(&quot;cid:%(iconName)s&quot;) != -1:
</ins><span class="cx"> 
</span><ins>+            with open(iconPath) as iconFile:
+                msgIcon = MIMEImage(iconFile.read(),
+                    _subtype='tiff;x-apple-mail-type=stationery;name=&quot;%s&quot;' %
+                    (iconName,))
+
+            msgIcon.add_header(&quot;Content-ID&quot;, &quot;&lt;%s&gt;&quot; % (iconName,))
+            msgIcon.add_header(&quot;Content-Disposition&quot;, &quot;inline;filename=%s&quot; %
+                (iconName,))
+            msgHtmlRelated.attach(msgIcon)
+
</ins><span class="cx">         # the icalendar attachment
</span><span class="cx">         self.log_debug(&quot;Mail gateway sending calendar body: %s&quot; % (str(calendar)))
</span><span class="cx">         msgIcal = MIMEText(str(calendar), &quot;calendar&quot;, &quot;UTF-8&quot;)
</span><span class="lines">@@ -769,135 +928,55 @@
</span><span class="cx">         return msgId, msg.as_string()
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-    def _generateCalendarSummary(self, calendar, organizer):
</del><ins>+    def getEventDetails(self, calendar, language='en'):
</ins><span class="cx"> 
</span><span class="cx">         # Get the most appropriate component
</span><span class="cx">         component = calendar.masterComponent()
</span><span class="cx">         if component is None:
</span><span class="cx">             component = calendar.mainComponent(True)
</span><span class="cx"> 
</span><del>-        organizerProp = component.getOrganizerProperty()
-        if &quot;CN&quot; in organizerProp.params():
-            organizer = &quot;%s &lt;%s&gt;&quot; % (organizerProp.params()[&quot;CN&quot;][0],
-                organizer,)
</del><ins>+        results = { }
</ins><span class="cx"> 
</span><del>-        if calendar.propertyValue(&quot;METHOD&quot;) == &quot;CANCEL&quot;:
-            dtinfo = &quot;&quot;
-        else:
-            dtinfo = self._getDateTimeInfo(component)
</del><ins>+        dtStart = component.propertyNativeValue(&quot;DTSTART&quot;)
+        results['month'] = dtStart.month
+        results['day'] = dtStart.day
</ins><span class="cx"> 
</span><span class="cx">         summary = component.propertyValue(&quot;SUMMARY&quot;)
</span><span class="cx">         if summary is None:
</span><span class="cx">             summary = &quot;&quot;
</span><ins>+        results['summary'] = summary
</ins><span class="cx"> 
</span><span class="cx">         description = component.propertyValue(&quot;DESCRIPTION&quot;)
</span><span class="cx">         if description is None:
</span><span class="cx">             description = &quot;&quot;
</span><ins>+        results['description'] = description
</ins><span class="cx"> 
</span><del>-        return summary, &quot;&quot;&quot;
</del><ins>+        location = component.propertyValue(&quot;LOCATION&quot;)
+        if location is None:
+            location = &quot;&quot;
+        results['location'] = location
</ins><span class="cx"> 
</span><del>-Summary: %s
-Organizer: %s
-%sDescription: %s
</del><ins>+        with translationTo(language) as trans:
+            results['dateInfo'] = trans.date(component)
+            results['timeInfo'], duration = trans.time(component)
+            results['durationInfo'] = &quot;(%s)&quot; % (duration,) if duration else &quot;&quot;
</ins><span class="cx"> 
</span><del>-&quot;&quot;&quot; % (summary, organizer, dtinfo, description,)
-
-    def _getDateTimeInfo(self, component):
-
-        dtstart = component.propertyNativeValue(&quot;DTSTART&quot;)
-        tzid_start = component.getProperty(&quot;DTSTART&quot;).params().get(&quot;TZID&quot;, &quot;UTC&quot;)
-
-        dtend = component.propertyNativeValue(&quot;DTEND&quot;)
-        if dtend:
-            tzid_end = component.getProperty(&quot;DTEND&quot;).params().get(&quot;TZID&quot;, &quot;UTC&quot;)
-            duration = dtend - dtstart
-        else:
-            duration = component.propertyNativeValue(&quot;DURATION&quot;)
-            if duration:
-                dtend = dtstart + duration
-                tzid_end = tzid_start
</del><ins>+            for propertyName in (&quot;RRULE&quot;, &quot;RDATE&quot;, &quot;EXRULE&quot;, &quot;EXDATE&quot;,
+                &quot;RECURRENCE-ID&quot;):
+                if component.hasProperty(propertyName):
+                    results['recurrenceInfo'] = _(&quot;(Repeating)&quot;)
+                    break
</ins><span class="cx">             else:
</span><del>-                if isinstance(dtstart, datetime.date):
-                    dtend = None
-                    duration = datetime.timedelta(days=1)
-                else:
-                    dtend = dtstart + datetime.timedelta(days=1)
-                    dtend.hour = dtend.minute = dtend.second = 0
-                    duration = dtend - dtstart
-        result = &quot;Starts:      %s\n&quot; % (self._getDateTimeText(dtstart, tzid_start),)
-        if dtend is not None:
-            result += &quot;Ends:        %s\n&quot; % (self._getDateTimeText(dtend, tzid_end),)
-        result += &quot;Duration:    %s\n&quot; % (self._getDurationText(duration),)
</del><ins>+                results['recurrenceInfo'] = &quot;&quot;
</ins><span class="cx"> 
</span><del>-        if not isinstance(dtstart, datetime.datetime):
-            result += &quot;All Day\n&quot;
</del><ins>+        return results
</ins><span class="cx"> 
</span><del>-        for property_name in (&quot;RRULE&quot;, &quot;RDATE&quot;, &quot;EXRULE&quot;, &quot;EXDATE&quot;, &quot;RECURRENCE-ID&quot;,):
-            if component.hasProperty(property_name):
-                result += &quot;Recurring\n&quot;
-                break
</del><span class="cx"> 
</span><del>-        return result
</del><span class="cx"> 
</span><del>-    def _getDateTimeText(self, dtvalue, tzid):
</del><span class="cx"> 
</span><del>-        if isinstance(dtvalue, datetime.datetime):
-            timeformat = &quot;%A, %B %e, %Y %I:%M %p&quot;
-        elif isinstance(dtvalue, datetime.date):
-            timeformat = &quot;%A, %B %e, %Y&quot;
-            tzid = &quot;&quot;
-        if tzid:
-            tzid = &quot; (%s)&quot; % (tzid,)
</del><span class="cx"> 
</span><del>-        return &quot;%s%s&quot; % (dtvalue.strftime(timeformat), tzid,)
</del><span class="cx"> 
</span><del>-    def _getDurationText(self, duration):
</del><span class="cx"> 
</span><del>-        result = &quot;&quot;
-        if duration.days &gt; 0:
-            result += &quot;%d %s&quot; % (
-                duration.days,
-                self._pluralize(duration.days, &quot;day&quot;, &quot;days&quot;)
-            )
-
-        hours = duration.seconds / 3600
-        minutes = divmod(duration.seconds / 60, 60)[1]
-        seconds = divmod(duration.seconds, 60)[1]
-
-        if hours &gt; 0:
-            if result:
-                result += &quot;, &quot;
-            result += &quot;%d %s&quot; % (
-                hours,
-                self._pluralize(hours, &quot;hour&quot;, &quot;hours&quot;)
-            )
-
-        if minutes &gt; 0:
-            if result:
-                result += &quot;, &quot;
-            result += &quot;%d %s&quot; % (
-                minutes,
-                self._pluralize(minutes, &quot;minute&quot;, &quot;minutes&quot;)
-            )
-
-        if seconds &gt; 0:
-            if result:
-                result += &quot;, &quot;
-            result += &quot;%d %s&quot; % (
-                seconds,
-                self._pluralize(seconds, &quot;second&quot;, &quot;seconds&quot;)
-            )
-
-        return result
-
-    def _pluralize(self, number, unit1, unitS):
-        return unit1 if number == 1 else unitS
-
-
-
-
-
-
</del><span class="cx"> #
</span><span class="cx"> # POP3
</span><span class="cx"> #
</span><span class="lines">@@ -972,6 +1051,7 @@
</span><span class="cx">             from twisted.internet import reactor
</span><span class="cx">         self.reactor = reactor
</span><span class="cx">         self.nextPoll = None
</span><ins>+        self.noisy = False
</ins><span class="cx"> 
</span><span class="cx">     def retry(self, connector=None):
</span><span class="cx">         # TODO: if connector is None:
</span><span class="lines">@@ -1147,6 +1227,7 @@
</span><span class="cx">         if reactor is None:
</span><span class="cx">             from twisted.internet import reactor
</span><span class="cx">         self.reactor = reactor
</span><ins>+        self.noisy = False
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx">     def handleMessage(self, message):
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarservermofromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavtestdatalocalesenLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.mo (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.mo)</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarserverpo"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1,249 +0,0 @@
</span><del>-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
-#
-msgid &quot;&quot;
-msgstr &quot;&quot;
-&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
-&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
-&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
-&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
-&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
-&quot;MIME-Version: 1.0\n&quot;
-&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
-&quot;Content-Transfer-Encoding: 8bit\n&quot;
-&quot;Generated-By: pygettext.py 1.5\n&quot;
-
-
-#: localization.py:171
-msgid &quot;All day&quot;
-msgstr &quot;&quot;
-
-#: localization.py:177
-msgid &quot;%(startTime)s to %(endTime)s&quot;
-msgstr &quot;&quot;
-
-#: localization.py:191
-msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-msgstr &quot;&quot;
-
-#: localization.py:207
-msgid &quot;AM&quot;
-msgstr &quot;&quot;
-
-#: localization.py:207
-msgid &quot;PM&quot;
-msgstr &quot;&quot;
-
-#: localization.py:213
-msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-msgstr &quot;&quot;
-
-#: localization.py:236
-msgid &quot;Monday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:237
-msgid &quot;Tuesday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:238
-msgid &quot;Wednesday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:239
-msgid &quot;Thursday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:240
-msgid &quot;Friday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:241
-msgid &quot;Saturday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:242
-msgid &quot;Sunday&quot;
-msgstr &quot;&quot;
-
-#: localization.py:246
-msgid &quot;Mon&quot;
-msgstr &quot;&quot;
-
-#: localization.py:247
-msgid &quot;Tue&quot;
-msgstr &quot;&quot;
-
-#: localization.py:248
-msgid &quot;Wed&quot;
-msgstr &quot;&quot;
-
-#: localization.py:249
-msgid &quot;Thu&quot;
-msgstr &quot;&quot;
-
-#: localization.py:250
-msgid &quot;Fri&quot;
-msgstr &quot;&quot;
-
-#: localization.py:251
-msgid &quot;Sun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:252
-msgid &quot;Sat&quot;
-msgstr &quot;&quot;
-
-#: localization.py:257
-msgid &quot;January&quot;
-msgstr &quot;&quot;
-
-#: localization.py:258
-msgid &quot;February&quot;
-msgstr &quot;&quot;
-
-#: localization.py:259
-msgid &quot;March&quot;
-msgstr &quot;&quot;
-
-#: localization.py:260
-msgid &quot;April&quot;
-msgstr &quot;&quot;
-
-#: localization.py:261 localization.py:277
-msgid &quot;May&quot;
-msgstr &quot;&quot;
-
-#: localization.py:262
-msgid &quot;June&quot;
-msgstr &quot;&quot;
-
-#: localization.py:263
-msgid &quot;July&quot;
-msgstr &quot;&quot;
-
-#: localization.py:264
-msgid &quot;August&quot;
-msgstr &quot;&quot;
-
-#: localization.py:265
-msgid &quot;September&quot;
-msgstr &quot;&quot;
-
-#: localization.py:266
-msgid &quot;October&quot;
-msgstr &quot;&quot;
-
-#: localization.py:267
-msgid &quot;November&quot;
-msgstr &quot;&quot;
-
-#: localization.py:268
-msgid &quot;December&quot;
-msgstr &quot;&quot;
-
-#: localization.py:273
-msgid &quot;Jan&quot;
-msgstr &quot;&quot;
-
-#: localization.py:274
-msgid &quot;Feb&quot;
-msgstr &quot;&quot;
-
-#: localization.py:275
-msgid &quot;Mar&quot;
-msgstr &quot;&quot;
-
-#: localization.py:276
-msgid &quot;Apr&quot;
-msgstr &quot;&quot;
-
-#: localization.py:278
-msgid &quot;Jun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:279
-msgid &quot;Jul&quot;
-msgstr &quot;&quot;
-
-#: localization.py:280
-msgid &quot;Aug&quot;
-msgstr &quot;&quot;
-
-#: localization.py:281
-msgid &quot;Sep&quot;
-msgstr &quot;&quot;
-
-#: localization.py:282
-msgid &quot;Oct&quot;
-msgstr &quot;&quot;
-
-#: localization.py:283
-msgid &quot;Nov&quot;
-msgstr &quot;&quot;
-
-#: localization.py:284
-msgid &quot;Dec&quot;
-msgstr &quot;&quot;
-
-#: mail.py:726 mail.py:755 mail.py:792
-msgid &quot;Event cancelled&quot;
-msgstr &quot;&quot;
-
-#: mail.py:727
-msgid &quot;Event invitation: %(summary)s&quot;
-msgstr &quot;&quot;
-
-#: mail.py:736
-msgid &quot;Event Invitation&quot;
-msgstr &quot;&quot;
-
-#: mail.py:737
-msgid &quot;Date&quot;
-msgstr &quot;&quot;
-
-#: mail.py:738
-msgid &quot;Time&quot;
-msgstr &quot;&quot;
-
-#: mail.py:739
-msgid &quot;Description&quot;
-msgstr &quot;&quot;
-
-#: mail.py:740
-msgid &quot;Organizer&quot;
-msgstr &quot;&quot;
-
-#: mail.py:741
-msgid &quot;Attendees&quot;
-msgstr &quot;&quot;
-
-#: mail.py:742
-msgid &quot;Location&quot;
-msgstr &quot;&quot;
-
-
-msgid &quot;1 day&quot;
-msgstr
-
-msgid &quot;%(dayCount)d days&quot;
-msgstr
-
-msgid &quot;1 hour&quot;
-
-msgid &quot;%(hourCount)d hours&quot;
-msgstr
-
-msgid &quot;1 minute&quot;
-msgstr
-
-msgid &quot;%(minuteCount)d minutes&quot;
-msgstr
-
-msgid &quot;1 second&quot;
-msgstr
-
-msgid &quot;%(secondCount)d seconds&quot;
-msgstr
-
</del></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalesenLC_MESSAGEScalendarserverpofromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavtestdatalocalesenLC_MESSAGEScalendarserverpo"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/en/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,249 @@
</span><ins>+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
+#
+msgid &quot;&quot;
+msgstr &quot;&quot;
+&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
+&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
+&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
+&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
+&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
+&quot;MIME-Version: 1.0\n&quot;
+&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
+&quot;Content-Transfer-Encoding: 8bit\n&quot;
+&quot;Generated-By: pygettext.py 1.5\n&quot;
+
+
+#: localization.py:171
+msgid &quot;All day&quot;
+msgstr &quot;&quot;
+
+#: localization.py:177
+msgid &quot;%(startTime)s to %(endTime)s&quot;
+msgstr &quot;&quot;
+
+#: localization.py:191
+msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+msgstr &quot;&quot;
+
+#: localization.py:207
+msgid &quot;AM&quot;
+msgstr &quot;&quot;
+
+#: localization.py:207
+msgid &quot;PM&quot;
+msgstr &quot;&quot;
+
+#: localization.py:213
+msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+msgstr &quot;&quot;
+
+#: localization.py:236
+msgid &quot;Monday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:237
+msgid &quot;Tuesday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:238
+msgid &quot;Wednesday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:239
+msgid &quot;Thursday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:240
+msgid &quot;Friday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:241
+msgid &quot;Saturday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:242
+msgid &quot;Sunday&quot;
+msgstr &quot;&quot;
+
+#: localization.py:246
+msgid &quot;Mon&quot;
+msgstr &quot;&quot;
+
+#: localization.py:247
+msgid &quot;Tue&quot;
+msgstr &quot;&quot;
+
+#: localization.py:248
+msgid &quot;Wed&quot;
+msgstr &quot;&quot;
+
+#: localization.py:249
+msgid &quot;Thu&quot;
+msgstr &quot;&quot;
+
+#: localization.py:250
+msgid &quot;Fri&quot;
+msgstr &quot;&quot;
+
+#: localization.py:251
+msgid &quot;Sun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:252
+msgid &quot;Sat&quot;
+msgstr &quot;&quot;
+
+#: localization.py:257
+msgid &quot;January&quot;
+msgstr &quot;&quot;
+
+#: localization.py:258
+msgid &quot;February&quot;
+msgstr &quot;&quot;
+
+#: localization.py:259
+msgid &quot;March&quot;
+msgstr &quot;&quot;
+
+#: localization.py:260
+msgid &quot;April&quot;
+msgstr &quot;&quot;
+
+#: localization.py:261 localization.py:277
+msgid &quot;May&quot;
+msgstr &quot;&quot;
+
+#: localization.py:262
+msgid &quot;June&quot;
+msgstr &quot;&quot;
+
+#: localization.py:263
+msgid &quot;July&quot;
+msgstr &quot;&quot;
+
+#: localization.py:264
+msgid &quot;August&quot;
+msgstr &quot;&quot;
+
+#: localization.py:265
+msgid &quot;September&quot;
+msgstr &quot;&quot;
+
+#: localization.py:266
+msgid &quot;October&quot;
+msgstr &quot;&quot;
+
+#: localization.py:267
+msgid &quot;November&quot;
+msgstr &quot;&quot;
+
+#: localization.py:268
+msgid &quot;December&quot;
+msgstr &quot;&quot;
+
+#: localization.py:273
+msgid &quot;Jan&quot;
+msgstr &quot;&quot;
+
+#: localization.py:274
+msgid &quot;Feb&quot;
+msgstr &quot;&quot;
+
+#: localization.py:275
+msgid &quot;Mar&quot;
+msgstr &quot;&quot;
+
+#: localization.py:276
+msgid &quot;Apr&quot;
+msgstr &quot;&quot;
+
+#: localization.py:278
+msgid &quot;Jun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:279
+msgid &quot;Jul&quot;
+msgstr &quot;&quot;
+
+#: localization.py:280
+msgid &quot;Aug&quot;
+msgstr &quot;&quot;
+
+#: localization.py:281
+msgid &quot;Sep&quot;
+msgstr &quot;&quot;
+
+#: localization.py:282
+msgid &quot;Oct&quot;
+msgstr &quot;&quot;
+
+#: localization.py:283
+msgid &quot;Nov&quot;
+msgstr &quot;&quot;
+
+#: localization.py:284
+msgid &quot;Dec&quot;
+msgstr &quot;&quot;
+
+#: mail.py:726 mail.py:755 mail.py:792
+msgid &quot;Event cancelled&quot;
+msgstr &quot;&quot;
+
+#: mail.py:727
+msgid &quot;Event invitation: %(summary)s&quot;
+msgstr &quot;&quot;
+
+#: mail.py:736
+msgid &quot;Event Invitation&quot;
+msgstr &quot;&quot;
+
+#: mail.py:737
+msgid &quot;Date&quot;
+msgstr &quot;&quot;
+
+#: mail.py:738
+msgid &quot;Time&quot;
+msgstr &quot;&quot;
+
+#: mail.py:739
+msgid &quot;Description&quot;
+msgstr &quot;&quot;
+
+#: mail.py:740
+msgid &quot;Organizer&quot;
+msgstr &quot;&quot;
+
+#: mail.py:741
+msgid &quot;Attendees&quot;
+msgstr &quot;&quot;
+
+#: mail.py:742
+msgid &quot;Location&quot;
+msgstr &quot;&quot;
+
+
+msgid &quot;1 day&quot;
+msgstr
+
+msgid &quot;%(dayCount)d days&quot;
+msgstr
+
+msgid &quot;1 hour&quot;
+
+msgid &quot;%(hourCount)d hours&quot;
+msgstr
+
+msgid &quot;1 minute&quot;
+msgstr
+
+msgid &quot;%(minuteCount)d minutes&quot;
+msgstr
+
+msgid &quot;1 second&quot;
+msgstr
+
+msgid &quot;%(secondCount)d seconds&quot;
+msgstr
+
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.mo</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarservermofromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavtestdatalocalespigLC_MESSAGEScalendarservermo"></a>
<div class="binary"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.mo (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.mo)</h4>
<pre class="diff"><span>
<span class="cx">(Binary files differ)
</span></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarserverpo"></a>
<div class="delfile"><h4>Deleted: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po (3309 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:00:02 UTC (rev 3309)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -1,250 +0,0 @@
</span><del>-# Pig Latin Translation
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
-#
-msgid &quot;&quot;
-msgstr &quot;&quot;
-&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
-&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
-&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
-&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
-&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
-&quot;MIME-Version: 1.0\n&quot;
-&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
-&quot;Content-Transfer-Encoding: 8bit\n&quot;
-&quot;Generated-By: pygettext.py 1.5\n&quot;
-
-
-#: localization.py:171
-msgid &quot;All day&quot;
-msgstr &quot;Allway ayday&quot;
-
-#: localization.py:177
-msgid &quot;%(startTime)s to %(endTime)s&quot;
-msgstr &quot;%(startTime)s otay %(endTime)s&quot;
-
-#: localization.py:191
-msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
-
-#: localization.py:207
-msgid &quot;AM&quot;
-msgstr &quot;AMWAY&quot;
-
-#: localization.py:207
-msgid &quot;PM&quot;
-msgstr &quot;PMAY&quot;
-
-#: localization.py:213
-msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
-msgstr &quot;%(hour24Number)02d:%(minuteNumber)02d&quot;
-
-#: localization.py:236
-msgid &quot;Monday&quot;
-msgstr &quot;Ondaymay&quot;
-
-#: localization.py:237
-msgid &quot;Tuesday&quot;
-msgstr &quot;Uesdaytay&quot;
-
-#: localization.py:238
-msgid &quot;Wednesday&quot;
-msgstr &quot;Ednesdayway&quot;
-
-#: localization.py:239
-msgid &quot;Thursday&quot;
-msgstr &quot;Ursdaythay&quot;
-
-#: localization.py:240
-msgid &quot;Friday&quot;
-msgstr &quot;Idayfray&quot;
-
-#: localization.py:241
-msgid &quot;Saturday&quot;
-msgstr &quot;Aturdaysay&quot;
-
-#: localization.py:242
-msgid &quot;Sunday&quot;
-msgstr &quot;Undaysay&quot;
-
-#: localization.py:246
-msgid &quot;Mon&quot;
-msgstr &quot;&quot;
-
-#: localization.py:247
-msgid &quot;Tue&quot;
-msgstr &quot;&quot;
-
-#: localization.py:248
-msgid &quot;Wed&quot;
-msgstr &quot;&quot;
-
-#: localization.py:249
-msgid &quot;Thu&quot;
-msgstr &quot;&quot;
-
-#: localization.py:250
-msgid &quot;Fri&quot;
-msgstr &quot;&quot;
-
-#: localization.py:251
-msgid &quot;Sun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:252
-msgid &quot;Sat&quot;
-msgstr &quot;&quot;
-
-#: localization.py:257
-msgid &quot;January&quot;
-msgstr &quot;Anuaryjay&quot;
-
-#: localization.py:258
-msgid &quot;February&quot;
-msgstr &quot;Ebruaryfay&quot;
-
-#: localization.py:259
-msgid &quot;March&quot;
-msgstr &quot;Archmay&quot;
-
-#: localization.py:260
-msgid &quot;April&quot;
-msgstr &quot;Aprilway&quot;
-
-#: localization.py:261 localization.py:277
-msgid &quot;May&quot;
-msgstr &quot;Aymay&quot;
-
-#: localization.py:262
-msgid &quot;June&quot;
-msgstr &quot;Unejay&quot;
-
-#: localization.py:263
-msgid &quot;July&quot;
-msgstr &quot;Ulyjay&quot;
-
-#: localization.py:264
-msgid &quot;August&quot;
-msgstr &quot;Augustway&quot;
-
-#: localization.py:265
-msgid &quot;September&quot;
-msgstr &quot;Eptembersay&quot;
-
-#: localization.py:266
-msgid &quot;October&quot;
-msgstr &quot;Octoberway&quot;
-
-#: localization.py:267
-msgid &quot;November&quot;
-msgstr &quot;Ovembernay&quot;
-
-#: localization.py:268
-msgid &quot;December&quot;
-msgstr &quot;Ecemberday&quot;
-
-#: localization.py:273
-msgid &quot;Jan&quot;
-msgstr &quot;&quot;
-
-#: localization.py:274
-msgid &quot;Feb&quot;
-msgstr &quot;&quot;
-
-#: localization.py:275
-msgid &quot;Mar&quot;
-msgstr &quot;&quot;
-
-#: localization.py:276
-msgid &quot;Apr&quot;
-msgstr &quot;&quot;
-
-#: localization.py:278
-msgid &quot;Jun&quot;
-msgstr &quot;&quot;
-
-#: localization.py:279
-msgid &quot;Jul&quot;
-msgstr &quot;&quot;
-
-#: localization.py:280
-msgid &quot;Aug&quot;
-msgstr &quot;&quot;
-
-#: localization.py:281
-msgid &quot;Sep&quot;
-msgstr &quot;&quot;
-
-#: localization.py:282
-msgid &quot;Oct&quot;
-msgstr &quot;&quot;
-
-#: localization.py:283
-msgid &quot;Nov&quot;
-msgstr &quot;&quot;
-
-#: localization.py:284
-msgid &quot;Dec&quot;
-msgstr &quot;&quot;
-
-#: mail.py:726 mail.py:755 mail.py:792
-msgid &quot;Event cancelled&quot;
-msgstr &quot;Eventway ancelledcay&quot;
-
-#: mail.py:727
-msgid &quot;Event invitation: %(summary)s&quot;
-msgstr &quot;Eventway invitationway: %(summary)s&quot;
-
-#: mail.py:736
-msgid &quot;Event Invitation&quot;
-msgstr &quot;Eventway invitationway&quot;
-
-#: mail.py:737
-msgid &quot;Date&quot;
-msgstr &quot;Ateday&quot;
-
-#: mail.py:738
-msgid &quot;Time&quot;
-msgstr &quot;Imetay&quot;
-
-#: mail.py:739
-msgid &quot;Description&quot;
-msgstr &quot;Escriptionday&quot;
-
-#: mail.py:740
-msgid &quot;Organizer&quot;
-msgstr &quot;Organizerway&quot;
-
-#: mail.py:741
-msgid &quot;Attendees&quot;
-msgstr &quot;Attendeesway&quot;
-
-#: mail.py:742
-msgid &quot;Location&quot;
-msgstr &quot;Ocationlay&quot;
-
-
-msgid &quot;1 day&quot;
-msgstr &quot;1 ayday&quot;
-
-msgid &quot;%(dayCount)d days&quot;
-msgstr &quot;%(dayCount)d aysday&quot;
-
-msgid &quot;1 hour&quot;
-msgstr &quot;1 ourhay&quot;
-
-msgid &quot;%(hourCount)d hours&quot;
-msgstr &quot;%(hourCount)d ourshay&quot;
-
-msgid &quot;1 minute&quot;
-msgstr &quot;1 inutemay&quot;
-
-msgid &quot;%(minuteCount)d minutes&quot;
-msgstr &quot;%(minuteCount)d inutesmay&quot;
-
-msgid &quot;1 second&quot;
-msgstr &quot;1 econdsay&quot;
-
-msgid &quot;%(secondCount)d seconds&quot;
-msgstr &quot;%(secondCount)d econdsay&quot;
-
</del></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtestdatalocalespigLC_MESSAGEScalendarserverpofromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavtestdatalocalespigLC_MESSAGEScalendarserverpo"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/data/locales/pig/LC_MESSAGES/calendarserver.po        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,250 @@
</span><ins>+# Pig Latin Translation
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
+#
+msgid &quot;&quot;
+msgstr &quot;&quot;
+&quot;Project-Id-Version: PACKAGE VERSION\n&quot;
+&quot;POT-Creation-Date: 2008-10-24 15:03+PDT\n&quot;
+&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
+&quot;Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n&quot;
+&quot;Language-Team: LANGUAGE &lt;LL@li.org&gt;\n&quot;
+&quot;MIME-Version: 1.0\n&quot;
+&quot;Content-Type: text/plain; charset=UTF-8\n&quot;
+&quot;Content-Transfer-Encoding: 8bit\n&quot;
+&quot;Generated-By: pygettext.py 1.5\n&quot;
+
+
+#: localization.py:171
+msgid &quot;All day&quot;
+msgstr &quot;Allway ayday&quot;
+
+#: localization.py:177
+msgid &quot;%(startTime)s to %(endTime)s&quot;
+msgstr &quot;%(startTime)s otay %(endTime)s&quot;
+
+#: localization.py:191
+msgid &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+msgstr &quot;%(dayName)s, %(monthName)s %(dayNumber)d, %(yearNumber)d&quot;
+
+#: localization.py:207
+msgid &quot;AM&quot;
+msgstr &quot;AMWAY&quot;
+
+#: localization.py:207
+msgid &quot;PM&quot;
+msgstr &quot;PMAY&quot;
+
+#: localization.py:213
+msgid &quot;%(hour12Number)d:%(minuteNumber)02d %(ampm)s&quot;
+msgstr &quot;%(hour24Number)02d:%(minuteNumber)02d&quot;
+
+#: localization.py:236
+msgid &quot;Monday&quot;
+msgstr &quot;Ondaymay&quot;
+
+#: localization.py:237
+msgid &quot;Tuesday&quot;
+msgstr &quot;Uesdaytay&quot;
+
+#: localization.py:238
+msgid &quot;Wednesday&quot;
+msgstr &quot;Ednesdayway&quot;
+
+#: localization.py:239
+msgid &quot;Thursday&quot;
+msgstr &quot;Ursdaythay&quot;
+
+#: localization.py:240
+msgid &quot;Friday&quot;
+msgstr &quot;Idayfray&quot;
+
+#: localization.py:241
+msgid &quot;Saturday&quot;
+msgstr &quot;Aturdaysay&quot;
+
+#: localization.py:242
+msgid &quot;Sunday&quot;
+msgstr &quot;Undaysay&quot;
+
+#: localization.py:246
+msgid &quot;Mon&quot;
+msgstr &quot;&quot;
+
+#: localization.py:247
+msgid &quot;Tue&quot;
+msgstr &quot;&quot;
+
+#: localization.py:248
+msgid &quot;Wed&quot;
+msgstr &quot;&quot;
+
+#: localization.py:249
+msgid &quot;Thu&quot;
+msgstr &quot;&quot;
+
+#: localization.py:250
+msgid &quot;Fri&quot;
+msgstr &quot;&quot;
+
+#: localization.py:251
+msgid &quot;Sun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:252
+msgid &quot;Sat&quot;
+msgstr &quot;&quot;
+
+#: localization.py:257
+msgid &quot;January&quot;
+msgstr &quot;Anuaryjay&quot;
+
+#: localization.py:258
+msgid &quot;February&quot;
+msgstr &quot;Ebruaryfay&quot;
+
+#: localization.py:259
+msgid &quot;March&quot;
+msgstr &quot;Archmay&quot;
+
+#: localization.py:260
+msgid &quot;April&quot;
+msgstr &quot;Aprilway&quot;
+
+#: localization.py:261 localization.py:277
+msgid &quot;May&quot;
+msgstr &quot;Aymay&quot;
+
+#: localization.py:262
+msgid &quot;June&quot;
+msgstr &quot;Unejay&quot;
+
+#: localization.py:263
+msgid &quot;July&quot;
+msgstr &quot;Ulyjay&quot;
+
+#: localization.py:264
+msgid &quot;August&quot;
+msgstr &quot;Augustway&quot;
+
+#: localization.py:265
+msgid &quot;September&quot;
+msgstr &quot;Eptembersay&quot;
+
+#: localization.py:266
+msgid &quot;October&quot;
+msgstr &quot;Octoberway&quot;
+
+#: localization.py:267
+msgid &quot;November&quot;
+msgstr &quot;Ovembernay&quot;
+
+#: localization.py:268
+msgid &quot;December&quot;
+msgstr &quot;Ecemberday&quot;
+
+#: localization.py:273
+msgid &quot;Jan&quot;
+msgstr &quot;&quot;
+
+#: localization.py:274
+msgid &quot;Feb&quot;
+msgstr &quot;&quot;
+
+#: localization.py:275
+msgid &quot;Mar&quot;
+msgstr &quot;&quot;
+
+#: localization.py:276
+msgid &quot;Apr&quot;
+msgstr &quot;&quot;
+
+#: localization.py:278
+msgid &quot;Jun&quot;
+msgstr &quot;&quot;
+
+#: localization.py:279
+msgid &quot;Jul&quot;
+msgstr &quot;&quot;
+
+#: localization.py:280
+msgid &quot;Aug&quot;
+msgstr &quot;&quot;
+
+#: localization.py:281
+msgid &quot;Sep&quot;
+msgstr &quot;&quot;
+
+#: localization.py:282
+msgid &quot;Oct&quot;
+msgstr &quot;&quot;
+
+#: localization.py:283
+msgid &quot;Nov&quot;
+msgstr &quot;&quot;
+
+#: localization.py:284
+msgid &quot;Dec&quot;
+msgstr &quot;&quot;
+
+#: mail.py:726 mail.py:755 mail.py:792
+msgid &quot;Event cancelled&quot;
+msgstr &quot;Eventway ancelledcay&quot;
+
+#: mail.py:727
+msgid &quot;Event invitation: %(summary)s&quot;
+msgstr &quot;Eventway invitationway: %(summary)s&quot;
+
+#: mail.py:736
+msgid &quot;Event Invitation&quot;
+msgstr &quot;Eventway invitationway&quot;
+
+#: mail.py:737
+msgid &quot;Date&quot;
+msgstr &quot;Ateday&quot;
+
+#: mail.py:738
+msgid &quot;Time&quot;
+msgstr &quot;Imetay&quot;
+
+#: mail.py:739
+msgid &quot;Description&quot;
+msgstr &quot;Escriptionday&quot;
+
+#: mail.py:740
+msgid &quot;Organizer&quot;
+msgstr &quot;Organizerway&quot;
+
+#: mail.py:741
+msgid &quot;Attendees&quot;
+msgstr &quot;Attendeesway&quot;
+
+#: mail.py:742
+msgid &quot;Location&quot;
+msgstr &quot;Ocationlay&quot;
+
+
+msgid &quot;1 day&quot;
+msgstr &quot;1 ayday&quot;
+
+msgid &quot;%(dayCount)d days&quot;
+msgstr &quot;%(dayCount)d aysday&quot;
+
+msgid &quot;1 hour&quot;
+msgstr &quot;1 ourhay&quot;
+
+msgid &quot;%(hourCount)d hours&quot;
+msgstr &quot;%(hourCount)d ourshay&quot;
+
+msgid &quot;1 minute&quot;
+msgstr &quot;1 inutemay&quot;
+
+msgid &quot;%(minuteCount)d minutes&quot;
+msgstr &quot;%(minuteCount)d inutesmay&quot;
+
+msgid &quot;1 second&quot;
+msgstr &quot;1 econdsay&quot;
+
+msgid &quot;%(secondCount)d seconds&quot;
+msgstr &quot;%(secondCount)d econdsay&quot;
+
</ins></span></pre></div>
<a id="CalendarServerbranchesuserssagenlocalization3308twistedcaldavtesttest_localizationpyfromrev3309CalendarServerbranchesuserssagenlocalization3280twistedcaldavtesttest_localizationpy"></a>
<div class="copfile"><h4>Copied: CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/test_localization.py (from rev 3309, CalendarServer/branches/users/sagen/localization-3280/twistedcaldav/test/test_localization.py) (0 => 3310)</h4>
<pre class="diff"><span>
<span class="info">--- CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/test_localization.py                                (rev 0)
+++ CalendarServer/branches/users/sagen/localization-3308/twistedcaldav/test/test_localization.py        2008-11-03 17:01:16 UTC (rev 3310)
</span><span class="lines">@@ -0,0 +1,137 @@
</span><ins>+##
+# Copyright (c) 2008 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+from __future__ import with_statement
+
+from twisted.trial.unittest import TestCase
+from twistedcaldav.localization import translationTo
+from twistedcaldav.ical import Component
+from datetime import datetime, time
+import os
+
+def getComp(str):
+    calendar = Component.fromString(str)
+    comp = calendar.masterComponent()
+    if comp is None:
+        comp = calendar.mainComponent(True)
+    return comp
+
+data = (
+    ('1-hour-long-morning', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:20081025T091500\r\nDTEND;TZID=US/Pacific:20081025T101501\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser@ex
 ample.com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+    ('2-hour-long-evening', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:20081025T131500\r\nDTEND;TZID=US/Pacific:20081025T151502\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser@ex
 ample.com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+    ('3-hour-long-cross-noon', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:20081025T110500\r\nDTEND;TZID=US/Pacific:20081025T141500\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser
 @example.com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+    ('all-day', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:20081025\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser@example.com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\
 r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+    ('instantaneous', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:20081025T131500\r\nDTEND;TZID=US/Pacific:20081025T131500\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser@example.
 com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+    ('cross-timezone', getComp('BEGIN:VCALENDAR\r\nVERSION:2.0\r\nCALSCALE:GREGORIAN\r\nMETHOD:REQUEST\r\nPRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN\r\nBEGIN:VTIMEZONE\r\nTZID:US/Pacific\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VTIMEZONE\r\nTZID:US/Eastern\r\nBEGIN:STANDARD\r\nDTSTART:20071104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nDTSTART:20070311T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nEND:DAYLIGHT\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:C7C037CC-1485-461B-8866-777C662C5930\r\nDTSTART;TZID=US/Pacific:
 20081025T110500\r\nDTEND;TZID=US/Eastern:20081025T181500\r\nATTENDEE;CN=test@systemcall.com;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSV\r\n P=TRUE:mailto:test@systemcall.com\r\nATTENDEE;CN=Test User;CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:mailto:testuser@\r\n example.com\r\nCREATED:20081024T181749Z\r\nDTSTAMP:20081024T183142Z\r\nORGANIZER;CN=Test User:mailto:testuser@example.com\r\nSEQUENCE:5\r\nSUMMARY:testing\r\nTRANSP:OPAQUE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n')),
+
+
+)
+
+localeDir = os.path.join(os.path.dirname(__file__), &quot;data&quot;, &quot;locales&quot;)
+
+class LocalizationTests(TestCase):
+
+    def test_BasicStringLocalization(self):
+
+        with translationTo('pig', localeDir=localeDir):
+
+            self.assertEquals(_(&quot;All day&quot;), &quot;Allway ayday&quot;)
+
+            self.assertEquals(_(&quot;%(startTime)s to %(endTime)s&quot;) %
+                { 'startTime' : 'a', 'endTime' : 'b' },
+                &quot;a otay b&quot;
+            )
+
+    def test_TimeFormattingAMPM(self):
+
+        with translationTo('en', localeDir=localeDir) as t:
+
+            self.assertEquals(t.dtTime(time(0,0)), &quot;12:00 AM&quot;)
+            self.assertEquals(t.dtTime(time(12,0)), &quot;12:00 PM&quot;)
+            self.assertEquals(t.dtTime(time(23,59)), &quot;11:59 PM&quot;)
+            self.assertEquals(t.dtTime(time(6,5)), &quot;6:05 AM&quot;)
+            self.assertEquals(t.dtTime(time(16,5)), &quot;4:05 PM&quot;)
+
+    def test_TimeFormatting24Hour(self):
+
+        with translationTo('pig', localeDir=localeDir) as t:
+
+            self.assertEquals(t.dtTime(time(0,0)), &quot;00:00&quot;)
+            self.assertEquals(t.dtTime(time(12,0)), &quot;12:00&quot;)
+            self.assertEquals(t.dtTime(time(23,59)), &quot;23:59&quot;)
+            self.assertEquals(t.dtTime(time(6,5)), &quot;06:05&quot;)
+            self.assertEquals(t.dtTime(time(16,5)), &quot;16:05&quot;)
+
+    def test_CalendarFormatting(self):
+
+        with translationTo('en', localeDir=localeDir) as t:
+
+            comp = data[0][1]
+            self.assertEquals(t.date(comp), &quot;Saturday, October 25, 2008&quot;)
+            self.assertEquals(t.time(comp),
+                (u'9:15 AM to 10:15 AM PDT', u'1 hour 1 second'))
+
+            comp = data[1][1]
+            self.assertEquals(t.time(comp),
+                (u'1:15 PM to 3:15 PM PDT', u'2 hours 2 seconds'))
+
+            comp = data[2][1]
+            self.assertEquals(t.time(comp),
+                (u'11:05 AM to 2:15 PM PDT', u'3 hours 10 minutes'))
+
+            comp = data[3][1]
+            self.assertEquals(t.time(comp),
+                (&quot;&quot;, u'All day'))
+
+            comp = data[4][1]
+            self.assertEquals(t.time(comp),
+                (u'1:15 PM PDT', &quot;&quot;))
+
+            comp = data[5][1]
+            self.assertEquals(t.time(comp),
+                (u'11:05 AM PDT to 6:15 PM EDT', u'4 hours 10 minutes'))
+
+        with translationTo('pig', localeDir=localeDir) as t:
+
+            comp = data[0][1]
+            self.assertEquals(t.date(comp), 'Aturdaysay, Octoberway 25, 2008')
+            self.assertEquals(t.time(comp),
+                (u'09:15 otay 10:15 PDT', u'1 ourhay 1 econdsay'))
+
+            comp = data[1][1]
+            self.assertEquals(t.time(comp),
+                (u'13:15 otay 15:15 PDT', u'2 ourshay 2 econdsay'))
+
+            comp = data[2][1]
+            self.assertEquals(t.time(comp),
+                (u'11:05 otay 14:15 PDT', u'3 ourshay 10 inutesmay'))
+
+            comp = data[3][1]
+            self.assertEquals(t.time(comp),
+                (&quot;&quot;, u'Allway ayday'))
+
+            comp = data[4][1]
+            self.assertEquals(t.time(comp),
+                (u'13:15 PDT', &quot;&quot;))
+
+            comp = data[5][1]
+            self.assertEquals(t.time(comp),
+                (u'11:05 PDT otay 18:15 EDT', u'4 ourshay 10 inutesmay'))
</ins></span></pre>
</div>
</div>

</body>
</html>