Merge lp:~danilo/launchpad/recife-translation-credits into lp:~launchpad/launchpad/recife

Proposed by Данило Шеган
Status: Merged
Approved by: Gavin Panella
Approved revision: no longer in the source branch.
Merged at revision: 9201
Proposed branch: lp:~danilo/launchpad/recife-translation-credits
Merge into: lp:~launchpad/launchpad/recife
Diff against target: 472 lines (+183/-116)
8 files modified
lib/lp/translations/doc/pofile.txt (+0/-70)
lib/lp/translations/doc/poimport.txt (+1/-2)
lib/lp/translations/interfaces/translationmessage.py (+7/-0)
lib/lp/translations/model/pofile.py (+10/-5)
lib/lp/translations/model/potmsgset.py (+14/-9)
lib/lp/translations/tests/test_pofile.py (+95/-1)
lib/lp/translations/tests/test_potmsgset.py (+55/-28)
lib/lp/translations/utilities/translation_import.py (+1/-1)
To merge this branch: bzr merge lp:~danilo/launchpad/recife-translation-credits
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+41172@code.launchpad.net

Description of the change

= Translation credits handling =

== Background ==

Update translation credits handling to use new methods (we are deprecating updateTranslation call), and adjust it to cope with the model changes.

The features that we have for translation credits handling is automatic generation on display/export to include translators working through Launchpad, and automatic creation of a stub generated message so we don't have to special case it in an otherwise slow statistics counting code (i.e. we make a translated message so you don't end up with a complete translation except the credits message, which you can't translate anyway).

== Implementation ==

The new call that should be used instead of IPOTMsgSet.updateTranslation is IPOTMsgSet.setCurrentTranslation. Replacement for the read-method getCurrent/ImportedTranslationMessage is getCurrentTranslation (the concept of two "sides" is moved to the side parameter).

Model changes we are doing in the integration branch (the one this is proposed to be merged into) basically change the semantics of "current" and "imported" to mean "current [translation] in Ubuntu" and "current upstream".

Along the way, I've moved unit-tests for prepareTranslationCredits masquerading as doctests from doc/pofile.txt to tests/test_pofile.py (and removed sampledata dependence).

I didn't even consider fixing entire doc/pofile.txt so some lint issues remain (i.e. comparisons between very long strings: they are not a single line over 78 characters, but are multi-line strings instead).

= Tests =

bin/test -cvvt setTranslationCreditsToTranslated -t prepareTranslationCredits

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/translations/doc/pofile.txt
  lib/lp/translations/doc/poimport.txt
  lib/lp/translations/interfaces/translationmessage.py
  lib/lp/translations/model/pofile.py
  lib/lp/translations/model/potmsgset.py
  lib/lp/translations/tests/test_pofile.py
  lib/lp/translations/tests/test_potmsgset.py
  lib/lp/translations/utilities/translation_import.py

./lib/lp/translations/doc/pofile.txt
     267: source exceeds 78 characters.
     458: want exceeds 78 characters.
     479: want exceeds 78 characters.
     985: want exceeds 78 characters.
     987: want exceeds 78 characters.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/translations/doc/pofile.txt'
2--- lib/lp/translations/doc/pofile.txt 2010-11-15 16:25:05 +0000
3+++ lib/lp/translations/doc/pofile.txt 2010-11-18 14:17:59 +0000
4@@ -1048,76 +1048,6 @@
5 >>> print current.translations
6 [u'Happy translator']
7
8-In automatically generated credits, alsa_translation.owner is now
9-credited as well.
10-
11- >>> potmsgset = alsa_template.getPOTMsgSetByMsgIDText(
12- ... u'translation-credits')
13- >>> print alsa_translation.prepareTranslationCredits(
14- ... potmsgset)
15- Happy translator
16- Launchpad Contributions:
17- Carlos ...
18-
19-Emails of translators just has the dummy translation.
20-
21- >>> emails_of_translators = alsa_template.getPOTMsgSetByMsgIDText(
22- ... u"_: EMAIL OF TRANSLATORS\nYour emails")
23- >>> current = emails_of_translators.getCurrentTranslationMessage(
24- ... alsa_template, alsa_translation.language)
25- >>> print current.translations
26- [u'This is a dummy translation so that
27- the credits are counted as translated.']
28-
29-But now credits Carlos when prepared automatically. Two empty emails
30-are added to make formatting nicer (first one is used as a separation
31-between package and Launchpad contributors, and second is empty email
32-for 'Launchpad Contributions' title; see bug #133817 for details).
33-
34- >>> print alsa_translation.prepareTranslationCredits(
35- ... emails_of_translators)
36- ,,carlos@canonical.com
37-
38-Names of translators just has the dummy translation.
39-
40- >>> names_of_translators = alsa_template.getPOTMsgSetByMsgIDText(
41- ... u"_: NAME OF TRANSLATORS\nYour names")
42- >>> current = names_of_translators.getCurrentTranslationMessage(
43- ... alsa_template, alsa_translation.language)
44- >>> print current.translations
45- [u'This is a dummy translation so that
46- the credits are counted as translated.']
47-
48-But now names credit Carlos when prepared automatically. As above, an
49-empty name is added first to serve as a separator, and "Launchpad
50-Contributions:" is used as a header for the added credits.
51-
52- >>> print alsa_translation.prepareTranslationCredits(
53- ... names_of_translators)
54- ,Launchpad Contributions:,Carlos P... M...
55-
56-Lets add a newly supported KDE context message with credit strings split
57-into two: context and message, instead of a single message with embedded
58-context.
59-
60- >>> new_kde_name_credits = alsa_template.createMessageSetFromText(
61- ... singular_text=u"Your names", plural_text=None,
62- ... context=u"NAME OF TRANSLATORS")
63-
64-prepareTranslationCredits works on such messages as well:
65-
66- >>> print alsa_translation.prepareTranslationCredits(new_kde_name_credits)
67- ,Launchpad Contributions:,Carlos P... M...
68-
69-Similar happens for email credits as with name credits.
70-
71- >>> new_kde_email_credits = alsa_template.createMessageSetFromText(
72- ... singular_text=u"Your emails", plural_text=None,
73- ... context=u"EMAIL OF TRANSLATORS")
74- >>> print alsa_translation.prepareTranslationCredits(
75- ... new_kde_email_credits)
76- ,,carlos@canonical.com
77-
78
79 POFileToTranslationFileDataAdapter
80 ----------------------------------
81
82=== modified file 'lib/lp/translations/doc/poimport.txt'
83--- lib/lp/translations/doc/poimport.txt 2010-11-09 09:46:20 +0000
84+++ lib/lp/translations/doc/poimport.txt 2010-11-18 14:17:59 +0000
85@@ -9,7 +9,6 @@
86
87 Here are some imports we need to get this test running.
88
89- >>> from canonical.launchpad.ftests import syncUpdate
90 >>> from canonical.launchpad.interfaces.launchpad import (
91 ... ILaunchpadCelebrities)
92 >>> from lp.registry.interfaces.person import IPersonSet
93@@ -224,7 +223,7 @@
94
95 And the statistics reflect it.
96
97- >>> pofile.rosettaCount()
98+ >>> pofile.currentCount()
99 1
100
101
102
103=== modified file 'lib/lp/translations/interfaces/translationmessage.py'
104--- lib/lp/translations/interfaces/translationmessage.py 2010-10-18 16:36:46 +0000
105+++ lib/lp/translations/interfaces/translationmessage.py 2010-11-18 14:17:59 +0000
106@@ -68,6 +68,13 @@
107 the community web site.
108 """)
109
110+ LAUNCHPAD_GENERATED = DBItem(3, """
111+ Generated by Launchpad itself.
112+
113+ This is used for messages like generated translation
114+ credits messages.
115+ """)
116+
117
118 class TranslationValidationStatus(DBEnumeratedType):
119 """Translation Validation Status
120
121=== modified file 'lib/lp/translations/model/pofile.py'
122--- lib/lp/translations/model/pofile.py 2010-11-15 16:25:05 +0000
123+++ lib/lp/translations/model/pofile.py 2010-11-18 14:17:59 +0000
124@@ -77,6 +77,7 @@
125 BrokenTextError,
126 TranslationCreditsType,
127 )
128+from lp.translations.interfaces.side import TranslationSide
129 from lp.translations.interfaces.translationcommonformat import (
130 ITranslationFileData,
131 )
132@@ -92,11 +93,12 @@
133 TranslationFormatSyntaxError,
134 )
135 from lp.translations.interfaces.translationmessage import (
136+ RosettaTranslationOrigin,
137 TranslationValidationStatus,
138 )
139 from lp.translations.interfaces.translations import TranslationConstants
140 from lp.translations.model.pomsgid import POMsgID
141-from lp.translations.model.potmsgset import POTMsgSet
142+from lp.translations.model.potmsgset import POTMsgSet, credits_message_str
143 from lp.translations.model.translatablemessage import TranslatableMessage
144 from lp.translations.model.translationimportqueue import collect_import_info
145 from lp.translations.model.translationmessage import (
146@@ -460,12 +462,15 @@
147 assert credits_type != TranslationCreditsType.NOT_CREDITS, (
148 "Calling prepareTranslationCredits on a message with "
149 "msgid '%s'." % potmsgset.singular_text)
150- imported = potmsgset.getImportedTranslationMessage(
151- self.potemplate, self.language)
152- if imported is None:
153+ upstream = potmsgset.getCurrentTranslation(
154+ None, self.language, TranslationSide.UPSTREAM)
155+ if (upstream is None or
156+ upstream.origin == RosettaTranslationOrigin.LAUNCHPAD_GENERATED or
157+ upstream.translations[0] == credits_message_str):
158 text = None
159 else:
160- text = imported.translations[0]
161+ text = upstream.translations[0]
162+
163 if credits_type == TranslationCreditsType.KDE_EMAILS:
164 emails = []
165 if text is not None:
166
167=== modified file 'lib/lp/translations/model/potmsgset.py'
168--- lib/lp/translations/model/potmsgset.py 2010-11-18 05:28:57 +0000
169+++ lib/lp/translations/model/potmsgset.py 2010-11-18 14:17:59 +0000
170@@ -5,15 +5,14 @@
171
172 __metaclass__ = type
173 __all__ = [
174+ 'credits_message_str',
175 'POTMsgSet',
176 ]
177
178
179-import datetime
180 import logging
181 import re
182
183-import pytz
184 from sqlobject import (
185 ForeignKey,
186 IntCol,
187@@ -56,7 +55,10 @@
188 POTMsgSetInIncompatibleTemplatesError,
189 TranslationCreditsType,
190 )
191-from lp.translations.interfaces.side import ITranslationSideTraitsSet
192+from lp.translations.interfaces.side import (
193+ ITranslationSideTraitsSet,
194+ TranslationSide,
195+ )
196 from lp.translations.interfaces.translationfileformat import (
197 TranslationFileFormat,
198 )
199@@ -1596,17 +1598,20 @@
200 if not self.is_translation_credit:
201 return
202
203- if self.getSharedTranslationMessage(pofile.language) is not None:
204+ shared_upstream_translation = self.getCurrentTranslation(
205+ None, pofile.language, TranslationSide.UPSTREAM)
206+
207+ if shared_upstream_translation is not None:
208 return
209
210 # The credits message has a fixed "translator."
211 translator = getUtility(ILaunchpadCelebrities).rosetta_experts
212
213- self.updateTranslation(
214- pofile, translator, [credits_message_str],
215- is_current_upstream=False, allow_credits=True,
216- force_shared=True, force_edition_rights=True,
217- lock_timestamp=datetime.datetime.now(pytz.UTC))
218+ generated_translation = self.setCurrentTranslation(
219+ pofile, translator, {0: credits_message_str},
220+ RosettaTranslationOrigin.LAUNCHPAD_GENERATED,
221+ share_with_other_side=True)
222+ generated_translation.shareIfPossible()
223
224 def setSequence(self, potemplate, sequence):
225 """See `IPOTMsgSet`."""
226
227=== modified file 'lib/lp/translations/tests/test_pofile.py'
228--- lib/lp/translations/tests/test_pofile.py 2010-11-16 14:25:31 +0000
229+++ lib/lp/translations/tests/test_pofile.py 2010-11-18 14:17:59 +0000
230@@ -35,6 +35,7 @@
231 )
232 from lp.translations.interfaces.translationgroup import TranslationPermission
233 from lp.translations.interfaces.translationmessage import (
234+ RosettaTranslationOrigin,
235 TranslationValidationStatus,
236 )
237 from lp.translations.interfaces.translationsperson import ITranslationsPerson
238@@ -1088,7 +1089,32 @@
239 canonical_url(person))
240 for person in self.pofile.contributors]))
241
242- def test_prepareTranslationCredits_extending(self):
243+ def test_prepareTranslationCredits_noop(self):
244+ # With no contributions, translator credits message is not None,
245+ # yet it's ignored in prepareTranslationCredits.
246+ credits = self.credits_potmsgset.getCurrentTranslation(
247+ self.potemplate, self.pofile.language,
248+ self.potemplate.translation_side)
249+ self.assertIsNot(None, credits)
250+ self.assertIs(
251+ None,
252+ self.pofile.prepareTranslationCredits(self.credits_potmsgset))
253+
254+ def test_prepareTranslationCredits_gnome(self):
255+ # Preparing translation credits for GNOME-like credits message.
256+ translator = self.factory.makePerson(
257+ name=u'the-translator',
258+ displayname=u'Launchpad Translator')
259+ upstream_credits = self.credits_potmsgset.setCurrentTranslation(
260+ self.pofile, translator, {0: 'upstream credits'},
261+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
262+ self.assertEquals(
263+ u'upstream credits\n\n'
264+ 'Launchpad Contributions:\n'
265+ ' Launchpad Translator http://launchpad.dev/~the-translator',
266+ self.pofile.prepareTranslationCredits(self.credits_potmsgset))
267+
268+ def test_prepareTranslationCredits_gnome_extending(self):
269 # This test ensures that continuous updates to the translation credits
270 # don't result in duplicate entries.
271 # Only the 'translator-credits' message is covered right now.
272@@ -1129,6 +1155,74 @@
273 self.compose_launchpad_credits_text(imported_credits_text),
274 credits_text)
275
276+ def test_prepareTranslationCredits_old_kde_names(self):
277+ # Preparing translation credits for old (pre-KDE4) KDE-like
278+ # credits message for contributor names.
279+ translator = self.factory.makePerson(
280+ displayname=u'Launchpad Translator')
281+ kde_names_potmsgset = self.factory.makePOTMsgSet(
282+ potemplate=self.potemplate,
283+ singular=u'_: NAME OF TRANSLATORS\nYour names')
284+ upstream_credits = kde_names_potmsgset.setCurrentTranslation(
285+ self.pofile, translator,
286+ {0: 'Upstream credits'},
287+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
288+ self.assertEquals(
289+ u'Upstream credits, ,Launchpad Contributions:,'
290+ 'Launchpad Translator',
291+ self.pofile.prepareTranslationCredits(kde_names_potmsgset))
292+
293+ def test_prepareTranslationCredits_old_kde_emails(self):
294+ # Preparing translation credits for old (pre-KDE4) KDE-like
295+ # credits message for contributor emails.
296+ translator = self.factory.makePerson(
297+ email=u'translator@launchpad')
298+ kde_emails_potmsgset = self.factory.makePOTMsgSet(
299+ potemplate=self.potemplate,
300+ singular=u'_: EMAIL OF TRANSLATORS\nYour emails')
301+ upstream_credits = kde_emails_potmsgset.setCurrentTranslation(
302+ self.pofile, translator,
303+ {0: 'translator@upstream'},
304+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
305+ self.assertEquals(
306+ u'translator@upstream,,,translator@launchpad',
307+ self.pofile.prepareTranslationCredits(kde_emails_potmsgset))
308+
309+ def test_prepareTranslationCredits_kde_names(self):
310+ # Preparing translation credits for new (KDE4 and later)
311+ # KDE-like credits message for contributor names.
312+ translator = self.factory.makePerson(
313+ displayname=u'Launchpad Translator')
314+ kde_names_potmsgset = self.factory.makePOTMsgSet(
315+ potemplate=self.potemplate,
316+ context=u'NAME OF TRANSLATORS',
317+ singular=u'Your names')
318+ upstream_credits = kde_names_potmsgset.setCurrentTranslation(
319+ self.pofile, translator,
320+ {0: 'Upstream credits'},
321+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
322+ self.assertEquals(
323+ u'Upstream credits, ,Launchpad Contributions:,'
324+ 'Launchpad Translator',
325+ self.pofile.prepareTranslationCredits(kde_names_potmsgset))
326+
327+ def test_prepareTranslationCredits_kde_emails(self):
328+ # Preparing translation credits for new (KDE4 and later)
329+ # KDE-like credits message for contributor emails.
330+ translator = self.factory.makePerson(
331+ email=u'translator@launchpad')
332+ kde_emails_potmsgset = self.factory.makePOTMsgSet(
333+ potemplate=self.potemplate,
334+ context=u'EMAIL OF TRANSLATORS',
335+ singular=u'Your emails')
336+ upstream_credits = kde_emails_potmsgset.setCurrentTranslation(
337+ self.pofile, translator,
338+ {0: 'translator@upstream'},
339+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
340+ self.assertEquals(
341+ u'translator@upstream,,,translator@launchpad',
342+ self.pofile.prepareTranslationCredits(kde_emails_potmsgset))
343+
344
345 class TestTranslationPOFilePOTMsgSetOrdering(TestCaseWithFactory):
346 """Test ordering of POTMsgSets as returned by PO file methods."""
347
348=== modified file 'lib/lp/translations/tests/test_potmsgset.py'
349--- lib/lp/translations/tests/test_potmsgset.py 2010-11-17 12:30:06 +0000
350+++ lib/lp/translations/tests/test_potmsgset.py 2010-11-18 14:17:59 +0000
351@@ -22,7 +22,6 @@
352 )
353 from lp.app.enums import ServiceUsage
354 from lp.registry.interfaces.person import IPersonSet
355-from lp.registry.interfaces.product import IProductSet
356 from lp.testing import TestCaseWithFactory
357 from lp.translations.interfaces.potemplate import IPOTemplateSet
358 from lp.translations.interfaces.potmsgset import (
359@@ -678,36 +677,63 @@
360 credits_potmsgset = self.factory.makePOTMsgSet(
361 self.devel_potemplate, singular=u'translator-credits')
362 credits_potmsgset.setTranslationCreditsToTranslated(sr_pofile)
363- current = credits_potmsgset.getCurrentTranslationMessage(
364- self.devel_potemplate, sr_pofile.language)
365+ current = credits_potmsgset.getCurrentTranslation(
366+ self.devel_potemplate, sr_pofile.language,
367+ TranslationSide.UPSTREAM)
368 self.assertNotEqual(None, current)
369+ self.assertEquals(
370+ RosettaTranslationOrigin.LAUNCHPAD_GENERATED, current.origin)
371+
372+ def test_setTranslationCreditsToTranslated_noop_when_translated(self):
373+ """Test that translation credits don't change."""
374+ sr_pofile = self.factory.makePOFile('sr', self.devel_potemplate)
375+ credits_potmsgset = self.factory.makePOTMsgSet(
376+ self.devel_potemplate, singular=u'translator-credits')
377+ old_credits = credits_potmsgset.setCurrentTranslation(
378+ sr_pofile, sr_pofile.potemplate.owner, {0: 'credits'},
379+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
380+ credits_potmsgset.setTranslationCreditsToTranslated(sr_pofile)
381+ current = credits_potmsgset.getCurrentTranslation(
382+ self.devel_potemplate, sr_pofile.language,
383+ TranslationSide.UPSTREAM)
384+ self.assertEquals(old_credits, current)
385+
386+ def test_setTranslationCreditsToTranslated_noop_when_not_credits(self):
387+ """Test that translation doesn't change on a non-credits message."""
388+ sr_pofile = self.factory.makePOFile('sr', self.devel_potemplate)
389+ not_credits_potmsgset = self.factory.makePOTMsgSet(
390+ self.devel_potemplate, singular=u'non-credit message')
391+ not_credits_potmsgset.setTranslationCreditsToTranslated(sr_pofile)
392+ current = not_credits_potmsgset.getCurrentTranslation(
393+ self.devel_potemplate, sr_pofile.language,
394+ TranslationSide.UPSTREAM)
395+ self.assertIs(None, current)
396
397 def test_setTranslationCreditsToTranslated_diverged(self):
398 # Even if there's a diverged translation credits translation,
399 # we should provide an automatic shared translation instead.
400- alsa_utils = getUtility(IProductSet).getByName('alsa-utils')
401- trunk = alsa_utils.getSeries('trunk')
402- potemplate = trunk.getPOTemplate('alsa-utils')
403- es_pofile = potemplate.getPOFileByLang('es')
404- credits_potmsgset = potemplate.getPOTMsgSetByMsgIDText(
405- u'_: EMAIL OF TRANSLATORS\nYour emails')
406-
407- es_current = credits_potmsgset.getCurrentTranslationMessage(
408- potemplate, es_pofile.language)
409- # Let's make sure this message is also marked as imported
410- # and diverged.
411- es_current.makeCurrentUpstream(True)
412- removeSecurityProxy(es_current).potemplate = potemplate
413-
414- self.assertTrue(es_current.is_current_ubuntu)
415- self.assertNotEqual(None, es_current.potemplate)
416-
417- # Setting credits as translated will give us a shared translation.
418- credits_potmsgset.setTranslationCreditsToTranslated(es_pofile)
419- current_shared = credits_potmsgset.getSharedTranslationMessage(
420- es_pofile.language)
421- self.assertNotEqual(None, current_shared)
422- self.assertEqual(None, current_shared.potemplate)
423+ sr_pofile = self.factory.makePOFile('sr', self.devel_potemplate)
424+ credits_potmsgset = self.factory.makePOTMsgSet(
425+ self.devel_potemplate, singular=u'translator-credits')
426+ diverged_credits = credits_potmsgset.setCurrentTranslation(
427+ sr_pofile, sr_pofile.potemplate.owner, {0: 'credits'},
428+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
429+ # Since translation credits are special, we can't easily create
430+ # a diverged translation on it, though it may already exist in
431+ # the DB.
432+ removeSecurityProxy(diverged_credits).potemplate = (
433+ sr_pofile.potemplate)
434+ # Make sure that worked (not a real test).
435+ self.assertTrue(diverged_credits.is_current_upstream)
436+ self.assertEquals(sr_pofile.potemplate, diverged_credits.potemplate)
437+
438+ credits_potmsgset.setTranslationCreditsToTranslated(sr_pofile)
439+
440+ # Shared translation is generated.
441+ shared = credits_potmsgset.getCurrentTranslation(
442+ None, sr_pofile.language, TranslationSide.UPSTREAM)
443+ self.assertNotEquals(diverged_credits, shared)
444+ self.assertIsNot(None, shared)
445
446 def test_setTranslationCreditsToTranslated_submitter(self):
447 # Submitter on the automated translation message is always
448@@ -718,8 +744,9 @@
449 sr_pofile.owner = translator
450 credits_potmsgset = self.factory.makePOTMsgSet(
451 self.devel_potemplate, singular=u'translator-credits')
452- current = credits_potmsgset.getCurrentTranslationMessage(
453- self.devel_potemplate, sr_pofile.language)
454+ current = credits_potmsgset.getCurrentTranslation(
455+ self.devel_potemplate, sr_pofile.language,
456+ TranslationSide.UPSTREAM)
457
458 rosetta_experts = getUtility(ILaunchpadCelebrities).rosetta_experts
459 self.assertEqual(rosetta_experts, current.submitter)
460
461=== modified file 'lib/lp/translations/utilities/translation_import.py'
462--- lib/lp/translations/utilities/translation_import.py 2010-11-10 11:01:28 +0000
463+++ lib/lp/translations/utilities/translation_import.py 2010-11-18 14:17:59 +0000
464@@ -482,7 +482,7 @@
465 return None
466 return potmsgset.setCurrentTranslation(
467 self.pofile, self.last_translator, credits,
468- RosettaTranslationOrigin.SCM, self.share_with_other_side)
469+ RosettaTranslationOrigin.SCM, share_with_other_side=True)
470
471 def _validateMessage(self, potmsgset, message,
472 translations, message_data):

Subscribers

People subscribed via source and target branches

to all changes: