Diff for "Translations/Specs/UpstreamImportIntoUbuntu/FixingIsImported/setCurrentTranslation"

Not logged in - Log In / Register

Differences between revisions 22 and 23
Revision 22 as of 2010-06-03 12:41:01
Size: 3705
Editor: jtv
Comment:
Revision 23 as of 2010-06-03 12:41:44
Size: 3705
Editor: jtv
Comment:
Deletions are marked like this. Additions are marked like this.
Line 94: Line 94:
|| diverged || A2 || A5 || A4 || A5 || || diverged || A2 || A5 || A4 || A6 ||

Setting a translation

Assumptions

We're not setting a translation that's identical to the current one.

We've checked that lock_timestamp is newer than the last update date.

A diverged message cannot be both the current Ubuntu message and the current upstream message. Those would be diverged in different templates.

When we look for an "identical" message, we look for ones that are either shared or diverged in the same template that we're looking at. We completely ignore messages that are diverged to other templates.

Messages have been validated against gettext (otherwise you wouldn't be setting them as current).

What happens to the existing current message

A: Deactivate & converge.

  If there is already a shared message identical to current:
    current.delete()
  else:
    current.is_current = False
    current.potemplate = None

B: Deactivate.

  current.is_current = False

What happens to the new current message

Some numbers are unused because their scenarios have collapsed into other ones.

1. Create & activate.

create TM 'new'
new.is_current = True

2. Create, diverge, activate.

create TM 'new'
new.is_current = True
new.potemplate = current.potemplate

4. Activate.

new.is_current = True

5. (NEW/CHANGED) If other is not current, it's a suggestion. Diverge & activate. (If it is current, deactivating the old diverged current message has already unmasked it).

if not new.is_current: (2)

6. (NEW/CHANGED) If other is not already current, fork a diverged message. (If it is current, deactivating the old diverged current message has already unmasked it).

if not new.is_current:
    new.potemplate = current.potemplate
    new.is_current = True

7. Converge & activate.

new.potemplate = None # (watch for existing identical TM)
new.is_current = True

⊕. MERGING POLICY determines if we need to do:

  • Look for shared translation with the is_other flag set: 'other' If found, steal its flag. If not, take the flag anyway:

    if other is not None:
       other.is_other = False
   new.is_other = True

By default, the policy should approve the change on is_other if working on upstream; or if working on Ubuntu but with privileges to edit both.

Execution matrix

IDENTICAL EXISTING TM 'new'

None

shared

diverged

upstream shared

CURRENT

None

Z1⊕

Z4⊕

Z7⊕

Z4⊕

shared

B1

B4

B7

B4

diverged

A2

A5

A4

A6

upstream shared

B1⊕

B4⊕

B7⊕

Ø

Notes

A diverged message can mask a similar shared message as well. We tried to take this into account throughout, and believe we covered it. Conditionals in the numbered parts ("what happens to the new current message") may warrant splitting rows or columns later.

Karma is being handled.

Implementation notes

See lp:~jtv/launchpad/recife-552639

This implements two methods: one for setting the upstream translation, and one for setting the Ubuntu translation. An upstream translation also overrides Ubuntu translations; whether the converse also happens when translating in Ubuntu is determined by an optional argument.

The code calls the "current" message the "incumbent," and the "existing" message the "twin."

If the flag-stealing policy approves, the newly activated instruction will also receive the "other flag" if there is no current translation to steal it from.

Translations/Specs/UpstreamImportIntoUbuntu/FixingIsImported/setCurrentTranslation (last edited 2010-06-19 03:51:36 by jtv)