chore: update project translations and correct localization strings across modules

This commit is contained in:
kdeterme 2026-08-11 16:46:07 +02:00
parent f41b10bff8
commit 97269fb001
28 changed files with 103 additions and 81 deletions

View file

@ -296,7 +296,7 @@ msgstr "Progress Photos"
#: controls/templates/controls/control_report.html:62
msgid "Observations"
msgstr "Comments"
msgstr "Observations"
#: controls/templates/controls/control_report.html:77
msgid "Rapport généré par"
@ -1026,7 +1026,7 @@ msgstr "Description: "
#: controls/views_reports_pdf.py:505
#, python-format
msgid "Erreur lors du chargement ou du dessin sur le plan %(name)s: %(e)s"
msgstr "Image loading error: %(e)s"
msgstr "Error loading or drawing on plan %(name)s: %(e)s"
#: controls/views_reports_pdf.py:743
msgid "Inconnu"

View file

@ -425,7 +425,7 @@ msgstr "No folders available."
#: documents/templates/documents/document_confirm_delete.html:6
#, python-format
msgid "Delete document \"%(document.title)s\""
msgstr "Delete document '%(document.title)s\"
msgstr "Delete document \"%(document.title)s\""
#: documents/templates/documents/document_confirm_delete.html:7
msgid ""

View file

@ -25,7 +25,7 @@ msgstr "File"
#: documents/templates/documents/document_detail.html:208
#: documents/templates/documents/document_form.html:68
msgid "Comment"
msgstr "Comment"
msgstr "Commentaire"
#: documents/forms.py:37 documents/models.py:97
#: documents/templates/documents/document_detail.html:148

View file

@ -753,7 +753,7 @@ msgstr "Evolution"
#: home/templates/home/widgets/observer_shortcuts.html:9
msgid "Observations"
msgstr "Comments"
msgstr "Observations"
#: home/templates/home/widgets/observer_shortcuts.html:18
msgid "Mes observations"

View file

@ -81,9 +81,9 @@
</button>
{% endif %}
{% if not intervention.assigned_member %}
<i class="bi bi-person-x fs-5 s-4" title="Non assignee"></i>
<i class="bi bi-person-x fs-5 s-4" title="{% translate 'Non assignée' %}"></i>
{% else %}
<i class="bi bi-person-check fs-5 {% if request.user == intervention.assigned_member.user %}text-primary{% else %}text-info{% endif %}" title="Assignee"></i>
<i class="bi bi-person-check fs-5 {% if request.user == intervention.assigned_member.user %}text-primary{% else %}text-info{% endif %}" title="{% translate 'Assignée' %}"></i>
{% endif %}
</div>
</div>

View file

@ -188,7 +188,7 @@
<!-- Champ de recherche -->
<div class="input-group">
<button type="button" class="btn btn-outline-secondary" id="clearSearch" title="Effacer" aria-label="Effacer la recherche">
<button type="button" class="btn btn-outline-secondary" id="clearSearch" title="{% translate 'Effacer' %}" aria-label="{% translate 'Effacer la recherche' %}">
<i class="bi bi-x"></i>
</button>
@ -198,13 +198,13 @@
id="searchInput"
class="form-control"
value="{{ request.GET.q|default:'' }}"
placeholder="Code ou titre"
placeholder="{% translate 'Code ou titre' %}"
autocomplete="off"
enterkeyhint="search"
aria-label="Rechercher par code ou titre"
aria-label="{% translate 'Rechercher par code ou titre' %}"
>
<button type="submit" class="btn btn-primary" id="submitSearch" title="Rechercher" aria-label="Rechercher">
<button type="submit" class="btn btn-primary" id="submitSearch" title="{% translate 'Rechercher' %}" aria-label="{% translate 'Rechercher' %}">
<i class="bi bi-search"></i>
</button>
</div>

View file

@ -22,11 +22,15 @@ class GIEPAssetsAJAXTests(TestCase):
$function$
""")
from common.models import Thematic, UserThematics
self.water_thematic, _ = Thematic.objects.get_or_create(code='water', defaults={'name_fr': 'Eau', 'name_nl': 'Water'})
User = get_user_model()
self.user = User.objects.create_user(username='giepadmin', password='pwd')
self.user = User.objects.create_user(username='giepadmin', password='pwd', is_superuser=True)
self.role_admin, _ = Role.objects.get_or_create(name='admin')
self.user_config = UserConfig.objects.create(user=self.user, is_intern=True)
self.user_config.roles.add(self.role_admin)
UserThematics.objects.get_or_create(user_config=self.user_config, thematic=self.water_thematic, defaults={'can_edit_assets': True})
self.client.force_login(self.user)
# Create correct geospatial polygon geometries by transforming to SRID 3812
geom1 = Polygon(((4.3570, 50.8475), (4.3570, 50.8479), (4.3574, 50.8479), (4.3574, 50.8475), (4.3570, 50.8475)), srid=4326)

View file

@ -1321,7 +1321,7 @@ msgstr "Assets"
#: templates/base.html:350
msgid "Observations"
msgstr "Comments"
msgstr "Observations"
#: templates/base.html:355
msgid "Interventions"

Binary file not shown.

View file

@ -135,11 +135,11 @@ msgstr "Snap"
#: mobile/templates/mobile/green_surfaces_edit_v2.html:990
msgid "Aimantage activé"
msgstr "Aimantage enabled"
msgstr "Snapping enabled"
#: mobile/templates/mobile/green_surfaces_edit_v2.html:991
msgid "Aimantage désactivé"
msgstr "Aimantage disabled"
msgstr "Snapping disabled"
#: mobile/templates/mobile/green_surfaces_edit_v2.html:992
msgid "Découper un polygone"
@ -249,7 +249,7 @@ msgstr "New items"
#: mobile/templates/mobile/mobile_index.html:18
msgid "Nouvelle observation"
msgstr "Observations"
msgstr "New observation"
#: mobile/templates/mobile/mobile_index.html:25
msgid "Nouvelle inspection"
@ -257,11 +257,11 @@ msgstr "New inspection"
#: mobile/templates/mobile/mobile_index.html:32
msgid "Intervention Réparation"
msgstr "Interventions"
msgstr "Repair intervention"
#: mobile/templates/mobile/mobile_index.html:39
msgid "Nouvelle intervention"
msgstr "Interventions"
msgstr "New intervention"
#: mobile/templates/mobile/mobile_index.html:54
msgid "Interventions"
@ -289,7 +289,7 @@ msgstr "Track project status"
#: mobile/templates/mobile/mobile_index.html:89
msgid "Observations"
msgstr "Comments"
msgstr "Observations"
#: mobile/templates/mobile/mobile_index.html:90
msgid "Consulter et ajouter des observations terrain"
@ -466,7 +466,7 @@ msgstr "QR Code not recognized."
#: mobile/templates/mobile/qr_scanner.html:213
msgid "Erreur lors de la résolution."
msgstr "Error deleting items"
msgstr "Error resolving QR code."
#: mobile/views.py:265
msgid "Format de QR Code invalide."
@ -475,7 +475,7 @@ msgstr "Invalid QR Code format."
#: mobile/views.py:278
#, python-brace-format
msgid "Produit « {identifier} » introuvable."
msgstr "Produit « {identifier} » introuvable."
msgstr "Product \"{identifier}\" not found."
#: mobile/views.py:289
msgid "Commande introuvable."
@ -484,17 +484,17 @@ msgstr "Order not found."
#: mobile/views.py:299
#, python-brace-format
msgid "Article tracé « {identifier} » introuvable."
msgstr "Article tracé « {identifier} » introuvable."
msgstr "Tracked item \"{identifier}\" not found."
#: mobile/views.py:310
#, python-brace-format
msgid "Emplacement « {identifier} » introuvable."
msgstr "Emplacement « {identifier} » introuvable."
msgstr "Location \"{identifier}\" not found."
#: mobile/views.py:320
#, python-brace-format
msgid "Bon de préparation « {identifier} » introuvable."
msgstr "Bon de préparation « {identifier} » introuvable."
msgstr "Preparation order \"{identifier}\" not found."
#: mobile/views.py:321
#, python-brace-format
@ -503,7 +503,7 @@ msgstr "Unknown QR code type: {qr_type}."
#: mobile/views.py:432
msgid "A traiter"
msgstr "To be treated"
msgstr "To process"
#: mobile/views.py:433
msgid "En attente"
@ -511,11 +511,11 @@ msgstr "On hold"
#: mobile/views.py:434
msgid "Traité"
msgstr "Treaty"
msgstr "Processed"
#: mobile/views.py:435
msgid "Annulé"
msgstr "Cancel"
msgstr "Cancelled"
#: mobile/views.py:438
msgid "Urgent"
@ -523,7 +523,7 @@ msgstr "Urgent"
#: mobile/views.py:439
msgid "Elevé"
msgstr "Pupil"
msgstr "High"
#: mobile/views.py:440
msgid "Normal"
@ -531,7 +531,7 @@ msgstr "Normal"
#: mobile/views.py:441
msgid "Bas"
msgstr "Down"
msgstr "Low"
#: mobile/views.py:591
msgid "Vous n'avez pas la permission d'accéder à cette page."
@ -561,7 +561,7 @@ msgstr "Signature registered successfully."
#: mobile/views.py:831
msgid "Veuillez sélectionner un emplacement."
msgstr "Please select a template"
msgstr "Please select a location."
#: mobile/views.py:838
msgid "Emplacement invalide ou non accessible."
@ -569,7 +569,7 @@ msgstr "Invalid or inaccessible location."
#: mobile/views.py:859
msgid "Inventaire créé avec succès."
msgstr "Polygon cut successfully"
msgstr "Inventory created successfully."
#: mobile/views.py:960
msgid "Document(s) ajouté(s) avec succès."

View file

@ -252,7 +252,7 @@ msgstr "Nieuwe artikelen"
#: mobile/templates/mobile/mobile_index.html:18
msgid "Nouvelle observation"
msgstr "Observaties"
msgstr "Nieuwe observatie"
#: mobile/templates/mobile/mobile_index.html:25
msgid "Nouvelle inspection"
@ -260,11 +260,11 @@ msgstr "Nieuwe keuring"
#: mobile/templates/mobile/mobile_index.html:32
msgid "Intervention Réparation"
msgstr "Interventies"
msgstr "Reparatie-interventie"
#: mobile/templates/mobile/mobile_index.html:39
msgid "Nouvelle intervention"
msgstr "Interventies"
msgstr "Nieuwe interventie"
#: mobile/templates/mobile/mobile_index.html:54
msgid "Interventions"
@ -471,7 +471,7 @@ msgstr "QR-code niet herkend."
#: mobile/templates/mobile/qr_scanner.html:213
msgid "Erreur lors de la résolution."
msgstr "Fout bij het verwijderen"
msgstr "Fout bij het verwerken van de QR-code."
#: mobile/views.py:265
msgid "Format de QR Code invalide."
@ -480,7 +480,7 @@ msgstr "Ongeldig QR-codeformaat."
#: mobile/views.py:278
#, python-brace-format
msgid "Produit « {identifier} » introuvable."
msgstr "Produit « {identifier} » introuvable."
msgstr "Product \"{identifier}\" niet gevonden."
#: mobile/views.py:289
msgid "Commande introuvable."
@ -489,17 +489,17 @@ msgstr "Bestelling niet gevonden."
#: mobile/views.py:299
#, python-brace-format
msgid "Article tracé « {identifier} » introuvable."
msgstr "Article tracé « {identifier} » introuvable."
msgstr "Gevolgde artikel \"{identifier}\" niet gevonden."
#: mobile/views.py:310
#, python-brace-format
msgid "Emplacement « {identifier} » introuvable."
msgstr "Emplacement « {identifier} » introuvable."
msgstr "Locatie \"{identifier}\" niet gevonden."
#: mobile/views.py:320
#, python-brace-format
msgid "Bon de préparation « {identifier} » introuvable."
msgstr "Bon de préparation « {identifier} » introuvable."
msgstr "Voorbereidingsbon \"{identifier}\" niet gevonden."
#: mobile/views.py:321
#, python-brace-format
@ -508,19 +508,19 @@ msgstr "Onbekend QR-codetype: {qr_type}."
#: mobile/views.py:432
msgid "A traiter"
msgstr "Te behandelen"
msgstr "Te verwerken"
#: mobile/views.py:433
msgid "En attente"
msgstr "In de wacht"
msgstr "In afwachting"
#: mobile/views.py:434
msgid "Traité"
msgstr "Verdrag"
msgstr "Verwerkt"
#: mobile/views.py:435
msgid "Annulé"
msgstr "Annuleren"
msgstr "Geannuleerd"
#: mobile/views.py:438
msgid "Urgent"
@ -528,7 +528,7 @@ msgstr "Dringend"
#: mobile/views.py:439
msgid "Elevé"
msgstr "Leerling"
msgstr "Hoog"
#: mobile/views.py:440
msgid "Normal"
@ -536,7 +536,7 @@ msgstr "Normaal"
#: mobile/views.py:441
msgid "Bas"
msgstr "Omlaag"
msgstr "Laag"
#: mobile/views.py:591
msgid "Vous n'avez pas la permission d'accéder à cette page."
@ -566,7 +566,7 @@ msgstr "Handtekening succesvol geregistreerd."
#: mobile/views.py:831
msgid "Veuillez sélectionner un emplacement."
msgstr "Selecteer een model"
msgstr "Selecteer een locatie."
#: mobile/views.py:838
msgid "Emplacement invalide ou non accessible."
@ -574,7 +574,7 @@ msgstr "Ongeldige of ontoegankelijke locatie."
#: mobile/views.py:859
msgid "Inventaire créé avec succès."
msgstr "Polygoon succesvol geknipt"
msgstr "Inventaris succesvol aangemaakt."
#: mobile/views.py:960
msgid "Document(s) ajouté(s) avec succès."

View file

@ -1058,12 +1058,12 @@ msgid "Autorisations → Appareil photo → Autoriser"
msgstr "Permissions → Camera → Allow"
#: observations/templates/observations/observation_form.html:3019
msgid "Revenez dans l\'application et réessayez."
msgid "Revenez dans l'application et réessayez."
msgstr "Return to the application and try again."
#: observations/templates/observations/observation_form.html:3022
msgid ""
"La permission caméra a été refusée. Veuillez l\'autoriser dans les "
"La permission caméra a été refusée. Veuillez l'autoriser dans les "
"paramètres de votre navigateur, puis rechargez la page."
msgstr ""
"Camera permission was denied. Please allow it in your browser "
@ -1071,12 +1071,12 @@ msgstr ""
#: observations/templates/observations/observation_form.html:3024
msgid ""
"Impossible d\'accéder à la caméra. Veuillez vérifier les autorisations."
"Impossible d'accéder à la caméra. Veuillez vérifier les autorisations."
msgstr ""
"Cannot access the camera. Please check permissions."
#: observations/templates/observations/observation_form.html:3031
msgid "La caméra avancée n\'est pas supportée sur ce navigateur."
msgid "La caméra avancée n'est pas supportée sur ce navigateur."
msgstr "Advanced camera is not supported on this browser."
#: observations/templates/observations/observation_form.html:3041
@ -1092,11 +1092,11 @@ msgid "Caméra prête. Appuyez sur Capturer pour prendre une photo."
msgstr "Camera ready. Press Capture to take a photo."
#: observations/templates/observations/observation_form.html:3075
msgid "Impossible d\'accéder à la caméra."
msgid "Impossible d'accéder à la caméra."
msgstr "Cannot access the camera."
#: observations/templates/observations/observation_form.html:3097
msgid "La vidéo n\'est pas encore prête."
msgid "La vidéo n'est pas encore prête."
msgstr "Video is not ready yet."
#: observations/templates/observations/observation_form.html:3109
@ -1222,7 +1222,7 @@ msgstr "Search"
#: observations/templates/observations/observations_index_mobile.html:306
#: observations/views.py:570
msgid "Observations"
msgstr "Comments"
msgstr "Observations"
#: observations/templates/observations/observations_index.html:374
msgid "Aucune observation chargée"

View file

@ -1063,12 +1063,12 @@ msgid "Autorisations → Appareil photo → Autoriser"
msgstr "Machtigingen → Camera → Toestaan"
#: observations/templates/observations/observation_form.html:3019
msgid "Revenez dans l\'application et réessayez."
msgid "Revenez dans l'application et réessayez."
msgstr "Keer terug naar de app en probeer het opnieuw."
#: observations/templates/observations/observation_form.html:3022
msgid ""
"La permission caméra a été refusée. Veuillez l\'autoriser dans les "
"La permission caméra a été refusée. Veuillez l'autoriser dans les "
"paramètres de votre navigateur, puis rechargez la page."
msgstr ""
"Cameratoestemming is geweigerd. Geef toestemming in uw "
@ -1076,12 +1076,12 @@ msgstr ""
#: observations/templates/observations/observation_form.html:3024
msgid ""
"Impossible d\'accéder à la caméra. Veuillez vérifier les autorisations."
"Impossible d'accéder à la caméra. Veuillez vérifier les autorisations."
msgstr ""
"Geen toegang tot de camera. Controleer de machtigingen."
#: observations/templates/observations/observation_form.html:3031
msgid "La caméra avancée n\'est pas supportée sur ce navigateur."
msgid "La caméra avancée n'est pas supportée sur ce navigateur."
msgstr "De geavanceerde camera wordt niet ondersteund in deze browser."
#: observations/templates/observations/observation_form.html:3041
@ -1097,11 +1097,11 @@ msgid "Caméra prête. Appuyez sur Capturer pour prendre une photo."
msgstr "Camera gereed. Druk op Opnemen om een foto te maken."
#: observations/templates/observations/observation_form.html:3075
msgid "Impossible d\'accéder à la caméra."
msgid "Impossible d'accéder à la caméra."
msgstr "Geen toegang tot de camera."
#: observations/templates/observations/observation_form.html:3097
msgid "La vidéo n\'est pas encore prête."
msgid "La vidéo n'est pas encore prête."
msgstr "De video is nog niet gereed."
#: observations/templates/observations/observation_form.html:3109

View file

@ -46,53 +46,53 @@
<div class="d-flex flex-column align-items-end gap-1 ms-2">
{% if observation.observation_type == 'incident' %}
<span class="badge bg-danger">
<i class="bi bi-exclamation-triangle me-1"></i>Incident
<i class="bi bi-exclamation-triangle me-1"></i>{% translate "Incident" %}
</span>
{% elif observation.observation_type == 'inventory' %}
<span class="badge bg-secondary">
<i class="bi bi-clipboard-check me-1"></i>Inventaire
<i class="bi bi-clipboard-check me-1"></i>{% translate "Inventaire" %}
</span>
{% elif observation.observation_type == 'remark' %}
<span class="badge bg-info">
<i class="bi bi-chat-dots me-1"></i>Remarque
<i class="bi bi-chat-dots me-1"></i>{% translate "Remarque" %}
</span>
{% endif %}
{% if observation.status == 'in_preparation' %}
<span class="badge bg-secondary">
<i class="bi bi-hourglass-split me-1"></i>En préparation
<i class="bi bi-hourglass-split me-1"></i>{% translate "En préparation" %}
</span>
{% elif observation.status == 'to_process' %}
<span class="badge bg-danger">
<i class="bi bi-clock-history me-1"></i>À traiter
<i class="bi bi-clock-history me-1"></i>{% translate "À traiter" %}
</span>
{% elif observation.status == 'in_progress' %}
<span class="badge bg-warning text-dark">
<i class="bi bi-hourglass-split me-1"></i>En cours
<i class="bi bi-hourglass-split me-1"></i>{% translate "En cours" %}
</span>
{% elif observation.status == 'processed' %}
<span class="badge bg-success">
<i class="bi bi-check-circle me-1"></i>Traité
<i class="bi bi-check-circle me-1"></i>{% translate "Traité" %}
</span>
{% elif observation.status == 'not_relevant' %}
<span class="badge bg-secondary">
<i class="bi bi-slash-circle me-1"></i>Non relevant
<i class="bi bi-slash-circle me-1"></i>{% translate "Non relevant" %}
</span>
{% elif observation.status == 'to_redirect' %}
<span class="badge bg-warning text-dark">
<i class="bi bi-reply-all me-1"></i>À rediriger
<i class="bi bi-reply-all me-1"></i>{% translate "À rediriger" %}
</span>
{% elif observation.status == 'duplicate' %}
<span class="badge bg-info text-dark">
<i class="bi bi-files me-1"></i>Doublon
<i class="bi bi-files me-1"></i>{% translate "Doublon" %}
</span>
{% elif observation.status == 'closed' %}
<span class="badge bg-dark">
<i class="bi bi-check-circle-fill me-1"></i>Clôturé
<i class="bi bi-check-circle-fill me-1"></i>{% translate "Clôturé" %}
</span>
{% elif observation.status == 'archived' %}
<span class="badge bg-dark">
<i class="bi bi-archive me-1"></i>Archivé
<i class="bi bi-archive me-1"></i>{% translate "Archivé" %}
</span>
{% endif %}

View file

@ -499,7 +499,7 @@ class ObservationPermissionTests(TestCase):
detail_url = reverse("observations:observation_detail", args=[obs.id])
response = self.client.get(detail_url)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Une intervention liée à cette observation a été annulée")
self.assertContains(response, _("Une intervention liée à cette observation a été annulée"))
self.assertContains(response, "INT-TEST-CANCEL")
def test_no_auto_intervention_loop_on_cancellation(self):

View file

@ -61,7 +61,7 @@ msgstr "Interventions"
#: reporting/templates/reporting/base.html:44
#: reporting/templates/reporting/base.html:47
msgid "Observations"
msgstr "Interventions"
msgstr "Observations"
#: reporting/templates/reporting/base.html:58
#: reporting/templates/reporting/base.html:59

View file

@ -2953,7 +2953,7 @@ msgstr "Are you sure you want to cancel this crafting voucher? This action is ir
#: stock/templates/stock/mobile/stock_production_order_detail_mobile.html:299
#: stock/templates/stock/preparation_order_detail.html:1090
#: stock/templates/stock/production_order_detail.html:374
msgid "Erreur lors de l\'envoi."
msgid "Erreur lors de l'envoi."
msgstr "Error sending."
#: stock/templates/stock/mobile/stock_production_order_detail_mobile.html:308
@ -3881,7 +3881,13 @@ msgid ""
"opérations de stock ou d'intervention, mais restera accessible dans "
"l'historique.\n"
" "
msgstr "\n Are you sure you want to make the product <strong>%(name)s</strong> inactive?\n It will no longer be visible for new stock or intervention operations, but will remain accessible in the history.\n"
msgstr ""
"\n"
" Are you sure you want to make the product <strong>%(name)s</strong> "
"inactive?\n"
" It will no longer be visible for new stock or intervention operations, but "
"will remain accessible in the history.\n"
" "
#: stock/templates/stock/product_detail.html:63
#: stock/templates/stock/serialized_item_detail.html:54
@ -4008,7 +4014,7 @@ msgid "Cr<43>er le premier"
msgstr "Create the first"
#: stock/templates/stock/production_order_detail.html:61
msgid "Confirmer l\'annulation ?"
msgid "Confirmer l'annulation ?"
msgstr "Confirm cancellation?"
#: stock/templates/stock/production_order_detail.html:135
@ -4292,7 +4298,12 @@ msgid ""
" Il ne sera plus visible pour les nouvelles opérations de "
"stock, mais restera accessible dans l'historique.\n"
" "
msgstr "\n Are you sure you want to make the item <strong>%(sn)s</strong> inactive?\n It will no longer be visible for new stock transactions, but will remain accessible in the history.\n"
msgstr ""
"\n"
" Are you sure you want to make the item <strong>%(sn)s</strong> inactive?\n"
" It will no longer be visible for new stock transactions, but will remain "
"accessible in the history.\n"
" "
#: stock/templates/stock/serialized_item_detail.html:123
msgid "Ouvrir le QR code"
@ -4628,7 +4639,11 @@ msgid ""
"<strong>%(name)s</strong> ?\n"
" Cette action est irréversible.\n"
" "
msgstr "\nAre you sure you want to delete the location <strong>%(name)s</strong>?\n This action is irreversible.\n"
msgstr ""
"\n"
"Are you sure you want to delete the location <strong>%(name)s</strong>?\n"
" This action is irreversible.\n"
" "
#: stock/templates/stock/warehouse_location_form.html:16
msgid "Modifier l'emplacement"
@ -4748,14 +4763,17 @@ msgstr "Line %(n)s: source and destination locations required for a transfer."
msgid ""
"Ligne %(n)s : l'emplacement source '%(loc)s' n'est pas autorisé pour le "
"produit '%(prod)s'."
msgstr "Line %(n)s: source location required for output."
msgstr ""
"Line %(n)s: source location '%(loc)s' is not allowed for product '%(prod)s'."
#: stock/views.py:1042
#, python-format
msgid ""
"Ligne %(n)s : l'emplacement de destination '%(loc)s' n'est pas autorisé pour "
"le produit '%(prod)s'."
msgstr "Line %(n)s: destination location required for an entry."
msgstr ""
"Line %(n)s: destination location '%(loc)s' is not allowed for product "
"'%(prod)s'."
#: stock/views.py:1045
#, python-format