From 72452dd4b327ed198010e400a341eb9cde9e3b88 Mon Sep 17 00:00:00 2001 From: Marco Bonetti Date: Wed, 23 May 2012 11:44:15 +0200 Subject: [PATCH 1/5] storages, wip --- rosetta/storage.py | 29 ++ rosetta/tests/django.po.issue38gh.template | 371 +++++++++++++++++++++ 2 files changed, 400 insertions(+) create mode 100644 rosetta/storage.py create mode 100644 rosetta/tests/django.po.issue38gh.template diff --git a/rosetta/storage.py b/rosetta/storage.py new file mode 100644 index 0000000..35bcb25 --- /dev/null +++ b/rosetta/storage.py @@ -0,0 +1,29 @@ +class BaseRosettaStorage: + def __repr__(self): + return str(self.id) + + def __del__(self): + self._persist(self.__dict__) + + def __getattr__(self, key, *args, **kwargs): + return None + + def __getitem__(self, key): + return self.__dict__.get(key, None) + + def __iter__(self): + return self.__dict__.__iter__() + + +class SessionRosettaStorage(BaseRosettaStorage): + def __init__(self, request): + self.request = request + + for key, value in self.request.session.iteritems(): + if key.startswith('rosetta_'): + setattr(self, key, value) + + def _persist(self, what): + for key, value in what: + if key.startswith('rosetta_'): + self.request.session[key] = value diff --git a/rosetta/tests/django.po.issue38gh.template b/rosetta/tests/django.po.issue38gh.template new file mode 100644 index 0000000..0bb1275 --- /dev/null +++ b/rosetta/tests/django.po.issue38gh.template @@ -0,0 +1,371 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Rosetta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-21 12:21+0200\n" +"PO-Revision-Date: 2008-09-22 11:02\n" +"Last-Translator: Admin Admin \n" +"Language-Team: French \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Translated-Using: django-rosetta 0.4.RC2\n" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 1" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 2" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 3" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 4" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 5" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 6" +msgstr "" + + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 7" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 8" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 9" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 10" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 11" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 12" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 13" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 14" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 15" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 16" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 17" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 18" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 19" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 20" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 21" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 22" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 23" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 24" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 25" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 26" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 27" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 28" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 29" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 30" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 31" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 32" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 33" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 34" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 35" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 36" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 37" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 38" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 39" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 40" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 41" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 42" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 43" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 44" +msgstr "" + + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 45" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 46" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 47" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 48" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 49" +msgstr "" + +msgid "0_81EhfRiLPoxAH5j3f1D2P33S_-Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 50" +msgstr "" + + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 1" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 2" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 3" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 4" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 5" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 6" +msgstr "" + + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 7" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 8" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 9" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 10" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 11" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 12" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 13" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 14" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 15" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 16" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 17" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 18" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 19" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 20" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 21" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 22" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 23" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 24" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 25" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 26" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 27" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 28" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 29" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 30" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 31" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 32" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 33" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 34" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 35" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 36" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 37" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 38" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 39" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 40" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 41" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 42" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 43" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 44" +msgstr "" + + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 45" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 46" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 47" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 48" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 49" +msgstr "" + +msgid "xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 50" +msgstr "" + + + From 3185d99bf7a685910352beb95f456dba7e484656 Mon Sep 17 00:00:00 2001 From: Marco Bonetti Date: Wed, 23 May 2012 11:45:04 +0200 Subject: [PATCH 2/5] storages, wip --- rosetta/tests/__init__.py | 30 +++++++++++++++++++++++++++--- rosetta/views.py | 2 ++ testproject/settings.py | 3 ++- testproject/urls.py | 7 ++++--- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/rosetta/tests/__init__.py b/rosetta/tests/__init__.py index 3f171d7..5f2d2ae 100644 --- a/rosetta/tests/__init__.py +++ b/rosetta/tests/__init__.py @@ -471,12 +471,36 @@ class RosettaTestCase(TestCase): # post a translation, it should have properly wrapped lines r = self.client.post(reverse('rosetta-home'), dict( - m_ff7060c1a9aae9c42af4d54ac8551f67_0='Foo %s', - m_ff7060c1a9aae9c42af4d54ac8551f67_1='Bar %s', - m_09f7e02f1290be211da707a266f153b3='Salut', _next='_next')) + m_ff7060c1a9aae9c42af4d54ac8551f67_0='Foo %s', + m_ff7060c1a9aae9c42af4d54ac8551f67_1='Bar %s', + m_09f7e02f1290be211da707a266f153b3='Salut', _next='_next')) pofile_content = open(self.dest_file, 'r').read() self.assertTrue('msgstr "Salut\\n"' in pofile_content) self.assertTrue('msgstr[0] ""\n"\\n"\n"Foo %s\\n"' in pofile_content) self.assertTrue('msgstr[1] ""\n"\\n"\n"Bar %s\\n"' in pofile_content) shutil.move(self.dest_file + '.orig', self.dest_file) + + def test_19_Test_Issue_gh38(self): + if self.django_version_major >= 1 and self.django_version_minor >= 4: + self.assertTrue('django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES) + settings.SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" + shutil.copy(self.dest_file, self.dest_file + '.orig') + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file) + + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict())) + r = self.client.get(reverse('rosetta-home')) + self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096) + self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in r.content) + r = self.client.post(reverse('rosetta-home'), dict( + m_9efd113f7919952523f06e0d88da9c54='Testing cookie length', + _next='_next' + )) + pofile_content = open(self.dest_file, 'r').read() + self.assertTrue('Testing cookie length' in pofile_content) + + self.client.get(reverse('rosetta-home') + '?filter=translated') + r = self.client.get(reverse('rosetta-home')) + self.assertTrue('Testing cookie length' in r.content) + shutil.move(self.dest_file + '.orig', self.dest_file) diff --git a/rosetta/views.py b/rosetta/views.py index a476e34..a89164f 100644 --- a/rosetta/views.py +++ b/rosetta/views.py @@ -12,6 +12,7 @@ from rosetta.conf import settings as rosetta_settings from rosetta.polib import pofile from rosetta.poutil import find_pos, pagination_range from rosetta.signals import entry_changed, post_save +from rosetta.storage import SessionRosettaStorage import re import rosetta import datetime @@ -47,6 +48,7 @@ def home(request): version = rosetta.get_version(True) + storage = SessionRosettaStorage(request) if 'rosetta_i18n_fn' in request.session: rosetta_i18n_fn = request.session.get('rosetta_i18n_fn') rosetta_i18n_app = get_app_name(rosetta_i18n_fn) diff --git a/testproject/settings.py b/testproject/settings.py index b47307d..27be8c0 100644 --- a/testproject/settings.py +++ b/testproject/settings.py @@ -45,8 +45,9 @@ SOUTH_TESTS_MIGRATE = False FIXTURE_DIRS = ( os.path.join(PROJECT_PATH, 'fixtures'), ) - +STATIC_URL = '/static/' ROOT_URLCONF = 'testproject.urls' DEBUG = True TEMPLATE_DEBUG = True +SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" diff --git a/testproject/urls.py b/testproject/urls.py index 039e61a..0948f3b 100644 --- a/testproject/urls.py +++ b/testproject/urls.py @@ -1,8 +1,8 @@ from django.conf.urls.defaults import patterns, include, url # Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() +from django.contrib import admin +admin.autodiscover() urlpatterns = patterns('', # Examples: @@ -13,5 +13,6 @@ urlpatterns = patterns('', # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: - # url(r'^admin/', include(admin.site.urls)), + url(r'^admin/', include(admin.site.urls)), + url(r'^rosetta/', include('rosetta.urls')) ) From cf9daaf0d1a4ee05039871d531f5d5cabc10ed32 Mon Sep 17 00:00:00 2001 From: Marco Bonetti Date: Sun, 27 May 2012 22:21:12 +0200 Subject: [PATCH 3/5] storages seem to work, more testing needed --- testproject/locale/xx/LC_MESSAGES/django.mo | Bin 0 -> 1498 bytes testproject/locale/xx/LC_MESSAGES/django.po | 618 ++++++++++++++++++++ 2 files changed, 618 insertions(+) create mode 100644 testproject/locale/xx/LC_MESSAGES/django.mo create mode 100644 testproject/locale/xx/LC_MESSAGES/django.po diff --git a/testproject/locale/xx/LC_MESSAGES/django.mo b/testproject/locale/xx/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..94e7c3878e136596caf6593c923935ffddcc45f3 GIT binary patch literal 1498 zcmdT@%aYng6jc%@3zn(ME{op8Wml?+S|EhvVPXX0VGBlp1`r!nkJJKzq{gj>#nj|8 z@&n#`>y4LLWRYE}vds_VC(?q%{)Xx5+vnb+(^seU`1{)@zY2VO!{d7%W>xUFOGuf zwvn+5=AmiPvOALZjR5r}tI=4va6nvTlDKm>Q*gXUsxkD_unHLNZ?^c=lu-u8kBMqrV#Fxdk1IBiRh({|%=+HMLZ zS?6-jT4lCgwp3q&O0Ep*-wTpeaQG&!7vwPc~7>Vl|u6#NSonZ{I z<0`M#$5M5JbzglA71@tQsIZHhLV7EW(v4-R_qj6hi~MN8H`AS5(zdk^dgft{4mZu& zZLGI@n-N(_x;K0)C62w%l(91PbhDpNC#rS4E38@8hzPPs`TzGVi-N`Io_HA?`*2BE z8q!1qbDEMY!?ig%QkKC3k29hHNfcFxL?|JEBuzp; zik#s>I44C|HT|SR5)@@9DF8J!S*@8k&7jS2l14bAOalO1VLuL&m*=(a(fFE+l5LK+ z1lk108W=E=csp=qnlGcUPTBUlHW^Qh&;C(eto3M;k%ad?9l5`Zl-WKW<@!}5gbq!ry59(=Q8ayUVuy5d6slK2>c90 zz%T!R#Osa(o<2RNSDj{+KC5W)3W?z1;mlVW@j2gv_#WwbZT;y95Fg&A=bQU`erO8W a, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Rosetta\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-10-21 12:21+0200\n" +"PO-Revision-Date: 2012-05-27 14:59\n" +"Last-Translator: \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"X-Translated-Using: django-rosetta 0.6.7\n" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 1" +msgstr "aaa" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 2" +msgstr "111" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 3" +msgstr "asdasd" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 4" +msgstr "aa" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 5" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 6" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 7" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 8" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 9" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 10" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 11" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 12" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 13" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 14" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 15" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 16" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 17" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 18" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 19" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 20" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 21" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 22" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 23" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 24" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 25" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 26" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 27" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 28" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 29" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 30" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 31" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 32" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 33" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 34" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 35" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 36" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 37" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 38" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 39" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 40" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 41" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 42" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 43" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 44" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 45" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 46" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 47" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 48" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 49" +msgstr "" + +msgid "" +"0_81EhfRiLPoxAH5j3f1D2P33S_-" +"Fe_7Mn_R_t9V8Bysr01xWAgvVEyyA190oYYTnzJCBucLBWKiqaAIjWAvQ3ZfrbCkDRe02iESoGhHEIBmmDI49SY6cQQk0AxGoB-" +"kmZfloBiMsQraFOWetVEF4SRTHlxhNEPA-kCYB4LUCfl-l String 50" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 1" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 2" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 3" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 4" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 5" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 6" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 7" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 8" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 9" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 10" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 11" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 12" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 13" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 14" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 15" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 16" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 17" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 18" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 19" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 20" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 21" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 22" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 23" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 24" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 25" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 26" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 27" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 28" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 29" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 30" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 31" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 32" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 33" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 34" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 35" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 36" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 37" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 38" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 39" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 40" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 41" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 42" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 43" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 44" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 45" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 46" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 47" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 48" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 49" +msgstr "" + +msgid "" +"xeXu5ur6xtXV69d2-7u7Fz5eD6TpYXyNVcFd28vjsZ7fnYIrzTTMEn__E_5ykGYGm-" +"aY_7JXpx9_fXD9K-75dlH1vTvOv2w2HsZPL9zu7MdvupP-" +"qNh5xo8PjfCLkR1kO4QUmB8CZHeW2BcGw2nYTjt7I7NcBLDuNM9PpbvPQt3le1Pex String 50" +msgstr "aaa2" From b10e37ebebf8a0f87b8de28d926f87af1f05367c Mon Sep 17 00:00:00 2001 From: Henk Vos Date: Wed, 30 May 2012 14:55:26 +0200 Subject: [PATCH 4/5] change to def proces to display the actual po file that contains the error on top of the line number --- rosetta/polib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosetta/polib.py b/rosetta/polib.py index 89e1620..b151b03 100644 --- a/rosetta/polib.py +++ b/rosetta/polib.py @@ -1310,7 +1310,7 @@ class _POFileParser(object): if action(): self.current_state = state except Exception: - raise IOError('Syntax error in po file (line %s)' % linenum) + raise IOError('Syntax error in po file: %s (line %s)' % (self.instance.fpath, linenum)) # state handlers From 4146da3287f71ccec5a6713e7e75cb346e805bce Mon Sep 17 00:00:00 2001 From: Marco Bonetti Date: Thu, 7 Jun 2012 13:46:16 +0200 Subject: [PATCH 5/5] rosetta 0.6.8 with pluggable storage classes, fixes Issue 38 --- CHANGES | 6 + README.rst | 13 + rosetta/__init__.py | 2 +- rosetta/conf/settings.py | 3 + rosetta/storage.py | 103 +++++-- rosetta/templates/rosetta/base.html | 2 +- rosetta/templates/rosetta/languages.html | 5 +- rosetta/tests/__init__.py | 364 +++++++++++------------ rosetta/views.py | 66 ++-- testproject/settings.py | 11 +- 10 files changed, 317 insertions(+), 258 deletions(-) diff --git a/CHANGES b/CHANGES index 19befdb..b15d6f9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +Version 0.6.8 +------------- +* Switched to a pluggable storage backend model to increase compatibility with Django 1.4. Cache and Session-based storages are provided. + +Version 0.6.7 +------------- * Added a testproject to run tests * Updated french translation. Thanks, @BertrandBordage * Merged @sleepyjames' PR that fixes an error when pofile save path contains '.po' in the path diff --git a/README.rst b/README.rst index 4ae079b..be394c1 100644 --- a/README.rst +++ b/README.rst @@ -60,6 +60,19 @@ Rosetta can be configured via the following parameters, to be defined in your pr * ``ROSETTA_EXCLUDED_APPLICATIONS``: Exclude applications defined in this list from being translated. Defaults to ``()``. * ``ROSETTA_REQUIRES_AUTH``: Require authentication for all Rosetta views. Defaults to ``True``. * ``ROSETTA_POFILE_WRAP_WIDTH``: Sets the line-length of the edited PO file. Set this to ``0`` to mimic ``makemessage``'s ``--no-wrap`` option. Defaults to ``78``. +* ``ROSETTA_STORAGE_CLASS``: See the note below on Storages. Defaults to ``rosetta.storage.CacheRosettaStorage`` + +******** +Storages +******** + +To prevent re-reading and parsing the PO file catalogs over and over again, Rosetta stores them in a volatile location. This can be either the HTTP session or the Django cache. + +Django 1.4 has introduced a signed cookie session backend, which stores the whole content of the session in an encrypted cookie. Unfortunately this doesn't work with large PO files, as the limit of 4096 chars that can be stored in a cookie are easily exceeded. + +In this case the Cache-based backend should be used (by setting ``ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'``). Please make sure that a proper CACHES backend is configured in your Django settings. + +Alternatively you can switch back to using the Session based storage by setting ``ROSETTA_STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage`` in your settings. This is perfectly safe on Django 1.3. On Django 1.4 or higher make sure you have DON'T use the `signed_cookies `_ ``SESSION_BACKEND`` with this Rosetta storage backend or funky things might happen. ******** Security diff --git a/rosetta/__init__.py b/rosetta/__init__.py index d0ea43a..664a7c7 100644 --- a/rosetta/__init__.py +++ b/rosetta/__init__.py @@ -1,4 +1,4 @@ -VERSION = (0, 6, 7) +VERSION = (0, 6, 8) def get_version(svn=False, limit=3): diff --git a/rosetta/conf/settings.py b/rosetta/conf/settings.py index 127db05..967afaf 100644 --- a/rosetta/conf/settings.py +++ b/rosetta/conf/settings.py @@ -48,3 +48,6 @@ EXCLUDED_APPLICATIONS = getattr(settings, 'ROSETTA_EXCLUDED_APPLICATIONS', ()) # Line length of the updated PO file POFILE_WRAP_WIDTH = getattr(settings, 'ROSETTA_POFILE_WRAP_WIDTH', 78) + +# Storage class to handle temporary data storage +STORAGE_CLASS = getattr(settings, 'ROSETTA_STORAGE_CLASS', 'rosetta.storage.CacheRosettaStorage') diff --git a/rosetta/storage.py b/rosetta/storage.py index 35bcb25..3e52443 100644 --- a/rosetta/storage.py +++ b/rosetta/storage.py @@ -1,29 +1,86 @@ -class BaseRosettaStorage: - def __repr__(self): - return str(self.id) - - def __del__(self): - self._persist(self.__dict__) - - def __getattr__(self, key, *args, **kwargs): - return None - - def __getitem__(self, key): - return self.__dict__.get(key, None) - - def __iter__(self): - return self.__dict__.__iter__() +from django.core.cache import cache +from django.utils import importlib +import hashlib +import time -class SessionRosettaStorage(BaseRosettaStorage): +class BaseRosettaStorage(object): def __init__(self, request): self.request = request - for key, value in self.request.session.iteritems(): - if key.startswith('rosetta_'): - setattr(self, key, value) + def get(self, key, default=None): + raise NotImplementedError - def _persist(self, what): - for key, value in what: - if key.startswith('rosetta_'): - self.request.session[key] = value + def set(self, key, val): + raise NotImplementedError + + def has(self, key): + raise NotImplementedError + + def delete(self, key): + raise NotImplementedError + + +class DummyRosettaStorage(BaseRosettaStorage): + def get(self, key, default=None): + return default + + def set(self, key, val): + pass + + def has(self, key): + return False + + def delete(self, key): + pass + + +class SessionRosettaStorage(BaseRosettaStorage): + def get(self, key, default=None): + if key in self.request.session: + return self.request.session[key] + return default + + def set(self, key, val): + self.request.session[key] = val + + def has(self, key): + return key in self.request.session + + def delete(self, key): + del(self.request.session[key]) + + +class CacheRosettaStorage(BaseRosettaStorage): + # unlike the session storage backend, cache is shared among all users + # so we need to per-user key prefix, which we store in the session + def __init__(self, request): + super(CacheRosettaStorage, self).__init__(request) + if 'rosetta_cache_storage_key_prefix' in self.request.session: + self._key_prefix = self.request.session['rosetta_cache_storage_key_prefix'] + else: + self._key_prefix = hashlib.new('sha1', str(time.time())).hexdigest() + self.request.session['rosetta_cache_storage_key_prefix'] = self._key_prefix + + def get(self, key, default=None): + #print ('get', self._key_prefix + key) + return cache.get(self._key_prefix + key, default) + + def set(self, key, val): + #print ('set', self._key_prefix + key) + cache.set(self._key_prefix + key, val) + + def has(self, key): + #print ('has', self._key_prefix + key) + return (self._key_prefix + key) in cache + + def delete(self, key): + #print ('del', self._key_prefix + key) + cache.delete(self._key_prefix + key) + + +def get_storage(request): + from rosetta.conf import settings + storage_module, storage_class = settings.STORAGE_CLASS.rsplit('.', 1) + storage_module = importlib.import_module(storage_module) + return getattr(storage_module, storage_class)(request) diff --git a/rosetta/templates/rosetta/base.html b/rosetta/templates/rosetta/base.html index e3abf2a..19fe7a0 100644 --- a/rosetta/templates/rosetta/base.html +++ b/rosetta/templates/rosetta/base.html @@ -33,7 +33,7 @@ {% block main %}{% endblock %} diff --git a/rosetta/templates/rosetta/languages.html b/rosetta/templates/rosetta/languages.html index d8c0cf9..ca66469 100644 --- a/rosetta/templates/rosetta/languages.html +++ b/rosetta/templates/rosetta/languages.html @@ -3,7 +3,10 @@ {% block pagetitle %}{{block.super}} - {% trans "Language selection" %}{% endblock %} -{% block breadcumbs %}{% trans "Home" %} › {% trans "Language selection" %}{% endblock %} +{% block breadcumbs %} +
{% trans "Home" %} › {% trans "Language selection" %}
+ {% if do_session_warn %}

{% trans "Couldn't load the specified language file. This usually happens when using the Encrypted Cookies Session Storage backend on Django 1.4 or higher.
Setting ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' in your settings file should fix this." %}

{% endif %} +{% endblock %} {% block main %}

 

diff --git a/rosetta/tests/__init__.py b/rosetta/tests/__init__.py index 5f2d2ae..a655090 100644 --- a/rosetta/tests/__init__.py +++ b/rosetta/tests/__init__.py @@ -33,123 +33,114 @@ class RosettaTestCase(TestCase): self.django_version_major, self.django_version_minor = django.VERSION[0], django.VERSION[1] def setUp(self): - user = User.objects.create_user('test_admin', 'test@test.com', 'test_password') - user2 = User.objects.create_user('test_admin2', 'test@test2.com', 'test_password') - user3 = User.objects.create_user('test_admin3', 'test@test2.com', 'test_password') - - user.is_superuser, user2.is_superuser, user3.is_superuser = True,True, True - user.is_staff, user2.is_staff, user3.is_staff = True,True, False - + user = User.objects.create_user('test_admin', 'test@test.com', 'test_password') + user2 = User.objects.create_user('test_admin2', 'test@test2.com', 'test_password') + user3 = User.objects.create_user('test_admin3', 'test@test2.com', 'test_password') + + user.is_superuser, user2.is_superuser, user3.is_superuser = True, True, True + user.is_staff, user2.is_staff, user3.is_staff = True, True, False + user.save() user2.save() user3.save() - + self.client2 = Client() - - self.client.login(username='test_admin',password='test_password') - self.client2.login(username='test_admin2',password='test_password') - - settings.LANGUAGES = (('xx','dummy language'),) - - + + self.client.login(username='test_admin', password='test_password') + self.client2.login(username='test_admin2', password='test_password') + + settings.LANGUAGES = (('xx', 'dummy language'),) + + shutil.copy(self.dest_file, self.dest_file + '.orig') + + def tearDown(self): + shutil.move(self.dest_file + '.orig', self.dest_file) def test_1_ListLoading(self): - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content) - - + def test_2_PickFile(self): - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() ) +'?rosetta') + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()) + '?rosetta') r = self.client.get(reverse('rosetta-home')) - + self.assertTrue('dummy language' in r.content) - + def test_3_DownloadZIP(self): - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') - - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() ) +'?rosetta') + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta') r = self.client.get(reverse('rosetta-home')) - r = self.client.get(reverse('rosetta-download-file' ) +'?rosetta') - self.assertTrue ('content-type' in r._headers.keys() ) - self.assertTrue ('application/x-zip' in r._headers.get('content-type')) - + r = self.client.get(reverse('rosetta-download-file') + '?rosetta') + self.assertTrue('content-type' in r._headers.keys()) + self.assertTrue('application/x-zip' in r._headers.get('content-type')) + def test_4_DoChanges(self): - - # copy the template file - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.template')), self.dest_file) + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file) # Load the template file - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') r = self.client.get(reverse('rosetta-home')) - # make sure both strings are untranslated self.assertTrue('dummy language' in r.content) self.assertTrue('String 1' in r.content) self.assertTrue('String 2' in r.content) self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content) - + # post a translation r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next')) - + # reload all untranslated strings - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() ) +'?rosetta') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta') r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') r = self.client.get(reverse('rosetta-home')) - + # the translated string no longer is up for translation self.assertTrue('String 1' in r.content) self.assertTrue('String 2' not in r.content) - + # display only translated strings r = self.client.get(reverse('rosetta-home') + '?filter=translated') r = self.client.get(reverse('rosetta-home')) - + # The tranlsation was persisted self.assertTrue('String 1' not in r.content) self.assertTrue('String 2' in r.content) self.assertTrue('Hello, world' in r.content) - - # reset the original file - shutil.move(self.dest_file+'.orig', self.dest_file) - def test_5_TestIssue67(self): # testcase for issue 67: http://code.google.com/p/django-rosetta/issues/detail?id=67 - # copy the template file - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.issue67.template')), self.dest_file) - + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue67.template')), self.dest_file) # Make sure the plurals string is valid - f_ = open(self.dest_file,'rb') + f_ = open(self.dest_file, 'rb') content = f_.read() f_.close() self.assertTrue(u'Hello, world' not in content) self.assertTrue(u'|| n%100>=20) ? 1 : 2)' in content) del(content) - + # Load the template file - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') - - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() ) +'?rosetta') + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()) + '?rosetta') r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') r = self.client.get(reverse('rosetta-home')) - + # make sure all strings are untranslated self.assertTrue('dummy language' in r.content) self.assertTrue('String 1' in r.content) self.assertTrue('String 2' in r.content) self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content) - + # post a translation r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next')) - + # Make sure the plurals string is still valid - f_ = open(self.dest_file,'rb') + f_ = open(self.dest_file, 'rb') content = f_.read() f_.close() self.assertTrue(u'Hello, world' in content) @@ -157,24 +148,21 @@ class RosettaTestCase(TestCase): self.assertTrue(u'or n%100>=20) ? 1 : 2)' not in content) del(content) - shutil.move(self.dest_file + '.orig', self.dest_file) - - def test_6_ExcludedApps(self): - + rosetta_settings.EXCLUDED_APPLICATIONS = ('rosetta',) - - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') + + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in r.content) - + rosetta_settings.EXCLUDED_APPLICATIONS = () - - r = self.client.get(reverse('rosetta-pick-file') +'?rosetta') + + r = self.client.get(reverse('rosetta-pick-file') + '?rosetta') self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in r.content) - - def test_7_selfInApplist(self): - self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') + + def test_7_selfInApplist(self): + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in r.content) @@ -182,107 +170,88 @@ class RosettaTestCase(TestCase): r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in r.content) - def test_8_hideObsoletes(self): - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) - + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) + # not in listing - for p in range(1,5): - r = self.client.get(reverse('rosetta-home') + '?page=%d'%p) + for p in range(1, 5): + r = self.client.get(reverse('rosetta-home') + '?page=%d' % p) self.assertTrue('dummy language' in r.content) self.assertTrue('Les deux' not in r.content) - + r = self.client.get(reverse('rosetta-home') + '?query=Les%20Deux') self.assertTrue('dummy language' in r.content) self.assertTrue('Les deux' not in r.content) - def test_9_concurrency(self): - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.template')), self.dest_file) - - r = self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') - r = self.client2.get(reverse('rosetta-pick-file') +'?filter=third-party') - - self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() ) ) - self.client2.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file) + + r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party') + + self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) + self.client2.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) # Load the template file - r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') - r = self.client.get(reverse('rosetta-home')) - r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated') - r2 = self.client2.get(reverse('rosetta-home')) - + r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') + r = self.client.get(reverse('rosetta-home')) + r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated') + r2 = self.client2.get(reverse('rosetta-home')) + self.assertTrue('String 1' in r.content) self.assertTrue('String 1' in r2.content) self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in r.content) - - r = self.client.post(reverse('rosetta-home'), dict(m_08e4e11e2243d764fc45a5a4fba5d0f2='Hello, world', _next='_next')) - r2 = self.client2.get(reverse('rosetta-home')) - - # Client 2 reloads the home, forces a reload of the catalog, + r2 = self.client2.get(reverse('rosetta-home')) + + # Client 2 reloads the home, forces a reload of the catalog, # the untranslated string1 is now translated self.assertTrue('String 1' not in r2.content) self.assertTrue('String 2' in r2.content) - - r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') - r = self.client.get(reverse('rosetta-home')) - r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated') - r2 = self.client2.get(reverse('rosetta-home')) - + r = self.client.get(reverse('rosetta-home') + '?filter=untranslated') + r = self.client.get(reverse('rosetta-home')) + r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated') + r2 = self.client2.get(reverse('rosetta-home')) self.assertTrue('String 2' in r2.content and 'm_e48f149a8b2e8baa81b816c0edf93890' in r2.content) self.assertTrue('String 2' in r.content and 'm_e48f149a8b2e8baa81b816c0edf93890' in r.content) - + # client 2 posts! r2 = self.client2.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client two!', _next='_next')) self.assertTrue('save-conflict' not in r2.content) - - + # uh-oh here comes client 1 r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client one!', _next='_next')) # An error message is displayed self.assertTrue('save-conflict' in r.content) - + # Both clients show all strings, error messages are gone - r = self.client.get(reverse('rosetta-home') +'?filter=translated') + r = self.client.get(reverse('rosetta-home') + '?filter=translated') self.assertTrue('save-conflict' not in r.content) - r2 = self.client2.get(reverse('rosetta-home') +'?filter=translated') + r2 = self.client2.get(reverse('rosetta-home') + '?filter=translated') self.assertTrue('save-conflict' not in r2.content) - r = self.client.get(reverse('rosetta-home')) + r = self.client.get(reverse('rosetta-home')) self.assertTrue('save-conflict' not in r.content) - r2 = self.client2.get(reverse('rosetta-home')) + r2 = self.client2.get(reverse('rosetta-home')) self.assertTrue('save-conflict' not in r2.content) - + # Both have client's two version self.assertTrue('Hello, world, from client two!' in r.content) self.assertTrue('Hello, world, from client two!' in r2.content) self.assertTrue('save-conflict' not in r2.content) self.assertTrue('save-conflict' not in r.content) - - - - # reset the original file - shutil.move(self.dest_file+'.orig', self.dest_file) - def test_10_issue_79_num_entries(self): - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.issue79.template')), self.dest_file) - - self.client.get(reverse('rosetta-pick-file') +'?filter=third-party') + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue79.template')), self.dest_file) + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) - + self.assertTrue('1' in r.content) self.assertTrue('%s%%' % str(floatformat(0.0, 2)) in r.content) self.assertTrue('1' in r.content) - - # reset the original file - shutil.move(self.dest_file+'.orig', self.dest_file) def test_11_issue_80_tab_indexes(self): self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') @@ -290,130 +259,105 @@ class RosettaTestCase(TestCase): r = self.client.get(reverse('rosetta-home')) self.assertTrue('tabindex="3"' in r.content) - def test_12_issue_82_staff_user(self): settings.ROSETTA_REQUIRES_AUTH = True self.client3 = Client() - self.client3.login(username='test_admin3',password='test_password') + self.client3.login(username='test_admin3', password='test_password') - self.client3.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client3.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) r = self.client3.get(reverse('rosetta-home')) self.assertTrue(not r.content) settings.ROSETTA_REQUIRES_AUTH = False - self.client3.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client3.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + self.client3.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client3.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict())) r = self.client3.get(reverse('rosetta-home')) self.assertFalse(not r.content) - def test_13_catalog_filters(self): - settings.LANGUAGES = (('fr','French'),('xx','Dummy Language'),) - - - - self.client.get(reverse('rosetta-pick-file')+'?filter=third-party') + settings.LANGUAGES = (('fr', 'French'), ('xx', 'Dummy Language'),) + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content) self.assertTrue(('contrib') not in r.content) - - self.client.get(reverse('rosetta-pick-file')+'?filter=django') + + self.client.get(reverse('rosetta-pick-file') + '?filter=django') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in r.content) - - if self.django_version_major >=1 and self.django_version_minor >=3: + + if self.django_version_major >= 1 and self.django_version_minor >= 3: self.assertTrue(('contrib') in r.content) - - self.client.get(reverse('rosetta-pick-file')+'?filter=all') + + self.client.get(reverse('rosetta-pick-file') + '?filter=all') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content) - - if self.django_version_major >=1 and self.django_version_minor >=3: + + if self.django_version_major >= 1 and self.django_version_minor >= 3: self.assertTrue(('contrib') in r.content) - - self.client.get(reverse('rosetta-pick-file')+'?filter=project') + + self.client.get(reverse('rosetta-pick-file') + '?filter=project') r = self.client.get(reverse('rosetta-pick-file')) self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in r.content) - - if self.django_version_major >=1 and self.django_version_minor >=3: + if self.django_version_major >= 1 and self.django_version_minor >= 3: self.assertTrue(('contrib') not in r.content) - def test_14_issue_99_context_and_comments(self): - self.client.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) r = self.client.get(reverse('rosetta-home')) self.assertTrue('This is a text of the base template' in r.content) self.assertTrue('Context hint' in r.content) - def test_14_issue_87_entry_changed_signal(self): # copy the template file - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.template')), self.dest_file) - - - self.client.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file) + + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict())) r = self.client.get(reverse('rosetta-home')) - + @receiver(entry_changed) def test_receiver(sender, **kwargs): self.test_old_msgstr = kwargs.get('old_msgstr') self.test_new_msgstr = sender.msgstr self.test_msg_id = sender.msgid - - self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content) # post a translation r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next')) - + self.assertTrue(self.test_old_msgstr == '') self.assertTrue(self.test_new_msgstr == 'Hello, world') self.assertTrue(self.test_msg_id == 'String 2') - + del(self.test_old_msgstr, self.test_new_msgstr, self.test_msg_id) - - # reset the original file - shutil.move(self.dest_file+'.orig', self.dest_file) def test_15_issue_101_post_save_signal(self): - # copy the template file - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.template')), self.dest_file) - - - self.client.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file) + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) r = self.client.get(reverse('rosetta-home')) - + @receiver(post_save) def test_receiver(sender, **kwargs): self.test_sig_lang = kwargs.get('language_code') - + self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content) # post a translation r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next')) - + self.assertTrue(self.test_sig_lang == 'xx') del(self.test_sig_lang) - # reset the original file - shutil.move(self.dest_file+'.orig', self.dest_file) - def test_16_issue_103_post_save_signal_has_request(self): - # copy the template file - shutil.copy(self.dest_file, self.dest_file + '.orig') - shutil.copy(os.path.normpath(os.path.join(self.curdir,'./django.po.template')), self.dest_file) + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file) - - self.client.get(reverse('rosetta-pick-file')+'?filter=third-party') - r = self.client.get(reverse('rosetta-language-selection', args=('xx',0,), kwargs=dict() )) + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict())) r = self.client.get(reverse('rosetta-home')) @receiver(post_save) @@ -428,10 +372,8 @@ class RosettaTestCase(TestCase): self.assertTrue(self.test_16_has_request) del(self.test_16_has_request) # reset the original file - shutil.move(self.dest_file + '.orig', self.dest_file) def test_17_Test_Issue_gh24(self): - shutil.copy(self.dest_file, self.dest_file + '.orig') shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue24gh.template')), self.dest_file) self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') @@ -456,10 +398,7 @@ class RosettaTestCase(TestCase): pofile_content = open(self.dest_file, 'r').read() self.assertTrue('felis eu pede mollis pretium."' in pofile_content) - shutil.move(self.dest_file + '.orig', self.dest_file) - def test_18_Test_Issue_gh34(self): - shutil.copy(self.dest_file, self.dest_file + '.orig') shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue34gh.template')), self.dest_file) self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') @@ -479,19 +418,21 @@ class RosettaTestCase(TestCase): self.assertTrue('msgstr[0] ""\n"\\n"\n"Foo %s\\n"' in pofile_content) self.assertTrue('msgstr[1] ""\n"\\n"\n"Bar %s\\n"' in pofile_content) - shutil.move(self.dest_file + '.orig', self.dest_file) - def test_19_Test_Issue_gh38(self): - if self.django_version_major >= 1 and self.django_version_minor >= 4: + if self.django_version_minor >= 4 and self.django_version_major >= 1: self.assertTrue('django.contrib.sessions.middleware.SessionMiddleware' in settings.MIDDLEWARE_CLASSES) + settings.SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" - shutil.copy(self.dest_file, self.dest_file + '.orig') + + # One: cache backend + rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file) self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict())) r = self.client.get(reverse('rosetta-home')) - self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096) + self.assertFalse(len(str(self.client.cookies.get('sessionid'))) > 4096) self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in r.content) r = self.client.post(reverse('rosetta-home'), dict( m_9efd113f7919952523f06e0d88da9c54='Testing cookie length', @@ -503,4 +444,31 @@ class RosettaTestCase(TestCase): self.client.get(reverse('rosetta-home') + '?filter=translated') r = self.client.get(reverse('rosetta-home')) self.assertTrue('Testing cookie length' in r.content) - shutil.move(self.dest_file + '.orig', self.dest_file) + self.assertTrue('m_9f6c442c6d579707440ba9dada0fb373' in r.content) + + # Two, the cookie backend + rosetta_settings.STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage' + + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file) + + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict())) + r = self.client.get(reverse('rosetta-home')) + self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096) + # boom: be a good browser, truncate the cookie + self.client.cookies['sessionid'] = unicode(self.client.cookies.get('sessionid'))[:4096] + r = self.client.get(reverse('rosetta-home')) + + self.assertFalse('m_9efd113f7919952523f06e0d88da9c54' in r.content) + + def test_20_concurrency_of_cache_backend(self): + rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' + shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue38gh.template')), self.dest_file) + + self.client.get(reverse('rosetta-pick-file') + '?filter=third-party') + self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict())) + + self.client2.get(reverse('rosetta-pick-file') + '?filter=third-party') + self.client2.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict())) + + self.assertTrue(self.client.session.get('rosetta_cache_storage_key_prefix') != self.client2.session.get('rosetta_cache_storage_key_prefix')) diff --git a/rosetta/views.py b/rosetta/views.py index a89164f..7c82e33 100644 --- a/rosetta/views.py +++ b/rosetta/views.py @@ -12,7 +12,7 @@ from rosetta.conf import settings as rosetta_settings from rosetta.polib import pofile from rosetta.poutil import find_pos, pagination_range from rosetta.signals import entry_changed, post_save -from rosetta.storage import SessionRosettaStorage +from rosetta.storage import get_storage import re import rosetta import datetime @@ -46,30 +46,29 @@ def home(request): out_ = out_.rstrip() return out_ - + storage = get_storage(request) version = rosetta.get_version(True) - storage = SessionRosettaStorage(request) - if 'rosetta_i18n_fn' in request.session: - rosetta_i18n_fn = request.session.get('rosetta_i18n_fn') + if storage.has('rosetta_i18n_fn'): + rosetta_i18n_fn = storage.get('rosetta_i18n_fn') rosetta_i18n_app = get_app_name(rosetta_i18n_fn) - rosetta_i18n_lang_code = request.session['rosetta_i18n_lang_code'] + rosetta_i18n_lang_code = storage.get('rosetta_i18n_lang_code') rosetta_i18n_lang_bidi = rosetta_i18n_lang_code.split('-')[0] in settings.LANGUAGES_BIDI - rosetta_i18n_write = request.session.get('rosetta_i18n_write', True) + rosetta_i18n_write = storage.get('rosetta_i18n_write', True) if rosetta_i18n_write: rosetta_i18n_pofile = pofile(rosetta_i18n_fn, wrapwidth=rosetta_settings.POFILE_WRAP_WIDTH) for entry in rosetta_i18n_pofile: entry.md5hash = hashlib.md5(entry.msgid.encode("utf8") + entry.msgstr.encode("utf8")).hexdigest() else: - rosetta_i18n_pofile = request.session.get('rosetta_i18n_pofile') + rosetta_i18n_pofile = storage.get('rosetta_i18n_pofile') if 'filter' in request.GET: if request.GET.get('filter') in ('untranslated', 'translated', 'fuzzy', 'all'): filter_ = request.GET.get('filter') - request.session['rosetta_i18n_filter'] = filter_ + storage.set('rosetta_i18n_filter', filter_) return HttpResponseRedirect(reverse('rosetta-home')) - rosetta_i18n_filter = request.session.get('rosetta_i18n_filter', 'all') + rosetta_i18n_filter = storage.get('rosetta_i18n_filter', 'all') if '_next' in request.POST: rx = re.compile(r'^m_([0-9a-f]+)') @@ -122,7 +121,7 @@ def home(request): ) else: - request.session['rosetta_last_save_error'] = True + storage.set('rosetta_last_save_error', True) if file_change and rosetta_i18n_write: try: @@ -165,9 +164,8 @@ def home(request): pass except: - request.session['rosetta_i18n_write'] = False - - request.session['rosetta_i18n_pofile'] = rosetta_i18n_pofile + storage.set('rosetta_i18n_write', False) + storage.set('rosetta_i18n_pofile', rosetta_i18n_pofile) # Retain query arguments query_arg = '' @@ -180,8 +178,8 @@ def home(request): query_arg = '?' query_arg = query_arg + 'page=%d' % int(request.GET.get('page')) return HttpResponseRedirect(reverse('rosetta-home') + iri_to_uri(query_arg)) - rosetta_i18n_lang_name = _(request.session.get('rosetta_i18n_lang_name')) - rosetta_i18n_lang_code = request.session.get('rosetta_i18n_lang_code') + rosetta_i18n_lang_name = _(storage.get('rosetta_i18n_lang_name')) + rosetta_i18n_lang_code = storage.get('rosetta_i18n_lang_code') if 'query' in request.REQUEST and request.REQUEST.get('query', '').strip(): query = request.REQUEST.get('query').strip() @@ -233,13 +231,13 @@ def home(request): BING_APP_ID = rosetta_settings.BING_APP_ID MESSAGES_SOURCE_LANGUAGE_NAME = rosetta_settings.MESSAGES_SOURCE_LANGUAGE_NAME MESSAGES_SOURCE_LANGUAGE_CODE = rosetta_settings.MESSAGES_SOURCE_LANGUAGE_CODE - if 'rosetta_last_save_error' in request.session: - del(request.session['rosetta_last_save_error']) + if storage.has('rosetta_last_save_error'): + storage.delete('rosetta_last_save_error') rosetta_last_save_error = True return render_to_response('rosetta/pofile.html', locals(), context_instance=RequestContext(request)) else: - return list_languages(request) + return list_languages(request, do_session_warn=True) home = never_cache(home) home = user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)(home) @@ -247,12 +245,13 @@ home = user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)(ho def download_file(request): import zipfile from StringIO import StringIO + storage = get_storage(request) # original filename - rosetta_i18n_fn = request.session.get('rosetta_i18n_fn', None) + rosetta_i18n_fn = storage.get('rosetta_i18n_fn', None) # in-session modified catalog - rosetta_i18n_pofile = request.session.get('rosetta_i18n_pofile', None) + rosetta_i18n_pofile = storage.get('rosetta_i18n_pofile', None) # language code - rosetta_i18n_lang_code = request.session.get('rosetta_i18n_lang_code', None) + rosetta_i18n_lang_code = storage.get('rosetta_i18n_lang_code', None) if not rosetta_i18n_lang_code or not rosetta_i18n_pofile or not rosetta_i18n_fn: return HttpResponseRedirect(reverse('rosetta-home')) @@ -281,20 +280,21 @@ download_file = never_cache(download_file) download_file = user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)(download_file) -def list_languages(request): +def list_languages(request, do_session_warn=False): """ Lists the languages for the current project, the gettext catalog files that can be translated and their translation progress """ + storage = get_storage(request) languages = [] if 'filter' in request.GET: if request.GET.get('filter') in ('project', 'third-party', 'django', 'all'): filter_ = request.GET.get('filter') - request.session['rosetta_i18n_catalog_filter'] = filter_ + storage.set('rosetta_i18n_catalog_filter', filter_) return HttpResponseRedirect(reverse('rosetta-pick-file')) - rosetta_i18n_catalog_filter = request.session.get('rosetta_i18n_catalog_filter', 'project') + rosetta_i18n_catalog_filter = storage.get('rosetta_i18n_catalog_filter', 'project') third_party_apps = rosetta_i18n_catalog_filter in ('all', 'third-party') django_apps = rosetta_i18n_catalog_filter in ('all', 'django') @@ -316,6 +316,7 @@ def list_languages(request): ADMIN_MEDIA_PREFIX = settings.STATIC_URL + 'admin/' version = rosetta.get_version(True) + do_session_warn = do_session_warn and 'SessionRosettaStorage' in rosetta_settings.STORAGE_CLASS and 'signed_cookies' in settings.SESSION_ENGINE return render_to_response('rosetta/languages.html', locals(), context_instance=RequestContext(request)) list_languages = never_cache(list_languages) list_languages = user_passes_test(lambda user: can_translate(user), settings.LOGIN_URL)(list_languages) @@ -330,30 +331,31 @@ def lang_sel(request, langid, idx): """ Selects a file to be translated """ + storage = get_storage(request) if langid not in [l[0] for l in settings.LANGUAGES]: raise Http404 else: - rosetta_i18n_catalog_filter = request.session.get('rosetta_i18n_catalog_filter', 'project') + rosetta_i18n_catalog_filter = storage.get('rosetta_i18n_catalog_filter', 'project') third_party_apps = rosetta_i18n_catalog_filter in ('all', 'third-party') django_apps = rosetta_i18n_catalog_filter in ('all', 'django') project_apps = rosetta_i18n_catalog_filter in ('all', 'project') file_ = find_pos(langid, project_apps=project_apps, django_apps=django_apps, third_party_apps=third_party_apps)[int(idx)] - request.session['rosetta_i18n_lang_code'] = langid - request.session['rosetta_i18n_lang_name'] = unicode([l[1] for l in settings.LANGUAGES if l[0] == langid][0]) - request.session['rosetta_i18n_fn'] = file_ + storage.set('rosetta_i18n_lang_code', langid) + storage.set('rosetta_i18n_lang_name', unicode([l[1] for l in settings.LANGUAGES if l[0] == langid][0])) + storage.set('rosetta_i18n_fn', file_) po = pofile(file_) for entry in po: entry.md5hash = hashlib.md5(entry.msgid.encode("utf8") + entry.msgstr.encode("utf8")).hexdigest() - request.session['rosetta_i18n_pofile'] = po + storage.set('rosetta_i18n_pofile', po) try: os.utime(file_, None) - request.session['rosetta_i18n_write'] = True + storage.set('rosetta_i18n_write', True) except OSError: - request.session['rosetta_i18n_write'] = False + storage.set('rosetta_i18n_write', False) return HttpResponseRedirect(reverse('rosetta-home')) lang_sel = never_cache(lang_sel) diff --git a/testproject/settings.py b/testproject/settings.py index 27be8c0..41a54fa 100644 --- a/testproject/settings.py +++ b/testproject/settings.py @@ -31,7 +31,6 @@ INSTALLED_APPS = [ 'rosetta', ] - LANGUAGE_CODE = "en" LANGUAGES = ( @@ -50,4 +49,12 @@ ROOT_URLCONF = 'testproject.urls' DEBUG = True TEMPLATE_DEBUG = True -SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" +#SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies" +#ROSETTA_STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage' +ROSETTA_STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage' +CACHES = { + 'default': { + 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', + 'LOCATION': '127.0.0.1:11212', + } +}