Index: ow/templates/dashboard.pt
===================================================================
--- ow/templates/dashboard.pt	(revision e171dc27798295938b6c2051533ecd2431a69f09)
+++ ow/templates/dashboard.pt	(revision ac3af3374f9d0054d8e5390387915475e504e851)
@@ -25,6 +25,7 @@
       <section class="workout-list">
 
-        <h3 tal:condition="viewing_month is not None">
-          <tal:d tal:content="month_name[viewing_month] + ' ' + str(viewing_year)"></tal:d> -
+        <h3 tal:condition="viewing_month is not None"
+            tal:define="localizer get_localizer(request)">
+          <tal:d tal:content="localizer.translate(month_name[viewing_month]) + ' ' + str(viewing_year)"></tal:d> -
           <tal:n tal:content="len(workouts)"></tal:n>
           <tal:t i18n:translate="">Workouts</tal:t>
@@ -174,10 +175,11 @@
                               <tal:months tal:repeat="month sorted(tree[year].keys())">
                                   <li tal:define="is_viewing_month is_viewing_year and month == viewing_month">
-                                      <a href=""
-                                         tal:attributes="href request.resource_url(context, query={'year': year, 'month': month});
-                                                         class 'viewing-month' if is_viewing_month else ''">
-                                           <span tal:content="month_name[month]"></span>
-                                           <span tal:content="sum([tree[year][month][sport] for sport in tree[year][month]])"></span>
-                                      </a>
+                                    <a href=""
+                                       tal:attributes="href request.resource_url(context, query={'year': year, 'month': month});
+                                             class 'viewing-month' if is_viewing_month else ''"
+                                       tal:define="localizer get_localizer(request)">
+                                      <span tal:content="localizer.translate(month_name[month])"></span>
+                                      <span tal:content="sum([tree[year][month][sport] for sport in tree[year][month]])"></span>
+                                    </a>
                                   </li>
                               </tal:months>
Index: ow/utilities.py
===================================================================
--- ow/utilities.py	(revision e171dc27798295938b6c2051533ecd2431a69f09)
+++ ow/utilities.py	(revision ac3af3374f9d0054d8e5390387915475e504e851)
@@ -282,4 +282,55 @@
 
 
+def get_month_names():
+    """
+    Return a list with the names of the months, marked for translation.
+
+    This should be done automatically by the calendar module:
+
+    >>> import calendar
+    >>> calendar.month_name[1]
+    'January'
+    >>>
+
+    But even trying setting the proper locale (using locale.setlocale()),
+    in some operating systems the names are not translated (OpenBSD).
+
+    So, for now, we use this dirty trick
+    """
+    return [
+        '',
+        _('January'),
+        _('February'),
+        _('March'),
+        _('April'),
+        _('May'),
+        _('June'),
+        _('July'),
+        _('August'),
+        _('September'),
+        _('October'),
+        _('November'),
+        _('December')
+    ]
+
+
+def get_week_day_names():
+    """
+    Return a list with the names of the week days, marked for translation.
+
+    As with get_month_names(), this is a dirty workaround for some locale
+    problem in some operating systems
+    """
+    return [
+        _('Monday'),
+        _('Tuesday'),
+        _('Wednesday'),
+        _('Thursday'),
+        _('Friday'),
+        _('Saturday'),
+        _('Sunday'),
+    ]
+
+
 def part_of_day(dt):
     """
Index: ow/views/user.py
===================================================================
--- ow/views/user.py	(revision e171dc27798295938b6c2051533ecd2431a69f09)
+++ ow/views/user.py	(revision ac3af3374f9d0054d8e5390387915475e504e851)
@@ -1,4 +1,3 @@
 import json
-from calendar import month_name
 from datetime import datetime, timezone, timedelta
 from decimal import Decimal
@@ -25,9 +24,14 @@
     timedelta_to_hms,
     get_verification_token,
-    get_available_locale_names
+    get_gender_names,
+    get_available_locale_names,
+    get_month_names,
+    get_week_day_names
 )
 from ..mail import send_verification_email
 
 _ = TranslationStringFactory('OpenWorkouts')
+month_name = get_month_names()
+weekday_name = get_week_day_names()
 
 
@@ -411,10 +415,12 @@
     name='week')
 def week_stats(context, request):
+    localizer = get_localizer(request)
     stats = context.week_stats
     json_stats = []
     for day in stats:
         hms = timedelta_to_hms(stats[day]['time'])
+        name = localizer.translate(weekday_name[day.weekday()])[:3]
         day_stats = {
-            'name': day.strftime('%a'),
+            'name': name,
             'time': str(hms[0]).zfill(2),
             'distance': int(round(stats[day]['distance'])),
@@ -436,4 +442,5 @@
     Return a json-encoded stream with statistics for the last 12 months
     """
+    localizer = get_localizer(request)
     stats = context.yearly_stats
     # this sets which month is 2 times in the stats, once this year, once
@@ -444,5 +451,5 @@
     for month in stats:
         hms = timedelta_to_hms(stats[month]['time'])
-        name = month_name[month[1]][:3]
+        name = localizer.translate(month_name[month[1]])[:3]
         if month[1] == repeated_month:
             name += ' ' + str(month[0])
@@ -473,4 +480,5 @@
     in a per-week basis
     """
+    localizer = get_localizer(request)
     stats = context.weekly_year_stats
     # this sets which month is 2 times in the stats, once this year, once
@@ -481,5 +489,5 @@
     for week in stats:
         hms = timedelta_to_hms(stats[week]['time'])
-        name = month_name[week[1]][:3]
+        name = localizer.translate(month_name[week[1]])[:3]
         if week[1] == repeated_month:
             name += ' ' + str(week[0])
