-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
translation: skip strings which can not be serialized
When string serialization fails, skip the string, unmark it as pending and continue in other pending strings. The error is stored as a Change object and the string is marked as needing editing. This makes it possible to recover from the situation, but the string can be lost as it is not serialized, the change will disappear on next upstream update. Right now this happens frequently with Fluent, but can happen with other formats as well. Fixes #9775
- Loading branch information
Showing
6 changed files
with
121 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# Copyright © Michal Čihař <[email protected]> | ||
# | ||
# SPDX-License-Identifier: GPL-3.0-or-later | ||
|
||
# Generated by Django 4.2.5 on 2023-10-05 10:40 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
dependencies = [ | ||
("trans", "0003_alter_project_access_control"), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterField( | ||
model_name="change", | ||
name="action", | ||
field=models.IntegerField( | ||
choices=[ | ||
(0, "Resource update"), | ||
(1, "Translation completed"), | ||
(2, "Translation changed"), | ||
(5, "New translation"), | ||
(3, "Comment added"), | ||
(4, "Suggestion added"), | ||
(6, "Automatic translation"), | ||
(7, "Suggestion accepted"), | ||
(8, "Translation reverted"), | ||
(9, "Translation uploaded"), | ||
(13, "New source string"), | ||
(14, "Component locked"), | ||
(15, "Component unlocked"), | ||
(17, "Committed changes"), | ||
(18, "Pushed changes"), | ||
(19, "Reset repository"), | ||
(20, "Merged repository"), | ||
(21, "Rebased repository"), | ||
(22, "Failed merge on repository"), | ||
(23, "Failed rebase on repository"), | ||
(28, "Failed push on repository"), | ||
(24, "Parse error"), | ||
(25, "Removed translation"), | ||
(26, "Suggestion removed"), | ||
(27, "Search and replace"), | ||
(29, "Suggestion removed during cleanup"), | ||
(30, "Source string changed"), | ||
(31, "New string added"), | ||
(32, "Bulk status change"), | ||
(33, "Changed visibility"), | ||
(34, "Added user"), | ||
(35, "Removed user"), | ||
(36, "Translation approved"), | ||
(37, "Marked for edit"), | ||
(38, "Removed component"), | ||
(39, "Removed project"), | ||
(41, "Renamed project"), | ||
(42, "Renamed component"), | ||
(43, "Moved component"), | ||
(44, "New string to translate"), | ||
(45, "New contributor"), | ||
(46, "New announcement"), | ||
(47, "New alert"), | ||
(48, "Added new language"), | ||
(49, "Requested new language"), | ||
(50, "Created project"), | ||
(51, "Created component"), | ||
(52, "Invited user"), | ||
(53, "Received repository notification"), | ||
(54, "Replaced file by upload"), | ||
(55, "License changed"), | ||
(56, "Contributor agreement changed"), | ||
(57, "Screnshot added"), | ||
(58, "Screnshot uploaded"), | ||
(59, "String updated in the repository"), | ||
(60, "Add-on installed"), | ||
(61, "Add-on configuration changed"), | ||
(62, "Add-on uninstalled"), | ||
(63, "Removed string"), | ||
(64, "Removed comment"), | ||
(65, "Resolved comment"), | ||
(66, "Explanation updated"), | ||
(67, "Removed category"), | ||
(68, "Renamed category"), | ||
(69, "Moved category"), | ||
(70, "Could not save string"), | ||
], | ||
default=2, | ||
), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -766,10 +766,17 @@ def update_units(self, units, store, author_name, author_id): | |
pounit.set_explanation(unit.explanation) | ||
pounit.set_source_explanation(unit.source_unit.explanation) | ||
except Exception as error: | ||
self.component.handle_parse_error(error, self, reraise=False) | ||
report_error( | ||
cause="Could not update unit", project=self.component.project | ||
) | ||
unit.state = STATE_FUZZY | ||
# Use update instead of hitting expensive save() | ||
Unit.objects.filter(pk=unit.pk).update(state=STATE_FUZZY) | ||
unit.change_set.create( | ||
action=Change.ACTION_SAVE_FAILED, | ||
target=self.get_parse_error_message(error), | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
nijel
Author
Member
|
||
) | ||
clear_pending.append(unit.pk) | ||
continue | ||
|
||
updated = True | ||
|
@nijel Thanks for putting this patch together.
I was testing this out, and I noticed that this line in throwing
Was it meant to be
self.component.get_parse_error_message(error)
?