diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f176b90..d305c09 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -11,7 +11,7 @@ - [ ] `dotnet build Rotula.sln -c Release` and `dotnet test Rotula.sln -c Release` pass - [ ] New behavior has tests; `Rotula.Core` stays at or above 80% line coverage - [ ] Public members have XML docs and non-obvious logic has a "why" comment (in English) -- [ ] New user-visible text exists in both `Strings.en.resx` and `Strings.es.resx` +- [ ] New user-visible text exists in all four languages: `Strings.en.resx`, `Strings.es.resx`, `Strings.pt-BR.resx` and `Strings.fr-CA.resx` - [ ] No network calls or telemetry added; light theme only - [ ] New dependencies are permissively licensed and listed in `THIRD-PARTY-NOTICES.md` - [ ] `CHANGELOG.md` updated under "Unreleased" when users would notice the change diff --git a/CHANGELOG.md b/CHANGELOG.md index 77eef8b..64307b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - **A gallery of eight showcase labels** in the README (GS1-128 pallet, parcel, food, wine, lab specimen, asset tag, shelf tags with data merge, print conditions). Their `.rotula` files and the CSV data are in `docs/showcase`, and the pictures are rendered with Rotula's own PNG export by a test that only runs when `ROTULA_RENDER_SHOWCASE=1` is set. - **Text fit for wrapped text** (Properties panel, Text fit): choose what a text block does when its text is longer than the box. "Shrink to fit" uses the largest font size, between a smallest and a largest size you set, at which all the text fits; "Grow height" adds lines, up to a limit you set, so all the text shows. With data merge every record gets the size or the lines its own text needs, the canvas shows the same size that prints, and "Do not warn" hides the does-not-fit warning when cutting the text off is what you want. Labels that do not use it are saved exactly as before; a label that does cannot be opened by older versions of Rotula. - **Print an object only when you want it**: in the new Printing section of the properties, mark an object "Do not print this object" (a note or guide that never reaches the printer or an export), set "Print only when" a field equals, does not equal, contains, is empty or is not empty a value (so a warning can appear on some labels only), and "Lock position" so nothing moves it by accident. The Objects list and the canvas show small No print, Hidden and Locked badges. +- **Portuguese (Brazil) and French (Canada)**: the whole interface is now also available in Brazilian Portuguese and Canadian French (View > Language, where each language is listed in its own name), and the installer offers both. On first run Rotula follows Windows: a Portuguese desktop gets Portuguese (Brazil), a French one French (Canada), Spanish stays Spanish and anything else English. Numbers and dates follow the chosen language. A language you picked before stays as it was. The "Language of Rotula" policy (Group Policy / Intune) also accepts `pt-BR` and `fr-CA`. ### Fixed - **Windows fonts that are named after a style now draw in that style.** "Arial Black", "Segoe UI Semibold", "Segoe UI Black", "Bahnschrift Condensed" and similar names used to be replaced by the default font in the preview, PNG/PDF export and print picture; they now resolve to their parent family at the weight and width the name says. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7bd1af3..cb90710 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,8 +16,10 @@ These are product rules; changes that break them will not be merged. anonymous `GET` of the public GitHub "latest release" API a day, with nothing about the user or the computer in it. It never downloads or installs anything. Do not add other network calls, and do not add anything to that request. - **Light theme only.** -- **Spanish and English** through `.resx` resources (`src/Rotula.App/Resources/Strings.en.resx` and `Strings.es.resx`). Every new - user-visible string needs both. Core returns message keys, not text. +- **English, Spanish, Portuguese (Brazil) and French (Canada)** through `.resx` resources in `src/Rotula.App/Resources` + (`Strings.en.resx`, `Strings.es.resx`, `Strings.pt-BR.resx`, `Strings.fr-CA.resx`). Every new user-visible string needs all + four: en, es, pt-BR, fr-CA, with the same `{0}` placeholders and `_` access keys. French follows Canadian (OQLF) usage, with + a non-breaking space before `:` `;` `!` `?` and inside « ». Core returns message keys, not text. - **Permissive dependencies only** (MIT, Apache-2.0, BSD and similar). Add any new package to [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md) in the same pull request. Discuss new dependencies in an issue first. - **Plain-language messages**: say what happened and what the user can do next. diff --git a/README.es.md b/README.es.md index 581e2b2..927e541 100644 --- a/README.es.md +++ b/README.es.md @@ -177,7 +177,7 @@ salida es determinista y en ASCII puro, así que puedes versionarla, compararla | **Impresión** | Cola de Windows (RAW, incluido USB) y puerto TCP 9100, detección de DPI y papel, perfiles de impresora, etiqueta de prueba, comprobación del estado de la impresora antes y después de cada trabajo | | **Puesto de impresión** | Una pantalla bloqueada, solo para imprimir, pensada para el almacén: elige o escanea una etiqueta, responde a sus preguntas con un lector de códigos, imprime y lee la respuesta de la impresora en letra grande y palabras sencillas ([detalles](#puesto-de-impresión)) | | **Resolución** | Convierte una etiqueta entre 203, 300 y 600 dpi conservando su tamaño físico | -| **Idiomas** | Español e inglés, con cambio en vivo | +| **Idiomas** | Español, inglés, portugués (Brasil) y francés (Canadá), con cambio en vivo | --- @@ -450,8 +450,10 @@ confirmación en dos pasos. El instalador lo coloca junto a la aplicación, por ## Idiomas -La interfaz está disponible en **español** y en **inglés**. De forma predeterminada Rotula sigue el idioma de Windows, y -puedes cambiarlo en cualquier momento desde **Ver > Idioma**, sin reiniciar. El instalador también está en ambos idiomas. +La interfaz está disponible en **español**, **inglés**, **portugués (Brasil)** y **francés (Canadá)**. De forma +predeterminada Rotula sigue el idioma de Windows (cualquier portugués usa portugués de Brasil, cualquier francés usa francés +de Canadá, y un idioma que Rotula no tiene usa inglés), y puedes cambiarlo en cualquier momento desde **Ver > Idioma**, sin +reiniciar. Los números y las fechas siguen el idioma elegido. El instalador también está en los cuatro idiomas. --- diff --git a/README.md b/README.md index 73e5549..34393ef 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ deterministic and plain ASCII, so you can version it, diff it or send it with an | **Printing** | Windows spooler (RAW, including USB) and TCP port 9100, DPI and paper detection, printer profiles, test label, printer status check before and after a job | | **Print station** | A locked, print-only screen for the warehouse floor: pick or scan a label, answer its questions with a barcode scanner, print, and read the printer's answer in large plain words ([details](#print-station)) | | **Resolution** | Convert a label between 203, 300 and 600 dpi while keeping its physical size | -| **Languages** | English and Spanish, switchable live | +| **Languages** | English, Spanish, Portuguese (Brazil) and French (Canada), switchable live | --- @@ -438,8 +438,10 @@ on in `rotula-mcp.settings.json`. Printing needs a two-step confirmation. The in ## Languages -The interface is available in **English** and **Spanish**. By default Rotula follows the Windows language, and you can -switch at any time from **View > Language**, with no restart. The installer is also available in both languages. +The interface is available in **English**, **Spanish**, **Portuguese (Brazil)** and **French (Canada)**. By default Rotula +follows the Windows language (any Portuguese gets Portuguese (Brazil), any French gets French (Canada), and a language +Rotula does not have gets English), and you can switch at any time from **View > Language**, with no restart. Numbers and +dates follow the language you choose. The installer is also available in all four languages. --- diff --git a/docs/decisions.md b/docs/decisions.md index 8e98e8c..afb13e8 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -3,13 +3,22 @@ ## App (Rotula.App) ### Language switch: live update -The in-app language switch (View > Language: Same as Windows / English / Espanol) updates open windows immediately; no restart. +The in-app language switch (View > Language: Same as Windows / English / Español / Português (Brasil) / Français (Canada)) +updates open windows immediately; no restart. Each language is listed in its own language. All XAML text is bound to the indexer of `Loc` (`{loc:T Key}`), which raises `Item[]` on a change. View-models that cache translated text (property panel rows, toolbox, layers, status text) rebuild on `Loc.LanguageChanged`. The default follows the -Windows display language (Spanish if it is Spanish, English otherwise). The choice is stored in `%AppData%\Rotula\settings.json`. -Only `Strings.en.resx` and `Strings.es.resx` exist (satellite assemblies, no neutral resources), so `Loc` always asks for "en" -or "es" explicitly and falls back to English per key. `NeutralResourcesLanguage(..., Satellite)` must NOT be used: it also -redirects WPF's own XAML lookup and the application fails to start. +Windows display language: any Spanish is `es`, any Portuguese `pt-BR`, any French `fr-CA`, everything else English. The choice +is stored in `%AppData%\Rotula\settings.json` as `auto` or the culture name; settings saved as `en` or `es` keep working unchanged. +Only `Strings.en.resx`, `Strings.es.resx`, `Strings.pt-BR.resx` and `Strings.fr-CA.resx` exist (satellite assemblies, no neutral +resources), so `Loc` always asks for one of `Loc.SupportedLanguages` by its full culture name and falls back to English per key. +Numbers and dates in UI text are formatted with that culture (decimal comma in es, pt-BR and fr-CA). +`NeutralResourcesLanguage(..., Satellite)` must NOT be used: it also redirects WPF's own XAML lookup and the application fails +to start. +- **One variant per language**: Brazilian Portuguese and Canadian French are the ones shipped; a Portugal or France desktop gets + them rather than English. The French follows Quebec usage (OQLF): "courriel", and a non-breaking space before `:` `;` `!` `?` + and inside « ». Technical tokens (ZPL commands, GS1 AIs, file extensions, the product name) are never translated. +- **Parity is tested**: every `Strings.*.resx` must have exactly the English keys, no empty value and the same `{n}` + placeholders per key, so a new language or a new key cannot ship half done. ### Core messages Core only returns `ValidationIssue.MessageKey` + args. The UI looks up `Issue.`; args that are keywords diff --git a/docs/deployment.md b/docs/deployment.md index 11b972c..03c08b5 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -98,7 +98,7 @@ Other switches: | `/DIR="D:\Apps\Rotula"` | Install folder | | `/TASKS="associate"` | Choose the tasks; leave `associate` out to skip the `.rotula` association | | `/MERGETASKS="desktopicon"` | Also add a desktop icon (off by default) | -| `/LANG=spanish` | Language of the installer itself (`english` or `spanish`) | +| `/LANG=spanish` | Language of the installer itself (`english`, `spanish`, `brazilianportuguese` or `french`) | | `/CURRENTUSER` | Force a per-user install even when run elevated | The licence page is accepted automatically by `/VERYSILENT`, so the same note about the licence terms applies as for the MSI. @@ -209,14 +209,14 @@ choice is kept in `settings.json` for the day the policy is removed. The MCP ser | Policy (template name) | Registry value | Type | Values | Effect | |---|---|---|---|---| -| Language of Rotula | `Language` | REG_SZ | `auto`, `en`, `es` | Sets the language and disables **View > Language**. `auto` follows the Windows display language | +| Language of Rotula | `Language` | REG_SZ | `auto`, `en`, `es`, `pt-BR`, `fr-CA` | Sets the language and disables **View > Language**. `auto` follows the Windows display language (any Portuguese gets `pt-BR`, any French `fr-CA`). Case does not matter | | Check for updates | `UpdateCheck` | REG_DWORD | `1` on, `0` off | Switches the daily update check on or off and disables **Help > Check for updates once a day**. Not set: each user decides (off until they switch it on) | | Default printer | `DefaultPrinter` | REG_SZ | A Windows printer name | Preselected in the Print dialog until the user picks a printer. Not locked; ignored quietly if the printer is not installed | | Allow data source add-ons from the user's folder | `UserAddOns` | REG_DWORD | `0` blocks | Add-ons in `%AppData%\Rotula\packs` are neither loaded nor offered for approval; the installed `packs` folder still works ([data-providers.md](data-providers.md)) | | Allow the MCP server to print | `McpPrinting` | REG_DWORD | `0` blocks | The MCP server refuses every print request, whatever its settings file says | | Allow the MCP server to read databases | `McpDatabase` | REG_DWORD | `0` blocks | The MCP server refuses every database query | -A value that Rotula does not understand (a language other than the three above, a number other than 0 or 1) is ignored, so +A value that Rotula does not understand (a language other than the five values above, a number other than 0 or 1) is ignored, so a typo never forces a wrong setting on users. The MCP policies can only take something away: setting them to `1` does not switch printing or database access on; the MCP server's own settings file still has to allow it ([mcp.md](mcp.md)). diff --git a/packaging/installer/Rotula.iss b/packaging/installer/Rotula.iss index 6b3c743..b920853 100644 --- a/packaging/installer/Rotula.iss +++ b/packaging/installer/Rotula.iss @@ -64,6 +64,9 @@ VersionInfoProductVersion={#AppVersionNumeric} [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "spanish"; MessagesFile: "compiler:Languages\Spanish.isl" +; The same four languages as the application (Loc.SupportedLanguages). Both files ship with Inno Setup itself. +Name: "brazilianportuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl" +Name: "french"; MessagesFile: "compiler:Languages\French.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked diff --git a/packaging/policies/Rotula.admx b/packaging/policies/Rotula.admx index f0f341e..7afbe67 100644 --- a/packaging/policies/Rotula.admx +++ b/packaging/policies/Rotula.admx @@ -38,6 +38,12 @@ es + + pt-BR + + + fr-CA + diff --git a/packaging/policies/en-US/Rotula.adml b/packaging/policies/en-US/Rotula.adml index 2283b0e..592b070 100644 --- a/packaging/policies/en-US/Rotula.adml +++ b/packaging/policies/en-US/Rotula.adml @@ -12,14 +12,16 @@ Language of Rotula Sets the language of Rotula and locks it: View > Language is disabled and says "Managed by your organization". -"Same as Windows" uses Spanish when the Windows display language is Spanish and English otherwise. +"Same as Windows" uses Spanish when the Windows display language is Spanish, Portuguese (Brazil) when it is any Portuguese, French (Canada) when it is any French, and English otherwise. Not configured or disabled: each user chooses the language. -Registry value: Language (text: auto, en or es). +Registry value: Language (text: auto, en, es, pt-BR or fr-CA). Same as Windows English Spanish + Portuguese (Brazil) + French (Canada) Check for updates Controls the daily update check and locks the choice (Help > Check for updates once a day). diff --git a/packaging/policies/es-ES/Rotula.adml b/packaging/policies/es-ES/Rotula.adml index e6fa9d4..c7af7d2 100644 --- a/packaging/policies/es-ES/Rotula.adml +++ b/packaging/policies/es-ES/Rotula.adml @@ -12,14 +12,16 @@ Idioma de Rotula Fija el idioma de Rotula y lo bloquea: Ver > Idioma queda desactivado e indica "Administrado por tu organización". -"Igual que Windows" usa el español cuando el idioma de presentación de Windows es español, y el inglés en los demás casos. +"Igual que Windows" usa el español cuando el idioma de presentación de Windows es español, el portugués (Brasil) cuando es cualquier portugués, el francés (Canadá) cuando es cualquier francés, y el inglés en los demás casos. Sin configurar o deshabilitada: cada usuario elige el idioma. -Valor del registro: Language (texto: auto, en o es). +Valor del registro: Language (texto: auto, en, es, pt-BR o fr-CA). Igual que Windows Inglés Español + Portugués (Brasil) + Francés (Canadá) Buscar actualizaciones Controla la búsqueda diaria de actualizaciones y bloquea la opción (Ayuda > Buscar actualizaciones una vez al día). diff --git a/src/Rotula.App/AssemblyInfo.cs b/src/Rotula.App/AssemblyInfo.cs index 379c50e..640412f 100644 --- a/src/Rotula.App/AssemblyInfo.cs +++ b/src/Rotula.App/AssemblyInfo.cs @@ -9,7 +9,7 @@ // app, or any theme specific resource dictionaries) )] -// The UI text lives in satellite assemblies (Strings.en.resx / Strings.es.resx) and Loc always asks for "en" or "es" -// explicitly, so no neutral-language attribute is used: NeutralResourcesLanguage(..., Satellite) would also redirect WPF's +// The UI text lives in satellite assemblies (Strings.en / es / pt-BR / fr-CA .resx) and Loc always asks for one of those +// cultures explicitly, so no neutral-language attribute is used: NeutralResourcesLanguage(..., Satellite) would also redirect WPF's // own XAML resource lookup to a satellite and the application would fail to start. [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Rotula.Tests")] diff --git a/src/Rotula.App/Localization/Loc.cs b/src/Rotula.App/Localization/Loc.cs index e35590b..26953db 100644 --- a/src/Rotula.App/Localization/Loc.cs +++ b/src/Rotula.App/Localization/Loc.cs @@ -6,14 +6,18 @@ namespace Rotula.App.Localization; /// -/// The application's translator. Every piece of UI text comes from Resources/Strings.en.resx or Strings.es.resx through -/// this class. XAML binds to the indexer ({loc:T Key}), so switching the language updates the open windows at once +/// The application's translator. Every piece of UI text comes from one of the Resources/Strings.<language>.resx files +/// (en, es, pt-BR, fr-CA) through this class. XAML binds to the indexer ({loc:T Key}), so switching the language updates the open windows at once /// (the "live" option, see docs/decisions.md). /// public sealed class Loc : INotifyPropertyChanged { - /// Language codes the application ships. - public static readonly string[] SupportedLanguages = { "en", "es" }; + /// + /// Culture names of the languages the application ships, English (the reference) first. Each has a + /// Resources/Strings.<name>.resx file. Full names, not two-letter codes: the Portuguese is Brazilian and the French is + /// Canadian, and their number and date formats follow those regions. + /// + public static readonly string[] SupportedLanguages = { "en", "es", "pt-BR", "fr-CA" }; private readonly ResourceManager _resources = new("Rotula.App.Resources.Strings", typeof(Loc).Assembly); private CultureInfo _culture = CultureInfo.GetCultureInfo("en"); @@ -24,11 +28,11 @@ public sealed class Loc : INotifyPropertyChanged /// public event PropertyChangedEventHandler? PropertyChanged; - /// The language currently shown (always "en" or "es"). + /// The language currently shown (always one of ). public CultureInfo Culture => _culture; - /// Two-letter code of the language currently shown. - public string LanguageCode => _culture.TwoLetterISOLanguageName; + /// Culture name of the language currently shown, as listed in ("en", "pt-BR"...). + public string LanguageCode => _culture.Name; /// /// Translates a key. A key that is missing in the current language falls back to English; a key missing everywhere is @@ -66,14 +70,24 @@ private string Lookup(string key) => } /// - /// Picks the language: "en" or "es" explicitly, or (for "auto" or anything unknown) the Windows display language - /// when it is Spanish, English otherwise. + /// Picks the language: one of when the setting names it, or (for "auto" or anything + /// unknown) the closest match to the Windows display language: any Spanish is "es", any Portuguese "pt-BR", any French + /// "fr-CA", and everything else English. /// public static string ResolveLanguage(string? setting, CultureInfo? windowsUiCulture = null) { - if (setting is "en" or "es") return setting; + // Settings saved before pt-BR and fr-CA existed hold "en", "es" or "auto"; they keep meaning the same thing. + var chosen = SupportedLanguages.FirstOrDefault(l => string.Equals(l, setting, StringComparison.OrdinalIgnoreCase)); + if (chosen is not null) return chosen; var ui = windowsUiCulture ?? CultureInfo.CurrentUICulture; - return ui.TwoLetterISOLanguageName.Equals("es", StringComparison.OrdinalIgnoreCase) ? "es" : "en"; + // One translation per language: a pt-PT or fr-FR desktop is far better served by pt-BR or fr-CA than by English. + return ui.TwoLetterISOLanguageName.ToLowerInvariant() switch + { + "es" => "es", + "pt" => "pt-BR", + "fr" => "fr-CA", + _ => "en", + }; } /// Switches the language and tells every binding to refresh. diff --git a/src/Rotula.App/MainWindow.xaml b/src/Rotula.App/MainWindow.xaml index 5ad68ed..810f837 100644 --- a/src/Rotula.App/MainWindow.xaml +++ b/src/Rotula.App/MainWindow.xaml @@ -215,6 +215,8 @@ + + diff --git a/src/Rotula.App/Resources/Strings.es.resx b/src/Rotula.App/Resources/Strings.es.resx index 1250821..ad3dd70 100644 --- a/src/Rotula.App/Resources/Strings.es.resx +++ b/src/Rotula.App/Resources/Strings.es.resx @@ -734,7 +734,7 @@ Mostrar cuadrícula - _Ayuda + Ay_uda Importar ZPL... diff --git a/src/Rotula.App/Resources/Strings.fr-CA.resx b/src/Rotula.App/Resources/Strings.fr-CA.resx new file mode 100644 index 0000000..bdad7cb --- /dev/null +++ b/src/Rotula.App/Resources/Strings.fr-CA.resx @@ -0,0 +1,6261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Cliquez sur un élément pour le sélectionner. Faites-le glisser pour le déplacer. Les touches fléchées déplacent la sélection d’un point ; avec Maj, de huit points. Appuyez sur Suppr pour le supprimer. + + + Zone de conception + + + Annuler + + + Créer + + + Rotula n’a pas pu démarrer. Rien n’a été modifié. Les détails ont été enregistrés dans {0}. Veuillez signaler le problème en joignant ce fichier. + + + Un problème inattendu est survenu lors de la dernière action. Votre étiquette est toujours ouverte ; par précaution, enregistrez-la sous un autre nom. Les détails ont été enregistrés dans {0}. + + + L’exportation a échoué + + + L’exportation s’est terminée avec des avertissements + + + Corrigez d’abord les erreurs + + + L’étiquette contient des erreurs ; elle ne peut donc pas encore être convertie en ZPL ni imprimée. Corrigez ces problèmes et réessayez : + + + L’image n’a pas pu être utilisée + + + Le ZPL n’a pas pu être importé + + + Certaines parties n’ont pas été importées + + + Format de l’étiquette + + + Nouvelle étiquette + + + Le fichier n’a pas pu être ouvert + + + L’étiquette n’a pas été imprimée + + + « {0} » contient des modifications non enregistrées. Voulez-vous d’abord les enregistrer ? + + + Modifications non enregistrées + + + L’étiquette n’a pas pu être enregistrée + + + Sans titre + + + Rectangle + + + Cercle + + + Champ de données + + + Exemple + + + Texte + + + Image + + + Ligne + + + Texte + + + Windows Latin-1 (1252) + + + Page de codes 850 (anciennes imprimantes) + + + UTF-8 (recommandé) + + + Code 128 + + + Code 39 + + + Code 93 + + + Data Matrix + + + EAN-13 + + + 2 parmi 5 entrelacé + + + PDF417 + + + Code QR + + + UPC-A + + + Automatique + + + EAN-128 + + + Aucun + + + Mode UCC + + + Coin supérieur gauche (^FO) + + + Ligne de base / coin inférieur gauche (^FT) + + + 180° (à l’envers) + + + 0° (normal) + + + 270° dans le sens horaire + + + 90° dans le sens horaire + + + Noir + + + Blanc + + + Au-dessus des barres + + + Sous les barres + + + Floyd-Steinberg (photos) + + + Tramage ordonné + + + Seuil fixe + + + À l’envers + + + Normale + + + Points + + + Pouces + + + Millimètres + + + Horizontale + + + Verticale + + + Continu + + + Marque noire + + + Détection d’espacement + + + Thermique directe + + + Transfert thermique (ruban) + + + 203 ppp + + + 300 ppp + + + 600 ppp + + + Élevée (30 %) + + + Faible (7 %) + + + Moyenne (15 %) + + + Quartile (25 %) + + + Centré + + + Justifié + + + Gauche + + + Droite + + + {0} est endommagé ou a été modifié à la main et ne peut pas être lu. Ouvrez une copie de sauvegarde si vous en avez une. + + + {0} a été enregistré par une version plus récente de Rotula (format de fichier {1}). Mettez Rotula à jour pour l’ouvrir. + + + {0} n’est pas un fichier d’étiquette Rotula. Choisissez un fichier dont le nom se termine par .rotula. + + + {0} n’a pas pu être lu. Vérifiez que le fichier existe toujours et que vous avez le droit de l’ouvrir. + + + Le fichier {0} n’a pas pu être écrit. Vérifiez que le dossier existe, qu’il reste de l’espace libre sur le disque et que vous avez le droit d’y écrire, puis réessayez ou choisissez un autre emplacement. + + + Tous les fichiers + + + Images + + + Document PDF + + + Image JPEG + + + Image PNG + + + Étiquettes Rotula + + + Fichiers ZPL + + + {0} n’est pas une image que Rotula peut lire. Choisissez un fichier PNG, JPG, BMP ou GIF. + + + Le ZPL n’a pas pu être interprété. Vérifiez que le fichier contient une étiquette qui commence par ^XA et se termine par ^XZ. + + + L’importation de ZPL n’est pas encore offerte dans cette version. Vous pouvez tout de même concevoir l’étiquette ici et en exporter le ZPL. + + + Ligne {0} : {1} + + + le nom du compteur est absent ou non valide (utilisez des lettres, des chiffres et des traits de soulignement) + + + le remplissage par des zéros doit être compris entre 0 et 18 + + + la valeur de départ n’est pas valide + + + pair + + + impair + + + Le Code 128 ne peut encoder que les caractères standard du clavier. Retirez les accents et les symboles spéciaux des données. + + + Le caractère {0} ne peut pas être utilisé dans les données Code 128, car l’imprimante le lit comme une commande. Retirez-le. + + + Le Code 39 n’accepte que les lettres majuscules, les chiffres et - . espace $ / + %. Modifiez les données pour n’utiliser que ces caractères. + + + Le Code 93 ne peut encoder que les caractères standard du clavier. Retirez les accents et les symboles spéciaux des données. + + + Le nombre de colonnes doit être compris entre {0} et {1}. + + + Le code à barres ne contient aucune donnée. Tapez le texte ou le nombre à encoder. + + + Les données Data Matrix sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Ce type de code à barres n’accepte que des chiffres (0 à 9). Retirez les lettres ou les symboles. + + + Le dernier chiffre n’est pas le bon chiffre de contrôle EAN-13. Il devrait être {0} ; sinon, retirez le dernier chiffre et laissez l’imprimante l’ajouter. + + + L’EAN-13 nécessite {0} chiffres (le chiffre de contrôle est ajouté pour vous) ou {1} chiffres, chiffre de contrôle compris. + + + La hauteur des barres doit être comprise entre {0} et {1} points. + + + Le 2 parmi 5 entrelacé nécessite un nombre {0} de chiffres avec ce réglage de chiffre de contrôle. Ajoutez ou retirez un chiffre, ou modifiez l’option du chiffre de contrôle. + + + La taille du module doit être comprise entre {0} et {1} points. + + + La largeur de la barre étroite doit être comprise entre {0} et {1} points. + + + Le niveau de sécurité PDF417 doit être compris entre {0} et {1}. + + + Les données PDF417 sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Le modèle QR doit être 1 ou 2. Choisissez 2, à moins que votre lecteur n’exige l’ancien modèle. + + + Les données du code QR sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Le nombre de rangées doit être 0 (automatique) ou compris entre {0} et {1}. + + + Ce type de code à barres n’est pas pris en charge. Choisissez un autre type. + + + Le dernier chiffre n’est pas le bon chiffre de contrôle UPC-A. Il devrait être {0} ; sinon, retirez le dernier chiffre et laissez l’imprimante l’ajouter. + + + L’UPC-A nécessite {0} chiffres (le chiffre de contrôle est ajouté pour vous) ou {1} chiffres, chiffre de contrôle compris. + + + Le rapport entre barre large et barre étroite doit être compris entre {0} et {1}. + + + Cet élément dépasse de l’étiquette ; une partie ne sera donc pas imprimée. Déplacez-le à l’intérieur de l’étiquette. + + + La position doit être comprise entre {0} et {1} points. Déplacez l’élément à l’intérieur de l’étiquette. + + + Le type d’élément {0} ne peut pas être converti en ZPL. Supprimez-le. + + + Erreur : + + + La hauteur de la police doit être comprise entre {0} et {1} points. + + + Le diamètre du cercle doit être compris entre {0} et {1} points. + + + L’arrondi des coins doit être compris entre {0} et {1}. + + + La taille et l’épaisseur doivent être comprises entre {0} et {1} points. + + + La taille de l’image n’est pas valide (largeur jusqu’à {0} points, hauteur jusqu’à {1} points). Réduisez l’image. + + + Cette image ne contient aucune illustration. Choisissez un fichier image dans les propriétés. + + + Le seuil doit être compris entre {0} et {1}. + + + Certaines barres ressemblent à un code à barres dessiné avec des lignes. Vérifiez cette partie de l’étiquette. + + + Ce Code 128 utilise des codes d’invocation (>), qui sont conservés tels qu’ils ont été saisis. + + + Le niveau de qualité Data Matrix {0} n’est pas pris en charge et a été ignoré. + + + Ce code QR utilise le mode de caractères manuel, qui est conservé tel qu’il a été saisi. + + + La commande {0} n’est pas reconnue par le concepteur. Elle a été conservée en ZPL brut et sera imprimée sans modification. + + + L’encodage des caractères passe à ^CI{0} en cours de route. Le texte qui suit est lu avec cet encodage. + + + Le jeu de caractères ^CI{0} est un jeu national et n’a été qu’approximé. + + + La réaffectation de caractères dans ^CI est ignorée. + + + Le jeu de caractères ^CI{0} n’est pas pris en charge ; certains caractères pourraient donc mal s’afficher. + + + Un champ n’a pas de ^FS à la fin. Il a été fermé automatiquement. + + + Le fichier n’a pas pu être lu ({0}). Vérifiez qu’il existe et que vous avez le droit de l’ouvrir. + + + L’étiquette utilise une police personnalisée (^A@). L’aperçu utilise une police de remplacement. + + + Un graphique utilise le format {0}, qui n’est pas pris en charge. Il a été conservé en ZPL brut. + + + Un graphique contient des données non valides ou est trop volumineux (total de {0} octets ; la limite est de 16 Mo par fichier). Il a été conservé en ZPL brut. + + + Un graphique contient moins de données qu’il n’en déclare. Il a été importé jusqu’où les données le permettent. + + + L’enregistrement d’une image dans l’imprimante (^IS {0}) n’est pas pris en charge. Il a été conservé en ZPL brut. + + + Une partie du fichier n’a pas pu être interprétée ({0}). Le reste a été importé. + + + L’origine de l’étiquette (^LH) arrive après certains champs ; elle ne s’applique donc qu’à ce qui suit. + + + Le fichier contient {0} étiquettes. Seule la première a été ouverte. + + + Un deuxième ^XA commence avant la fin de l’étiquette précédente. + + + L’étiquette n’a pas de ^XZ à la fin. Elle a été fermée automatiquement. + + + La longueur de l’étiquette (^LL) est absente ; une longueur a donc été estimée. Vérifiez-la dans les propriétés de l’étiquette. + + + Le fichier ne commence pas par ^XA. Il a quand même été lu comme une seule étiquette. + + + La largeur de l’étiquette (^PW) est absente ; une largeur a donc été estimée. Vérifiez-la dans les propriétés de l’étiquette. + + + Un ^XZ sans ^XA correspondant a été ignoré. + + + {0} a une valeur non valide ({1}) ; la valeur par défaut a donc été utilisée. + + + {0} a une valeur hors plage ({1}) ; elle a donc été ignorée. + + + Une commande brute contient des caractères qui ne sont pas de l’ASCII simple. Vérifiez qu’elle s’imprime correctement. + + + Le fichier rappelle le format stocké {0}, qui se trouve dans l’imprimante et ne peut pas être affiché ici. + + + Le fichier rappelle le graphique stocké {0}, qui se trouve dans l’imprimante et ne peut pas être affiché ici. + + + Le fichier rappelle l’image stockée {0}, qui se trouve dans l’imprimante et ne peut pas être affichée ici. + + + {0} a été approximé par {1}. + + + Le réglage {0} n’est pas pris en charge par le concepteur. Il a été conservé en ZPL brut. + + + Le stockage d’un format dans l’imprimante (^DF {0}) n’est pas pris en charge. Il a été conservé en ZPL brut. + + + Une partie du texte n’a pas pu être décodée avec {0}. Vérifiez les lettres accentuées. + + + Du texte situé hors de tout champ a été ignoré : {0} + + + Les positions ont été converties depuis des unités {0} (facteur {1}). + + + La hauteur de l’étiquette doit être comprise entre {0} et {1} points. Modifiez la hauteur dans les propriétés de l’étiquette. + + + La largeur de l’étiquette doit être comprise entre {0} et {1} points. Modifiez la largeur dans les propriétés de l’étiquette. + + + La colonne de données {0} n’est pas utilisée par l’étiquette. + + + La colonne des copies {0} est introuvable dans les données. Choisissez une colonne existante. + + + Le nombre de copies ({0}) n’est pas valide. Utilisez un nombre entier égal ou supérieur à 0. + + + Le compteur {0} a un réglage non valide ({1}). + + + le nom du compteur est absent ou non valide (utilisez des lettres, des chiffres et des traits de soulignement) + + + Le compteur {0} a dépassé sa valeur maximale. + + + le remplissage par des zéros doit être compris entre 0 et 18 + + + la valeur de départ n’est pas valide + + + Une valeur entre guillemets du fichier de données a un guillemet ouvrant, mais pas de guillemet fermant ; les dernières valeurs pourraient donc être erronées. Corrigez les guillemets dans le fichier et chargez-le de nouveau. + + + La variable {0} est associée à la colonne {1}, qui ne figure pas dans les données. + + + La variable {0} de l’étiquette n’a aucune colonne correspondante dans les données. + + + Une ligne de données n’a pas pu être fusionnée ({0}). Vérifiez cette ligne dans le fichier de données. + + + Le nombre avant pause doit être compris entre {0} et {1}. + + + Le nombre de copies doit être compris entre {0} et {1}. + + + Le nombre de répliques doit être compris entre {0} et {1}. + + + Le nombre maximal de lignes doit être compris entre {0} et {1}. + + + La largeur du bloc de texte doit être comprise entre {0} et {1} points. + + + Le caractère {0} ne peut pas être imprimé avec l’encodage de caractères choisi. Choisissez UTF-8 dans les propriétés de l’étiquette ou retirez le caractère. + + + Problème détecté ({0}). Vérifiez les réglages de cet élément. + + + La variable {0} n’est pas déclarée. Ajoutez-la aux variables de l’étiquette ou corrigez son nom. + + + Avertissement : + + + Descendre + + + Monter + + + À propos de Rotula + + + Aligner + + + En bas + + + Centrer horizontalement + + + Centrer verticalement + + + À gauche + + + À droite + + + En haut + + + _Organiser + + + Avancer d’un niveau + + + Mettre au premier plan + + + Copier + + + Couper + + + Supprimer + + + Répartir + + + Horizontalement + + + Verticalement + + + Dupliquer + + + É_dition + + + Quitter + + + Exporter + + + Document PDF... + + + Image JPEG... + + + Image PNG... + + + Fichier ZPL... + + + _Fichier + + + Afficher la grille + + + A_ide + + + Importer du ZPL... + + + Langue + + + Comme Windows + + + Menu principal + + + Nouvelle... + + + Ouvrir... + + + Coller + + + Imprimer... + + + Ouvrir un fichier récent + + + Rétablir + + + Rétablir {0} + + + Faire pivoter de 90° dans le sens antihoraire + + + Faire pivoter de 90° dans le sens horaire + + + Enregistrer + + + Enregistrer sous... + + + Tout sélectionner + + + Sélectionner l’élément suivant + + + Sélectionner l’élément précédent + + + Reculer d’un niveau + + + Mettre en arrière-plan + + + Aligner sur la grille + + + Aligner sur les repères + + + Annuler + + + Annuler {0} + + + Points + + + Pouces + + + Millimètres + + + Unités des règles + + + _Affichage + + + Taille réelle (100 %) + + + Ajuster l’étiquette à la fenêtre + + + Zoom avant + + + Zoom arrière + + + Code à barres + + + Valeurs par défaut et imprimante + + + {0} + + + Image + + + Étiquette + + + Calques + + + Marges (points) + + + {0} éléments sont sélectionnés. Déplacez-les, alignez-les ou organisez-les ensemble, ou sélectionnez un seul élément pour modifier ses propriétés. + + + Position + + + Tâche d’impression + + + Propriétés + + + Sélection + + + Forme + + + Format de l’étiquette + + + Texte + + + Éléments + + + Variables + + + Code ZPL (lecture seule) + + + 100 x 150 mm + + + 100 x 50 mm + + + 2 x 1 po + + + 4 x 3 po + + + 4 x 6 po + + + Format personnalisé + + + L’aperçu est approximatif : le texte est dessiné avec une police de remplacement ; la forme des lettres et les retours à la ligne peuvent donc différer légèrement sur l’étiquette imprimée. + + + Remarque : l’aperçu est approximatif + + + L’étiquette n’a pas de format valide ; elle ne peut donc pas être dessinée. Indiquez une largeur et une hauteur supérieures à zéro dans les propriétés de l’étiquette. + + + L’étiquette est trop grande pour être dessinée à ce niveau de zoom. Faites un zoom arrière et réessayez. + + + L’étiquette n’a pas pu être imprimée. Vérifiez la connexion de l’imprimante et réessayez. + + + Hauteur des barres (points) + + + Retour à la ligne automatique (ajuster le texte dans un cadre) + + + Alignement + + + Retrait négatif (points) + + + Interligne supplémentaire (points) + + + Nombre maximal de lignes + + + Largeur du cadre (points) + + + Ajouter un chiffre de contrôle + + + Choisir une autre image... + + + Mode Code 128 + + + Couleur + + + Colonnes (0 = automatique) + + + Arrondi des coins (0 à 8) + + + Données (utilisez {{nom}} pour les variables) + + + Hauteur de police par défaut (points) + + + Largeur de police par défaut (points) + + + Rotation par défaut + + + Diamètre (points) + + + Direction + + + Conversion en noir et blanc + + + Résolution de l’imprimante (ppp) + + + Encodage des caractères + + + Hauteur de la police (points) + + + Police (laisser vide pour utiliser celle de l’étiquette) + + + Une seule lettre ou un seul chiffre. 0 est la police vectorielle. + + + Largeur de la police (points, 0 = automatique) + + + Hauteur (points) + + + Imprimer le texte avec les barres + + + Position du texte + + + Laissez vide pour utiliser la valeur par défaut de l’étiquette. + + + Inverser le noir et le blanc + + + Hauteur + + + Unité + + + Largeur + + + Longueur (points) + + + Bas + + + Gauche + + + Droite + + + Haut + + + Détection du support + + + Type de support + + + Taille du module (points) + + + Largeur de la barre étroite (points) + + + Nom + + + Orientation d’impression + + + La position correspond à + + + Le coin supérieur gauche, ou la ligne de base du texte / le coin inférieur gauche. + + + Pause toutes les N étiquettes (0 = jamais) + + + Niveau de sécurité (1 à 8) + + + PDF417 compact (tronqué) + + + Correction d’erreurs + + + Modèle QR (1 ou 2) + + + Copies + + + Répliques de chaque numéro de série + + + Impression inversée (inverse ce qui se trouve dessous) + + + Rotation + + + Valeur de l’étiquette + + + Rangées (0 = automatique) + + + Type de code à barres + + + Texte + + + Épaisseur du trait (points) + + + Seuil (0 à 255) + + + Nom de la variable + + + Variables (une par ligne : nom=valeur d’exemple) + + + Pour utiliser une variable dans un texte ou dans les données d’un code à barres, écrivez {{nom}}. + + + Rapport large/étroite (2,0 à 3,0) + + + Largeur (points) + + + X (points) + + + Y (points) + + + Règle horizontale + + + Règle verticale + + + Redimensionner le panneau des calques + + + Ajouté : {0} + + + Barre d’état + + + Exporté : {0} + + + Importé : {0}. Enregistrez l’étiquette pour la conserver. + + + {0} éléments sélectionnés + + + Nouvelle étiquette créée + + + Aucun problème détecté + + + Aucune sélection + + + Il n’y a rien à coller. Copiez d’abord un élément. + + + 1 élément sélectionné + + + Ouvert : {0} + + + Envoyé à l’imprimante + + + {0} erreurs, {1} avertissements + + + Enregistré : {0} + + + Sélectionné : {0} + + + Zoom + + + ZPL copié dans le presse-papiers + + + Le code ZPL n’a pas pu être créé + + + Code à barres + + + Rectangle + + + Cercle + + + Champ de données + + + Image + + + Ligne + + + Code QR + + + Texte + + + Barre d’édition + + + Barre Fichier + + + Barre Affichage + + + l’ajout + + + l’alignement + + + l’avancement d’un niveau + + + la mise au premier plan + + + la suppression + + + la répartition + + + la duplication + + + les réglages de l’étiquette + + + le déplacement + + + le collage + + + la modification de propriété + + + la réorganisation + + + le redimensionnement + + + la rotation + + + le recul d’un niveau + + + la mise en arrière-plan + + + La police doit être une seule lettre ou un seul chiffre. + + + Le format de l’étiquette n’est pas valide. La largeur peut être d’au plus {0} points et la hauteur d’au plus {1} points. Tapez un format plus petit. + + + Ce n’est pas un nombre entier. Tapez uniquement des chiffres, par exemple 120. + + + Ce n’est pas un nombre. Tapez un nombre comme 12,5. + + + La valeur doit être comprise entre {0} et {1}. Tapez une valeur dans cette plage. + + + Cette case ne peut pas être vide. Tapez un nombre. + + + Le texte est trop long. Utilisez au plus {0} caractères. + + + Chaque ligne doit avoir la forme nom=valeur. Les noms peuvent contenir des lettres, des chiffres et des traits de soulignement, et chaque nom ne peut apparaître qu’une fois. + + + Copier le ZPL + + + Fermer + + + Arrêter + + + Arrêté. Rien de plus n’a été fait. + + + Un problème inattendu est survenu ({0}). Rien n’a été modifié ; réessayez. + + + Windows n’a aucune imprimante nommée « {0} ». Actualisez la liste des imprimantes et choisissez-en une autre, ou vérifiez que l’imprimante est installée. + + + Vous n’avez pas l’autorisation d’imprimer sur « {0} ». Demandez l’accès à votre administrateur ou choisissez une autre imprimante. + + + L’imprimante « {0} » est hors ligne. Allumez-la, vérifiez le câble et assurez-vous qu’elle n’est pas en pause, puis réessayez. + + + L’imprimante à l’adresse {0}:{1} n’a pas répondu à temps. Vérifiez qu’elle est allumée et sur le même réseau, puis réessayez. + + + L’appareil à l’adresse {0}:{1} a refusé la connexion. Vérifiez le port (la plupart des imprimantes d’étiquettes utilisent le 9100) et que le port réseau de l’imprimante est activé. + + + Impossible de joindre {0}:{1}. Vérifiez l’adresse, le câble réseau ou le Wi-Fi, et que l’imprimante est allumée. + + + L’impression a été annulée. Rien de plus n’a été envoyé. + + + L’étiquette contient des erreurs ; rien n’a donc été envoyé. Corrigez les problèmes ci-dessous et réessayez. + + + Les réglages de l’imprimante sont hors plage ; rien n’a donc été envoyé. Corrigez les valeurs et réessayez. + + + L’étiquette contient des caractères que le jeu de caractères {0} ne peut pas imprimer. Changez le jeu de caractères de l’étiquette pour UTF-8 ou retirez ces caractères. + + + L’impression par les imprimantes Windows n’est offerte que sous Windows. Utilisez une imprimante réseau ou enregistrez plutôt le fichier ZPL. + + + L’imprimante a signalé un problème inattendu ({0}). Vérifiez la connexion et réessayez, ou enregistrez le fichier ZPL et envoyez-le autrement. + + + Le contraste doit être un nombre de 0 à 30. Modifiez-le, ou laissez-le vide pour conserver le réglage de l’imprimante. + + + La vitesse doit être un nombre de 1 à 14 pouces par seconde. Modifiez-la, ou laissez-la vide pour conserver le réglage de l’imprimante. + + + La largeur de l’étiquette est hors plage : elle doit être comprise entre 1 et 9999 points à la résolution choisie. Vérifiez la largeur et la résolution (ppp). + + + La hauteur de l’étiquette est hors plage : elle doit être comprise entre 1 et 32000 points à la résolution choisie. Vérifiez la hauteur et la résolution (ppp). + + + Imprimer + + + Choisissez une imprimante, vérifiez ses réglages et imprimez l’étiquette. + + + Imprimante + + + Configuration de l’imprimante + + + Imprimante Windows (USB ou installée) + + + Imprimante réseau (TCP/IP) + + + Imprimante + + + Actualiser la liste des imprimantes + + + Recherche des imprimantes + + + Aucune imprimante n’est installée dans Windows. Installez le pilote de l’imprimante, ou passez à une imprimante réseau et entrez son adresse. + + + L’imprimante « {0} » utilisée la dernière fois n’est pas installée sur cet ordinateur. Choisissez une autre imprimante. + + + (par défaut) + + + (hors ligne) + + + Nom d’hôte ou adresse IP + + + Port + + + Résolution + + + Détection du support + + + Largeur de l’étiquette (mm) + + + Hauteur de l’étiquette (mm) + + + Contraste (0-30) + + + Vitesse (1-14 po/s) + + + Laissez le contraste et la vitesse vides pour conserver les réglages enregistrés dans l’imprimante. + + + Copies + + + Imprimer + + + Enregistrer en ZPL... + + + Imprimer une étiquette d’essai + + + Imprime une petite étiquette d’exemple pour vérifier la connexion, la largeur et les accents. + + + L’étiquette contient des erreurs et ne peut pas encore être imprimée : + + + L’étiquette sera imprimée avec les valeurs de l’enregistrement affiché dans la zone de conception. + + + Enregistrements à imprimer + + + Cochez les enregistrements à imprimer. Chaque enregistrement coché imprime sa propre étiquette, dans l’ordre des données, avec l’imprimante et le nombre de copies choisis ici. + + + Aucun enregistrement n’est coché ; il n’y a donc rien à imprimer. Cochez au moins un enregistrement dans la liste ci-dessus. + + + La fenêtre Données définit les copies de chaque enregistrement ; ce réglage remplace donc ce nombre. + + + Envoi de l’étiquette à l’imprimante... + + + Envoi de l’étiquette d’essai... + + + Enregistrement du fichier ZPL... + + + Envoyé à l’imprimante ({0} copies). + + + L’étiquette d’essai a été envoyée à l’imprimante. + + + Enregistré : {0}. + + + Aucune imprimante n’est sélectionnée. Choisissez une imprimante installée, ou passez à une imprimante réseau et entrez son adresse. + + + Entrez le nom d’hôte ou l’adresse IP de l’imprimante réseau, par exemple 192.168.1.50. + + + Le port doit être un nombre entier de 1 à 65535 (la plupart des imprimantes d’étiquettes utilisent le 9100). + + + {0} doit être un nombre. Entrez uniquement des chiffres, par exemple 12. + + + Le nombre de copies doit être un entier de 1 à 99999999. + + + Une étiquette avec une quantité d’impression (^PQ) + + + Répéter l’étiquette une fois par copie + + + Ignorer l’enregistrement et continuer + + + S’arrêter à l’enregistrement + + + Chiffres + + + Lettres et chiffres + + + Recommencer + + + Signaler une erreur + + + Imprimante Windows + + + Imprimante réseau (TCP/IP) + + + Fichiers CSV et Excel + + + Fusion de données + + + Ouvrir un fichier de données... + + + Recharger + + + Retirer les données + + + Aucun fichier de données ouvert + + + Les données restent sur cet ordinateur. Seuls les réglages ci-dessous sont enregistrés dans le fichier de l’étiquette, jamais les données elles-mêmes. + + + Fusionnez une feuille de calcul avec votre étiquette + + + Ouvrez un fichier CSV ou Excel (.xlsx). Chaque ligne devient une étiquette, et chaque colonne peut remplir une {{variable}} de l’étiquette. Vous pourrez ensuite parcourir les enregistrements et tous les imprimer. + + + Cette étiquette se souvient de son fichier de données, mais les données ne sont pas chargées. Choisissez Recharger pour le relire, ou ouvrez un autre fichier. + + + Données + + + Variables + + + Compteurs + + + Copies et tâches + + + Vérifier et imprimer + + + Feuille + + + Séparateur + + + Détecter automatiquement + + + virgule (,) + + + point-virgule (;) + + + tabulation + + + Séparateur détecté : {0} + + + Séparateur utilisé : {0} + + + La première ligne contient les noms des colonnes + + + {0} enregistrements, {1} colonnes + + + Aperçu des données + + + Affichage des {0} premiers enregistrements. + + + Remarques sur le fichier de données + + + {0} a été chargé : {1} enregistrements. + + + Lecture de {0}... + + + {0} n’a pas pu être ouvert. S’il est ouvert dans Excel ou un autre programme, fermez-le et réessayez ; sinon, vérifiez que le fichier existe toujours. + + + {0} n’a pas pu être lu comme un fichier CSV ou Excel (.xlsx). Ouvrez-le dans Excel, enregistrez-le de nouveau en .xlsx ou .csv et réessayez. + + + {0} ne contient aucune colonne. Vérifiez que la première ligne contient les noms des colonnes, ou décochez « La première ligne contient les noms des colonnes ». + + + Ouvrez d’abord un fichier de données. + + + Le fichier de données ne contient aucun enregistrement (ligne) à fusionner. + + + Premier enregistrement + + + Enregistrement précédent + + + Enregistrement suivant + + + Dernier enregistrement + + + Enregistrement actuel + + + Aller à l’enregistrement + + + Aller + + + Entrez un numéro d’enregistrement de 1 à {0}. + + + Aucun enregistrement + + + Enregistrement {0} sur {1} + + + Sélectionné {0} sur {1} (ligne {2}) + + + Ligne {0} (non sélectionnée ; {1} sélectionnés) + + + Enregistrement {0} sur {1} (aucun sélectionné) + + + Enregistrements à imprimer + + + Cochez les enregistrements à imprimer. Espace coche la ligne en surbrillance, Maj+clic coche une plage et Ctrl+A coche toutes les lignes affichées. Seuls les enregistrements cochés sont imprimés, vérifiés ou exportés. + + + N° + + + Numéro de ligne + + + Sélectionner ou désélectionner tous les enregistrements affichés + + + Sélectionner l’enregistrement {0} + + + Tout sélectionner + + + Sélectionner les enregistrements affichés : {0} + + + Tout désélectionner + + + Désélectionner les enregistrements affichés : {0} + + + Inverser la sélection + + + Inverser les enregistrements affichés : {0} + + + {0} sur {1} sélectionnés + + + Affichage de {0} enregistrements sur {1} + + + Aucun enregistrement ne correspond au filtre. Modifiez le texte ou effacez le filtre. + + + Filtre + + + Filtrer les enregistrements + + + Tapez du texte pour n’afficher que les enregistrements qui le contiennent (sans tenir compte des majuscules et des minuscules). + + + Colonne où chercher + + + Toutes les colonnes + + + N’afficher que la sélection + + + Effacer le filtre + + + Imprimer les {0} étiquettes sélectionnées + + + Imprimer l’étiquette sélectionnée + + + Imprimer les {0} étiquettes + + + Aucun enregistrement n’est sélectionné ; il n’y a donc rien à imprimer, à vérifier ni à exporter. Sélectionnez d’abord des enregistrements dans l’onglet Données. + + + Aucun enregistrement n’est sélectionné. Sélectionnez au moins un enregistrement dans l’onglet Données. + + + Envoyer les {0} enregistrements sélectionnés (sur {3}) à {1} ? Cela représente {2} étiquettes, copies comprises. L’impression commencera immédiatement. + + + Envoyer {0} enregistrements à {1} ? Cela représente {2} étiquettes, copies comprises. L’impression commencera immédiatement. + + + Afficher cet enregistrement dans la zone de conception + + + Chaque variable de l’étiquette prend sa valeur dans la colonne du même nom. Choisissez une autre colonne ici si les noms ne correspondent pas. + + + L’étiquette n’a encore aucune variable. Ajoutez un texte contenant {{nom}} (ou un champ de données) et elle apparaîtra ici. + + + Même nom (automatique) + + + Remplie par la colonne {0} + + + Aucune colonne correspondante : choisissez-en une + + + Remplie par le compteur + + + Aucun compteur portant ce nom : ajoutez-en un dans l’onglet Compteurs + + + Points à vérifier + + + Ajouter un compteur + + + Retirer + + + Aucun compteur pour l’instant. Un compteur produit un numéro de série comme 0001, 0002, 0003 pour chaque enregistrement. + + + (sans nom) + + + Nom + + + Tapez ceci dans l’étiquette + + + Compte avec + + + Commencer à + + + Pas + + + Remplissage par des zéros (chiffres) + + + Préfixe + + + Suffixe + + + Quand le compteur est épuisé + + + Premières valeurs + + + Réglages du compteur : {0}. + + + Le pas doit être un nombre entier, par exemple 1 ou -1. + + + Le remplissage par des zéros doit être un nombre entier de 0 à 18. + + + Copies de chaque enregistrement + + + Le nombre de copies provient de + + + La quantité propre à l’étiquette + + + Le même nombre pour tous les enregistrements + + + Une colonne des données + + + Copies + + + Colonne contenant les copies + + + Le nombre de copies doit être un entier de 1 à 99999999. + + + Façon d’écrire les copies + + + Une quantité d’impression (^PQ) est plus compacte et plus rapide. Répéter l’étiquette n’est utile que si votre imprimante ignore ^PQ. + + + Tâches et problèmes + + + Un enregistrement qui contient des erreurs + + + Enregistrements par tâche d’impression (0 = une seule tâche) + + + Compté en enregistrements, et non en copies. Des tâches plus petites ménagent l’imprimante et permettent de s’arrêter en cours de route. + + + Le nombre d’enregistrements par tâche doit être un entier de 0 à 1000000. + + + Vérifier et imprimer les enregistrements sélectionnés + + + Vérifiez d’abord quels enregistrements sélectionnés posent problème. L’impression envoie chaque enregistrement sélectionné et valide à l’imprimante de gauche, dans l’ordre des données. Choisissez les enregistrements dans l’onglet Données. + + + Vérifier les enregistrements sélectionnés + + + Exporter le ZPL... + + + Tout imprimer + + + Écrire un fichier par tâche lors de l’exportation + + + Vérification de tous les enregistrements... + + + Envoi des enregistrements à l’imprimante... + + + Écriture du ZPL... + + + {0} enregistrements vérifiés : {1} prêts, {2} avec des erreurs. + + + Affichage des {0} premiers problèmes sur {1}. + + + Les {0} enregistrements sont prêts à imprimer. + + + {0} enregistrements contiennent des erreurs et seraient exclus. Consultez la liste pour chaque problème et corrigez les données ou l’étiquette. + + + Imprimer tous les enregistrements + + + Envoyer {0} enregistrements à {1} ? L’impression commencera immédiatement. + + + {0} étiquettes envoyées à l’imprimante en {1} tâche(s). + + + {0} étiquettes écrites dans un fichier. + + + {0} étiquettes écrites dans {1} fichiers. + + + Remplacer les fichiers existants ? + + + {0} fichier(s) portant les mêmes noms existent déjà et seront remplacés. + + + {0} tâche(s) avaient déjà été envoyées avant l’arrêt ; ne les imprimez pas de nouveau. + + + Arrêté. {0} tâche(s) avaient déjà été envoyées à l’imprimante. + + + {0} enregistrement(s) ont été exclus en raison d’erreurs ; consultez la liste. + + + L’impression s’est arrêtée à l’enregistrement {0} en raison du réglage « s’arrêter ». + + + Aucune étiquette n’a été produite, car tous les enregistrements contiennent des erreurs. Vérifiez les enregistrements et l’étiquette. + + + Problèmes par enregistrement + + + Enregistrement + + + Type + + + Ce qui s’est passé + + + Erreur + + + Avertissement + + + Ce fichier d’étiquette indiquait un fichier de données dans un emplacement que Rotula ne suit pas automatiquement (un chemin réseau, une adresse Web ou un chemin relatif) ; il a donc été ignoré pour votre sécurité. Choisissez « Ouvrir un fichier de données » pour sélectionner le fichier vous-même. + + + Le fichier de données mémorisé ({0}) ne se trouve pas sur un disque local ; Rotula ne l’ouvrira donc pas automatiquement. Choisissez « Ouvrir un fichier de données » pour le sélectionner vous-même. + + + Le fichier de données {0} est introuvable. Il a peut-être été déplacé ou renommé ; choisissez « Ouvrir un fichier de données » pour le retrouver. + + + Chemin du fichier de données mémorisé + + + Réduire + + + Agrandir + + + Restaurer + + + Fermer + + + Étiquette + + + Propriétés de l’étiquette + + + Imprimante + + + Actualiser la liste des imprimantes + + + Fusion de données... + + + Ouvrir un fichier de données... + + + Zoom + + + Étiquette + + + Imprimante + + + Choisissez l’imprimante de cette étiquette. La configuration de l’imprimante se trouve sous Imprimante > Imprimer. + + + Sélectionner une imprimante + + + Aperçu + + + Afficher l’étiquette en plus grand, telle qu’elle sera dessinée + + + Imprimer + + + Imprimer... (Ctrl+P) + + + Sélectionner + + + Redimensionner le panneau des propriétés + + + Objets + + + Type de l’objet sélectionné + + + SORTIE ZPL + + + Exporter en .zpl + + + Format, résolution et type de l’étiquette + + + {0} objets + + + 1 objet + + + aucune sélection + + + {0} sélectionné(s) + + + Aperçu de l’étiquette + + + Aperçu - {0} + + + Afficher le code ZPL + + + Afficher ou masquer le panneau du code ZPL + + + 1 erreur + + + {0} erreurs + + + 1 avertissement + + + {0} avertissements + + + Aperçu approximatif + + + Aucun objet pour l’instant + + + Choisissez un outil à gauche pour ajouter du texte, un code à barres ou une forme. + + + Format personnalisé... + + + Formats courants + + + Résolution d’impression + + + Choisissez le format de l’étiquette et la résolution d’impression + + + le format de l’étiquette + + + Format, marges et valeurs par défaut de l’imprimante + + + Rien n’est sélectionné ; voici donc les réglages de l’étiquette entière. Cliquez sur un objet dans la zone de conception ou dans la liste pour le modifier. + + + {0} au total + + + Largeur ({0}) + + + Hauteur ({0}) + + + mm + + + po + + + points + + + Résolution de {0} ppp détectée dans le pilote de l’imprimante + + + La résolution n’a pas pu être lue dans le pilote ; choisissez-la manuellement. + + + Lecture du pilote de l’imprimante... + + + Utiliser le format de l’imprimante ({0}) + + + Remplit la largeur et la hauteur de l’étiquette avec le format de papier indiqué par le pilote de l’imprimante + + + Cette étiquette a été conçue à {0} ppp. Elle sera convertie automatiquement à {1} ppp pour s’imprimer au même format. + + + Passer l’étiquette à {0} ppp + + + Convertit la conception ouverte à la résolution de l’imprimante. Vous pouvez annuler avec Ctrl+Z. + + + Points à vérifier après la conversion ({0}) + + + Une partie de l’étiquette n’a pas pu être convertie exactement. Vérifiez le résultat imprimé, ou passez l’étiquette à la résolution de l’imprimante et révisez-la. + + + Le code à barres « {0} » a une largeur de barre de {1} points, qui devient {2} points à la nouvelle résolution. Le code est légèrement plus large ou plus étroit qu’avant. Vérifiez qu’il se lit toujours. + + + Dans « {0} », la valeur « {1} » donnerait {2} points à la nouvelle résolution, mais l’imprimante accepte {3}. Elle a été fixée à {3}. Vérifiez l’élément. + + + « {0} » contient du ZPL brut, qui ne peut pas être redimensionné automatiquement. Il conserve ses positions d’origine en points et pourrait s’imprimer plus petit ou plus grand que le reste. Modifiez-le ou remplacez-le par des éléments ordinaires. + + + Le graphique stocké « {0} » est une image matricielle fixe et ne peut pas être redimensionné pour la nouvelle résolution. Il s’imprimera à une taille physique différente. Remplacez-le par un graphique conçu pour cette résolution. + + + Cette étiquette contient un élément qui ne peut pas être converti automatiquement de {0} ppp à {1} ppp. Rien n’a été modifié. + + + Impossible de changer l’étiquette + + + OK + + + Enregistrer + + + Ne pas enregistrer + + + Information + + + Avertissement + + + Erreur + + + Question + + + À propos de Rotula + + + Version {0} + + + Logiciel de conception d’étiquettes et de codes à barres pour Windows (ZPL), gratuit et à code source ouvert (MIT) + + + Fonctionne hors ligne. Aucune télémétrie, aucun accès au réseau. + + + L’aperçu à l’écran est approximatif : le texte est dessiné avec une police de remplacement ; la forme des lettres et les retours à la ligne peuvent donc différer légèrement sur l’étiquette imprimée. + + + https://github.com/P4Software/Rotula + + + Ouvrir la page du projet dans votre navigateur Web + + + Le navigateur Web n’a pas pu être ouvert. La page du projet est {0} + + + Avis de tiers + + + Avis de tiers + + + Le fichier des avis ne fait pas partie de cette version. Il est offert à https://github.com/P4Software/Rotula, dans THIRD-PARTY-NOTICES.md. + + + Bienvenue dans Rotula + + + Concevez une étiquette, vérifiez-la à l’écran et imprimez-la sur votre imprimante compatible ZPL. + + + Nouvelle étiquette + + + Choisissez un format et commencez la conception. + + + Ouvrir une étiquette + + + Reprenez un fichier .rotula enregistré. + + + Importer du ZPL + + + Transformez un fichier ZPL existant en conception modifiable. + + + Étiquettes récentes + + + Les étiquettes que vous enregistrez ou ouvrez apparaîtront ici. + + + Commencer avec une étiquette vierge + + + Astuce : faites glisser les coins pour redimensionner, utilisez les touches fléchées pour déplacer et Ctrl+Z pour annuler n’importe quelle étape. + + + Écran d’accueil + + + Fichiers de base de données + + + Choisir un fichier de base de données SQLite + + + Données provenant de + + + Fichier (CSV ou Excel) + + + Base de données + + + Base de données + + + Base de données : aucune donnée lue pour l’instant + + + Connexion à la base de données : {0} + + + {0} lignes ont été lues à partir de la connexion à la base de données « {1} ». + + + {0} lignes, {1} colonnes + + + Connexion enregistrée + + + Nouvelle connexion... + + + Gérer les connexions... + + + Il n’y a encore aucune connexion enregistrée. Choisissez « Nouvelle connexion... » pour ajouter la première. + + + Choisissez d’abord une connexion enregistrée, ou créez-en une avec « Nouvelle connexion... ». + + + Changer la source de données... + + + Revenir aux données chargées + + + Cette étiquette utilise la connexion enregistrée « {0} ». Connectez-vous et rechargez les données. + + + Rotula ne s’est connecté à rien. Il se connecte seulement quand vous cliquez sur le bouton, et n’exécute la requête ci-dessous que si elle passe la vérification de lecture seule. + + + Requête enregistrée dans cette étiquette + + + Se connecter et recharger les données + + + Il n’y a aucune connexion enregistrée nommée « {0} » sur cet ordinateur. Ouvrez « Gérer les connexions... », ajoutez une connexion et donnez-lui exactement le nom « {0} », puis cliquez de nouveau sur le bouton. + + + Table ou vue + + + Requête + + + Rechercher des tables et des vues + + + Tables et vues + + + vue + + + Aucune table ni vue à afficher. Modifiez la recherche, ou vérifiez que ce compte peut lire la base de données. + + + Aperçu + + + L’aperçu affiche les 100 premières lignes. « Utiliser ces données » lit toutes les lignes jusqu’au maximum. + + + Choisissez une table ou une vue pour en voir les lignes. + + + Requête SELECT + + + Un seul SELECT est permis. Écrivez @nom à l’endroit où une valeur doit être insérée, par exemple WHERE Id = @id. + + + Tout semble correct : cette requête ne fait que lire des données. + + + Paramètres + + + Valeurs des @noms de votre requête. Choisissez Nombre ou Date quand la colonne n’est pas du texte. + + + Type du paramètre + + + Texte + + + Nombre + + + Date + + + La valeur de {0} n’est pas un nombre. Tapez des chiffres avec, au besoin, un point décimal, par exemple 12.5. + + + La valeur de {0} n’est pas une date. Tapez-la ainsi : 2026-03-31. + + + Exécuter + + + Exécute la requête (en lecture seule) et affiche les lignes ci-dessous. + + + Résultat + + + Détail technique fourni par la base de données + + + Utiliser ces données + + + Lit les lignes et les utilise comme enregistrements de cette étiquette. + + + Nombre maximal de lignes + + + Au plus ce nombre de lignes est lu (de 1 à 1 000 000). Un avertissement apparaît si le résultat a été tronqué. + + + Le nombre maximal de lignes doit être un entier de 1 à {0}. + + + Cette base de données ne contient aucune table ni vue visible par ce compte. + + + Lecture de la liste des tables... + + + Lecture de {0}... + + + Exécution de la requête... + + + Lecture de toutes les lignes de {0}... + + + Connexions aux bases de données + + + Rotula ne fait que lire des données. Utilisez un compte de base de données en lecture seule quand c’est possible. + + + Connexions enregistrées + + + Rien n’est encore enregistré. Remplissez le formulaire et choisissez Enregistrer. + + + Nouvelle + + + Supprimer + + + Détails de la connexion + + + Nom + + + Les étiquettes désignent une connexion par ce nom ; choisissez donc un nom court que vous conserverez. + + + Le nom ne peut pas être modifié, car des étiquettes y font référence. Pour utiliser un autre nom, créez une nouvelle connexion. + + + Tapez un nom pour cette connexion. + + + Une connexion nommée « {0} » existe déjà. Choisissez un autre nom, ou sélectionnez-la dans la liste pour la modifier. + + + Type de base de données + + + SQL Server + + + PostgreSQL + + + MySQL / MariaDB + + + Fichier SQLite + + + ODBC + + + Serveur + + + Port + + + Le port doit être un nombre entier de 1 à 65535, ou rester vide pour utiliser le port habituel. + + + Nom de la base de données + + + Fichier SQLite + + + Le fichier est ouvert en lecture seule ; Rotula ne peut donc jamais le modifier. + + + Parcourir... + + + Charger la liste + + + Lecture de la liste sur le serveur... + + + Choisissez une base de données du serveur, ou tapez son nom. + + + Remplissez d’abord l’adresse du serveur et l’ouverture de session, puis chargez la liste. Vous pouvez aussi simplement taper le nom. + + + Tapez le mot de passe pour charger la liste, ou tapez simplement le nom de la base de données. + + + Bases de données trouvées : {0}. Choisissez-en une, ou tapez son nom. + + + Le serveur contient plus de bases de données qu’il n’est possible d’en afficher ; voici les {0} premières. Choisissez-en une, ou tapez son nom. + + + Cet identifiant ne peut ouvrir aucune base de données sur le serveur. Tapez plutôt le nom. + + + Ce type de serveur ne peut pas lister ses bases de données. Tapez plutôt le nom. + + + Arrêté. Appuyez sur Charger la liste pour réessayer, ou tapez le nom. + + + Tapez de nouveau le mot de passe pour charger la liste : le mot de passe enregistré n’est utilisé que tant que le serveur et l’utilisateur restent les mêmes. + + + La liste n’a pas pu être lue : cet identifiant n’a peut-être pas le droit de voir les autres bases de données. Tapez plutôt le nom. + + + La liste n’a pas pu être lue. {0} Vous pouvez tout de même taper le nom. + + + Choisissez une source de données installée sur cet ordinateur, ou tapez son nom. + + + Aucune source de données ODBC n’est installée sur cet ordinateur. Tapez plutôt le nom. + + + système + + + Nom de la source de données ODBC (DSN) + + + ou une chaîne de connexion + + + Si la chaîne de connexion contient un mot de passe, Rotula le déplace dans le magasin protégé et le retire du texte enregistré. + + + Se connecter avec + + + Mon compte Windows + + + Nom d’utilisateur et mot de passe + + + Nom d’utilisateur + + + Mot de passe + + + Un mot de passe est enregistré pour cette connexion et n’est jamais affiché. Laissez ce champ vide pour le conserver, ou tapez-en un nouveau pour le remplacer. + + + Le mot de passe est stocké de façon protégée pour votre compte Windows seulement, et n’est plus jamais affiché. + + + Sécurité + + + Chiffrer la connexion + + + Laissez cette option activée. Désactivez-la seulement pour un serveur de confiance sur votre propre réseau. + + + Le chiffrement est désactivé : n’importe qui sur le chemin réseau peut lire les données et le mot de passe. Utilisez ce réglage seulement avec un serveur local de confiance. + + + Faire confiance au certificat de ce serveur + + + Seulement pour un serveur que vous connaissez et contrôlez, comme un serveur de test. Sinon, quelqu’un pourrait usurper l’identité du serveur. + + + Rotula ne vérifiera pas l’identité du serveur ; quelqu’un sur le réseau pourrait donc se faire passer pour lui et lire les données et le mot de passe. Utilisez ce réglage seulement avec un serveur que vous contrôlez. + + + Tester la connexion + + + La connexion fonctionne. + + + Vous avez modifié cette connexion, et le mot de passe enregistré ne peut pas être relu pour un test. Tapez de nouveau le mot de passe pour la tester. + + + Enregistrer + + + La connexion « {0} » a été enregistrée. + + + La connexion « {0} » a été supprimée. + + + Supprimer la connexion + + + Supprimer la connexion « {0} » ? Les étiquettes qui l’utilisent demanderont une connexion portant ce nom la prochaine fois qu’elles seront ouvertes. + + + Enregistrement... + + + Suppression... + + + Test de la connexion... + + + Le certificat de sécurité du serveur n’a pas pu être vérifié. S’il s’agit de votre propre serveur (par exemple un serveur de test), vous pouvez lui faire confiance pour cette connexion. Sinon, demandez un certificat valide à l’administrateur. + + + Faire confiance à ce serveur et enregistrer + + + nom + + + type de base de données + + + mode de connexion + + + serveur + + + port + + + nom de la base de données + + + nom d’utilisateur + + + fichier SQLite + + + chaîne de connexion + + + nom de la source de données + + + délai d’expiration de la commande + + + délai d’expiration de la connexion + + + Un problème est survenu lors de la lecture de la base de données ({0}). Réessayez, et vérifiez les détails de la connexion si le problème persiste. + + + Rotula n’a pas pu se connecter à la base de données. Vérifiez les détails de la connexion et que le serveur est en marche, puis réessayez. + + + Le serveur n’a pas accepté le nom d’utilisateur ou le mot de passe. Vérifiez-les dans « Gérer les connexions... » et réessayez. + + + La base de données a mis trop de temps à répondre. Réessayez, restreignez la requête ou adressez-vous à l’administrateur de la base de données. + + + Le serveur est injoignable. Vérifiez le nom du serveur et le port, votre réseau ou votre RPV, puis réessayez. + + + La base de données est introuvable. Vérifiez le nom de la base de données ou l’emplacement du fichier, puis réessayez. + + + Ce compte n’a pas le droit de lire ces données. Demandez un accès en lecture à l’administrateur de la base de données. + + + Rotula ne fait que lire des données ; cette requête n’a donc pas été exécutée. {0} + + + La base de données n’a pas pu exécuter la requête. Vérifiez les noms des tables et des colonnes ainsi que l’orthographe de la requête, puis réessayez. + + + Arrêté. Rien n’a été modifié. + + + La limite de {0} lignes dépasse le maximum de {1}. Choisissez une limite plus petite. + + + Le pilote ou la source de données ODBC n’est pas installé sur cet ordinateur. Installez-le, ou choisissez un autre nom de source de données. + + + Le certificat de sécurité du serveur n’est pas approuvé. S’il s’agit de votre propre serveur, ouvrez « Gérer les connexions... » et choisissez de lui faire confiance pour cette connexion. Sinon, demandez un certificat valide à l’administrateur. + + + Le réglage « {0} » est absent ou non permis. Corrigez-le dans « Gérer les connexions... » et réessayez. + + + Il n’y a aucune connexion enregistrée nommée « {0} ». Créez-la avec exactement ce nom dans « Gérer les connexions... ». + + + Une seule requête SELECT est permise. Réécrivez-la sous forme de SELECT. + + + Une seule instruction est permise. Retirez tout ce qui suit le premier point-virgule. + + + Tapez d’abord une requête SELECT. + + + Le mot « {0} » n’est pas permis, car il peut modifier des données. S’il s’agit d’un nom de colonne, mettez-le entre guillemets. + + + SELECT ... INTO n’est pas permis, car il crée des tables ou des fichiers. Retirez la partie INTO. + + + Le verrouillage de lignes (FOR UPDATE, FOR SHARE, LOCK IN SHARE MODE) n’est pas permis. Retirez cette partie. + + + La fonction « {0} » n’est pas permise, car elle peut lire des fichiers, joindre d’autres serveurs ou exécuter du code. Retirez-la. + + + Un commentaire qui commence par /*! s’exécute comme du SQL dans MySQL ; il n’est donc pas permis. Retirez-le. + + + Un guillemet ou un commentaire n’est pas fermé. Fermez-le et réessayez. + + + La requête est trop longue. Raccourcissez-la. + + + Le paramètre @{0} n’a pas de valeur. Remplissez-le sous Paramètres. + + + Seules les {0} premières lignes ont été lues. Augmentez le nombre maximal de lignes ou restreignez la requête pour lire le reste. + + + Le fichier des connexions enregistrées est endommagé et a été ignoré. Ajoutez de nouveau vos connexions ; le fichier endommagé est conservé à côté avec l’extension .damaged. + + + Vous avez modifié l’endroit ou la façon dont cette connexion ouvre une session ; le mot de passe enregistré n’a donc pas été utilisé. Tapez de nouveau le mot de passe. + + + Le type de source de données « {0} » n’est pas disponible. Son module complémentaire est peut-être absent ou désactivé. + + + Cette requête peut se lire de plusieurs façons (par exemple une barre oblique inverse devant un guillemet) ; elle n’a donc pas été exécutée. Utilisez deux apostrophes ('') au lieu de la barre oblique inverse. + + + fournisseur + + + service + + + fichier de l’autorité de certification + + + options supplémentaires + + + Le fichier des connexions enregistrées est trop volumineux et a été ignoré. Ajoutez de nouveau vos connexions. + + + Le mot de passe enregistré ne peut pas être lu. Il a probablement été enregistré par un autre utilisateur Windows ou sur un autre ordinateur. Ouvrez « Gérer les connexions... » et tapez-le de nouveau. + + + Rotula n’a pas pu enregistrer les connexions. Vérifiez que vous pouvez écrire dans votre dossier utilisateur (AppData) et réessayez. + + + La protection des mots de passe n’est pas offerte sur ce système ; les connexions qui exigent un mot de passe ne peuvent donc pas être enregistrées. Connectez-vous avec votre compte Windows, ou utilisez un fichier SQLite. + + + chiffrement + + + faire confiance au certificat du serveur + + + Code 11 + + + 2 parmi 5 industriel + + + 2 parmi 5 standard + + + LOGMARS + + + Codabar + + + MSI + + + Plessey + + + EAN-8 + + + UPC-E + + + Extension UPC/EAN + + + POSTNET + + + PLANET + + + GS1 DataBar + + + Code Aztec + + + MicroPDF417 + + + Codablock + + + MaxiCode + + + TLC39 + + + Code 49 + + + Omnidirectionnel + + + Tronqué + + + Empilé + + + Empilé omnidirectionnel + + + Limité + + + Étendu + + + Aucun + + + Un chiffre modulo 10 + + + Deux chiffres modulo 10 + + + Chiffres modulo 11 et modulo 10 + + + Codablock A (caractères du Code 39) + + + Codablock E (Code 128, FNC1 automatique) + + + Codablock F (Code 128) + + + Linéaires + + + Matriciels 2D + + + Empilés + + + Postaux + + + Chiffres de contrôle (1 ou 2) + + + Chiffres de contrôle + + + Afficher les chiffres de contrôle dans le texte + + + Caractère de début + + + Caractère de fin + + + Type de GS1 DataBar + + + Hauteur du séparateur (1-2) + + + Segments par rangée (2-22) + + + Les données contiennent des codes ECI + + + Correction d’erreurs / taille + + + Symbole de menu (configuration du lecteur) + + + Symboles de l’ensemble + + + Identifiant de l’ensemble (facultatif) + + + Mode (0-33) + + + Type de Codablock + + + Ajouter des caractères de contrôle + + + Mode (2-6) + + + Numéro du symbole (1-8) + + + Nombre total de symboles (1-8) + + + Module MicroPDF417 (points) + + + Rangée MicroPDF417 (points) + + + Mode de départ + + + Caractères par rangée + + + Automatique + + + Rotation (impossible à imprimer pour ce code à barres : choisissez Valeur de l’étiquette) + + + À propos de l’aperçu + + + L’imprimante dessine ce code à barres ; l’aperçu affiche un espace réservé. + + + Ce symbole Aztec (Rune, menu, ajout structuré ou ECI) est dessiné par l’imprimante ; l’aperçu affiche un espace réservé. + + + Les symboles Rune, de menu, d’ajout structuré et ECI sont dessinés par l’imprimante ; dans ces cas, l’aperçu affiche un espace réservé. + + + Dans l’aperçu, le rapport entre barres larges et étroites est dessiné à 2:1. + + + Dans l’aperçu, le rapport entre barres larges et étroites est dessiné à 3:1. + + + Dans l’aperçu, la largeur des barres et des espaces suit la largeur du module ; l’imprimante réelle utilise les dimensions fixes de l’USPS. + + + La partie composite 2D du GS1 DataBar n’est pas prise en charge ; dans les types empilés, la hauteur des barres est celle du symbole entier. + + + Le Code 11 n’accepte que des chiffres et le trait d’union (-). Retirez tout autre caractère. + + + Le Code 11 utilise 1 ou 2 chiffres de contrôle. Choisissez l’une de ces deux valeurs. + + + Le LOGMARS n’accepte que les lettres de A à Z, les chiffres, l’espace et - . $ / + %. Retirez tout autre caractère. + + + L’imprimante imprime toujours le texte sous un code LOGMARS ; le désactiver n’a donc aucun effet. Activez le texte pour qu’il corresponde à ce qui sera imprimé. + + + Le Codabar n’accepte que des chiffres et - $ : / . + dans les données. Les lettres de début et de fin (A à D) se choisissent dans les options ; elles ne se tapent pas dans les données. + + + Les caractères de début et de fin du Codabar doivent chacun être A, B, C ou D. Choisissez l’un d’eux. + + + Les données MSI peuvent contenir au plus {0} chiffres avec ce réglage de chiffre de contrôle. Raccourcissez les données. + + + Choisissez l’une des options de chiffre de contrôle MSI. + + + Le Plessey n’accepte que les chiffres de 0 à 9 et les lettres majuscules de A à F. Retirez tout autre caractère. + + + L’EAN-8 nécessite {0} chiffres (le chiffre de contrôle est ajouté pour vous) ou {1} chiffres, chiffre de contrôle compris. + + + Le dernier chiffre n’est pas le bon chiffre de contrôle EAN-8. Il devrait être {0} ; sinon, retirez le dernier chiffre et laissez l’imprimante l’ajouter. + + + L’UPC-E nécessite le code fabricant et produit de 10 chiffres que l’imprimante raccourcit, ou le code UPC-E de 6 chiffres (éventuellement précédé du système de numérotation 0 et suivi d’un chiffre de contrôle). Modifiez le nombre de chiffres. + + + L’UPC-E ne peut utiliser que le système de numérotation 0. Commencez le code par 0. + + + Ces chiffres ne peuvent pas être raccourcis en code UPC-E, car l’UPC-E exige des zéros à des positions précises. Modifiez les chiffres ou utilisez plutôt l’UPC-A. + + + Le dernier chiffre n’est pas le bon chiffre de contrôle UPC-E. Il devrait être {0} ; sinon, retirez le dernier chiffre et laissez l’imprimante l’ajouter. + + + Une extension UPC/EAN nécessite exactement 2 ou 5 chiffres. + + + Les données POSTNET doivent comporter l’un de ces nombres de chiffres : {0}. L’imprimante ajoute le chiffre de contrôle. + + + Les données PLANET doivent comporter l’un de ces nombres de chiffres : {0}. L’imprimante ajoute le chiffre de contrôle. + + + Choisissez l’un des types de GS1 DataBar. + + + Ce type de GS1 DataBar nécessite jusqu’à {0} chiffres (des zéros sont ajoutés devant) ou {1} chiffres, chiffre de contrôle compris. Raccourcissez les données. + + + Le dernier chiffre n’est pas le bon chiffre de contrôle GS1. Il devrait être {0} ; sinon, retirez le dernier chiffre et laissez l’imprimante l’ajouter. + + + Les données composites (2D) après un | ne sont pas prises en charge. Retirez le | et tout ce qui le suit. + + + Le GS1 DataBar Expanded nécessite des chaînes d’éléments GS1 dont les identifiants sont entre parenthèses, par exemple (01)12345678901231(10)ABC. Vérifiez les parenthèses et les identifiants. + + + Une chaîne d’éléments GS1 ne peut contenir que des caractères standard du clavier. Retirez les accents et les symboles spéciaux. + + + La chaîne d’éléments GS1 est trop longue (maximum {0} caractères). Raccourcissez-la. + + + L’élément (01) nécessite un GTIN de 14 chiffres composé uniquement de chiffres. Corrigez les chiffres entre parenthèses. + + + Le GS1 DataBar Limited ne peut encoder que des nombres jusqu’à 1999999999999 ; le premier de ses 13 chiffres doit donc être 0 ou 1. Modifiez le nombre ou choisissez un autre type. + + + Le nombre de segments par rangée doit être un nombre pair compris entre {0} et {1}. + + + La hauteur du séparateur doit être comprise entre {0} et {1} modules. + + + La valeur de correction d’erreurs Aztec n’est pas valide. Utilisez 0 (automatique), 1 à 99 (pourcentage), 101 à 104 (format compact), 201 à 232 (format complet) ou 300 (Rune). + + + Le nombre de symboles d’un ensemble à ajout structuré doit être compris entre {0} et {1}. + + + L’identifiant de l’ensemble peut comporter au plus {0} caractères. Raccourcissez-le. + + + L’identifiant de l’ensemble ne peut contenir que des caractères standard du clavier, à l’exception de la virgule, de ^ et de ~. Retirez-les. + + + Les données Aztec sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Le mode MicroPDF417 doit être compris entre {0} et {1}. + + + Les données MicroPDF417 sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Choisissez Codablock A, E ou F. + + + Le Codablock A n’accepte que les lettres majuscules, les chiffres et - . espace $ / + %. Modifiez les données ou choisissez Codablock E ou F. + + + Les Codablock E et F ne peuvent encoder que les caractères standard du clavier. Retirez les accents et les symboles spéciaux. + + + Le nombre de caractères par rangée doit être 0 (automatique) ou compris entre {0} et {1}. + + + Pour ce type de Codablock, le nombre de rangées doit être 0 (automatique) ou compris entre {0} et {1}. + + + Le mode MaxiCode doit être compris entre {0} et {1}. + + + Le nombre total de symboles MaxiCode doit être compris entre {0} et {1}, et le numéro de ce symbole doit être compris entre 1 et ce total. + + + Le mode {0} de MaxiCode nécessite un message de transporteur : une classe de service de 3 chiffres, un code de pays de 3 chiffres, puis le code postal (9 chiffres en mode 2, 6 lettres ou chiffres en mode 3). Complétez le début des données. + + + Les données MaxiCode sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Le MaxiCode ne peut pas être pivoté en ZPL ; la rotation définie pour cet élément ne sera donc pas imprimée. Rétablissez la rotation par défaut de l’étiquette. + + + Les données TLC39 commencent par un numéro ECI de 6 chiffres, éventuellement suivi d’une virgule, du numéro de série et d’autres champs. Corrigez le début des données. + + + Chaque champ TLC39 après le numéro ECI ne peut contenir que des lettres et des chiffres, jusqu’à {0} caractères. Vérifiez les champs entre les virgules. + + + Les données TLC39 sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + La largeur du module MicroPDF417 doit être comprise entre {0} et {1} points. + + + La hauteur de rangée MicroPDF417 doit être comprise entre {0} et {1} points. + + + Le Code 49 ne peut encoder que les caractères standard du clavier. Retirez les accents et les symboles spéciaux. + + + Le mode de départ du Code 49 doit être automatique ou un nombre de 0 à 5. Choisissez l’une de ces valeurs. + + + Les données Code 49 sont trop longues (maximum {0} caractères). Raccourcissez le texte. + + + Ce GS1 DataBar utilise le type de symbologie {0}, que Rotula ne prend pas en charge (seulement les types 1 à 6). Il a été conservé en texte ZPL et s’imprimera quand même, mais il ne peut pas être modifié. + + + Ce GS1 DataBar comporte une partie composite (2D), que Rotula ne prend pas en charge. Il a été conservé en texte ZPL et s’imprimera quand même, mais il ne peut pas être modifié. + + + Ce code à barres postal utilise le type {0}, que Rotula ne prend pas en charge (seulement POSTNET et PLANET). Il a été conservé en texte ZPL et s’imprimera quand même, mais il ne peut pas être modifié. + + + Nombres pairs seulement. Sous 22, le symbole est empilé sur plusieurs rangées. + + + 0 = automatique. 1 à 99 = correction d’erreurs minimale en pourcentage. 101 à 104 = symbole compact de 1 à 4 couches. 201 à 232 = symbole complet de 1 à 32 couches. 300 = Aztec Rune. + + + 1 = un seul symbole. De 2 à 26, le message est réparti sur ce nombre de symboles. + + + 0 = automatique. + + + Les modes 2 et 3 transportent un message de transporteur structuré (classe de service, pays, code postal) ; les modes 4 à 6 transportent n’importe quel texte. + + + Le mode fixe le nombre de colonnes et de rangées ainsi que la correction d’erreurs (voir le guide ZPL). + + + Un compteur d’imprimante nécessite une valeur de départ de 1 à 40 caractères composée de lettres, de chiffres, d’espaces et de - / . avec au moins un chiffre. Modifiez le texte de ce champ. + + + L’imprimante ne peut pas incrémenter un code QR, car ses données commencent par un en-tête. Désactivez le compteur d’imprimante pour ce code à barres. + + + Le masque du compteur ne peut utiliser que les lettres D, H, O, A, N et %, et le pas, que des lettres, des chiffres et %. Corrigez le masque ou le pas. + + + Le caractère qui marque les références aux numéros de champ doit être un seul caractère standard du clavier, autre que ^ ou ~. Choisissez-en un autre. + + + Les caractères marqueurs de l’horloge doivent être des caractères standard du clavier, différents les uns des autres, autres que ^, ~ ou la virgule. Modifiez-les. + + + Le numéro de champ doit être compris entre {0} et {1}. + + + L’invite du champ ne peut contenir que des lettres, des chiffres et des espaces, jusqu’à 255 caractères. Modifiez l’invite. + + + Ellipse + + + Ligne diagonale + + + Symbole + + + Ellipse + + + Ligne diagonale + + + Symbole + + + Symbole + + + Inclinaison + + + Symbole + + + Hauteur du caractère (points) + + + Largeur du caractère (points) + + + Vers la droite (/ du coin inférieur gauche au coin supérieur droit) + + + Vers la gauche (\ du coin supérieur gauche au coin inférieur droit) + + + Marque déposée (R) + + + Droit d’auteur (C) + + + Marque de commerce (TM) + + + Underwriters Laboratories (UL) + + + Association canadienne de normalisation (CSA) + + + Horizontale + + + Verticale (de haut en bas) + + + Inversée (de droite à gauche) + + + Le décalage de l’étiquette doit être compris entre {0} et {1} points. Modifiez le décalage dans les réglages de l’étiquette. + + + Le haut de l’étiquette doit être compris entre {0} et {1} rangées de points. Modifiez-le dans les réglages de l’étiquette. + + + La modification du contraste doit être comprise entre {0} et {1}. Choisissez une valeur dans cette plage. + + + Les vitesses d’impression doivent être comprises entre {0} et {1} pouces par seconde. Réglez les vitesses d’impression, d’avance et de recul à des valeurs dans cette plage. + + + La police {0} ne peut pas utiliser le fichier « {1} ». Un identifiant de police est une lettre ou un chiffre, et le fichier doit avoir la forme E:NOM.TTF. Corrigez l’identifiant de police ou le nom du fichier. + + + Le graphique stocké {0} ne peut pas être utilisé. Son nom doit avoir la forme R:LOGO.GRF et ses données ne doivent pas dépasser 4 Mo. Corrigez le nom ou utilisez un graphique plus petit. + + + La largeur, la hauteur et l’épaisseur d’une ligne diagonale doivent être comprises entre {0} et {1} points. Modifiez la taille. + + + La largeur, la hauteur et l’épaisseur d’une ellipse doivent être comprises entre {0} et {1} points. Modifiez la taille. + + + La hauteur et la largeur d’un symbole doivent être comprises entre {0} et {1} points. Modifiez la taille. + + + La largeur et la hauteur d’une zone de texte doivent être comprises entre {0} et {1} points. Modifiez la taille de la zone. + + + Un champ de texte peut être un bloc avec retour à la ligne ou une zone de texte, mais pas les deux. Désactivez l’un des deux. + + + L’espace entre les caractères doit être compris entre {0} et {1} points. Modifiez l’espace. + + + L’option {0} de ce champ ne peut pas être utilisée avec le champ auquel elle appartient ; le champ entier a donc été conservé en ZPL brut et s’imprimera quand même, mais il ne peut pas être modifié. + + + Ce champ contient à la fois des données et un compteur d’imprimante, qui ne peuvent pas être combinés. Il a été conservé en ZPL brut et s’imprimera quand même, mais il ne peut pas être modifié. + + + L’attribution de police {0} arrive après que certains champs ont déjà été définis ; elle ne peut donc pas devenir un réglage de l’étiquette. Elle a été conservée en ZPL brut à son emplacement d’origine. + + + Le fichier de supports « {0} » dépasse {1} octets ; il n’a donc pas été lu. Utilisez un fichier plus petit. + + + Le fichier de supports « {0} » n’a pas pu être ouvert. Vérifiez qu’il existe et que vous avez le droit de le lire. + + + Le fichier de supports « {0} » n’est pas une liste de supports valide. Vérifiez le fichier, ou restaurez-le à partir de l’original. + + + Le fichier de supports « {0} » a une version de format ({1}) que cette version de Rotula ne comprend pas. Mettez Rotula à jour ou utilisez un autre fichier. + + + Le fichier de supports « {0} » ne contient aucune entrée. Ajoutez-y au moins un support. + + + Le fichier de supports « {0} » contient plus de {1} entrées ; seules les {1} premières ont donc été lues. Divisez le fichier en fichiers plus petits. + + + Le dossier des supports contient plus de {0} fichiers ; les fichiers en trop ont donc été ignorés. Retirez les fichiers dont vous n’avez pas besoin. + + + L’élément {1} de « {0} » n’est pas une entrée de support ; il a donc été ignoré. + + + L’entrée {1} de « {0} » n’a pas d’identifiant ; elle a donc été ignorée. Donnez un identifiant unique à chaque entrée. + + + L’entrée {1} de « {0} » a l’identifiant « {2} », qui est trop long ou contient des caractères non permis ; elle a donc été ignorée. Utilisez des lettres, des chiffres, des points, des traits de soulignement et des traits d’union, jusqu’à 64 caractères. + + + L’identifiant « {1} » apparaît deux fois dans « {0} » ; la deuxième entrée a donc été ignorée. Donnez un identifiant unique à chaque entrée. + + + Le support « {0} » n’a pas de nom ; il a donc été ignoré. Donnez-lui un nom. + + + Le champ « {1} » du support « {0} » est du mauvais type ou est trop long ; le support a donc été ignoré. Corrigez le champ. + + + Le support « {0} » n’a pas de largeur ni de hauteur utilisables ; il a donc été ignoré. Ajoutez le format de l’étiquette. + + + La valeur {1} du support « {0} » ({2}) se situe hors des formats qu’une imprimante d’étiquettes peut utiliser ; le support a donc été ignoré. Vérifiez le nombre et son unité. + + + La valeur {1} du support « {0} » est indiquée comme {2} mm et {3} po, qui ne correspondent pas à la même longueur ; le support a donc été ignoré. Corrigez l’une des deux valeurs. + + + Le champ « {1} » du support « {0} » a la valeur {2}, qui est hors de la plage permise ; le support a donc été ignoré. Corrigez la valeur. + + + L’adresse source du support « {0} » n’est pas une adresse https ; le support a donc été ignoré. Utilisez une adresse qui commence par https://. + + + Le champ « {1} » du support « {0} » ressemble à un prix. Rotula ne conserve pas les prix ; le champ a donc été ignoré. + + + Le support « {0} » est marqué comme vérifié, mais il lui manque {1}. Ajoutez cette information ou marquez le support comme non vérifié. + + + Le support « {0} » n’indique pas d’où proviennent ses données. Ajoutez un identifiant de source ou une adresse source https. + + + Le bloc de description du fichier de supports est incomplet : {0} est absent. Ajoutez cette information. + + + Le support « {0} » cite la source « {1} », que le fichier ne décrit pas. Ajoutez cette source au bloc de description. + + + Le fichier indique que {0} entrées sont vérifiées, mais il y en a {1}. Mettez à jour les totaux dans le bloc de description. + + + Le format du support « {0} » n’a pas été vérifié. Mesurez les étiquettes réelles avant d’imprimer un grand tirage. + + + L’espace entre les étiquettes du support « {0} » est inconnu. Étalonnez l’imprimante avec ce support chargé. + + + Le support « {0} » est un rouleau continu sans hauteur d’étiquette fixe ; la hauteur de l’étiquette a donc été laissée telle quelle. Indiquez la hauteur dont vous avez besoin. + + + Ce support comporte {0} étiquettes dans la largeur et {1} dans la longueur. Pour l’instant, une seule étiquette est disposée ; placez donc vous-même les autres étiquettes au besoin. + + + Le support « {0} » est une feuille prédécoupée. Le format de l’étiquette a été appliqué, mais pas la disposition de la feuille. + + + L’étiquette a déjà du contenu ; sa rotation par défaut des champs n’a donc pas été modifiée pour le support « {0} ». Modifiez vous-même la rotation si le support l’exige. + + + Le support « {0} » est rond ou ovale, mais l’étiquette de l’imprimante est rectangulaire et la forme n’est pas dessinée. Gardez votre contenu à l’intérieur de la forme. + + + {0} éléments se trouvent déjà sur l’étiquette et pourraient maintenant dépasser du nouveau format. Vérifiez qu’ils tiennent toujours. + + + Les fichiers de type « {0} » ne peuvent pas être importés. Enregistrez la liste en .csv ou en .xlsx et réessayez. + + + La liste dépasse {0} octets et n’a pas été lue. Utilisez un fichier plus petit. + + + La liste « {0} » n’a pas pu être lue. Vérifiez qu’elle n’est pas ouverte dans un autre programme et qu’il s’agit d’un fichier valide. + + + La liste ne contient aucune ligne de données. Ajoutez les supports sous la ligne d’en-tête. + + + La liste contient plus de {0} lignes ; seules les {0} premières ont donc été lues. Divisez-la en listes plus petites. + + + Aucune colonne de numéros de pièce n’a été trouvée ; rien n’a donc été importé. Ajoutez une colonne nommée « Part number ». + + + Aucune colonne de formats d’étiquette n’a été trouvée ; rien n’a donc été importé. Ajoutez une colonne de format, ou une colonne de largeur et une colonne de hauteur. + + + La colonne « {0} » ressemble à un prix et a été ignorée. Rotula ne conserve pas les prix. + + + La colonne {0} a été choisie d’après son contenu, car aucun en-tête ne correspondait : « {1} ». Vérifiez que c’est la bonne. + + + La ligne {0} n’a pas de numéro de pièce ; elle a donc été ignorée. Ajoutez le numéro de pièce. + + + La ligne {0} ({1}) n’a aucun format lisible ; elle a donc été ignorée. Écrivez le format sous la forme largeur x hauteur, avec une unité. + + + La ligne {0} ({1}) donne le format « {2} » sans préciser s’il s’agit de pouces ou de millimètres ; elle a donc été ignorée. Ajoutez « in » ou « mm ». + + + La ligne {0} ({1}) indique deux formats qui ne concordent pas (« {2} ») ; elle a donc été ignorée. Ne gardez que le bon. + + + La ligne {0} ({1}) a le format « {2} », qui se situe hors des formats qu’une imprimante d’étiquettes peut utiliser ; elle a donc été ignorée. Vérifiez le nombre et son unité. + + + La ligne {0} répète le numéro de pièce {1} ; elle a donc été ignorée. Gardez une seule ligne par numéro de pièce. + + + Adresse du serveur + + + Le nom ou l’adresse IP du serveur de base de données, par exemple db.exemple.com. Votre administrateur de base de données peut vous l’indiquer. + + + Port + + + Nom de la base de données + + + Nom d’utilisateur + + + Fichier de base de données + + + Nom de la source de données (DSN) + + + Chaîne de connexion + + + Chiffrer la connexion + + + Laissez cette option activée. Désactivez-la seulement pour un serveur de confiance sur votre propre réseau. + + + Faire confiance au certificat de ce serveur + + + Seulement pour un serveur que vous connaissez et contrôlez, comme un serveur de test. Sinon, quelqu’un pourrait usurper l’identité du serveur. + + + Fichier de l’autorité de certification (facultatif) + + + Le serveur se trouve derrière un regroupeur de connexions + + + Famille du serveur + + + MySQL + + + MariaDB + + + Base de données derrière le pilote + + + Si vous savez avec quelle base de données le pilote ODBC communique, choisissez-la pour que Rotula applique les règles de sécurité de cette base de données. Les vérifications ne sont jamais assouplies. + + + Je ne sais pas + + + SQL Server + + + PostgreSQL + + + MySQL + + + MariaDB + + + SQLite + + + Oracle + + + DuckDB + + + BigQuery + + + Snowflake + + + ClickHouse + + + Informix + + + IBM Db2 + + + Firebird + + + Microsoft Access / Excel (Jet, ACE) + + + Si le certificat du serveur provient de votre propre organisation, choisissez ici le fichier de l’autorité de certification. Votre administrateur peut vous le fournir. + + + Ce service n’accepte que la connexion Microsoft Entra, qui nécessite un module complémentaire qui n’est pas encore installé. Vous ne pouvez pas vous y connecter avec un nom d’utilisateur et un mot de passe. + + + Le pilote de ce type de fichier est introuvable sur cet ordinateur. Installez le « Microsoft Access Database Engine » 64 bits de Microsoft, puis redémarrez Rotula. + + + Ce serveur est un regroupeur de connexions. Si quelque chose ne fonctionne pas, essayez plutôt l’adresse de connexion directe. + + + Utilisez un compte de base de données qui peut seulement lire (SELECT). Cette source de données ne peut pas rendre elle-même une session en lecture seule ; le compte est donc la véritable protection. + + + MariaDB + + + Amazon RDS pour MySQL + + + Amazon Aurora (MySQL) + + + Amazon RDS pour PostgreSQL + + + Amazon Aurora (PostgreSQL) + + + Amazon Redshift + + + CockroachDB + + + YugabyteDB (YSQL) + + + Supabase (connexion directe) + + + Supabase (regroupeur de connexions) + + + Neon (connexion directe) + + + Neon (regroupeur de connexions) + + + PlanetScale + + + TiDB + + + SingleStore + + + Azure SQL Database + + + Azure Synapse Analytics + + + Microsoft Fabric + + + Google Cloud SQL pour MySQL + + + Google Cloud SQL pour PostgreSQL + + + Google Cloud SQL pour SQL Server + + + Microsoft Access (.mdb, .accdb) + + + Microsoft Excel (.xls, .xlsx) + + + Fichiers texte et CSV (un dossier) + + + Le module complémentaire du dossier « {0} » n’a pas de fichier de description valide (pack.json) ; il n’a donc pas été chargé. Demandez une copie corrigée à la personne qui vous a fourni le module. + + + Le module complémentaire « {0} » nécessite une version plus récente de Rotula (interface de données {1}). Mettez Rotula à jour, puis redémarrez-le. + + + Le module complémentaire « {0} » a été conçu pour une version antérieure de Rotula et ne peut pas être utilisé. Demandez un module à jour. + + + Le module complémentaire « {0} » n’a pas pu être ouvert. Un fichier est peut-être absent ou endommagé, ou conçu pour un autre type d’ordinateur. Réinstallez le module. + + + Le module complémentaire « {0} » s’est arrêté sur une erreur au démarrage ; il a donc été désactivé. Rotula lui-même n’est pas touché. Réinstallez ou mettez à jour le module. + + + Le module complémentaire « {0} » ne correspond pas à son fichier de description ; il n’a donc pas été chargé. Réinstallez le module. + + + Un module complémentaire propose une source de données nommée « {0} », qui n’est pas un nom valide ; le module n’a donc pas été chargé. + + + Un module complémentaire propose une source de données nommée « {0} », qui existe déjà ; le module n’a donc pas été chargé. Un module ne peut jamais remplacer une source de données. + + + Un module complémentaire nommé « {0} » est déjà chargé ; la deuxième copie a été ignorée. + + + Le module complémentaire « {0} » de votre propre dossier n’a pas été chargé. Un module est un programme : approuvez-le seulement si vous faites confiance à sa provenance. + + + Le module complémentaire « {0} » a changé depuis que vous l’avez approuvé ; il n’a donc pas été chargé. Approuvez-le de nouveau seulement si vous vous attendiez à ce changement. + + + Le dossier du module complémentaire « {0} » contient des raccourcis (liens) ou est trop volumineux ; il a donc été ignoré. + + + Approuver ce module complémentaire ? + + + « {0} » est un module complémentaire de votre propre dossier ({1}). Un module est un programme : si vous l’approuvez, il peut faire tout ce que vous pouvez faire sur cet ordinateur, y compris lire vos fichiers. Approuvez-le seulement si vous savez qui l’a créé et que vous l’avez obtenu d’une source fiable. Vous pourrez retirer l’approbation plus tard. + + + Le module complémentaire « {0} » n’a pas pu être utilisé. + + + Certains modules complémentaires de sources de données n’ont pas pu être chargés. + + + Un module complémentaire attend votre approbation. + + + Détails + + + Fermer cet avis + + + Modules complémentaires de sources de données + + + Ces modules complémentaires ont été trouvés, mais n’ont pas été chargés. Rotula lui-même fonctionne normalement. + + + Détail technique + + + Examiner... + + + Examiner le module complémentaire {0} + + + Le module complémentaire « {0} » a été approuvé et est maintenant disponible. + + + Éditeur + + + Version + + + Empreinte (SHA-256) + + + Dossier + + + Approuver et charger + + + Ignorer + + + Ignorer laisse le module complémentaire désactivé. Rotula vous le redemandera au prochain démarrage. + + + non indiqué + + + Serveurs de bases de données + + + Services infonuagiques + + + Fichiers + + + Bases de documents + + + Services Web + + + Autres (pilotes ODBC) + + + Plus d’options + + + Cette connexion nécessite le module complémentaire « {0} », qui n’est pas installé. Ses réglages sont conservés tels quels. Installez le module et redémarrez Rotula pour utiliser ou modifier cette connexion. + + + Rotula n’a pas pu confirmer les réglages de ce service à l’aide de la documentation du fournisseur. Vérifiez l’adresse et le port avant de vous y fier. + + + Fichier + + + Dossier + + + Choisir un dossier... + + + Cette adresse semble correspondre à {0}. + + + Utiliser ses réglages + + + Vous avez modifié l’endroit ou la façon dont cette connexion ouvre une session ; le mot de passe enregistré n’a donc pas été utilisé. Tapez le mot de passe dans la case Mot de passe et testez de nouveau. + + + Choisir... + + + Le champ {0} est obligatoire. + + + {0} doit être un nombre entier de {1} à {2}. + + + Rechercher des supports d’étiquettes + + + Rechercher par numéro de pièce, format ou nom + + + Essayez un numéro de pièce comme {0}, ou un format comme 4x6 ou 100x150mm. + + + Marque + + + Toutes les marques + + + Exprimé en + + + Pouces ou mm + + + Pouces + + + Millimètres + + + Type + + + Tous les types + + + Rouleau + + + Feuille + + + Ronde + + + Vérifiés seulement + + + Favoris seulement + + + Formats courants + + + Favoris + + + Récents + + + Résultats + + + Formats proches + + + Format personnalisé... + + + Tapez votre propre largeur et hauteur + + + Format d’étiquette courant + + + {0} supports d’étiquettes. Tapez pour rechercher. + + + La bibliothèque de supports n’est pas disponible. Vous pouvez tout de même utiliser les formats courants ou un format personnalisé. + + + {0} supports trouvés + + + Affichage de {0} supports sur {1}. Tapez davantage pour affiner la recherche. + + + {0} supports trouvés, et {1} formats proches ci-dessous + + + Aucun support ne correspond. Essayez moins de mots, ou seulement le numéro de pièce ou le format. + + + Chargement de la bibliothèque de supports... + + + Format vérifié + + + Format non vérifié + + + Le format a été confirmé par deux sources indépendantes. + + + Le format provient d’une seule source, ou les sources ne concordent pas. Mesurez les étiquettes réelles avant d’imprimer un grand tirage. + + + Mon support + + + Ajouter aux favoris + + + Retirer des favoris + + + favori + + + Créer l’étiquette + + + Obtenue de votre imprimante ({0} ppp). Modifiez-la si vous imprimez sur une autre imprimante. + + + Avant de commencer + + + Ce que l’on sait de ce support + + + Il s’agit d’un rouleau continu : tapez la hauteur de l’étiquette voulue. + + + Hauteur de l’étiquette + + + Ce support n’a pas de format utilisable ; il ne peut donc pas être appliqué. + + + Le rouleau mesure {0} m de long. + + + {0} x {1} mm + + + {0} x {1} po + + + {0} mm de largeur + + + {0} po de largeur + + + {0} mm + + + {0} m + + + {0} mm ({1} po) + + + {0} dans la largeur, {1} dans la longueur + + + Inconnu. Étalonnez l’imprimante avec ce support chargé. + + + Marque noire au verso + + + Non indiqué + + + Thermique directe + + + Transfert thermique + + + Thermique directe ou transfert thermique + + + Non indiqué + + + Rouleau d’étiquettes prédécoupées + + + Rouleau continu + + + Rouleau sans dorsal + + + Pile pliée en paravent + + + Feuilles + + + Marque + + + Numéro de pièce + + + Famille de produits + + + Format + + + Type d’impression + + + Présentation + + + Surface et adhésif + + + Mandrin + + + Étiquettes par rouleau + + + Longueur du rouleau + + + Étiquettes dans la largeur + + + Rayon des coins + + + Espace entre les étiquettes + + + Espace entre les colonnes + + + Espace entre les rangées + + + Sources + + + Vérification + + + Conserver ce format comme mon propre support + + + Nom + + + Numéro de pièce (facultatif) + + + Enregistrer comme mon support + + + « {0} » a été enregistré. Vous pouvez le retrouver en recherchant son nom ou son numéro de pièce. + + + Donnez un nom ou un numéro de pièce au support. + + + Le support n’a pas pu être enregistré : {0} + + + Ce format ne peut pas être conservé comme support : il se situe hors des formats qu’une imprimante d’étiquettes peut utiliser. + + + Importer une liste de fournitures... + + + Choisissez une liste de fournitures (CSV ou Excel) + + + Importer une liste de fournitures + + + Vérifiez ce que Rotula a compris avant de le conserver. Seuls les numéros de pièce, les descriptions et les formats sont lus ; les prix ne sont jamais lus. + + + {0} lignes lues, {1} supports trouvés. + + + Rien n’a pu être importé de cette liste. + + + Ligne + + + Numéro de pièce + + + Description + + + Format (mm) + + + Format (po) + + + Certitude + + + Élevée + + + Moyenne : à vérifier + + + Le format a sa propre colonne avec une unité, ou deux mentions du format concordent. + + + Le format a été trouvé dans du texte libre avec une unité. Comparez-le avec l’étiquette réelle. + + + Remarques sur la liste + + + Enregistrer {0} supports + + + {0} supports enregistrés dans {1}. Ils font maintenant partie de la recherche. + + + Les noms de marques et de produits appartiennent à leurs propriétaires ; Rotula n’y est pas affilié. + + + À propos du catalogue de supports + + + À propos du catalogue de supports + + + La bibliothèque de supports répertorie les supports d’étiquettes par numéro de pièce du fabricant, avec le format de l’étiquette en millimètres et en pouces, le type d’impression et, lorsqu’une source l’indique, la taille du mandrin, le nombre d’étiquettes par rouleau, le nombre d’étiquettes dans la largeur et le rayon des coins. + +Elle contient {0} supports, dont {1} au format vérifié (deux sources indépendantes concordent). Les numéros de pièce et les formats sont des données de produit publiées par les fabricants ; Rotula ne conserve ni prix, ni images, ni textes publicitaires. + +L’espace entre les étiquettes n’est presque jamais publié ; Rotula le laisse donc à l’imprimante : étalonnez l’imprimante avec le support chargé. Pour les supports comportant plusieurs étiquettes dans la largeur ou dans la longueur, ainsi que pour les feuilles, seul le format d’une étiquette est appliqué. + +Vos propres supports et les listes de fournitures que vous importez sont conservés dans {2}. Supprimez un fichier de ce dossier pour retirer ses supports. + +Les noms de marques et de produits appartiennent à leurs propriétaires ; Rotula n’y est pas affilié. Vous avez trouvé un format erroné ? Les corrections sont les bienvenues : consultez docs/stock-catalog.md dans le projet. + + + Support d’étiquettes + + + Support d’étiquettes : {0} + + + Support d’étiquettes : {0} (ne figure plus dans la bibliothèque) + + + numéro de pièce + + + format + + + Trouver un support + + + Format de l’étiquette + + + Filtres + + + 1 support trouvé + + + Famille de produits + + + Toutes les familles + + + Comme vos derniers réglages d’impression ({0} ppp). Modifiez-la si vous imprimez sur une autre imprimante. + + + Les adresses de ce service ressemblent à {0}. + + + Insérer un champ + + + Insère un champ de données à la position du curseur. Vous pouvez aussi taper {{ pour afficher la liste. + + + Chargez d’abord des données : Imprimante > Fusion de données + + + Ouvrir Fusion de données + + + Rechercher des champs + + + Champs disponibles + + + 1 champ disponible + + + {0} champs disponibles + + + Aucun champ ne correspond + + + Haut/Bas pour choisir, Entrée pour insérer, Échap pour fermer + + + Colonne + + + Compteur + + + Variable + + + (vide) + + + Valeur dans l’enregistrement affiché : {0} + + + Aucune colonne nommée {0} dans les données chargées + + + Affiche les données de : {0} + + + Champs de vos données + + + Ajoutez une colonne à l’étiquette sous forme de texte, de code à barres ou de code QR, ou placez-la dans l’élément sélectionné sur l’étiquette. + + + Il n’y a encore aucun champ. Ouvrez d’abord un fichier de données ou choisissez une table de la base de données. + + + Ajouter tous les champs à l’étiquette + + + Ajoute un texte par colonne, empilés de haut en bas + + + Ajouter à l’étiquette + + + Ajouter ce champ à l’étiquette sous forme de texte + + + Utiliser ici + + + Placer ce champ dans l’élément sélectionné + + + Sélectionnez un texte ou un code à barres sur l’étiquette pour y placer un champ. + + + Élément sélectionné : {0} + + + {0} a été ajouté à l’étiquette + + + {0} champs ont été ajoutés à l’étiquette + + + Les champs ne tiennent pas tous + + + Le nouveau champ ne tient pas dans l’étiquette. Augmentez la hauteur de l’étiquette ou déplacez le champ. + + + {0} des {1} nouveaux champs ne tiennent pas dans l’étiquette. Augmentez la hauteur de l’étiquette, utilisez moins de champs ou déplacez-les. + + + {0} a été placé dans {1} + + + Variables de l’étiquette + + + l’insertion du champ + + + l’ajout des champs + + + Valeur fixe + + + Champ + + + Choisissez si le contenu est une valeur fixe ou provient d’un champ de données + + + Affiche le champ {0} des données. Utilisez Champ pour en choisir un autre. + + + Utiliser plutôt une valeur fixe + + + Ajouter comme texte + + + Ajouter comme code à barres + + + Ajouter comme code QR + + + le passage à une valeur fixe + + + Utilise des champs de données + + + Autres façons d’ajouter ce champ + + + + Le nom de variable « {0} » n’est pas valide. Utilisez seulement des lettres, des chiffres et des traits de soulignement, et gardez-le court. + + + Deux variables sont nommées « {0} ». Les noms ne tiennent pas compte des majuscules et des minuscules ; donnez donc un nom différent à chaque variable. + + + La variable « {0} » porte le même nom qu’une colonne de données ; sa propre valeur est donc utilisée au lieu de la colonne. Renommez l’une des deux si vous voulez les données de la colonne. + + + + Le format de date « {1} » de la variable « {0} » ne peut pas être utilisé. Choisissez un format dans la liste ou vérifiez le modèle. + + + La langue « {1} » choisie pour la variable « {0} » n’est pas connue sur cet ordinateur ; la langue standard est donc utilisée pour les noms des mois et des jours. Choisissez une autre langue. + + + Le décalage de date de la variable « {0} » est trop grand, ou il y a trop de décalages. Utilisez des valeurs d’au plus {1} et moins de décalages. + + + La date calculée pour la variable « {0} » se situe hors des dates que Rotula peut traiter. Réduisez les décalages de date. + + + La variable « {0} » est réglée sur une date fixe, mais aucune date n’a été entrée. Entrez la date. + + + La variable « {0} » compte des jours ouvrables, ce qu’une imprimante ne sait pas faire ; l’horloge de l’ordinateur est donc utilisée. + + + La variable « {0} » arrondit au début ou à la fin d’une période, ce qui exige l’horloge de l’ordinateur ; celle-ci est donc utilisée au lieu de l’horloge de l’imprimante. + + + La variable « {0} » utilise l’heure UTC, que l’horloge de l’imprimante ne peut pas fournir ; l’horloge de l’ordinateur est donc utilisée. + + + Le format de date de la variable « {0} » utilise « {1} », que l’imprimante ne peut pas imprimer ; l’horloge de l’ordinateur est donc utilisée. Utilisez un format plus simple pour utiliser l’horloge de l’imprimante. + + + La variable « {0} » imprime des noms de mois ou de jours dans la langue « {1} », mais l’imprimante les écrit en anglais ; l’horloge de l’ordinateur est donc utilisée. Choisissez l’anglais ou un format numérique pour utiliser l’horloge de l’imprimante. + + + Une étiquette ne peut décaler l’horloge de l’imprimante que de deux façons différentes, et les deux sont déjà utilisées ; la variable « {0} » utilise donc l’horloge de l’ordinateur. + + + La variable « {0} » utilise une date fixe, qui n’est pas une horloge ; il n’y a donc pas d’horloge d’imprimante à lire, et l’ordinateur est utilisé. + + + L’horloge de l’imprimante ne peut pas être utilisée dans un code à barres ; la variable « {0} » utilise donc l’horloge de l’ordinateur. + + + Ce champ utilise déjà ses propres marqueurs d’horloge et aucun n’est libre pour la variable « {0} » ; l’horloge de l’ordinateur est donc utilisée. + + + Aucun caractère marqueur d’horloge n’est libre dans ce champ pour la variable « {0} » ; l’horloge de l’ordinateur est donc utilisée. + + + + Le compteur « {0} » a un réglage non valide : {1}. Corrigez-le dans les réglages de la variable. + + + Le compteur « {0} » a dépassé son plus grand nombre et s’arrête au lieu de recommencer. Autorisez plus de chiffres ou réinitialisez le compteur. + + + Le départ, le pas, le type ou le remplissage du compteur « {0} » a été modifié alors que des numéros avaient déjà été utilisés (dernier numéro : {1}). L’impression est bloquée jusqu’à ce que vous acceptiez la modification ou réinitialisiez le compteur. + + + Une impression précédente a réservé les numéros {1} à {2} du compteur « {0} » sans jamais se terminer ; ces numéros ont donc été sautés. Si rien n’a été imprimé avec eux, vous pouvez les rendre dans les réglages du compteur. + + + Le fichier des compteurs « {0} » est endommagé. Rien n’a été modifié. Récupérez les compteurs (le fichier endommagé est mis de côté) ou restaurez une copie de sauvegarde, puis réessayez. + + + Le fichier des compteurs « {0} » a été écrit par une version plus récente de Rotula (version de fichier {1}). Mettez Rotula à jour pour l’utiliser. Rien n’a été modifié. + + + Le fichier des compteurs « {0} » est utilisé par un autre programme ou ne peut pas être écrit. Fermez l’autre programme, vérifiez que vous pouvez écrire dans ce dossier, puis réessayez. + + + Le compteur « {0} » mémorise son numéro d’une impression à l’autre ; l’étiquette doit donc d’abord être enregistrée. Enregistrez l’étiquette et réessayez. + + + Le compteur « {0} » devrait mémoriser son numéro, mais les compteurs ne peuvent pas être stockés pour l’instant ; il ne peut donc compter qu’à partir de son premier numéro. Pour éviter de répéter des numéros, l’impression a besoin que le fichier des compteurs soit disponible. + + + + Entrez une valeur pour « {0} ». + + + La réponse pour « {0} » est trop courte. Entrez au moins {1} caractères. + + + La réponse pour « {0} » est trop longue. Entrez au plus {1} caractères. + + + La réponse pour « {0} » n’est pas dans le format attendu. Vérifiez-la et réessayez. + + + La règle de format définie pour la question « {0} » n’est pas valide. Corrigez la règle dans les réglages de la variable. + + + La réponse pour « {0} » doit être un nombre. + + + La réponse pour « {0} » doit être une date. + + + Choisissez l’une des options proposées pour « {0} ». + + + La question « {0} » n’a aucun choix proposé. Ajoutez au moins un choix dans les réglages de la variable. + + + Aucune réponse n’a été donnée pour « {0} ». Répondez à toutes les questions avant d’imprimer. + + + + La formule de la variable « {0} » est vide. Écrivez une formule ou retirez la variable. + + + La formule de la variable « {0} » est trop longue (maximum {2} caractères). Raccourcissez-la. + + + La formule de la variable « {0} » est trop imbriquée près de la position {1} (maximum {2} niveaux). Simplifiez-la. + + + La formule de la variable « {0} » comporte trop de parties (maximum {2}). Divisez-la en deux variables. + + + La formule de la variable « {0} » contient un caractère non permis à la position {1} : {2}. Retirez-le. + + + Autre chose était attendu à la position {1} de la formule de « {0} », mais {2} a été trouvé. Vérifiez la formule. + + + La formule de la variable « {0} » se termine trop tôt (position {1}). Vérifiez s’il manque une valeur ou une parenthèse fermante. + + + Un texte entre guillemets à la position {1} de la formule de « {0} » n’est pas fermé. Ajoutez le guillemet fermant. + + + Le nombre « {2} » à la position {1} de la formule de « {0} » n’est pas valide. Vérifiez son écriture. + + + La fonction « {2} » à la position {1} de la formule de « {0} » n’existe pas. Vérifiez l’orthographe. + + + La fonction {2} à la position {1} de la formule de « {0} » accepte de {3} à {4} valeurs. Ajoutez ou retirez des valeurs. + + + La valeur numéro {3} de la fonction {2} dans la formule de « {0} » n’est pas permise (par exemple une longueur négative). Modifiez-la. + + + La formule de la variable « {0} » utilise « {2} », qui n’est pas une variable déclarée et n’a pas de données. Créez la variable ou corrigez le nom. + + + Des variables calculées dépendent les unes des autres en boucle ({2}). Modifiez l’une des formules pour briser la boucle. + + + Un résultat de la formule de « {0} » dépasserait {2} caractères et a été tronqué. Raccourcissez la formule. + + + La fonction {2} dans la formule de « {0} » n’a pas pu lire « {3} » comme un nombre. Vérifiez la valeur. + + + La fonction {2} dans la formule de « {0} » n’a pas pu lire « {3} » comme une date. Écrivez les dates sous la forme AAAA-MM-JJ ou AAAAMMJJ. + + + Le format « {3} » utilisé par la fonction {2} dans la formule de « {0} » ne peut pas être utilisé. Vérifiez le format. + + + + Les données ne tiennent pas dans un code QR au niveau de correction d’erreurs « {2} » : elles comptent {0} caractères et le maximum possible est de {1}. Raccourcissez les données ou choisissez un niveau de correction d’erreurs plus faible. + + + Le mode d’entrée des données QR n’est pas un mode connu de Rotula. Choisissez Automatique ou l’un des modes manuels. + + + Le mode alphanumérique manuel n’accepte que les chiffres, les lettres majuscules de A à Z, les espaces et les symboles $ % * + - . / : . Modifiez les données ou choisissez un autre mode d’entrée. + + + Les données sont trop longues pour le mode octet manuel (maximum {0} octets). Raccourcissez les données. + + + Le mode numérique manuel n’accepte que les chiffres de 0 à 9. Modifiez les données ou choisissez un autre mode d’entrée. + + + Le motif de masque QR doit être un nombre de {0} à {1}, ou rester automatique. + + + faible (7 %) + + + moyen (15 %) + + + quartile (25 %) + + + élevé (30 %) + + + Ce Code 128 ({0}) contient des données GS1 que Rotula ne peut pas réécrire exactement telles quelles. Il a été conservé en texte ZPL et s’imprimera quand même, mais il ne peut pas être modifié. + + + + Il n’y a aucune donnée GS1. Entrez au moins un identifiant avec sa valeur, par exemple (01)09506000134352. + + + Les données GS1 sont mal écrites près du caractère {0}. Chaque élément doit avoir la forme (01)09506000134352. + + + L’identifiant ({0}) a une longueur fixe ; il ne doit donc pas être suivi d’un caractère séparateur. Retirez le séparateur. + + + Les données se terminent avant que la valeur de ({0}) soit complète. Vérifiez que la valeur comporte tous ses caractères. + + + Les données se terminent par un séparateur qui n’est suivi de rien. Retirez-le. + + + L’identifiant qui commence par « {0} » n’est pas un identifiant GS1 connu. Vérifiez le numéro. + + + L’identifiant ({0}) n’existe pas dans le système GS1. Vérifiez le numéro entre parenthèses. + + + La valeur de ({0}) est trop longue (maximum {1} caractères). Raccourcissez-la. + + + La valeur de ({0}) est trop courte (minimum {1} caractères). Complétez-la. + + + L’identifiant ({0}) apparaît plus d’une fois avec des valeurs différentes. N’en gardez qu’un. + + + L’identifiant ({0}) apparaît plus d’une fois avec la même valeur. Retirez la répétition. + + + Les identifiants ({0}) et ({1}) ne peuvent pas être utilisés ensemble. Retirez l’un d’eux. + + + L’identifiant ({0}) s’utilise normalement avec d’autres identifiants : {1} (une virgule sépare les solutions de rechange, un signe plus signifie tous). Ajoutez-les ou vérifiez vos données. + + + Un Data Matrix GS1 ne peut pas aussi être un GS1 Digital Link. Désactivez l’une des deux options. + + + L’option de chiffre de contrôle n’est pas nécessaire : le GS1-128 ajoute son propre chiffre de contrôle. Désactivez l’option. + + + Une valeur contient une parenthèse, que l’imprimante supprime en mode GS1-128. Retirez la parenthèse de la valeur. + + + Les données GS1-128 comptent {0} caractères ; le maximum est de {1} (les identifiants et les séparateurs comptent). Raccourcissez les données. + + + Un code ITF-14 nécessite exactement 14 chiffres. + + + Le chiffre de contrôle du code ITF-14 est erroné. Il devrait être {0}. + + + La partie linéaire « {0} » du code composite n’est pas un GTIN valide (8, 12, 13 ou 14 chiffres avec un chiffre de contrôle correct). Corrigez-la. + + + L’identifiant ({0}) apparaît à la fois dans la partie linéaire et dans la partie 2D du code composite. Ne le gardez que dans l’une des deux. + + + + Le texte n’est pas une adresse Web valide. Un GS1 Digital Link doit commencer par https:// (ou http://). + + + Le lien n’a pas de clé GS1. Un Digital Link doit avoir une clé, comme le GTIN (01), suivie de sa valeur. + + + Le lien a plus d’une clé GS1. Un Digital Link nécessite exactement une clé, comme le GTIN. Retirez les autres. + + + L’identifiant ({0}) ne peut pas être utilisé dans un GS1 Digital Link. Retirez-le. + + + Le chemin du lien est incomplet : il doit être formé de paires, un identifiant suivi de sa valeur. Vérifiez le lien. + + + Les qualificatifs ({1}) ne forment pas une combinaison permise pour la clé ({0}). Retirez-en un ou vérifiez les règles GS1. + + + Les qualificatifs ({1}) de la clé ({0}) ne sont pas dans un ordre permis. Placez-les dans l’ordre défini par GS1 pour cette clé. + + + + La valeur de ({0}) ne doit contenir que des traits d’union (-). + + + La valeur de ({0}) doit contenir au moins un caractère qui n’est pas un chiffre. + + + La valeur de ({0}) doit être composée uniquement de zéros. + + + La valeur de ({0}) doit être 0, 1 ou 9. + + + La valeur de ({0}) doit être 0 ou 1. + + + La valeur de ({0}) doit être 0, 1, 2 ou 9. + + + La valeur « {1} » de ({0}) n’est pas un code de pays à 3 chiffres valide (ISO 3166). Vérifiez-la. + + + La valeur « {1} » de ({0}) n’est pas un code de pays. Utilisez un code ISO 3166 à 3 chiffres ou 999. + + + La valeur « {1} » de ({0}) n’est pas un code de pays à 2 lettres valide (ISO 3166). Vérifiez-la. + + + La valeur « {1} » de ({0}) n’est pas un code numérique de devise valide (ISO 4217). Vérifiez-la. + + + La valeur « {1} » de ({0}) n’est pas un code de type d’emballage valide. Vérifiez-la. + + + La valeur de ({0}) doit être une seule lettre, un seul chiffre, un trait d’union ou un trait de soulignement. + + + La valeur de ({0}) doit compter 10 chiffres et représenter une latitude entre -90 et 90 degrés. + + + La valeur de ({0}) doit compter 10 chiffres et représenter une longitude entre -180 et 180 degrés. + + + Le caractère « {1} » dans la valeur de ({0}) n’est pas un chiffre. Cet identifiant n’accepte que des chiffres. + + + Le caractère « {1} » dans la valeur de ({0}) ne peut pas être utilisé dans des données GS1. Utilisez seulement les lettres, les chiffres et les symboles permis par GS1. + + + Le caractère « {1} » dans la valeur de ({0}) n’est pas permis. Utilisez seulement des lettres majuscules, des chiffres, # - et /. + + + Le caractère « {1} » dans la valeur de ({0}) n’est pas permis dans un texte Base64. Utilisez des lettres, des chiffres, - et _. + + + Le remplissage « = » à la fin de la valeur de ({0}) n’est pas correct. + + + Le chiffre de contrôle de ({0}) est erroné ou absent (attendu : {1}). Corrigez-le. + + + Les deux caractères de contrôle à la fin de la valeur de ({0}) sont erronés. Corrigez-les. + + + La valeur de ({0}) doit contenir un préfixe d’entreprise GS1 d’au moins 4 chiffres à l’endroit attendu. + + + La date de ({0}) doit s’écrire sous la forme {1}. + + + Le mois « {1} » dans la date de ({0}) doit être de 01 à 12. + + + Le jour « {1} » dans la date de ({0}) n’est pas valide pour ce mois. + + + L’heure de ({0}) doit s’écrire sous la forme {1}. + + + L’heure « {1} » dans ({0}) doit être de 00 à 23. + + + Les minutes « {1} » dans ({0}) doivent être de 00 à 59. + + + Les secondes « {1} » dans ({0}) doivent être de 00 à 59. + + + La valeur de ({0}) ne doit pas être zéro. + + + La valeur de ({0}) ne doit pas commencer par un zéro. + + + La valeur de ({0}) doit être formée de deux nombres de même longueur : le numéro de pièce et le total (par exemple 0204). + + + Ni le numéro de pièce ni le total de ({0}) ne peuvent être zéro. + + + Le numéro de pièce de ({0}) est supérieur au total. Vérifiez les deux nombres. + + + La valeur de ({0}) doit être formée de deux nombres séparés par une barre oblique (par exemple 2/5). + + + Le premier nombre de ({0}) est supérieur au second. Vérifiez les deux nombres. + + + La valeur de ({0}) contient un code % incomplet ou non valide. + + + Le type de support « {1} » de ({0}) n’est pas valide. Utilisez de 01 à 10 ou de 80 à 99. + + + La valeur de ({0}) n’est pas un IBAN valide. Vérifiez-la. + + + + Seuls les chiffres sont permis. + + + Le chiffre de contrôle est erroné. Il devrait être {0}. + + + Un GTIN compte 8, 12, 13 ou 14 chiffres. + + + Le chiffre indicateur doit être de 0 à 9. + + + Un préfixe d’entreprise GS1 compte de 4 à 12 chiffres. + + + La référence ne doit pas être vide et doit être composée de chiffres. + + + Le préfixe d’entreprise est trop long : il ne laisse pas de place pour la référence. + + + La référence est trop longue. Au plus {0} caractères sont permis. + + + Le chiffre d’extension doit être de 0 à 9. + + + Le caractère « {0} » n’est pas permis dans des données GS1. + + + L’identifiant ({0}) n’est pas une mesure avec une position de virgule décimale. + + + La mesure ne peut pas être négative et peut compter au plus {0} chiffres. + + + + Le code QR est rempli à {0} % (version {1}). Il pourrait être difficile à lire. Raccourcissez le contenu ou choisissez un niveau de correction d’erreurs plus faible. + + + Le contenu ne tient pas dans un code QR au niveau de correction d’erreurs « {2} » : il nécessite {0} et la limite est de {1}. + + + Raccourcissez le contenu pour qu’il tienne. + + + Le niveau de correction d’erreurs « {0} » permettrait au contenu de tenir. + + + L’adresse courriel n’est pas valide. Vérifiez-la (par exemple nom@exemple.com). + + + Entrez au moins une adresse courriel. + + + L’événement se termine avant de commencer. Vérifiez les dates de début et de fin. + + + La date n’a pas de fuseau horaire ; elle est donc lue en heure UTC et pourrait paraître décalée dans un calendrier. Ajoutez le fuseau, par exemple -05:00. + + + Entrez un titre pour l’événement. + + + L’altitude n’est pas un nombre valide. + + + La latitude doit être un nombre entre -90 et 90. + + + La longitude doit être un nombre entre -180 et 180. + + + Entrez un prénom ou un nom de famille pour le contact. + + + Entrez un prénom, un nom de famille ou une organisation pour le contact. + + + Le numéro de téléphone n’est pas valide. Utilisez des chiffres, éventuellement avec + et l’indicatif du pays (par exemple +15145551234). + + + Le message dépasse {0} caractères ; il pourrait donc être envoyé en plusieurs messages. + + + Entrez l’adresse Web. + + + L’adresse Web n’est pas valide. Écrivez-la au complet, sans espaces (par exemple https://exemple.com). + + + L’adresse commence par « {0} », que bien des appareils photo de téléphone n’ouvriront pas. Utilisez https:// si possible. + + + Ce réseau n’a aucune sécurité ; le mot de passe est donc ignoré. Effacez le mot de passe ou choisissez un type de sécurité. + + + La longueur du mot de passe n’est pas valide pour ce type de sécurité. Il doit compter {0} caractères. + + + Entrez le mot de passe du réseau. + + + Entrez le nom du réseau Wi-Fi. + + + Le nom du réseau est trop long (maximum {0} octets ; les caractères accentués en utilisent plus d’un). + + + Ce champ est obligatoire. + + + Ce texte est trop long (maximum {1} caractères). Raccourcissez-le. + + + Choisissez l’une des valeurs proposées. + + + Entrez un nombre valide (utilisez un point pour les décimales). + + + Entrez une date valide, ou une date et une heure avec leur fuseau (par exemple 2026-03-14T09:00:00-05:00). + + + + Les données sont GS1 (GS1 DataMatrix) + + + Les données sont un GS1 Digital Link + + + Motif de masque + + + Mode d’entrée des données + + + Contenu structuré + + + Faible (7 %) + + + Moyen (15 %) + + + Quartile (25 %) + + + Élevé (30 %) + + + Modèle 1 (original) + + + Modèle 2 (recommandé) + + + Automatique (l’imprimante choisit) + + + Motif 0 + + + Motif 1 + + + Motif 2 + + + Motif 3 + + + Motif 4 + + + Motif 5 + + + Motif 6 + + + Motif 7 + + + Automatique + + + Manuel : chiffres seulement + + + Manuel : majuscules et chiffres + + + Manuel : tout texte (octets) + + + Manuel : kanji + + + + Adresse Web + + + Texte + + + Wi-Fi + + + Contact (vCard) + + + Contact (MeCard) + + + GS1 Digital Link + + + Courriel + + + Appel téléphonique + + + Message texte (SMS) + + + Emplacement + + + Événement d’agenda + + + + Adresse Web + + + Retirer les paramètres de suivi + + + Texte + + + Nom du réseau + + + Mot de passe + + + Sécurité + + + Réseau masqué + + + Prénom + + + Nom de famille + + + Organisation + + + Titre + + + Téléphone + + + Cellulaire + + + Courriel + + + Rue + + + Ville + + + Province, État ou région + + + Code postal + + + Pays + + + Remarque + + + Préfixe de l’adresse Web + + + GTIN + + + Lot + + + Numéro de série + + + Date d’expiration (AAMMJJ) + + + Meilleur avant (AAMMJJ) + + + Date de production (AAMMJJ) + + + À + + + Objet + + + Corps du message + + + Numéro de téléphone + + + Message + + + Latitude + + + Longitude + + + Nom du lieu + + + Début + + + Fin + + + Lieu + + + Description + + + Toute la journée + + + + WPA / WPA2 + + + WPA3 + + + WEP (ancien) + + + Aucune (réseau ouvert) + + + + Le serveur a fermé la connexion pendant l’ouverture de session. Le nom d’utilisateur ou le mot de passe est probablement erroné. Si vous utilisez une connexion chiffrée, le certificat du serveur peut aussi être en cause. + + + La base de données ne peut pas déterminer le type de ce paramètre. + + + Indiquez le type du paramètre dans la requête, par exemple @x::text. + + + Le paramètre est d’un type différent de celui de la colonne à laquelle il est comparé. + + + Passez une valeur du type de la colonne, ou convertissez le paramètre, par exemple @x::numeric ou @x::date. + + + Accepte un certificat qui ne peut pas être vérifié. Avec MariaDB et un compte à mot de passe, le certificat est vérifié par son empreinte ; un serveur à certificat autosigné se connecte donc habituellement sans cette option. + + + Nom de la table + + + + Fichier DuckDB + + + Firebird + + + Oracle Database + + + ClickHouse + + + Fichier de base de données DuckDB + + + Le fichier .duckdb sur cet ordinateur. + + + Limite de mémoire (Mo) + + + Limite facultative de la mémoire qu’une requête peut utiliser. + + + Chemin ou alias de la base de données sur le serveur + + + Le chemin tel que le serveur le voit (C:\donnees\ventes.fdb) ou un alias du fichier databases.conf du serveur. + + + Chiffre toute la connexion. Avec un nom d’utilisateur et un mot de passe, c’est obligatoire : si le serveur ne peut pas chiffrer, la connexion échoue. + + + Rôle SQL (facultatif) + + + Utilisez un rôle qui peut seulement lire (SELECT). + + + Nom du service + + + Le service offert par l’écouteur (par exemple ORCLPDB1). + + + Utilise TLS. Désactivez-le seulement pour un écouteur sans TLS. + + + Ne pas vérifier le nom du serveur dans le certificat + + + Garde TLS activé, mais saute la vérification du nom d’hôte. Réduit la sécurité. + + + Le nom ci-dessus est + + + Un nom de service + + + Un SID (ancienne méthode) + + + Un nom de tnsnames.ora + + + Dossier contenant tnsnames.ora + + + Seulement pour les noms de tnsnames.ora. + + + Dossier du portefeuille (certificats TLS) + + + Un portefeuille Oracle contenant les certificats de confiance, lorsque le magasin de certificats de Windows ne suffit pas. + + + Laisser le serveur arrêter les longues requêtes (nécessite un compte autorisé à modifier les réglages) + + + Désactivé par défaut : les comptes à profil en lecture seule sont refusés lorsqu’un réglage change. + + + Assistant de contenu... + + + Assistant GS1... + + + Créé avec l’assistant de contenu : {0}. Modifier le texte à la main supprime cette définition. + + + La définition de contenu enregistrée ne peut pas être lue. Ouvrez l’assistant de contenu pour la recréer. + + + Vous avez modifié le texte à la main ; la définition de l’assistant de contenu a donc été supprimée. Ouvrez l’assistant de contenu pour recommencer à partir d’un formulaire. + + + l’assistant de contenu QR + + + l’assistant GS1 + + + Rien à mesurer pour l’instant. L’indicateur apparaît quand le code a du contenu. + + + Tient : {0} % de la capacité au niveau {1}, version {2} + + + Tient : {0} % de la capacité au niveau {1} (modèle 1) + + + Presque plein : {0} % de la capacité au niveau {1}, version {2}. Baissez le niveau ou raccourcissez le texte pour faciliter la lecture. + + + Presque plein : {0} % de la capacité au niveau {1} (modèle 1). Baissez le niveau ou raccourcissez le texte pour faciliter la lecture. + + + Ne tient pas au niveau {0} : il faut {1} et la limite est de {2}. Baissez le niveau ou raccourcissez le texte. + + + Au niveau {0}, le contenu tiendrait. + + + Même le niveau le plus bas ne suffit pas : raccourcissez le texte. + + + Niveau suggéré pour ce contenu : {0}. + + + Mesuré sur le plus long des {0} enregistrements chargés. + + + Taille imprimée : {0} mm ({1} po) de côté à {2} ppp (version {3}). + + + Chaque module mesure {0} mm de largeur à {1} ppp. + + + Trop petit pour être lu : chaque module mesure {0} mm de largeur. Utilisez au moins {1} points (environ {2} mm) par module à {3} ppp. + + + Assistant de contenu QR + + + Appliquer au code + + + Que doit faire le code quand on le lit ? + + + Aperçu + + + Texte dans le code + + + Capacité + + + À corriger + + + Utiliser plutôt une valeur fixe + + + {0} caractères + + + Le mot de passe est imprimé en clair dans le code : quiconque le lit peut le voir. Il est affiché ici volontairement, pour que vous puissiez le vérifier. + + + Exemple : {0} + + + Vous pouvez écrire plusieurs lignes. Exemple : {0} + + + Un numéro de téléphone avec l’indicatif du pays. Exemple : {0} + + + Une adresse courriel. Exemple : {0} + + + Une adresse Web complète qui commence par https://. Exemple : {0} + + + Un nombre ; utilisez un point pour les décimales. Exemple : {0} + + + Chiffres seulement. Exemple : {0} + + + Choisissez la date, écrivez l’heure en heures et minutes (09:30), ou liez un champ. Exemple : {0} + + + Remplissez le formulaire et le code apparaîtra ici. + + + Le code apparaît une fois les problèmes de droite corrigés. + + + Les champs liés affichent la valeur de l’enregistrement affiché dans la zone de conception, ou leur exemple. + + + Remplissez les champs marqués d’un * pour continuer. + + + Assistant GS1-128 + + + Assistant GS1 DataMatrix + + + Appliquer au code à barres + + + Valeur + + + Valeur + + + Identifiant inconnu + + + Format {0}, jusqu’à {1} caractères. + + + Expédition (SSCC) + + + Une palette ou un colis : son code séquentiel de colis (SSCC). + + + Produit (GTIN, lot, expiration) + + + Le code du produit avec son lot et sa date d’expiration. + + + Sérialisation (GTIN, numéro de série) + + + Le code du produit avec un numéro de série pour chaque article. + + + Identifiants courants. Tapez pour les rechercher tous. + + + {0} identifiants trouvés + + + {0} caractères sur {1} + + + Environ {0} caractères sur {1} (les champs liés sont estimés) + + + {0} caractères + + + Le message nécessite {0} caractères et le GS1-128 en contient au plus {1}. Retirez un identifiant ou utilisez des valeurs plus courtes. + + + Cette valeur provient d’un champ. Elle est vérifiée par rapport aux données à l’impression. + + + Choisissez un usage prédéfini ou ajoutez des identifiants de la liste pour commencer. + + + Remplissez la valeur de chaque identifiant pour continuer. + + + Monter + + + Descendre + + + Retirer cet identifiant + + + Partir d’un usage + + + Ajouter un identifiant + + + Rechercher des identifiants + + + Tapez le numéro d’un identifiant (10) ou des mots de son nom en anglais (expiry). + + + Entrée ou un double-clic ajoute l’identifiant. Flèche bas pour passer à la liste. + + + Identifiants correspondants + + + Le message + + + Aucun identifiant pour l’instant. Choisissez un usage à gauche, ou recherchez un identifiant et ajoutez-le. + + + Aperçu + + + Le symbole apparaît lorsque toutes les valeurs sont valides. + + + Forme lisible + + + Caractères encodés avec FNC1 + + + [FNC1] marque le caractère spécial qui commence le symbole et sépare les valeurs de longueur variable. + + + Longueur + + + Oui + + + Heure du jour en heures et minutes, par exemple 09:30 + + + Avant d’imprimer + + + Cette étiquette pose quelques questions. Vos réponses sont utilisées sur toutes les étiquettes de cette impression. + + + Continuer + + + Tapez la date sous la forme AAAA-MM-JJ, par exemple 2026-03-07. + + + Tapez un nombre, par exemple 12 ou 3.5. + + + Afficher ou masquer la liste des objets + + + Le texte ne tient pas dans sa zone : une partie est coupée. Agrandissez la zone, permettez plus de lignes, utilisez une taille plus petite ou raccourcissez le texte. + + + Le texte risque de ne pas tenir dans sa zone. L’imprimante n’indique pas la largeur de ses lettres ; il s’agit donc d’une estimation : imprimez une étiquette d’essai pour vérifier, ou agrandissez la zone ou permettez plus de lignes. + + + Le texte utilise la police Windows « {0} », qui doit être dessinée comme une image, mais ce programme ne peut pas la dessiner ici ; le texte n’a donc pas été imprimé. Choisissez plutôt une police de l’imprimante. + + + Un texte en police Windows est imprimé comme une image ; l’imprimante ne peut donc pas le numéroter, le tirer d’un champ enregistré ni y intégrer des caractères. Retirez ces options de champ ou choisissez une police de l’imprimante. + + + La date « {0} » utilise l’horloge de l’imprimante, qui ne peut pas servir dans une image de texte. L’horloge de l’ordinateur a été utilisée à la place. + + + La direction et l’espacement des caractères d’un texte sont ignorés quand il utilise une police Windows. + + + Le texte est trop grand pour être imprimé comme une image. Utilisez une taille plus petite ou une zone plus étroite. + + + Cet ordinateur n’a aucune police nommée « {0} » ; « {1} » est donc utilisée à la place. Installez la police ou choisissez-en une autre, sinon le texte imprimé aura une apparence différente. + + + La police « {0} » ne peut pas être utilisée : il lui faut un nom et une taille de 1 à 1000 points. + + + Le gras, l’italique et le soulignement n’existent pas dans les polices propres à l’imprimante et ne sont pas imprimés. Choisissez une police Windows pour les utiliser. + + + « {0} » n’est pas un nom de fichier de police accepté par l’imprimante. Utilisez un nom comme E:ARIAL.TTF. + + + Cette étiquette a un compteur ; chaque copie a donc besoin de son propre numéro, ce qui est limité à {0} copies par impression. Imprimez moins de copies à la fois, ou utilisez la fenêtre Fusion de données. + + + Mise en forme + + + Retour à la ligne automatique + + + Taille en points de l’imprimante (avancé) + + + Mise en forme du texte + + + Police + + + Taille (pt) + + + Taille en points typographiques (1 point vaut 1/72 de pouce), comme dans un traitement de texte. Choisissez une taille ou tapez la vôtre. + + + Choisissez une police de l’imprimante (imprimée comme du vrai texte) ou une police Windows (imprimée comme une image). Tapez pour rechercher. + + + Polices de l’imprimante + + + Polices Windows + + + Police de l’imprimante {0} (vectorielle) + + + Police de l’imprimante {0} (forme fixe) + + + Police de l’imprimante {0} + + + Police enregistrée dans l’imprimante ({0}) + + + {0} (non installée) + + + Gras + + + Italique + + + Souligné + + + Gras (Ctrl+B) + + + Italique (Ctrl+I) + + + Souligné (Ctrl+U) + + + Le gras, l’italique et le soulignement n’existent pas dans les polices propres à l’imprimante. Choisissez une police Windows dans la liste Police pour les utiliser. + + + L’alignement fonctionne dans une zone de texte. Activez le retour à la ligne automatique pour l’utiliser. + + + Aligner à gauche + + + Centrer + + + Aligner à droite + + + Justifier + + + Ce texte est imprimé comme une image. Il reste net à la résolution de l’imprimante, mais l’imprimante ne peut pas le modifier ni le tirer de ses propres champs. Les polices de l’imprimante sont imprimées comme du vrai texte. + + + Compris + + + Police Windows : imprimée comme une image + + + Agrandir la zone + + + Réduire le texte + + + Cliquez sur l’un des boutons ci-dessous pour corriger le problème en une étape. + + + Cet ordinateur n’a aucune police nommée « {0} » ; « {1} » est donc utilisée à la place. Installez la police ou choisissez-en une autre, sinon le texte imprimé aura une apparence différente. + + + Le gras, l’italique et le soulignement nécessitent une police Windows. Choisissez-en une dans la liste Police. + + + Largeur de la zone : {0} points ({1} mm) + + + Le texte tient maintenant dans sa zone. + + + Le texte ne tient toujours pas ; essayez une zone plus grande ou une taille plus petite. + + + le changement de police + + + le style du texte + + + la taille de police + + + l’alignement + + + le retour à la ligne + + + l’ajustement du texte à sa zone + + + L’aperçu ne peut pas être dessiné pour l’instant. Faites un zoom arrière ou réduisez l’étiquette, puis réessayez ; votre étiquette n’est pas touchée. + + + Ajustement du texte + + + Quand le texte est trop long + + + Laisser tel que conçu + + + Réduire pour ajuster + + + Augmenter la hauteur + + + La zone reste telle que conçue. Le texte qui ne tient pas est coupé à l’impression. + + + Chaque étiquette utilise la plus grande taille, entre la plus petite et la plus grande ci-dessous, à laquelle tout le texte tient dans la zone. Avec des données, chaque enregistrement a sa propre taille. + + + La taille reste la même et la zone reçoit autant de lignes que le texte en a besoin, jusqu’à la limite ci-dessous. Les éléments placés dessous ne bougent pas. + + + Plus petite taille (pt) + + + Plus grande taille (pt) + + + Nombre maximal de lignes + + + Ne pas avertir quand le texte ne tient pas + + + Utilisez cette option quand vous voulez que le texte soit coupé. + + + La plus petite taille ne peut pas être supérieure à la plus grande taille. + + + le changement d’ajustement du texte + + + le changement de limite d’ajustement du texte + + + Impression + + + Ne pas imprimer cet objet + + + L’objet reste sur l’étiquette dans le concepteur, par exemple comme note ou repère, mais il n’est jamais imprimé ni exporté. + + + Imprimer seulement si + + + Omet cet objet sur les étiquettes où la règle ci-dessous n’est pas vraie, par exemple pour imprimer un avertissement seulement pour certains enregistrements. + + + Champ à vérifier + + + La colonne de données ou la variable dont la valeur décide si cet objet est imprimé. + + + Choisir un champ + + + Comparaison + + + Valeur à comparer + + + Les majuscules et les espaces autour du texte n’ont pas d’importance : Oui, oui et " OUI " sont identiques. + + + Règle d’impression + + + Verrouiller la position + + + Un objet verrouillé ne peut pas être déplacé, redimensionné ni supprimé avec la souris ou le clavier tant que vous ne le déverrouillez pas. Vous pouvez quand même le sélectionner et modifier ses propriétés ici. Le verrouillage ne change pas ce qui est imprimé. + + + est égal à + + + est différent de + + + est vide + + + n’est pas vide + + + contient + + + S’imprime seulement si {0} est égal à « {1} ». + + + S’imprime seulement si {0} est différent de « {1} ». + + + S’imprime seulement si {0} est vide. + + + S’imprime seulement si {0} n’est pas vide. + + + S’imprime seulement si {0} contient « {1} ». + + + Choisissez le champ à vérifier. D’ici là, cet objet est toujours imprimé. + + + Cet objet n’est jamais imprimé, quelle que soit la règle. + + + Choisissez le champ à vérifier. + + + Aucun champ ni aucune variable nommé « {0} » n’existe dans les données chargées ou dans l’étiquette. Il est traité comme vide ; vérifiez donc le nom. + + + La règle d’impression de cet objet vérifie « {0} », mais aucune colonne de données ni variable ne porte ce nom. Il est traité comme vide ; vérifiez donc le nom. + + + Les objets verrouillés n’ont pas été modifiés. Décochez « Verrouiller la position » dans les propriétés pour les modifier. + + + Non imprimé + + + Marqué « Ne pas imprimer » : cet objet n’est jamais imprimé ni exporté. + + + Masqué + + + La règle d’impression de cet objet n’est pas vraie pour l’enregistrement affiché ; il est donc omis de cette étiquette. + + + Verrouillé + + + Verrouillé : cet objet ne peut pas être déplacé, redimensionné ni supprimé tant que vous ne le déverrouillez pas. + + + Rien n’a été envoyé : l’imprimante « {0} » signale que sa tête d’impression est ouverte. Fermez la tête jusqu’au déclic, puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » signale qu’elle n’a plus d’étiquettes. Chargez des étiquettes, fermez la tête, appuyez une fois sur Feed, puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » signale que le ruban est épuisé. Installez un nouveau ruban, fermez la tête, puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » signale que sa tête d’impression est trop chaude. Attendez quelques minutes qu’elle refroidisse, puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » est en mode de diagnostic des communications et imprimerait les données comme du texte au lieu d’étiquettes. Désactivez ce mode sur l’imprimante (ou redémarrez-la), puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » signale que sa mémoire pour les travaux reçus est pleine. Attendez qu’elle ait imprimé ce qu’elle a déjà, puis imprimez de nouveau. + + + Rien n’a été envoyé : l’imprimante « {0} » est en pause. Appuyez sur Pause sur l’imprimante pour reprendre, puis imprimez de nouveau. + + + L’imprimante signale aussi : {0}. + + + L’état de l’imprimante n’a pas pu être lu avant l’impression ({0}) ; les étiquettes ont donc été envoyées sans cette vérification. + + + L’imprimante signale : {0}. Les étiquettes ont été envoyées ; vérifiez la qualité d’impression. + + + Imprimé et vérifié : l’imprimante signale qu’elle a terminé le travail sans problème. + + + Les étiquettes ont été envoyées, mais l’imprimante a ensuite signalé un problème : {0}. Certaines étiquettes n’ont peut-être pas été imprimées. Réglez le problème de l’imprimante et vérifiez les étiquettes avant d’imprimer de nouveau. + + + Les étiquettes ont été envoyées, mais Rotula n’a pas pu confirmer qu’elles ont été imprimées ({0}). Vérifiez l’imprimante. + + + cette imprimante ou son pilote Windows ne répond pas aux demandes d’état, ce qui est courant avec les pilotes USB + + + Windows indique que l’imprimante est hors ligne + + + l’imprimante n’a pas pu être jointe + + + l’imprimante n’a pas répondu à temps + + + la réponse de l’imprimante n’était pas une réponse d’état ZPL + + + elle imprimait encore quand Rotula a cessé d’attendre + + + la vérification a été arrêtée + + + la raison est inconnue + + + tête d’impression ouverte + + + plus d’étiquettes + + + ruban épuisé + + + tête d’impression trop chaude + + + mode de diagnostic des communications activé + + + mémoire pour les travaux reçus pleine + + + en pause + + + tête d’impression trop froide (les étiquettes peuvent sortir plus pâles) + + + réglages perdus (l’imprimante utilise ses valeurs par défaut) + + + un travail est encore en cours de réception + + + une étiquette imprimée attend d’être retirée + + + inconnu + + + réenroulement + + + décollage (peel-off) + + + détachement manuel (tear-off) + + + coupe + + + applicateur + + + coupe différée + + + décollage sans support + + + réenroulement sans support + + + coupe partielle + + + RFID + + + kiosque + + + continu + + + Vérifier l’état de l’imprimante + + + Demande à l’imprimante son état (papier, tête, ruban, pause) avec une petite commande ZPL. Rien n’est imprimé sur une imprimante compatible ZPL. + + + Demande de l’état de l’imprimante... + + + L’imprimante est prête. + + + L’imprimante ne peut pas imprimer pour l’instant : {0}. + + + L’imprimante signale : {0}. + + + L’état de l’imprimante n’a pas pu être lu : {0}. Vous pouvez quand même imprimer. + + + Seule une partie de l’état a été reçue ; certains problèmes peuvent donc manquer dans la liste. + + + Étiquettes restant à imprimer : {0}. Travaux en attente dans l’imprimante : {1}. + + + Mode d’impression : {0}. {1}. Longueur d’étiquette : {2} points. + + + Transfert thermique (avec ruban) + + + Thermique direct (sans ruban) + + + Vérifier l’imprimante avant et après l’impression + + + Avant chaque travail, Rotula demande son état à l’imprimante et n’envoie rien tant qu’elle n’a plus d’étiquettes, qu’elle est ouverte, en pause ou sans ruban. Après le travail, il attend que l’imprimante signale qu’elle a terminé. Pour les imprimantes compatibles ZPL ; beaucoup de pilotes USB ne peuvent pas répondre, et l’impression se fait alors sans la vérification. + + + Ouvrir le poste d’impression... + + + Créer le NIP du poste d’impression... + + + Poste d’impression + + + Choisissez le dossier du poste d’impression (avec son station.json, ou avec les étiquettes à proposer) + + + Le poste d’impression ne peut pas s’ouvrir. + + + Quitter + + + Toutes les étiquettes + + + Recherchez ou scannez une étiquette + + + Tapez un nom ou scannez le code de l’étiquette, puis appuyez sur Entrée. Ou touchez une étiquette ci-dessous. + + + Aucune étiquette ne correspond à la recherche. + + + Aucune étiquette n’a le code « {0} ». Scannez-le de nouveau ou choisissez une étiquette dans la liste. + + + Certaines étiquettes ne sont pas disponibles : + + + L’étiquette « {0} » ne peut pas être utilisée : {1} + + + Imprimante : {0} + + + Aucune imprimante n’est configurée pour cette étiquette. Demandez à la personne qui a configuré le poste d’en ajouter une dans station.json. + + + Quantité + + + De 1 à {0} étiquettes + + + Entrez une quantité de 1 à {0}, puis appuyez de nouveau sur Imprimer. + + + Imprimer + + + Imprimer tous les enregistrements + + + {0} enregistrements des données de l’étiquette sont prêts à imprimer. + + + Les données de l’étiquette n’ont pas pu être lues : {0} + + + les données ne contiennent aucun enregistrement. + + + Cette étiquette ne pose aucune question. Indiquez la quantité et appuyez sur Imprimer. + + + Certaines réponses ne sont pas acceptées. Corrigez les champs marqués en rouge, puis imprimez de nouveau. + + + Aperçu + + + Vérification de l’imprimante... + + + Imprimante prête + + + État de l’imprimante inconnu + + + L’imprimante demande votre attention + + + Impression... + + + Rotula vérifie l’imprimante avant l’envoi et attend qu’elle signale avoir terminé. + + + Non imprimé : l’imprimante demande votre attention + + + Envoyé à l’imprimante + + + Imprimé et vérifié + + + Envoyé, mais non confirmé + + + Envoyé, mais l’imprimante signale un problème + + + Non imprimé + + + Entrez le NIP pour quitter le poste d’impression + + + NIP + + + Quitter le poste + + + Ce NIP n’est pas le bon. Réessayez. + + + Trop de NIP erronés. Attendez {0} secondes, puis réessayez. + + + Créer un NIP pour le poste d’impression + + + Le NIP est nécessaire pour quitter le poste d’impression. Rotula ne conserve qu’un code protégé créé à partir de celui-ci, jamais le NIP lui-même. Copiez la ligne dans le station.json du poste. + + + Nouveau NIP + + + Tapez le NIP de nouveau + + + Créer + + + Ligne pour station.json + + + Copier + + + Copié. Collez-le dans station.json, à côté des autres réglages. + + + Un NIP doit compter de {0} à {1} caractères. + + + Les deux NIP ne sont pas identiques. Tapez-les de nouveau. + + + « {0} » est introuvable. Vérifiez le chemin donné au poste d’impression. + + + « {0} » n’a pas pu être lu. Vérifiez que le fichier n’est pas verrouillé et que cet utilisateur a le droit de le lire. + + + « {0} » contient une erreur près de la ligne {1} ({2}) : un réglage est mal orthographié, a une valeur du mauvais type, ou il manque une virgule ou un guillemet. + + + Les réglages du poste ont été écrits pour une version plus récente de Rotula (format {0}). Mettez Rotula à jour sur cet ordinateur. + + + Il n’y a aucune étiquette à proposer. Placez des fichiers .rotula dans le dossier du poste ou énumérez-les sous "labels" dans station.json. + + + L’étiquette « {0} » indiquée dans station.json est introuvable et est omise. + + + « {0} » n’est pas une étiquette Rotula (fichier .rotula). Corrigez-le dans station.json. + + + L’entrée d’étiquette {0} de station.json n’a pas de "file". Ajoutez le nom du fichier de l’étiquette. + + + Deux étiquettes utilisent le code « {0} ». Donnez à chaque étiquette son propre code, pour qu’un scan ouvre la bonne. + + + L’imprimante « {0} » n’est pas définie sous "printers" dans station.json. + + + L’imprimante « {0} » a besoin soit de "windowsPrinter" (une imprimante installée), soit de "host" (une adresse réseau), mais pas des deux. + + + Le port de l’imprimante « {0} » doit être compris entre 1 et 65535 (habituellement 9100). + + + La résolution de l’imprimante « {0} » doit être 203, 300 ou 600. + + + L’imprimante « {0} » a un contraste hors de 0 à 30 ou une vitesse hors de 1 à 14. + + + Les réglages de copies du poste ne sont pas valides : "maxCopies" doit être compris entre 1 et 99999999 et "defaultCopies" entre 1 et "maxCopies". + + + Les réglages de copies de l’étiquette « {0} » ne sont pas valides : "maxCopies" doit être compris entre 1 et 99999999 et "defaultCopies" entre 1 et "maxCopies". + + + "exitPinHash" n’est pas un code de NIP créé par Rotula. Créez-le avec Fichier > Créer le NIP du poste d’impression (un NIP n’est jamais enregistré en clair). + + + + Géré par votre organisation + + + Vérifier les mises à jour une fois par jour + + + Lorsque cette option est activée, Rotula demande une fois par jour à la page du projet sur GitHub si une version plus récente existe. Rien sur vous ni sur cet ordinateur n’est envoyé, et rien n’est téléchargé ni installé. + + + Rotula {0} est disponible. Vous pouvez le télécharger à partir de la page de la version. + + + Mise à jour disponible + + + Voir la version + + + Fermer cet avis + + + Le navigateur n’a pas pu être ouvert. La page de la version est {0} + + diff --git a/src/Rotula.App/Resources/Strings.pt-BR.resx b/src/Rotula.App/Resources/Strings.pt-BR.resx new file mode 100644 index 0000000..66e4fd5 --- /dev/null +++ b/src/Rotula.App/Resources/Strings.pt-BR.resx @@ -0,0 +1,6261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Clique em um elemento para selecioná-lo. Arraste para movê-lo. As teclas de seta movem a seleção um ponto; com Shift, oito pontos. Pressione Delete para removê-lo. + + + Área de design + + + Cancelar + + + Criar + + + O Rotula não pôde ser iniciado. Nada foi alterado. Os detalhes foram salvos em {0}. Informe o problema anexando esse arquivo. + + + Algo inesperado deu errado na última ação. Sua etiqueta continua aberta; por segurança, salve-a com outro nome. Os detalhes foram salvos em {0}. + + + Não foi possível exportar + + + A exportação terminou com avisos + + + Corrija os erros primeiro + + + A etiqueta tem erros, por isso ainda não pode ser convertida em ZPL nem impressa. Corrija estes problemas e tente novamente: + + + Não foi possível usar a imagem + + + Não foi possível importar o ZPL + + + Algumas partes não foram importadas + + + Tamanho da etiqueta + + + Nova etiqueta + + + Não foi possível abrir o arquivo + + + A etiqueta não foi impressa + + + "{0}" tem alterações não salvas. Deseja salvá-las antes? + + + Alterações não salvas + + + Não foi possível salvar a etiqueta + + + Sem título + + + Retângulo + + + Círculo + + + Campo de dados + + + Exemplo + + + Texto + + + Imagem + + + Linha + + + Texto + + + Windows Latin-1 (1252) + + + Página de código 850 (impressoras antigas) + + + UTF-8 (recomendado) + + + Code 128 + + + Code 39 + + + Code 93 + + + Data Matrix + + + EAN-13 + + + Intercalado 2 de 5 + + + PDF417 + + + Código QR + + + UPC-A + + + Automático + + + EAN-128 + + + Nenhum + + + Modo UCC + + + Canto superior esquerdo (^FO) + + + Linha de base / inferior esquerdo (^FT) + + + 180° (de cabeça para baixo) + + + 0° (normal) + + + 270° no sentido horário + + + 90° no sentido horário + + + Preto + + + Branco + + + Acima das barras + + + Abaixo das barras + + + Floyd-Steinberg (fotos) + + + Pontilhado ordenado + + + Limiar fixo + + + De cabeça para baixo + + + Normal + + + Pontos + + + Polegadas + + + Milímetros + + + Horizontal + + + Vertical + + + Contínuo + + + Marca preta + + + Sensor de espaçamento (gap) + + + Térmica direta + + + Transferência térmica (ribbon) + + + 203 DPI + + + 300 DPI + + + 600 DPI + + + Alta (30%) + + + Baixa (7%) + + + Média (15%) + + + Quartil (25%) + + + Centro + + + Justificado + + + Esquerda + + + Direita + + + {0} está danificado ou foi editado manualmente e não pode ser lido. Abra uma cópia de segurança, se tiver uma. + + + {0} foi salvo por uma versão mais recente do Rotula (formato de arquivo {1}). Atualize o Rotula para abri-lo. + + + {0} não é um arquivo de etiqueta do Rotula. Escolha um arquivo que termine em .rotula. + + + Não foi possível ler {0}. Verifique se o arquivo ainda existe e se você tem permissão para abri-lo. + + + Não foi possível gravar o arquivo {0}. Verifique se a pasta existe, se há espaço livre em disco e se você tem permissão para gravar nela; depois tente novamente ou escolha outro local. + + + Todos os arquivos + + + Imagens + + + Documento PDF + + + Imagem JPEG + + + Imagem PNG + + + Etiquetas do Rotula + + + Arquivos ZPL + + + {0} não é uma imagem que o Rotula consiga ler. Escolha um arquivo PNG, JPG, BMP ou GIF. + + + Não foi possível interpretar o ZPL. Verifique se o arquivo contém uma etiqueta que começa com ^XA e termina com ^XZ. + + + A importação de ZPL ainda não está disponível nesta versão. Você pode criar a etiqueta aqui e exportar o ZPL dela. + + + Linha {0}: {1} + + + o nome do contador está faltando ou não é válido (use letras, dígitos e sublinhados) + + + o preenchimento com zeros deve estar entre 0 e 18 + + + o valor inicial não é válido + + + par + + + ímpar + + + O Code 128 só codifica caracteres comuns do teclado. Remova os acentos e símbolos especiais dos dados. + + + O caractere {0} não pode ser usado nos dados do Code 128 porque a impressora o interpreta como um comando. Remova-o. + + + O Code 39 aceita somente letras maiúsculas, dígitos e - . espaço $ / + %. Altere os dados para usar apenas esses caracteres. + + + O Code 93 só codifica caracteres comuns do teclado. Remova os acentos e símbolos especiais dos dados. + + + O número de colunas deve estar entre {0} e {1}. + + + O código de barras não tem dados. Digite o texto ou número a codificar. + + + Os dados do Data Matrix são longos demais (máximo de {0} caracteres). Encurte o texto. + + + Este tipo de código de barras aceita somente dígitos (0 a 9). Remova as letras ou símbolos. + + + O último dígito não é o dígito verificador correto do EAN-13. Ele deveria ser {0}; ou remova o último dígito e deixe a impressora adicioná-lo. + + + O EAN-13 precisa de {0} dígitos (o dígito verificador é adicionado automaticamente) ou de {1} dígitos incluindo o dígito verificador. + + + A altura das barras deve estar entre {0} e {1} pontos. + + + O Intercalado 2 de 5 precisa de uma quantidade {0} de dígitos com esta opção de dígito verificador. Adicione ou remova um dígito, ou altere a opção de dígito verificador. + + + O tamanho do módulo deve estar entre {0} e {1} pontos. + + + A largura da barra estreita deve estar entre {0} e {1} pontos. + + + O nível de segurança do PDF417 deve estar entre {0} e {1}. + + + Os dados do PDF417 são longos demais (máximo de {0} caracteres). Encurte o texto. + + + O modelo do QR deve ser 1 ou 2. Escolha 2, a menos que seu leitor precise do modelo antigo. + + + Os dados do código QR são longos demais (máximo de {0} caracteres). Encurte o texto. + + + O número de linhas deve ser 0 (automático) ou estar entre {0} e {1}. + + + Este tipo de código de barras não é compatível. Escolha outro tipo. + + + O último dígito não é o dígito verificador correto do UPC-A. Ele deveria ser {0}; ou remova o último dígito e deixe a impressora adicioná-lo. + + + O UPC-A precisa de {0} dígitos (o dígito verificador é adicionado automaticamente) ou de {1} dígitos incluindo o dígito verificador. + + + A proporção entre barra larga e estreita deve estar entre {0} e {1}. + + + Este elemento ultrapassa a etiqueta, por isso parte dele não será impressa. Mova-o para dentro da etiqueta. + + + A posição deve estar entre {0} e {1} pontos. Mova o elemento para dentro da etiqueta. + + + O tipo de elemento {0} não pode ser convertido em ZPL. Exclua-o. + + + Erro: + + + A altura da fonte deve estar entre {0} e {1} pontos. + + + O diâmetro do círculo deve estar entre {0} e {1} pontos. + + + O arredondamento dos cantos deve estar entre {0} e {1}. + + + O tamanho e a espessura devem estar entre {0} e {1} pontos. + + + O tamanho da imagem não é válido (largura até {0}, altura até {1} pontos). Reduza a imagem. + + + Esta imagem não tem nenhuma figura. Escolha um arquivo de imagem nas propriedades. + + + O limiar deve estar entre {0} e {1}. + + + Algumas barras parecem um código de barras desenhado com linhas. Verifique essa parte da etiqueta. + + + Este Code 128 usa códigos de invocação (>) que são mantidos como foram digitados. + + + O nível de qualidade {0} do Data Matrix não é compatível e foi ignorado. + + + Este código QR usa o modo manual de caracteres, que é mantido como foi digitado. + + + O comando {0} não é reconhecido pelo designer. Ele foi mantido como ZPL bruto e será impresso sem alterações. + + + A codificação de caracteres muda para ^CI{0} no meio da etiqueta. O texto a partir desse ponto é lido com essa codificação. + + + O conjunto de caracteres ^CI{0} é um conjunto nacional e foi apenas aproximado. + + + O remapeamento de caracteres em ^CI é ignorado. + + + O conjunto de caracteres ^CI{0} não é compatível, por isso alguns caracteres podem aparecer errados. + + + Um campo não tem ^FS no final. Ele foi fechado automaticamente. + + + Não foi possível ler o arquivo ({0}). Verifique se ele existe e se você tem permissão para abri-lo. + + + A etiqueta usa uma fonte personalizada (^A@). A visualização usa uma fonte substituta. + + + Um gráfico usa o formato {0}, que não é compatível. Ele foi mantido como ZPL bruto. + + + Um gráfico tem dados inválidos ou é grande demais (total de {0} bytes; o limite é 16 MB por arquivo). Ele foi mantido como ZPL bruto. + + + Um gráfico tem menos dados do que declara. Ele foi importado até onde os dados vão. + + + Salvar uma imagem na impressora (^IS {0}) não é compatível. Isso foi mantido como ZPL bruto. + + + Não foi possível interpretar parte do arquivo ({0}). O restante foi importado. + + + A origem da etiqueta (^LH) vem depois de alguns campos, por isso só afeta o que vem em seguida. + + + O arquivo contém {0} etiquetas. Somente a primeira foi aberta. + + + Um segundo ^XA começa antes do fim da etiqueta anterior. + + + A etiqueta não tem ^XZ no final. Ela foi fechada automaticamente. + + + O comprimento da etiqueta (^LL) está faltando, por isso foi estimado. Verifique-o nas propriedades da etiqueta. + + + O arquivo não começa com ^XA. Mesmo assim, ele foi lido como uma única etiqueta. + + + A largura da etiqueta (^PW) está faltando, por isso foi estimada. Verifique-a nas propriedades da etiqueta. + + + Um ^XZ sem o ^XA correspondente foi ignorado. + + + {0} tem um valor inválido ({1}), por isso foi usado o valor padrão. + + + {0} tem um valor fora do intervalo ({1}), por isso foi ignorado. + + + Um comando bruto contém caracteres que não são ASCII simples. Verifique se ele é impresso corretamente. + + + O arquivo recupera o formato armazenado {0}, que fica na impressora e não pode ser mostrado aqui. + + + O arquivo recupera o gráfico armazenado {0}, que fica na impressora e não pode ser mostrado aqui. + + + O arquivo recupera a imagem armazenada {0}, que fica na impressora e não pode ser mostrada aqui. + + + {0} foi aproximado como {1}. + + + A configuração {0} não é compatível com o designer. Ela foi mantida como ZPL bruto. + + + Armazenar um formato na impressora (^DF {0}) não é compatível. Isso foi mantido como ZPL bruto. + + + Não foi possível decodificar parte do texto com {0}. Verifique as letras acentuadas. + + + Texto fora de qualquer campo foi ignorado: {0} + + + As posições foram convertidas a partir de unidades {0} (fator {1}). + + + A altura da etiqueta deve estar entre {0} e {1} pontos. Altere a altura nas propriedades da etiqueta. + + + A largura da etiqueta deve estar entre {0} e {1} pontos. Altere a largura nas propriedades da etiqueta. + + + A coluna de dados {0} não é usada pela etiqueta. + + + A coluna de cópias {0} não foi encontrada nos dados. Escolha uma coluna existente. + + + O número de cópias ({0}) não é válido. Use um número inteiro a partir de 0. + + + O contador {0} tem uma configuração inválida ({1}). + + + o nome do contador está faltando ou não é válido (use letras, dígitos e sublinhados) + + + O contador {0} ultrapassou seu valor máximo. + + + o preenchimento com zeros deve estar entre 0 e 18 + + + o valor inicial não é válido + + + Um valor entre aspas no arquivo de dados tem aspas de abertura, mas não de fechamento, por isso os últimos valores podem estar errados. Corrija as aspas no arquivo e carregue-o novamente. + + + A variável {0} está associada à coluna {1}, que não está nos dados. + + + A variável {0} da etiqueta não tem uma coluna correspondente nos dados. + + + Não foi possível mesclar uma linha de dados ({0}). Verifique essa linha no arquivo de dados. + + + A quantidade para pausar deve estar entre {0} e {1}. + + + O número de cópias deve estar entre {0} e {1}. + + + O número de réplicas deve estar entre {0} e {1}. + + + O número máximo de linhas deve estar entre {0} e {1}. + + + A largura do bloco de texto deve estar entre {0} e {1} pontos. + + + O caractere {0} não pode ser impresso com a codificação de caracteres escolhida. Escolha UTF-8 nas propriedades da etiqueta ou remova o caractere. + + + Problema encontrado ({0}). Revise as configurações deste elemento. + + + A variável {0} não está declarada. Adicione-a às variáveis da etiqueta ou corrija o nome. + + + Aviso: + + + Descer + + + Subir + + + Sobre o Rotula + + + Alinhar + + + Inferior + + + Centralizar horizontalmente + + + Centralizar verticalmente + + + Esquerda + + + Direita + + + Superior + + + _Organizar + + + Avançar + + + Trazer para a frente + + + Copiar + + + Recortar + + + Excluir + + + Distribuir + + + Horizontalmente + + + Verticalmente + + + Duplicar + + + _Editar + + + Sair + + + Exportar + + + Documento PDF... + + + Imagem JPEG... + + + Imagem PNG... + + + Arquivo ZPL... + + + _Arquivo + + + Mostrar grade + + + Aj_uda + + + Importar ZPL... + + + Idioma + + + Igual ao Windows + + + Menu principal + + + Nova... + + + Abrir... + + + Colar + + + Imprimir... + + + Abrir recente + + + Refazer + + + Refazer {0} + + + Girar 90° no sentido anti-horário + + + Girar 90° no sentido horário + + + Salvar + + + Salvar como... + + + Selecionar tudo + + + Selecionar o próximo elemento + + + Selecionar o elemento anterior + + + Recuar + + + Enviar para trás + + + Alinhar à grade + + + Alinhar às guias + + + Desfazer + + + Desfazer {0} + + + Pontos + + + Polegadas + + + Milímetros + + + Unidades das réguas + + + E_xibir + + + Tamanho real (100%) + + + Ajustar a etiqueta à janela + + + Ampliar + + + Reduzir + + + Código de barras + + + Padrões e impressora + + + {0} + + + Imagem + + + Etiqueta + + + Camadas + + + Margens (pontos) + + + {0} elementos estão selecionados. Mova, alinhe ou organize todos juntos, ou selecione um único elemento para editar suas propriedades. + + + Posição + + + Trabalho de impressão + + + Propriedades + + + Seleção + + + Forma + + + Tamanho da etiqueta + + + Texto + + + Elementos + + + Variáveis + + + Código ZPL (somente leitura) + + + 100 x 150 mm + + + 100 x 50 mm + + + 2 x 1 pol + + + 4 x 3 pol + + + 4 x 6 pol + + + Tamanho personalizado + + + A visualização é aproximada: o texto é desenhado com uma fonte substituta, por isso o formato das letras e as quebras de linha podem diferir um pouco na etiqueta impressa. + + + Observação: a visualização é aproximada + + + A etiqueta não tem um tamanho válido, por isso não pode ser desenhada. Defina largura e altura maiores que zero nas propriedades da etiqueta. + + + A etiqueta é grande demais para ser desenhada com este zoom. Reduza o zoom e tente novamente. + + + Não foi possível imprimir a etiqueta. Verifique a conexão da impressora e tente novamente. + + + Altura das barras (pontos) + + + Quebra automática (ajustar o texto em uma caixa) + + + Alinhamento + + + Recuo deslocado (pontos) + + + Espaço extra entre linhas (pontos) + + + Máximo de linhas + + + Largura da caixa (pontos) + + + Adicionar dígito verificador + + + Escolher outra imagem... + + + Modo do Code 128 + + + Cor + + + Colunas (0 = automático) + + + Arredondamento dos cantos (0 a 8) + + + Dados (use {{nome}} para variáveis) + + + Altura padrão da fonte (pontos) + + + Largura padrão da fonte (pontos) + + + Rotação padrão + + + Diâmetro (pontos) + + + Direção + + + Conversão para preto e branco + + + Resolução da impressora (DPI) + + + Codificação de caracteres + + + Altura da fonte (pontos) + + + Fonte (deixe vazio para usar a padrão da etiqueta) + + + Uma única letra ou dígito. 0 é a fonte escalável. + + + Largura da fonte (pontos, 0 = automático) + + + Altura (pontos) + + + Imprimir o texto junto às barras + + + Posição do texto + + + Deixe vazio para usar o padrão da etiqueta. + + + Inverter preto e branco + + + Altura + + + Unidade + + + Largura + + + Comprimento (pontos) + + + Inferior + + + Esquerda + + + Direita + + + Superior + + + Detecção da mídia + + + Tipo de mídia + + + Tamanho do módulo (pontos) + + + Largura da barra estreita (pontos) + + + Nome + + + Orientação de impressão + + + A posição se refere a + + + Canto superior esquerdo, ou linha de base do texto / canto inferior esquerdo. + + + Pausar a cada N etiquetas (0 = nunca) + + + Nível de segurança (1 a 8) + + + PDF417 compacto (truncado) + + + Correção de erros + + + Modelo QR (1 ou 2) + + + Cópias + + + Réplicas de cada número de série + + + Impressão inversa (inverte o que está embaixo) + + + Rotação + + + Padrão da etiqueta + + + Linhas (0 = automático) + + + Tipo de código de barras + + + Texto + + + Espessura da linha (pontos) + + + Limiar (0 a 255) + + + Nome da variável + + + Variáveis (uma por linha: nome=valor de exemplo) + + + Use uma variável em um texto ou nos dados de um código de barras escrevendo {{nome}}. + + + Proporção larga/estreita (2,0 a 3,0) + + + Largura (pontos) + + + X (pontos) + + + Y (pontos) + + + Régua horizontal + + + Régua vertical + + + Redimensionar o painel de camadas + + + Adicionado: {0} + + + Barra de status + + + Exportado: {0} + + + Importado: {0}. Salve a etiqueta para mantê-la. + + + {0} elementos selecionados + + + Nova etiqueta criada + + + Nenhum problema encontrado + + + Nada selecionado + + + Não há nada para colar. Copie um elemento primeiro. + + + 1 elemento selecionado + + + Aberto: {0} + + + Enviado para a impressora + + + {0} erros, {1} avisos + + + Salvo: {0} + + + Selecionado: {0} + + + Zoom + + + ZPL copiado para a área de transferência + + + Não foi possível criar o código ZPL + + + Código de barras + + + Retângulo + + + Círculo + + + Campo de dados + + + Imagem + + + Linha + + + Código QR + + + Texto + + + Barra de edição + + + Barra de arquivo + + + Barra de exibição + + + adição + + + alinhamento + + + avanço de nível + + + trazer para a frente + + + exclusão + + + distribuição + + + duplicação + + + configurações da etiqueta + + + movimentação + + + colagem + + + alteração de propriedade + + + reordenação + + + redimensionamento + + + rotação + + + recuo de nível + + + enviar para trás + + + A fonte deve ser uma única letra ou dígito. + + + O tamanho da etiqueta não é válido. A largura pode ter no máximo {0} pontos e a altura no máximo {1} pontos. Digite um tamanho menor. + + + Isso não é um número inteiro. Digite apenas dígitos, por exemplo 120. + + + Isso não é um número. Digite um número como 12,5. + + + O valor deve estar entre {0} e {1}. Digite um valor nesse intervalo. + + + Este campo não pode ficar vazio. Digite um número. + + + O texto é longo demais. Use no máximo {0} caracteres. + + + Cada linha deve ter o formato nome=valor. Os nomes podem usar letras, dígitos e sublinhados, e cada nome só pode aparecer uma vez. + + + Copiar ZPL + + + Fechar + + + Parar + + + Interrompido. Nada mais foi feito. + + + Algo inesperado deu errado ({0}). Nada foi alterado; tente novamente. + + + O Windows não tem nenhuma impressora chamada "{0}". Atualize a lista de impressoras e escolha outra, ou verifique se a impressora está instalada. + + + Você não tem permissão para imprimir em "{0}". Peça acesso ao administrador ou escolha outra impressora. + + + A impressora "{0}" está offline. Ligue-a, verifique o cabo e confirme que ela não está pausada; depois tente novamente. + + + A impressora em {0}:{1} não respondeu a tempo. Verifique se ela está ligada e na mesma rede; depois tente novamente. + + + O dispositivo em {0}:{1} recusou a conexão. Verifique a porta (a maioria das impressoras de etiquetas usa a 9100) e se a porta de rede da impressora está ativada. + + + Não é possível alcançar {0}:{1}. Verifique o endereço, o cabo de rede ou o Wi-Fi, e se a impressora está ligada. + + + A impressão foi cancelada. Nada mais foi enviado. + + + A etiqueta tem erros, por isso nada foi enviado. Corrija os problemas abaixo e tente novamente. + + + As configurações da impressora estão fora do intervalo, por isso nada foi enviado. Corrija os valores e tente novamente. + + + A etiqueta contém caracteres que o conjunto de caracteres {0} não consegue imprimir. Altere o conjunto de caracteres da etiqueta para UTF-8 ou remova esses caracteres. + + + A impressão por impressoras do Windows só está disponível no Windows. Use uma impressora de rede ou salve o arquivo ZPL. + + + A impressora relatou um problema inesperado ({0}). Verifique a conexão e tente novamente, ou salve o arquivo ZPL e envie-o de outra forma. + + + A intensidade deve ser um número de 0 a 30. Altere-a ou deixe-a vazia para manter a configuração da própria impressora. + + + A velocidade deve ser um número de 1 a 14 polegadas por segundo. Altere-a ou deixe-a vazia para manter a configuração da própria impressora. + + + A largura da etiqueta está fora do intervalo: ela deve estar entre 1 e 9999 pontos na resolução escolhida. Verifique a largura e a resolução (DPI). + + + A altura da etiqueta está fora do intervalo: ela deve estar entre 1 e 32000 pontos na resolução escolhida. Verifique a altura e a resolução (DPI). + + + Imprimir + + + Escolha uma impressora, verifique as configurações dela e imprima a etiqueta. + + + Impressora + + + Configuração da impressora + + + Impressora do Windows (USB ou instalada) + + + Impressora de rede (TCP/IP) + + + Impressora + + + Atualizar a lista de impressoras + + + Procurando impressoras + + + O Windows não tem impressoras instaladas. Instale o driver da impressora ou mude para uma impressora de rede e informe o endereço dela. + + + A impressora "{0}" usada da última vez não está instalada neste computador. Escolha outra impressora. + + + (padrão) + + + (offline) + + + Nome do host ou endereço IP + + + Porta + + + Resolução + + + Detecção da mídia + + + Largura da etiqueta (mm) + + + Altura da etiqueta (mm) + + + Intensidade (0-30) + + + Velocidade (1-14 pol/s) + + + Deixe a intensidade e a velocidade vazias para manter as configurações armazenadas na impressora. + + + Cópias + + + Imprimir + + + Salvar como ZPL... + + + Imprimir etiqueta de teste + + + Imprime uma pequena etiqueta de exemplo para verificar a conexão, a largura e os acentos. + + + A etiqueta tem erros e ainda não pode ser impressa: + + + A etiqueta será impressa com os valores do registro de dados mostrado na área de design. + + + Registros a imprimir + + + Marque os registros que deseja imprimir. Cada registro marcado imprime sua própria etiqueta, na ordem dos dados, com a impressora e as cópias escolhidas aqui. + + + Nenhum registro está marcado, por isso não há nada para imprimir. Marque pelo menos um registro na lista acima. + + + A janela Dados define as cópias de cada registro, por isso essa configuração é usada no lugar deste número. + + + Enviando a etiqueta para a impressora... + + + Enviando a etiqueta de teste... + + + Salvando o arquivo ZPL... + + + Enviado para a impressora ({0} cópias). + + + A etiqueta de teste foi enviada para a impressora. + + + Salvo: {0}. + + + Nenhuma impressora está selecionada. Escolha uma impressora instalada ou mude para uma impressora de rede e informe o endereço dela. + + + Informe o nome do host ou o endereço IP da impressora de rede, por exemplo 192.168.1.50. + + + A porta deve ser um número inteiro de 1 a 65535 (a maioria das impressoras de etiquetas usa a 9100). + + + {0} deve ser um número. Digite apenas dígitos, por exemplo 12. + + + As cópias devem ser um número inteiro de 1 a 99999999. + + + Uma etiqueta com quantidade de impressão (^PQ) + + + Repetir a etiqueta uma vez por cópia + + + Ignorar o registro e continuar + + + Parar no registro + + + Números + + + Letras e dígitos + + + Recomeçar + + + Relatar um erro + + + Impressora do Windows + + + Impressora de rede (TCP/IP) + + + Arquivos CSV e Excel + + + Mesclar dados + + + Abrir arquivo de dados... + + + Recarregar + + + Remover os dados + + + Nenhum arquivo de dados aberto + + + Os dados ficam neste computador. Apenas as configurações abaixo são salvas no arquivo da etiqueta, nunca os dados em si. + + + Mescle uma planilha com a sua etiqueta + + + Abra um arquivo CSV ou Excel (.xlsx). Cada linha vira uma etiqueta, e cada coluna pode preencher uma {{variável}} da etiqueta. Depois você pode percorrer os registros e imprimir todos. + + + Esta etiqueta lembra o seu arquivo de dados, mas os dados não estão carregados. Escolha Recarregar para lê-lo novamente ou abra outro arquivo. + + + Dados + + + Variáveis + + + Contadores + + + Cópias e trabalhos + + + Verificar e imprimir + + + Planilha + + + Delimitador + + + Detectar automaticamente + + + vírgula (,) + + + ponto e vírgula (;) + + + tabulação + + + Delimitador detectado: {0} + + + Delimitador usado: {0} + + + A primeira linha contém os nomes das colunas + + + {0} registros, {1} colunas + + + Visualização dos dados + + + Mostrando os primeiros {0} registros. + + + Avisos sobre o arquivo de dados + + + {0} foi carregado: {1} registros. + + + Lendo {0}... + + + Não foi possível abrir {0}. Se ele estiver aberto no Excel ou em outro programa, feche-o lá e tente novamente; caso contrário, verifique se o arquivo ainda existe. + + + Não foi possível ler {0} como um arquivo CSV ou Excel (.xlsx). Abra-o no Excel, salve-o novamente como .xlsx ou .csv e tente outra vez. + + + {0} não tem colunas. Verifique se a primeira linha contém os nomes das colunas ou desmarque "A primeira linha contém os nomes das colunas". + + + Abra um arquivo de dados primeiro. + + + O arquivo de dados não tem registros (linhas) para mesclar. + + + Primeiro registro + + + Registro anterior + + + Próximo registro + + + Último registro + + + Registro atual + + + Ir para o registro + + + Ir + + + Digite um número de registro de 1 a {0}. + + + Nenhum registro + + + Registro {0} de {1} + + + Selecionado {0} de {1} (linha {2}) + + + Linha {0} (não selecionada; {1} selecionados) + + + Registro {0} de {1} (nenhum selecionado) + + + Registros a imprimir + + + Marque os registros a imprimir. Espaço marca a linha destacada, Shift+clique marca um intervalo e Ctrl+A marca todas as linhas mostradas. Somente os registros marcados são impressos, verificados ou exportados. + + + Nº + + + Número da linha + + + Selecionar ou desmarcar todos os registros mostrados + + + Selecionar o registro {0} + + + Selecionar todos + + + Selecionar os mostrados: {0} + + + Desmarcar todos + + + Desmarcar os mostrados: {0} + + + Inverter a seleção + + + Inverter os mostrados: {0} + + + {0} de {1} selecionados + + + Mostrando {0} de {1} registros + + + Nenhum registro corresponde ao filtro. Altere o texto ou limpe o filtro. + + + Filtro + + + Filtrar registros + + + Digite um texto para mostrar apenas os registros que o contêm (maiúsculas e minúsculas não importam). + + + Coluna para pesquisar + + + Todas as colunas + + + Mostrar apenas os selecionados + + + Limpar o filtro + + + Imprimir {0} etiquetas selecionadas + + + Imprimir 1 etiqueta selecionada + + + Imprimir todas as {0} etiquetas + + + Nenhum registro está selecionado, por isso não há nada para imprimir, verificar ou exportar. Selecione registros na guia Dados primeiro. + + + Nenhum registro está selecionado. Selecione pelo menos um registro na guia Dados. + + + Enviar os {0} registros selecionados (de {3}) para {1}? Isso resulta em {2} etiquetas, contando as cópias. As etiquetas começarão a ser impressas imediatamente. + + + Enviar {0} registros para {1}? Isso resulta em {2} etiquetas, contando as cópias. As etiquetas começarão a ser impressas imediatamente. + + + Mostrar este registro na área de design + + + Cada variável da etiqueta recebe o valor da coluna com o mesmo nome. Escolha outra coluna aqui se os nomes não corresponderem. + + + A etiqueta ainda não tem variáveis. Adicione um texto com {{nome}} (ou um campo de dados) e ele aparecerá aqui. + + + Mesmo nome (automático) + + + Preenchida pela coluna {0} + + + Nenhuma coluna correspondente: escolha uma + + + Preenchida pelo contador + + + Nenhum contador com este nome: adicione um na guia Contadores + + + Itens a verificar + + + Adicionar contador + + + Remover + + + Ainda não há contadores. Um contador gera um número de série como 0001, 0002, 0003 para cada registro. + + + (sem nome) + + + Nome + + + Digite isto na etiqueta + + + Conta com + + + Começar em + + + Incremento + + + Preenchimento com zeros (dígitos) + + + Prefixo + + + Sufixo + + + Quando o contador se esgotar + + + Primeiros valores + + + Configurações do contador: {0}. + + + O incremento deve ser um número inteiro, por exemplo 1 ou -1. + + + O preenchimento com zeros deve ser um número inteiro de 0 a 18. + + + Cópias de cada registro + + + O número de cópias vem de + + + A quantidade da própria etiqueta + + + O mesmo número para todos os registros + + + Uma coluna dos dados + + + Cópias + + + Coluna com as cópias + + + As cópias devem ser um número inteiro de 1 a 99999999. + + + Como as cópias são escritas + + + Uma quantidade de impressão (^PQ) é menor e mais rápida. Repetir a etiqueta só é necessário se a sua impressora ignorar o ^PQ. + + + Trabalhos e problemas + + + Um registro com erros + + + Registros por trabalho de impressão (0 = um único trabalho) + + + Contado em registros, não em cópias. Trabalhos menores pesam menos para a impressora e permitem parar no meio. + + + Os registros por trabalho devem ser um número inteiro de 0 a 1000000. + + + Verificar e imprimir os registros selecionados + + + Verifique primeiro para ver quais registros selecionados têm problemas. A impressão envia cada registro selecionado e válido para a impressora à esquerda, na ordem dos dados. Escolha os registros na guia Dados. + + + Verificar os registros selecionados + + + Exportar ZPL... + + + Imprimir tudo + + + Gravar um arquivo por trabalho ao exportar + + + Verificando todos os registros... + + + Enviando os registros para a impressora... + + + Gravando o ZPL... + + + {0} registros verificados: {1} prontos, {2} com erros. + + + Mostrando os primeiros {0} de {1} problemas. + + + Todos os {0} registros estão prontos para imprimir. + + + {0} registros têm erros e ficariam de fora. Veja a lista de cada problema e corrija os dados ou a etiqueta. + + + Imprimir todos os registros + + + Enviar {0} registros para {1}? As etiquetas começarão a ser impressas imediatamente. + + + {0} etiquetas enviadas para a impressora em {1} trabalho(s). + + + {0} etiquetas gravadas em um arquivo. + + + {0} etiquetas gravadas em {1} arquivos. + + + Substituir os arquivos existentes? + + + Já existem {0} arquivo(s) com os mesmos nomes, que serão substituídos. + + + {0} trabalho(s) já tinham sido enviados antes da interrupção; não os imprima de novo. + + + Interrompido. {0} trabalho(s) já foram enviados para a impressora. + + + {0} registro(s) ficaram de fora por causa de erros; veja a lista. + + + A impressão parou no registro {0} por causa da opção "parar". + + + Nenhuma etiqueta foi gerada porque todos os registros têm erros. Verifique os registros e a etiqueta. + + + Problemas por registro + + + Registro + + + Tipo + + + O que aconteceu + + + Erro + + + Aviso + + + Este arquivo de etiqueta indicava um arquivo de dados em um local que o Rotula não segue automaticamente (um caminho de rede, um endereço da web ou um caminho relativo), por isso ele foi ignorado para sua segurança. Escolha "Abrir arquivo de dados" para selecionar o arquivo você mesmo. + + + O arquivo de dados lembrado ({0}) não está em um disco local, por isso o Rotula não o abrirá automaticamente. Escolha "Abrir arquivo de dados" para selecioná-lo você mesmo. + + + O arquivo de dados {0} não foi encontrado. Ele pode ter sido movido ou renomeado; escolha "Abrir arquivo de dados" para localizá-lo. + + + Caminho do arquivo de dados lembrado + + + Minimizar + + + Maximizar + + + Restaurar + + + Fechar + + + Etiqueta + + + Propriedades da etiqueta + + + Impressora + + + Atualizar a lista de impressoras + + + Mesclar dados... + + + Abrir arquivo de dados... + + + Zoom + + + Etiqueta + + + Impressora + + + Escolha a impressora desta etiqueta. A configuração da impressora fica em Impressora > Imprimir. + + + Selecionar impressora + + + Visualizar + + + Mostrar a etiqueta maior, como ela será desenhada + + + Imprimir + + + Imprimir... (Ctrl+P) + + + Selecionar + + + Redimensionar o painel de propriedades + + + Objetos + + + Tipo do objeto selecionado + + + SAÍDA ZPL + + + Exportar .zpl + + + Tamanho, resolução e formato da etiqueta + + + {0} objetos + + + 1 objeto + + + nenhum selecionado + + + {0} selecionado(s) + + + Visualização da etiqueta + + + Visualização - {0} + + + Mostrar o código ZPL + + + Mostrar ou ocultar o painel do código ZPL + + + 1 erro + + + {0} erros + + + 1 aviso + + + {0} avisos + + + Visualização aproximada + + + Ainda não há objetos + + + Escolha uma ferramenta à esquerda para adicionar texto, um código de barras ou uma forma. + + + Tamanho personalizado... + + + Tamanhos comuns + + + Resolução de impressão + + + Escolha o tamanho da etiqueta e a resolução de impressão + + + tamanho da etiqueta + + + Tamanho, margens e padrões da impressora + + + Nada está selecionado, por isso estas são as configurações da etiqueta inteira. Clique em um objeto na área de design ou na lista para editá-lo. + + + {0} no total + + + Largura ({0}) + + + Altura ({0}) + + + mm + + + pol + + + pontos + + + {0} dpi detectados no driver da impressora + + + Não foi possível ler a resolução no driver; escolha-a manualmente. + + + Lendo o driver da impressora... + + + Usar o tamanho da impressora ({0}) + + + Preenche a largura e a altura da etiqueta com o tamanho de papel informado pelo driver da impressora + + + Esta etiqueta foi criada a {0} dpi. Ela será convertida automaticamente para {1} dpi para ser impressa no mesmo tamanho. + + + Mudar a etiqueta para {0} dpi + + + Converte o design aberto para a resolução da impressora. Você pode desfazer com Ctrl+Z. + + + Itens a verificar após a conversão ({0}) + + + Parte da etiqueta não pôde ser convertida com exatidão. Verifique o resultado impresso ou mude a etiqueta para a resolução da impressora e revise-a. + + + O código de barras "{0}" tem largura de barra de {1} pontos, que passa a {2} pontos na nova resolução. O código fica um pouco mais largo ou mais estreito do que antes. Verifique se ele ainda é lido. + + + Em "{0}", o valor "{1}" seria de {2} pontos na nova resolução, mas a impressora permite {3}. Ele foi definido como {3}. Verifique o elemento. + + + "{0}" contém ZPL bruto, que não pode ser redimensionado automaticamente. Ele mantém as posições originais em pontos e pode ser impresso menor ou maior do que o restante. Edite-o ou substitua-o por elementos comuns. + + + O gráfico armazenado "{0}" é um bitmap fixo e não pode ser redimensionado para a nova resolução. Ele será impresso com outro tamanho físico. Substitua-o por um gráfico feito para esta resolução. + + + Esta etiqueta contém um elemento que não pode ser convertido automaticamente de {0} dpi para {1} dpi. Nada foi alterado. + + + Não é possível mudar a etiqueta + + + OK + + + Salvar + + + Não salvar + + + Informação + + + Aviso + + + Erro + + + Pergunta + + + Sobre o Rotula + + + Versão {0} + + + Designer de etiquetas e códigos de barras para Windows (ZPL), gratuito e de código aberto (MIT) + + + Funciona offline. Sem telemetria, sem acesso à rede. + + + A visualização na tela é aproximada: o texto é desenhado com uma fonte substituta, por isso o formato das letras e as quebras de linha podem diferir um pouco na etiqueta impressa. + + + https://github.com/P4Software/Rotula + + + Abrir a página do projeto no navegador + + + Não foi possível abrir o navegador. A página do projeto é {0} + + + Avisos de terceiros + + + Avisos de terceiros + + + O arquivo de avisos não faz parte desta compilação. Ele está disponível em https://github.com/P4Software/Rotula, no arquivo THIRD-PARTY-NOTICES.md. + + + Bem-vindo ao Rotula + + + Crie uma etiqueta, confira-a na tela e imprima-a na sua impressora compatível com ZPL. + + + Nova etiqueta + + + Escolha um tamanho e comece a criar. + + + Abrir etiqueta + + + Continue um arquivo .rotula salvo. + + + Importar ZPL + + + Transforme um arquivo ZPL existente em um design editável. + + + Etiquetas recentes + + + As etiquetas que você salvar ou abrir aparecerão aqui. + + + Começar com uma etiqueta em branco + + + Dica: arraste os cantos para redimensionar, use as teclas de seta para mover e Ctrl+Z para desfazer qualquer etapa. + + + Tela inicial + + + Arquivos de banco de dados + + + Escolher um arquivo de banco de dados SQLite + + + Dados de + + + Arquivo (CSV ou Excel) + + + Banco de dados + + + Banco de dados + + + Banco de dados: nenhum dado lido ainda + + + Conexão de banco de dados: {0} + + + {0} linhas foram lidas da conexão de banco de dados "{1}". + + + {0} linhas, {1} colunas + + + Conexão salva + + + Nova conexão... + + + Gerenciar conexões... + + + Ainda não há conexões salvas. Escolha "Nova conexão..." para adicionar a primeira. + + + Escolha primeiro uma conexão salva ou crie uma com "Nova conexão...". + + + Alterar a fonte de dados... + + + Voltar aos dados carregados + + + Esta etiqueta usa a conexão salva "{0}". Conecte e recarregue os dados. + + + O Rotula não se conectou a nada. Ele só se conecta depois que você clica no botão, e só executa a consulta abaixo se ela passar na verificação de somente leitura. + + + Consulta salva nesta etiqueta + + + Conectar e recarregar os dados + + + Não há nenhuma conexão salva chamada "{0}" neste computador. Abra "Gerenciar conexões...", adicione uma conexão com exatamente o nome "{0}" e clique no botão novamente. + + + Tabela ou exibição + + + Consulta + + + Pesquisar tabelas e exibições + + + Tabelas e exibições + + + exibição + + + Não há tabelas nem exibições para mostrar. Altere a pesquisa ou verifique se esta conta pode ler o banco de dados. + + + Visualização + + + A visualização mostra as primeiras 100 linhas. "Usar estes dados" lê todas as linhas até o máximo. + + + Escolha uma tabela ou exibição para ver as linhas dela. + + + Consulta SELECT + + + Só é permitido um único SELECT. Escreva @nome onde um valor deve ser preenchido, por exemplo WHERE Id = @id. + + + Tudo certo: esta consulta apenas lê dados. + + + Parâmetros + + + Valores para os @nomes da sua consulta. Escolha Número ou Data quando a coluna não for de texto. + + + Tipo do parâmetro + + + Texto + + + Número + + + Data + + + O valor de {0} não é um número. Digite dígitos com um ponto decimal opcional, por exemplo 12.5. + + + O valor de {0} não é uma data. Digite-a assim: 2026-03-31. + + + Executar + + + Executa a consulta (somente leitura) e mostra as linhas abaixo. + + + Resultado + + + Detalhe técnico do banco de dados + + + Usar estes dados + + + Lê as linhas e as usa como registros desta etiqueta. + + + Máximo de linhas + + + São lidas no máximo esta quantidade de linhas (de 1 a 1.000.000). Um aviso aparece quando o resultado foi cortado. + + + O máximo de linhas deve ser um número inteiro de 1 a {0}. + + + Este banco de dados não tem tabelas nem exibições que esta conta possa ver. + + + Lendo a lista de tabelas... + + + Lendo {0}... + + + Executando a consulta... + + + Lendo todas as linhas de {0}... + + + Conexões de banco de dados + + + O Rotula apenas lê dados. Sempre que possível, use uma conta de banco de dados somente leitura. + + + Conexões salvas + + + Nada salvo ainda. Preencha o formulário e escolha Salvar. + + + Nova + + + Excluir + + + Detalhes da conexão + + + Nome + + + As etiquetas se referem a uma conexão por este nome, por isso escolha um nome curto que você vá manter. + + + O nome não pode ser alterado porque há etiquetas que se referem a ele. Para usar outro nome, crie uma nova conexão. + + + Digite um nome para esta conexão. + + + Já existe uma conexão chamada "{0}". Escolha outro nome ou selecione-a na lista para editá-la. + + + Tipo de banco de dados + + + SQL Server + + + PostgreSQL + + + MySQL / MariaDB + + + Arquivo SQLite + + + ODBC + + + Servidor + + + Porta + + + A porta deve ser um número inteiro de 1 a 65535, ou ficar vazia para usar a habitual. + + + Nome do banco de dados + + + Arquivo SQLite + + + O arquivo é aberto como somente leitura, por isso o Rotula nunca pode alterá-lo. + + + Procurar... + + + Carregar lista + + + Lendo a lista do servidor... + + + Escolha um banco de dados do servidor ou digite o nome dele. + + + Preencha primeiro o endereço do servidor e o login e depois carregue a lista. Você também pode simplesmente digitar o nome. + + + Digite a senha para carregar a lista ou simplesmente digite o nome do banco de dados. + + + Bancos de dados encontrados: {0}. Escolha um ou digite o nome dele. + + + O servidor tem mais bancos de dados do que é possível mostrar; estes são os primeiros {0}. Escolha um ou digite o nome dele. + + + Este login não pode abrir nenhum banco de dados no servidor. Digite o nome. + + + Este tipo de servidor não consegue listar seus bancos de dados. Digite o nome. + + + Interrompido. Pressione Carregar lista para tentar novamente ou digite o nome. + + + Digite a senha novamente para carregar a lista: a senha salva só é usada enquanto o servidor e o usuário continuarem os mesmos. + + + Não foi possível ler a lista: talvez este login não tenha permissão para ver outros bancos de dados. Digite o nome. + + + Não foi possível ler a lista. {0} Você ainda pode digitar o nome. + + + Escolha uma fonte de dados instalada neste computador ou digite o nome dela. + + + Não há fontes de dados ODBC instaladas neste computador. Digite o nome. + + + sistema + + + Nome da fonte de dados ODBC (DSN) + + + ou uma cadeia de conexão + + + Se a cadeia de conexão contiver uma senha, o Rotula a move para o armazenamento protegido e a remove do texto salvo. + + + Entrar com + + + Minha conta do Windows + + + Nome de usuário e senha + + + Nome de usuário + + + Senha + + + Há uma senha salva para esta conexão, e ela nunca é mostrada. Deixe este campo vazio para mantê-la ou digite uma nova para substituí-la. + + + A senha é armazenada de forma protegida somente para a sua conta do Windows e nunca é mostrada novamente. + + + Segurança + + + Criptografar a conexão + + + Mantenha esta opção ativada. Desative-a somente para um servidor confiável na sua própria rede. + + + A criptografia está desativada: qualquer pessoa no caminho da rede pode ler os dados e a senha. Use isto somente com um servidor local confiável. + + + Confiar no certificado deste servidor + + + Somente para um servidor que você conhece e controla, como um servidor de teste. Caso contrário, alguém poderia se passar pelo servidor. + + + O Rotula não verificará quem é o servidor, então alguém na rede poderia se passar por ele e ler os dados e a senha. Use isto somente com um servidor que você controla. + + + Testar conexão + + + A conexão funciona. + + + Você alterou esta conexão, e a senha salva não pode ser lida de volta para um teste. Digite a senha novamente para testá-la. + + + Salvar + + + A conexão "{0}" foi salva. + + + A conexão "{0}" foi excluída. + + + Excluir conexão + + + Excluir a conexão "{0}"? As etiquetas que a usam pedirão uma conexão com este nome na próxima vez que forem abertas. + + + Salvando... + + + Excluindo... + + + Testando a conexão... + + + Não foi possível verificar o certificado de segurança do servidor. Se este for o seu próprio servidor (por exemplo, um servidor de teste), você pode confiar nele para esta conexão. Caso contrário, peça ao administrador um certificado válido. + + + Confiar neste servidor e salvar + + + nome + + + tipo de banco de dados + + + método de login + + + servidor + + + porta + + + nome do banco de dados + + + nome de usuário + + + arquivo SQLite + + + cadeia de conexão + + + nome da fonte de dados + + + tempo limite do comando + + + tempo limite de conexão + + + Algo deu errado ao ler o banco de dados ({0}). Tente novamente e, se o problema continuar, verifique os detalhes da conexão. + + + O Rotula não conseguiu se conectar ao banco de dados. Verifique os detalhes da conexão e se o servidor está em execução; depois tente novamente. + + + O servidor não aceitou o nome de usuário ou a senha. Verifique-os em "Gerenciar conexões..." e tente novamente. + + + O banco de dados demorou demais para responder. Tente novamente, restrinja a consulta ou fale com o administrador do banco de dados. + + + Não foi possível alcançar o servidor. Verifique o nome do servidor e a porta, a sua rede ou VPN, e tente novamente. + + + O banco de dados não foi encontrado. Verifique o nome do banco de dados ou o local do arquivo e tente novamente. + + + Esta conta não tem permissão para ler esses dados. Peça acesso de leitura ao administrador do banco de dados. + + + O Rotula apenas lê dados, por isso esta consulta não foi executada. {0} + + + O banco de dados não conseguiu executar a consulta. Verifique os nomes das tabelas e colunas e a grafia da consulta; depois tente novamente. + + + Interrompido. Nada foi alterado. + + + O limite de linhas {0} ultrapassa o máximo de {1}. Escolha um limite menor. + + + O driver ou a fonte de dados ODBC não está instalado neste computador. Instale-o ou escolha outro nome de fonte de dados. + + + O certificado de segurança do servidor não é confiável. Se este for o seu próprio servidor, abra "Gerenciar conexões..." e escolha confiar nele para esta conexão. Caso contrário, peça ao administrador um certificado válido. + + + A configuração "{0}" está faltando ou não é permitida. Corrija-a em "Gerenciar conexões..." e tente novamente. + + + Não há nenhuma conexão salva chamada "{0}". Crie-a com exatamente esse nome em "Gerenciar conexões...". + + + Só é permitida uma única consulta SELECT. Reescreva-a como um SELECT. + + + Só é permitida uma instrução. Remova tudo o que vem depois do primeiro ponto e vírgula. + + + Digite primeiro uma consulta SELECT. + + + A palavra "{0}" não é permitida porque pode alterar dados. Se for o nome de uma coluna, coloque-a entre aspas. + + + SELECT ... INTO não é permitido porque cria tabelas ou arquivos. Remova a parte INTO. + + + Não é permitido bloquear linhas (FOR UPDATE, FOR SHARE, LOCK IN SHARE MODE). Remova essa parte. + + + A função "{0}" não é permitida porque pode ler arquivos, acessar outros servidores ou executar código. Remova-a. + + + Um comentário que começa com /*! é executado como SQL no MySQL, por isso não é permitido. Remova-o. + + + Há aspas ou um comentário sem fechamento. Feche-os e tente novamente. + + + A consulta é longa demais. Encurte-a. + + + O parâmetro @{0} não tem valor. Preencha-o em Parâmetros. + + + Somente as primeiras {0} linhas foram lidas. Aumente o máximo de linhas ou restrinja a consulta para ler o restante. + + + O arquivo com as conexões salvas está danificado e foi ignorado. Adicione suas conexões novamente; o arquivo danificado é mantido ao lado, com a extensão .damaged. + + + Você alterou onde ou como esta conexão faz login, por isso a senha salva não foi usada. Digite a senha novamente. + + + O tipo de fonte de dados "{0}" não está disponível. O complemento dele pode estar faltando ou desativado. + + + Esta consulta pode ser lida de mais de uma forma (por exemplo, uma barra invertida antes de uma aspa), por isso não foi executada. Use duas aspas simples ('') em vez da barra invertida. + + + provedor + + + serviço + + + arquivo da autoridade certificadora + + + opções adicionais + + + O arquivo com as conexões salvas é grande demais e foi ignorado. Adicione suas conexões novamente. + + + Não é possível ler a senha salva. Provavelmente ela foi salva por outro usuário do Windows ou em outro computador. Abra "Gerenciar conexões..." e digite-a novamente. + + + O Rotula não conseguiu salvar as conexões. Verifique se você pode gravar na sua pasta de usuário (AppData) e tente novamente. + + + A proteção de senhas não está disponível neste sistema, por isso não é possível salvar conexões que precisam de senha. Entre com a sua conta do Windows ou use um arquivo SQLite. + + + criptografia + + + confiar no certificado do servidor + + + Code 11 + + + Industrial 2 de 5 + + + Standard 2 de 5 + + + LOGMARS + + + Codabar + + + MSI + + + Plessey + + + EAN-8 + + + UPC-E + + + Extensão UPC/EAN + + + POSTNET + + + PLANET + + + GS1 DataBar + + + Código Aztec + + + MicroPDF417 + + + Codablock + + + MaxiCode + + + TLC39 + + + Code 49 + + + Omnidirecional + + + Truncado + + + Empilhado + + + Empilhado omnidirecional + + + Limitado + + + Expandido + + + Nenhum + + + Um dígito módulo 10 + + + Dois dígitos módulo 10 + + + Dígitos módulo 11 e módulo 10 + + + Codablock A (caracteres do Code 39) + + + Codablock E (Code 128, FNC1 automático) + + + Codablock F (Code 128) + + + Lineares + + + Matriciais 2D + + + Empilhados + + + Postais + + + Dígitos verificadores (1 ou 2) + + + Dígitos verificadores + + + Mostrar os dígitos verificadores no texto + + + Caractere inicial + + + Caractere final + + + Tipo de GS1 DataBar + + + Altura do separador (1-2) + + + Segmentos por linha (2-22) + + + Os dados têm códigos ECI + + + Correção de erros / tamanho + + + Símbolo de menu (configuração do leitor) + + + Símbolos do conjunto + + + ID do conjunto (opcional) + + + Modo (0-33) + + + Tipo de Codablock + + + Adicionar caracteres de verificação + + + Modo (2-6) + + + Número do símbolo (1-8) + + + Total de símbolos (1-8) + + + Módulo do MicroPDF417 (pontos) + + + Linha do MicroPDF417 (pontos) + + + Modo inicial + + + Caracteres por linha + + + Automático + + + Rotação (não pode ser impressa para este código de barras: escolha Padrão da etiqueta) + + + Sobre a visualização + + + A impressora desenha este código de barras; a visualização mostra um marcador de posição. + + + Este símbolo Aztec (Rune, menu, anexação estruturada ou ECI) é desenhado pela impressora; a visualização mostra um marcador de posição. + + + Os símbolos Rune, de menu, de anexação estruturada e com ECI são desenhados pela impressora; nesses casos, a visualização mostra um marcador de posição. + + + Na visualização, a proporção entre barras largas e estreitas é desenhada como 2:1. + + + Na visualização, a proporção entre barras largas e estreitas é desenhada como 3:1. + + + Na visualização, as larguras das barras e dos espaços seguem a largura do módulo; a impressora real usa as dimensões fixas do USPS. + + + A parte composta 2D do GS1 DataBar não é compatível; nos tipos empilhados, a altura da barra é a altura do símbolo inteiro. + + + O Code 11 aceita somente dígitos e o hífen (-). Remova qualquer outro caractere. + + + O Code 11 usa 1 ou 2 dígitos verificadores. Escolha um desses dois valores. + + + O LOGMARS aceita somente letras de A a Z, dígitos, espaço e - . $ / + %. Remova qualquer outro caractere. + + + A impressora sempre imprime o texto abaixo de um código LOGMARS, por isso desativá-lo não tem efeito. Ative o texto para corresponder ao que será impresso. + + + O Codabar aceita somente dígitos e - $ : / . + nos dados. As letras inicial e final, de A a D, são escolhidas nas opções, não digitadas nos dados. + + + Os caracteres inicial e final do Codabar devem ser A, B, C ou D. Escolha um deles. + + + Os dados MSI podem ter no máximo {0} dígitos com esta opção de dígito verificador. Encurte os dados. + + + Escolha uma das opções de dígito verificador do MSI. + + + O Plessey aceita somente os dígitos de 0 a 9 e as letras maiúsculas de A a F. Remova qualquer outro caractere. + + + O EAN-8 precisa de {0} dígitos (o dígito verificador é adicionado automaticamente) ou de {1} dígitos incluindo o dígito verificador. + + + O último dígito não é o dígito verificador correto do EAN-8. Ele deveria ser {0}; ou remova o último dígito e deixe a impressora adicioná-lo. + + + O UPC-E precisa do código de 10 dígitos de fabricante e produto que a impressora encurta, ou do código UPC-E de 6 dígitos (opcionalmente com o sistema numérico 0 na frente e um dígito verificador no final). Altere a quantidade de dígitos. + + + O UPC-E só pode usar o sistema numérico 0. Comece o código com 0. + + + Estes dígitos não podem ser encurtados para um código UPC-E, porque o UPC-E precisa de zeros em posições específicas. Altere os dígitos ou use UPC-A. + + + O último dígito não é o dígito verificador correto do UPC-E. Ele deveria ser {0}; ou remova o último dígito e deixe a impressora adicioná-lo. + + + Uma extensão UPC/EAN precisa de exatamente 2 ou 5 dígitos. + + + Os dados POSTNET devem ter uma destas quantidades de dígitos: {0}. A impressora adiciona o dígito verificador. + + + Os dados PLANET devem ter uma destas quantidades de dígitos: {0}. A impressora adiciona o dígito verificador. + + + Escolha um dos tipos de GS1 DataBar. + + + Este tipo de GS1 DataBar precisa de até {0} dígitos (zeros são adicionados na frente) ou de {1} dígitos incluindo o dígito verificador. Encurte os dados. + + + O último dígito não é o dígito verificador GS1 correto. Ele deveria ser {0}; ou remova o último dígito e deixe a impressora adicioná-lo. + + + Dados compostos (2D) depois de um | não são compatíveis. Remova o | e tudo o que vem depois dele. + + + O GS1 DataBar Expanded precisa de cadeias de elementos GS1 com os identificadores entre parênteses, por exemplo (01)12345678901231(10)ABC. Verifique os parênteses e os identificadores. + + + Uma cadeia de elementos GS1 só pode conter caracteres comuns do teclado. Remova os acentos e símbolos especiais. + + + A cadeia de elementos GS1 é longa demais (máximo de {0} caracteres). Encurte-a. + + + O elemento (01) precisa de um GTIN de 14 dígitos formado apenas por números. Corrija os dígitos dentro dos parênteses. + + + O GS1 DataBar Limited só pode codificar números até 1999999999999, por isso o primeiro dos seus 13 dígitos deve ser 0 ou 1. Altere o número ou escolha outro tipo. + + + Os segmentos por linha devem ser um número par entre {0} e {1}. + + + A altura do separador deve estar entre {0} e {1} módulos. + + + O valor de correção de erros do Aztec não é válido. Use 0 (automático), 1 a 99 (percentual), 101 a 104 (tamanho compacto), 201 a 232 (tamanho completo) ou 300 (Rune). + + + O número de símbolos em um conjunto de anexação estruturada deve estar entre {0} e {1}. + + + O ID do conjunto pode ter no máximo {0} caracteres. Encurte-o. + + + O ID do conjunto só pode usar caracteres comuns do teclado, e não vírgula, ^ ou ~. Remova-os. + + + Os dados do Aztec são longos demais (máximo de {0} caracteres). Encurte o texto. + + + O modo do MicroPDF417 deve estar entre {0} e {1}. + + + Os dados do MicroPDF417 são longos demais (máximo de {0} caracteres). Encurte o texto. + + + Escolha Codablock A, E ou F. + + + O Codablock A aceita somente letras maiúsculas, dígitos e - . espaço $ / + %. Altere os dados ou escolha Codablock E ou F. + + + O Codablock E e o F só codificam caracteres comuns do teclado. Remova os acentos e símbolos especiais. + + + Os caracteres por linha devem ser 0 (automático) ou estar entre {0} e {1}. + + + Para este tipo de Codablock, o número de linhas deve ser 0 (automático) ou estar entre {0} e {1}. + + + O modo do MaxiCode deve estar entre {0} e {1}. + + + O número total de símbolos MaxiCode deve estar entre {0} e {1}, e o número deste símbolo deve estar entre 1 e o total. + + + O modo {0} do MaxiCode precisa de uma mensagem de transporte: uma classe de serviço de 3 dígitos, um código de país de 3 dígitos e depois o código postal (9 dígitos no modo 2, 6 letras ou dígitos no modo 3). Complete o início dos dados. + + + Os dados do MaxiCode são longos demais (máximo de {0} caracteres). Encurte o texto. + + + O MaxiCode não pode ser girado em ZPL, por isso a rotação definida neste elemento não será impressa. Volte a rotação para o padrão da etiqueta. + + + Os dados do TLC39 começam com um número ECI de 6 dígitos, opcionalmente seguido de uma vírgula, do número de série e de outros campos. Corrija o início dos dados. + + + Cada campo do TLC39 depois do número ECI só pode ter letras e dígitos, até {0} caracteres. Verifique os campos entre as vírgulas. + + + Os dados do TLC39 são longos demais (máximo de {0} caracteres). Encurte o texto. + + + A largura do módulo do MicroPDF417 deve estar entre {0} e {1} pontos. + + + A altura da linha do MicroPDF417 deve estar entre {0} e {1} pontos. + + + O Code 49 só codifica caracteres comuns do teclado. Remova os acentos e símbolos especiais. + + + O modo inicial do Code 49 deve ser automático ou um número de 0 a 5. Escolha um deles. + + + Os dados do Code 49 são longos demais (máximo de {0} caracteres). Encurte o texto. + + + Este GS1 DataBar usa o tipo de simbologia {0}, que o Rotula não suporta (somente os tipos 1 a 6). Ele foi mantido como texto ZPL e continuará sendo impresso, mas não pode ser editado. + + + Este GS1 DataBar tem uma parte composta (2D), que o Rotula não suporta. Ele foi mantido como texto ZPL e continuará sendo impresso, mas não pode ser editado. + + + Este código de barras postal usa o tipo {0}, que o Rotula não suporta (somente POSTNET e PLANET). Ele foi mantido como texto ZPL e continuará sendo impresso, mas não pode ser editado. + + + Somente números pares. Com menos de 22, o símbolo é empilhado em várias linhas. + + + 0 = automático. 1 a 99 = correção de erros mínima em percentual. 101 a 104 = símbolo compacto de 1 a 4 camadas. 201 a 232 = símbolo completo de 1 a 32 camadas. 300 = Aztec Rune. + + + 1 = um único símbolo. De 2 a 26 divide a mensagem nessa quantidade de símbolos. + + + 0 = automático. + + + Os modos 2 e 3 levam uma mensagem de transporte estruturada (classe de serviço, país, código postal); os modos 4 a 6 levam qualquer texto. + + + O modo define o número de colunas e linhas e a correção de erros (consulte o guia de ZPL). + + + Um contador da impressora precisa de um valor inicial de 1 a 40 caracteres formado por letras, dígitos, espaços e - / . com pelo menos um dígito. Altere o texto deste campo. + + + A impressora não consegue contar em um código QR, porque os dados dele começam com um cabeçalho. Desative o contador da impressora para este código de barras. + + + A máscara do contador só pode usar as letras D, H, O, A, N e %, e o incremento só letras, dígitos e %. Corrija a máscara ou o incremento. + + + O caractere que marca as referências a números de campo deve ser um único caractere comum do teclado, e não ^ ou ~. Escolha outro. + + + Os caracteres marcadores do relógio devem ser caracteres comuns do teclado, diferentes entre si, e não ^, ~ ou vírgula. Altere-os. + + + O número do campo deve estar entre {0} e {1}. + + + O texto de solicitação do campo só pode usar letras, dígitos e espaços, até 255 caracteres. Altere o texto. + + + Elipse + + + Linha diagonal + + + Símbolo + + + Elipse + + + Linha diagonal + + + Símbolo + + + Símbolo + + + Inclinação + + + Símbolo + + + Altura do caractere (pontos) + + + Largura do caractere (pontos) + + + Direita (/ do canto inferior esquerdo ao superior direito) + + + Esquerda (\ do canto superior esquerdo ao inferior direito) + + + Marca registrada (R) + + + Direitos autorais (C) + + + Marca comercial (TM) + + + Underwriters Laboratories (UL) + + + Canadian Standards Association (CSA) + + + Horizontal + + + Vertical (de cima para baixo) + + + Invertida (da direita para a esquerda) + + + O deslocamento da etiqueta deve estar entre {0} e {1} pontos. Altere o deslocamento nas configurações da etiqueta. + + + A margem superior da etiqueta deve estar entre {0} e {1} linhas de pontos. Altere-a nas configurações da etiqueta. + + + A alteração de intensidade deve estar entre {0} e {1}. Escolha um valor nesse intervalo. + + + As velocidades de impressão devem estar entre {0} e {1} polegadas por segundo. Altere as velocidades de impressão, de avanço e de recuo para valores nesse intervalo. + + + A fonte {0} não pode usar o arquivo "{1}". O ID de uma fonte é uma letra ou um dígito, e o arquivo deve ter o formato E:NOME.TTF. Corrija o ID da fonte ou o nome do arquivo. + + + O gráfico armazenado {0} não pode ser usado. O nome dele deve ter o formato R:LOGO.GRF e os dados não podem passar de 4 MB. Corrija o nome ou use um gráfico menor. + + + A largura, a altura e a espessura de uma linha diagonal devem estar entre {0} e {1} pontos. Altere o tamanho. + + + A largura, a altura e a espessura de uma elipse devem estar entre {0} e {1} pontos. Altere o tamanho. + + + A altura e a largura de um símbolo devem estar entre {0} e {1} pontos. Altere o tamanho. + + + A largura e a altura de uma caixa de texto devem estar entre {0} e {1} pontos. Altere o tamanho da caixa. + + + Um campo de texto pode ser um bloco com quebra automática ou uma caixa de texto, mas não os dois. Desative um deles. + + + O espaço entre caracteres deve estar entre {0} e {1} pontos. Altere o espaço. + + + A opção {0} deste campo não pode ser usada com o campo ao qual pertence, por isso o campo inteiro foi mantido como ZPL bruto e continuará sendo impresso, mas não pode ser editado. + + + Este campo tem dados e também um contador da impressora, que não podem ser combinados. Ele foi mantido como ZPL bruto e continuará sendo impresso, mas não pode ser editado. + + + A atribuição de fonte {0} vem depois de alguns campos já terem sido definidos, por isso não pode virar uma configuração da etiqueta. Ela foi mantida como ZPL bruto no lugar original. + + + O arquivo de suprimentos "{0}" tem mais de {1} bytes, por isso não foi lido. Use um arquivo menor. + + + Não foi possível abrir o arquivo de suprimentos "{0}". Verifique se ele existe e se você tem permissão para lê-lo. + + + O arquivo de suprimentos "{0}" não é uma lista de suprimentos válida. Verifique o arquivo ou restaure-o a partir do original. + + + O arquivo de suprimentos "{0}" tem uma versão de formato ({1}) que esta versão do Rotula não entende. Atualize o Rotula ou use outro arquivo. + + + O arquivo de suprimentos "{0}" não tem entradas. Adicione pelo menos um suprimento. + + + O arquivo de suprimentos "{0}" tem mais de {1} entradas, por isso somente as primeiras {1} foram lidas. Divida o arquivo em arquivos menores. + + + A pasta de suprimentos tem mais de {0} arquivos, por isso os excedentes foram ignorados. Remova os arquivos de que não precisa. + + + O item {1} de "{0}" não é uma entrada de suprimento, por isso foi ignorado. + + + A entrada {1} de "{0}" não tem ID, por isso foi ignorada. Dê a cada entrada um ID único. + + + A entrada {1} de "{0}" tem o ID "{2}", que é longo demais ou usa caracteres não permitidos, por isso foi ignorada. Use letras, dígitos, pontos, sublinhados e hífens, até 64 caracteres. + + + O ID "{1}" aparece duas vezes em "{0}", por isso a segunda entrada foi ignorada. Dê a cada entrada um ID único. + + + O suprimento "{0}" não tem nome, por isso foi ignorado. Dê um nome a ele. + + + O campo "{1}" do suprimento "{0}" tem o tipo errado ou é longo demais, por isso o suprimento foi ignorado. Corrija o campo. + + + O suprimento "{0}" não tem largura e altura utilizáveis, por isso foi ignorado. Adicione o tamanho da etiqueta. + + + O valor de {1} do suprimento "{0}" ({2}) está fora dos tamanhos que uma impressora de etiquetas pode usar, por isso o suprimento foi ignorado. Verifique o número e a unidade. + + + O valor de {1} do suprimento "{0}" aparece como {2} mm e {3} pol, que não são o mesmo comprimento, por isso o suprimento foi ignorado. Corrija um dos dois valores. + + + O campo "{1}" do suprimento "{0}" tem o valor {2}, que está fora do intervalo permitido, por isso o suprimento foi ignorado. Corrija o valor. + + + O endereço de origem do suprimento "{0}" não é um endereço https, por isso o suprimento foi ignorado. Use um endereço que comece com https://. + + + O campo "{1}" do suprimento "{0}" parece um preço. O Rotula não guarda preços, por isso o campo foi ignorado. + + + O suprimento "{0}" está marcado como verificado, mas está faltando {1}. Adicione esse dado ou marque o suprimento como não verificado. + + + O suprimento "{0}" não diz de onde vêm os dados dele. Adicione um ID de fonte ou um endereço de origem https. + + + O bloco de descrição do arquivo de suprimentos está incompleto: está faltando {0}. Adicione esse dado. + + + O suprimento "{0}" cita a fonte "{1}", que o arquivo não descreve. Adicione essa fonte ao bloco de descrição. + + + O arquivo diz que {0} entradas estão verificadas, mas são {1}. Atualize as contagens no bloco de descrição. + + + O tamanho do suprimento "{0}" não foi verificado. Meça as etiquetas reais antes de imprimir uma tiragem grande. + + + O espaçamento entre as etiquetas do suprimento "{0}" não é conhecido. Calibre a impressora com este suprimento carregado. + + + O suprimento "{0}" é um rolo contínuo sem altura fixa de etiqueta, por isso a altura da etiqueta foi mantida como estava. Defina a altura de que precisa. + + + Este suprimento tem {0} etiquetas na largura e {1} no comprimento. Por enquanto, apenas uma etiqueta é diagramada, por isso posicione você mesmo as outras etiquetas, se precisar delas. + + + O suprimento "{0}" é uma folha recortada. O tamanho da etiqueta foi aplicado, mas não a disposição da folha. + + + A etiqueta já tem conteúdo, por isso a rotação padrão dos campos não foi alterada para o suprimento "{0}". Altere você mesmo a rotação, se o suprimento precisar. + + + O suprimento "{0}" é redondo ou oval, mas a etiqueta da impressora é retangular e o formato não é desenhado. Mantenha o conteúdo dentro do formato. + + + {0} elementos já estão na etiqueta e agora podem ficar fora do novo tamanho. Verifique se eles ainda cabem. + + + Arquivos do tipo "{0}" não podem ser importados. Salve a lista como .csv ou .xlsx e tente novamente. + + + A lista tem mais de {0} bytes e não foi lida. Use um arquivo menor. + + + Não foi possível ler a lista "{0}". Verifique se ela não está aberta em outro programa e se é um arquivo válido. + + + A lista não tem linhas de dados. Adicione os suprimentos abaixo da linha de cabeçalho. + + + A lista tem mais de {0} linhas, por isso somente as primeiras {0} foram lidas. Divida-a em listas menores. + + + Nenhuma coluna com códigos de peça foi encontrada, por isso nada foi importado. Adicione uma coluna chamada "Part number". + + + Nenhuma coluna com tamanhos de etiqueta foi encontrada, por isso nada foi importado. Adicione uma coluna de tamanho ou uma coluna de largura e outra de altura. + + + A coluna "{0}" parece um preço e foi ignorada. O Rotula não guarda preços. + + + A coluna de {0} foi escolhida pelo conteúdo porque nenhum cabeçalho correspondeu: "{1}". Verifique se é a coluna certa. + + + A linha {0} não tem código de peça, por isso foi ignorada. Adicione o código da peça. + + + A linha {0} ({1}) não tem um tamanho legível, por isso foi ignorada. Escreva o tamanho como largura x altura, com a unidade. + + + A linha {0} ({1}) informa o tamanho "{2}" sem dizer se é em polegadas ou milímetros, por isso foi ignorada. Adicione "in" ou "mm". + + + A linha {0} ({1}) informa dois tamanhos que não coincidem ("{2}"), por isso foi ignorada. Mantenha apenas o correto. + + + A linha {0} ({1}) tem o tamanho "{2}", que está fora dos tamanhos que uma impressora de etiquetas pode usar, por isso foi ignorada. Verifique o número e a unidade. + + + A linha {0} repete o código de peça {1}, por isso foi ignorada. Mantenha uma linha por código de peça. + + + Endereço do servidor + + + O nome ou endereço IP do servidor de banco de dados, por exemplo db.exemplo.com. O administrador do banco de dados pode informá-lo. + + + Porta + + + Nome do banco de dados + + + Nome de usuário + + + Arquivo de banco de dados + + + Nome da fonte de dados (DSN) + + + Cadeia de conexão + + + Criptografar a conexão + + + Mantenha esta opção ativada. Desative-a somente para um servidor confiável na sua própria rede. + + + Confiar no certificado deste servidor + + + Somente para um servidor que você conhece e controla, como um servidor de teste. Caso contrário, alguém poderia se passar pelo servidor. + + + Arquivo da autoridade certificadora (opcional) + + + O servidor está atrás de um pooler de conexões + + + Família do servidor + + + MySQL + + + MariaDB + + + Banco de dados por trás do driver + + + Se você sabe com qual banco de dados o driver ODBC se comunica, escolha-o para que o Rotula aplique as regras de segurança desse banco de dados. Isso nunca afrouxa as verificações. + + + Não tenho certeza + + + SQL Server + + + PostgreSQL + + + MySQL + + + MariaDB + + + SQLite + + + Oracle + + + DuckDB + + + BigQuery + + + Snowflake + + + ClickHouse + + + Informix + + + IBM Db2 + + + Firebird + + + Microsoft Access / Excel (Jet, ACE) + + + Se o certificado do servidor for emitido pela sua própria organização, escolha aqui o arquivo da autoridade certificadora. O administrador pode fornecê-lo a você. + + + Este serviço só aceita login do Microsoft Entra, que precisa de um complemento ainda não instalado. Não é possível conectar-se a ele com nome de usuário e senha. + + + O driver para este tipo de arquivo não foi encontrado neste computador. Instale o "Microsoft Access Database Engine" de 64 bits da Microsoft e reinicie o Rotula. + + + Este servidor é um pooler de conexões. Se algo não funcionar, tente o endereço de conexão direta. + + + Use uma conta de banco de dados que só possa ler (SELECT). Esta fonte de dados não consegue tornar uma sessão somente leitura por conta própria, por isso a conta é a proteção real. + + + MariaDB + + + Amazon RDS para MySQL + + + Amazon Aurora (MySQL) + + + Amazon RDS para PostgreSQL + + + Amazon Aurora (PostgreSQL) + + + Amazon Redshift + + + CockroachDB + + + YugabyteDB (YSQL) + + + Supabase (conexão direta) + + + Supabase (pooler de conexões) + + + Neon (conexão direta) + + + Neon (pooler de conexões) + + + PlanetScale + + + TiDB + + + SingleStore + + + Azure SQL Database + + + Azure Synapse Analytics + + + Microsoft Fabric + + + Google Cloud SQL para MySQL + + + Google Cloud SQL para PostgreSQL + + + Google Cloud SQL para SQL Server + + + Microsoft Access (.mdb, .accdb) + + + Microsoft Excel (.xls, .xlsx) + + + Arquivos de texto e CSV (uma pasta) + + + O complemento da pasta "{0}" não tem um arquivo de descrição válido (pack.json), por isso não foi carregado. Peça uma cópia corrigida a quem forneceu o complemento. + + + O complemento "{0}" precisa de uma versão mais recente do Rotula (interface de dados {1}). Atualize o Rotula e reinicie-o. + + + O complemento "{0}" foi feito para uma versão anterior do Rotula e não pode ser usado. Peça um complemento atualizado. + + + Não foi possível abrir o complemento "{0}". Pode estar faltando um arquivo, algum arquivo pode estar danificado ou o complemento foi feito para outro tipo de computador. Reinstale o complemento. + + + O complemento "{0}" parou com um erro ao iniciar, por isso foi desativado. O Rotula em si não foi afetado. Reinstale ou atualize o complemento. + + + O complemento "{0}" não corresponde ao seu arquivo de descrição, por isso não foi carregado. Reinstale o complemento. + + + Um complemento oferece uma fonte de dados chamada "{0}", que não é um nome válido, por isso o complemento não foi carregado. + + + Um complemento oferece uma fonte de dados chamada "{0}", que já existe, por isso o complemento não foi carregado. Um complemento nunca pode substituir uma fonte de dados. + + + Um complemento chamado "{0}" já está carregado; a segunda cópia foi ignorada. + + + O complemento "{0}" da sua própria pasta não foi carregado. Um complemento é um programa: aprove-o somente se confiar na origem dele. + + + O complemento "{0}" mudou desde que você o aprovou, por isso não foi carregado. Aprove-o novamente somente se você esperava a mudança. + + + A pasta do complemento "{0}" contém atalhos (links) ou é grande demais, por isso foi ignorada. + + + Aprovar este complemento? + + + "{0}" é um complemento da sua própria pasta ({1}). Um complemento é um programa: se você o aprovar, ele poderá fazer tudo o que você pode fazer neste computador, inclusive ler seus arquivos. Aprove-o somente se souber quem o criou e se o obteve de uma fonte confiável. Você pode remover a aprovação depois. + + + Não foi possível usar o complemento "{0}". + + + Alguns complementos de fontes de dados não puderam ser carregados. + + + Um complemento está aguardando a sua aprovação. + + + Detalhes + + + Fechar este aviso + + + Complementos de fontes de dados + + + Estes complementos foram encontrados, mas não foram carregados. O Rotula em si funciona normalmente. + + + Detalhe técnico + + + Revisar... + + + Revisar o complemento {0} + + + O complemento "{0}" foi aprovado e já está disponível. + + + Editor + + + Versão + + + Impressão digital (SHA-256) + + + Pasta + + + Aprovar e carregar + + + Ignorar + + + Ignorar mantém o complemento desativado. O Rotula perguntará novamente na próxima vez que for iniciado. + + + não informado + + + Servidores de banco de dados + + + Serviços na nuvem + + + Arquivos + + + Bancos de documentos + + + Serviços web + + + Outros (drivers ODBC) + + + Mais opções + + + Esta conexão precisa do complemento "{0}", que não está instalado. As configurações dela são mantidas como estão. Instale o complemento e reinicie o Rotula para usar ou editar esta conexão. + + + O Rotula não conseguiu confirmar as configurações deste serviço na documentação do fornecedor. Verifique o endereço e a porta antes de confiar neles. + + + Arquivo + + + Pasta + + + Escolher uma pasta... + + + Este endereço parece ser de {0}. + + + Usar as configurações dele + + + Você alterou onde ou como esta conexão faz login, por isso a senha salva não foi usada. Digite a senha no campo Senha e teste novamente. + + + Escolher... + + + {0} é obrigatório. + + + {0} deve ser um número inteiro de {1} a {2}. + + + Pesquisar suprimentos de etiquetas + + + Pesquise por código da peça, tamanho ou nome + + + Experimente um código de peça como {0} ou um tamanho como 4x6 ou 100x150mm. + + + Marca + + + Todas as marcas + + + Medidas em + + + Polegadas ou mm + + + Polegadas + + + Milímetros + + + Tipo + + + Todos os tipos + + + Rolo + + + Folha + + + Redonda + + + Somente verificados + + + Somente favoritos + + + Tamanhos comuns + + + Favoritos + + + Recentes + + + Resultados + + + Tamanhos próximos + + + Tamanho personalizado... + + + Digite a sua própria largura e altura + + + Tamanho de etiqueta comum + + + {0} suprimentos de etiquetas. Digite para pesquisar. + + + A biblioteca de suprimentos não está disponível. Você ainda pode usar os tamanhos comuns ou um tamanho personalizado. + + + {0} suprimentos encontrados + + + Mostrando {0} de {1} suprimentos. Digite mais para refinar. + + + {0} suprimentos encontrados e {1} tamanhos próximos abaixo + + + Nenhum suprimento corresponde. Tente menos palavras, ou apenas o código da peça ou o tamanho. + + + Carregando a biblioteca de suprimentos... + + + Tamanho verificado + + + Tamanho não verificado + + + O tamanho foi confirmado por duas fontes independentes. + + + O tamanho vem de uma única fonte ou as fontes não coincidem. Meça as etiquetas reais antes de imprimir uma tiragem grande. + + + Meu suprimento + + + Adicionar aos favoritos + + + Remover dos favoritos + + + favorito + + + Criar etiqueta + + + Obtida da sua impressora ({0} dpi). Altere-a se for imprimir em outra. + + + Antes de começar + + + O que se sabe sobre este suprimento + + + Este é um rolo contínuo: digite a altura da etiqueta que você deseja. + + + Altura da etiqueta + + + Este suprimento não tem um tamanho utilizável, por isso não pode ser aplicado. + + + O rolo tem {0} m de comprimento. + + + {0} x {1} mm + + + {0} x {1} pol + + + {0} mm de largura + + + {0} pol de largura + + + {0} mm + + + {0} m + + + {0} mm ({1} pol) + + + {0} na largura, {1} no comprimento + + + Desconhecido. Calibre a impressora com este suprimento carregado. + + + Marca preta no verso + + + Não informado + + + Térmica direta + + + Transferência térmica + + + Térmica direta ou transferência térmica + + + Não informado + + + Rolo de etiquetas cortadas + + + Rolo contínuo + + + Rolo sem liner + + + Formulário sanfonado + + + Folhas avulsas + + + Marca + + + Código da peça + + + Família de produtos + + + Tamanho + + + Tipo de impressão + + + Fornecido como + + + Superfície e adesivo + + + Tubete + + + Etiquetas por rolo + + + Comprimento do rolo + + + Etiquetas na largura + + + Raio dos cantos + + + Espaçamento entre etiquetas + + + Espaçamento entre colunas + + + Espaçamento entre linhas + + + Fontes + + + Verificação + + + Guardar este tamanho como meu próprio suprimento + + + Nome + + + Código da peça (opcional) + + + Salvar como meu suprimento + + + "{0}" salvo. Você pode encontrá-lo pesquisando pelo nome ou pelo código da peça. + + + Dê ao suprimento um nome ou um código de peça. + + + Não foi possível salvar o suprimento: {0} + + + Esse tamanho não pode ser guardado como suprimento: ele está fora dos tamanhos que uma impressora de etiquetas pode usar. + + + Importar uma lista de suprimentos... + + + Escolha uma lista de suprimentos (CSV ou Excel) + + + Importar uma lista de suprimentos + + + Confira o que o Rotula entendeu antes de guardar. Apenas códigos de peça, descrições e tamanhos são lidos; os preços nunca são lidos. + + + {0} linhas lidas, {1} suprimentos encontrados. + + + Não foi possível importar nada desta lista. + + + Linha + + + Código da peça + + + Descrição + + + Tamanho (mm) + + + Tamanho (pol) + + + Certeza + + + Alta + + + Média: confira + + + O tamanho tem uma coluna própria com unidade, ou duas informações sobre ele coincidem. + + + O tamanho foi encontrado em texto livre com unidade. Confira-o com a etiqueta real. + + + Observações sobre a lista + + + Salvar {0} suprimentos + + + {0} suprimentos salvos em {1}. Eles agora fazem parte da pesquisa. + + + Os nomes de marcas e produtos pertencem aos seus proprietários; o Rotula não tem vínculo com eles. + + + Sobre o catálogo de suprimentos + + + Sobre o catálogo de suprimentos + + + A biblioteca de suprimentos lista suprimentos de etiquetas pelo código da peça do fabricante, com o tamanho da etiqueta em milímetros e polegadas, o tipo de impressão e, quando uma fonte informa, o tamanho do tubete, as etiquetas por rolo, as etiquetas na largura e o raio dos cantos. + +Ela contém {0} suprimentos, {1} deles com tamanho verificado (duas fontes independentes coincidem). Códigos de peça e tamanhos são dados de produto que os fabricantes publicam; o Rotula não guarda preços, imagens nem textos de marketing. + +O espaçamento entre etiquetas quase nunca é publicado, por isso o Rotula deixa isso para a impressora: calibre a impressora com o suprimento carregado. Nos suprimentos com várias etiquetas na largura ou no comprimento, e nas folhas avulsas, só o tamanho de uma etiqueta é aplicado. + +Seus próprios suprimentos e as listas de suprimentos que você importar ficam em {2}. Exclua um arquivo dessa pasta para remover os suprimentos dele. + +Os nomes de marcas e produtos pertencem aos seus proprietários; o Rotula não tem vínculo com eles. Encontrou um tamanho errado? Correções são bem-vindas: consulte docs/stock-catalog.md no projeto. + + + Suprimento de etiquetas + + + Suprimento de etiquetas: {0} + + + Suprimento de etiquetas: {0} (não está mais na biblioteca) + + + código da peça + + + tamanho + + + Encontrar um suprimento + + + Tamanho da etiqueta + + + Filtros + + + 1 suprimento encontrado + + + Família de produtos + + + Todas as famílias + + + Igual às suas últimas configurações de impressão ({0} dpi). Altere-a se for imprimir em outra impressora. + + + Os endereços deste serviço têm o formato {0}. + + + Inserir campo + + + Insere um campo de dados na posição do cursor. Você também pode digitar {{ para ver a lista. + + + Carregue os dados primeiro: Impressora > Mesclar dados + + + Abrir Mesclar dados + + + Pesquisar campos + + + Campos disponíveis + + + 1 campo disponível + + + {0} campos disponíveis + + + Nenhum campo corresponde + + + Setas para cima/baixo para escolher, Enter para inserir, Esc para fechar + + + Coluna + + + Contador + + + Variável + + + (vazio) + + + Valor no registro mostrado: {0} + + + Nenhuma coluna chamada {0} nos dados carregados + + + Mostra dados de: {0} + + + Campos dos seus dados + + + Adicione uma coluna à etiqueta como texto, código de barras ou código QR, ou coloque-a no elemento selecionado na etiqueta. + + + Ainda não há campos. Abra primeiro um arquivo de dados ou escolha uma tabela do banco de dados. + + + Adicionar todos os campos à etiqueta + + + Adiciona um texto por coluna, empilhados de cima para baixo + + + Adicionar à etiqueta + + + Adicionar este campo à etiqueta como texto + + + Usar aqui + + + Colocar este campo no elemento selecionado + + + Selecione um texto ou um código de barras na etiqueta para colocar um campo nele. + + + Elemento selecionado: {0} + + + {0} adicionado à etiqueta + + + {0} campos adicionados à etiqueta + + + Nem todos os campos cabem + + + O novo campo não cabe dentro da etiqueta. Aumente a altura da etiqueta ou mova o campo. + + + {0} dos {1} novos campos não cabem dentro da etiqueta. Aumente a altura da etiqueta, use menos campos ou mova-os. + + + {0} colocado em {1} + + + Variáveis da etiqueta + + + inserção de campo + + + adição de campos + + + Valor fixo + + + Campo + + + Escolha se o conteúdo é um valor fixo ou vem de um campo de dados + + + Mostra o campo {0} dos dados. Use Campo para escolher outro. + + + Usar um valor fixo + + + Adicionar como texto + + + Adicionar como código de barras + + + Adicionar como código QR + + + uso de valor fixo + + + Usa campos de dados + + + Mais formas de adicionar este campo + + + + O nome de variável "{0}" não é válido. Use apenas letras, dígitos e sublinhados, e mantenha-o curto. + + + Há duas variáveis chamadas "{0}". Os nomes não diferenciam maiúsculas de minúsculas, por isso dê um nome diferente a cada variável. + + + A variável "{0}" tem o mesmo nome de uma coluna de dados, por isso o valor da própria variável é usado no lugar da coluna. Renomeie uma delas se quiser os dados da coluna. + + + + O formato de data "{1}" da variável "{0}" não pode ser usado. Escolha um formato da lista ou verifique o padrão. + + + O idioma "{1}" escolhido para a variável "{0}" não é conhecido neste computador, por isso o idioma padrão é usado para os nomes de meses e dias. Escolha outro idioma. + + + O deslocamento de data da variável "{0}" é grande demais, ou há deslocamentos demais. Use valores de no máximo {1} e menos deslocamentos. + + + A data calculada para a variável "{0}" está fora das datas que o Rotula consegue tratar. Reduza os deslocamentos de data. + + + A variável "{0}" está definida com uma data fixa, mas nenhuma data foi informada. Informe a data. + + + A variável "{0}" conta dias úteis, o que uma impressora não consegue fazer, por isso o relógio do computador é usado. + + + A variável "{0}" arredonda para o início ou o fim de um período, o que exige o relógio do computador, por isso ele é usado no lugar do relógio da impressora. + + + A variável "{0}" usa o horário UTC, que o relógio da impressora não consegue fornecer, por isso o relógio do computador é usado. + + + O formato de data da variável "{0}" usa "{1}", que a impressora não consegue imprimir, por isso o relógio do computador é usado. Use um formato mais simples para usar o relógio da impressora. + + + A variável "{0}" imprime nomes de meses ou dias no idioma "{1}", mas a impressora os escreve em inglês, por isso o relógio do computador é usado. Escolha inglês ou um formato numérico para usar o relógio da impressora. + + + Uma etiqueta só pode deslocar o relógio da impressora de duas maneiras diferentes, e ambas já estão em uso, por isso a variável "{0}" usa o relógio do computador. + + + A variável "{0}" usa uma data fixa, que não é um relógio, por isso não há relógio da impressora para ler e o computador é usado. + + + O relógio da impressora não pode ser usado dentro de um código de barras, por isso a variável "{0}" usa o relógio do computador. + + + Este campo já usa os seus próprios marcadores de relógio e nenhum está livre para a variável "{0}", por isso o relógio do computador é usado. + + + Nenhum caractere marcador de relógio está livre neste campo para a variável "{0}", por isso o relógio do computador é usado. + + + + O contador "{0}" tem uma configuração que não é válida: {1}. Corrija-a nas configurações da variável. + + + O contador "{0}" passou do seu maior número e para em vez de recomeçar. Permita mais dígitos ou reinicie o contador. + + + O início, o incremento, o tipo ou o preenchimento do contador "{0}" foi alterado depois que números já tinham sido usados (último número: {1}). A impressão fica bloqueada até você aceitar a alteração ou reiniciar o contador. + + + Uma impressão anterior reservou os números {1} a {2} do contador "{0}" e nunca terminou, por isso esses números foram pulados. Se nada foi impresso com eles, você pode devolvê-los nas configurações do contador. + + + O arquivo de contadores "{0}" está danificado. Nada foi alterado. Recupere os contadores (o arquivo danificado é guardado à parte) ou restaure uma cópia de segurança; depois tente novamente. + + + O arquivo de contadores "{0}" foi gravado por uma versão mais recente do Rotula (versão de arquivo {1}). Atualize o Rotula para usá-lo. Nada foi alterado. + + + O arquivo de contadores "{0}" está em uso por outro programa ou não pode ser gravado. Feche o outro programa, verifique se você pode gravar nessa pasta e tente novamente. + + + O contador "{0}" lembra o seu número entre impressões, por isso a etiqueta precisa ser salva primeiro. Salve a etiqueta e tente novamente. + + + O contador "{0}" deveria lembrar o seu número, mas os contadores não podem ser armazenados agora, por isso ele só pode contar a partir do primeiro número. Para não repetir números, a impressão precisa que o arquivo de contadores esteja disponível. + + + + Informe um valor para "{0}". + + + A resposta para "{0}" é curta demais. Informe pelo menos {1} caracteres. + + + A resposta para "{0}" é longa demais. Informe no máximo {1} caracteres. + + + A resposta para "{0}" não está no formato esperado. Verifique-a e tente novamente. + + + A regra de formato definida para a pergunta "{0}" não é válida. Corrija a regra nas configurações da variável. + + + A resposta para "{0}" deve ser um número. + + + A resposta para "{0}" deve ser uma data. + + + Escolha uma das opções oferecidas para "{0}". + + + A pergunta "{0}" não tem opções para escolher. Adicione pelo menos uma opção nas configurações da variável. + + + Nenhuma resposta foi dada para "{0}". Responda a todas as perguntas antes de imprimir. + + + + A fórmula da variável "{0}" está vazia. Escreva uma fórmula ou remova a variável. + + + A fórmula da variável "{0}" é longa demais (máximo de {2} caracteres). Encurte-a. + + + A fórmula da variável "{0}" tem aninhamento profundo demais perto da posição {1} (máximo de {2} níveis). Simplifique-a. + + + A fórmula da variável "{0}" tem partes demais (máximo de {2}). Divida-a em duas variáveis. + + + A fórmula da variável "{0}" tem um caractere não permitido na posição {1}: {2}. Remova-o. + + + Era esperado outro elemento na posição {1} da fórmula de "{0}", mas foi encontrado {2}. Verifique a fórmula. + + + A fórmula da variável "{0}" termina cedo demais (posição {1}). Verifique se falta um valor ou um parêntese de fechamento. + + + Um texto entre aspas na posição {1} da fórmula de "{0}" não está fechado. Adicione as aspas de fechamento. + + + O número "{2}" na posição {1} da fórmula de "{0}" não é válido. Verifique como ele está escrito. + + + A função "{2}" na posição {1} da fórmula de "{0}" não existe. Verifique a grafia. + + + A função {2} na posição {1} da fórmula de "{0}" aceita de {3} a {4} valores. Adicione ou remova valores. + + + O valor número {3} da função {2} na fórmula de "{0}" não é permitido (por exemplo, um comprimento negativo). Altere-o. + + + A fórmula da variável "{0}" usa "{2}", que não é uma variável declarada e não tem dados. Crie a variável ou corrija o nome. + + + Variáveis calculadas dependem umas das outras em círculo ({2}). Altere uma das fórmulas para quebrar o círculo. + + + Um resultado da fórmula de "{0}" teria mais de {2} caracteres e foi cortado. Encurte a fórmula. + + + A função {2} na fórmula de "{0}" não conseguiu ler "{3}" como número. Verifique o valor. + + + A função {2} na fórmula de "{0}" não conseguiu ler "{3}" como data. Escreva as datas como aaaa-MM-dd ou aaaaMMdd. + + + O formato "{3}" usado pela função {2} na fórmula de "{0}" não pode ser usado. Verifique o formato. + + + + Os dados não cabem em um código QR com o nível de correção de erros "{2}": eles têm {0} caracteres e o máximo que cabe é {1}. Encurte os dados ou escolha um nível de correção de erros mais baixo. + + + O modo de entrada de dados QR não é um modo que o Rotula conheça. Escolha Automático ou um dos modos manuais. + + + O modo alfanumérico manual só aceita dígitos, letras maiúsculas de A a Z, espaços e os símbolos $ % * + - . / : . Altere os dados ou escolha outro modo de entrada. + + + Os dados são longos demais para o modo de bytes manual (máximo de {0} bytes). Encurte os dados. + + + O modo numérico manual só aceita os dígitos de 0 a 9. Altere os dados ou escolha outro modo de entrada. + + + O padrão de máscara QR deve ser um número de {0} a {1}, ou ficar automático. + + + baixa (7%) + + + média (15%) + + + quartil (25%) + + + alta (30%) + + + Este Code 128 ({0}) contém dados GS1 que o Rotula não consegue regravar exatamente como estão. Ele foi mantido como texto ZPL e continuará sendo impresso, mas não pode ser editado. + + + + Não há dados GS1. Informe pelo menos um identificador com o seu valor, por exemplo (01)09506000134352. + + + Os dados GS1 não estão escritos corretamente perto do caractere {0}. Cada elemento deve ter o formato (01)09506000134352. + + + O identificador ({0}) tem comprimento fixo, por isso não deve ser seguido de um caractere separador. Remova o separador. + + + Os dados terminam antes de o valor de ({0}) estar completo. Verifique se o valor tem todos os seus caracteres. + + + Os dados terminam com um separador sem nada depois dele. Remova-o. + + + O identificador que começa com "{0}" não é um identificador GS1 conhecido. Verifique o número. + + + O identificador ({0}) não existe no sistema GS1. Verifique o número entre parênteses. + + + O valor de ({0}) é longo demais (máximo de {1} caracteres). Encurte-o. + + + O valor de ({0}) é curto demais (mínimo de {1} caracteres). Complete-o. + + + O identificador ({0}) aparece mais de uma vez com valores diferentes. Mantenha apenas um. + + + O identificador ({0}) aparece mais de uma vez com o mesmo valor. Remova a repetição. + + + Os identificadores ({0}) e ({1}) não podem ser usados juntos. Remova um deles. + + + O identificador ({0}) normalmente é usado junto com outros identificadores: {1} (a vírgula separa alternativas e o sinal de mais significa todos eles). Adicione-os ou verifique os seus dados. + + + Um Data Matrix GS1 não pode ser também um GS1 Digital Link. Desative uma das duas opções. + + + A opção de dígito verificador não é necessária: o GS1-128 adiciona o seu próprio dígito verificador. Desative a opção. + + + Um valor contém um parêntese, que a impressora descarta no modo GS1-128. Remova o parêntese do valor. + + + Os dados GS1-128 têm {0} caracteres; o máximo é {1} (identificadores e separadores contam). Encurte os dados. + + + Um código ITF-14 precisa de exatamente 14 dígitos. + + + O dígito verificador do código ITF-14 está errado. Ele deveria ser {0}. + + + A parte linear "{0}" do código composto não é um GTIN válido (8, 12, 13 ou 14 dígitos com um dígito verificador correto). Corrija-a. + + + O identificador ({0}) aparece tanto na parte linear quanto na parte 2D do código composto. Mantenha-o em apenas uma delas. + + + + O texto não é um endereço da web válido. Um GS1 Digital Link deve começar com https:// (ou http://). + + + O link não tem chave GS1. Um Digital Link deve ter uma chave, como o GTIN (01), seguida do seu valor. + + + O link tem mais de uma chave GS1. Um Digital Link precisa de exatamente uma chave, como o GTIN. Remova as outras. + + + O identificador ({0}) não pode ser usado em um GS1 Digital Link. Remova-o. + + + O caminho do link está incompleto: ele deve ser formado por pares, um identificador seguido do seu valor. Verifique o link. + + + Os qualificadores ({1}) não são uma combinação permitida para a chave ({0}). Remova um deles ou verifique as regras GS1. + + + Os qualificadores ({1}) da chave ({0}) não estão em uma ordem permitida. Coloque-os na ordem que o GS1 define para essa chave. + + + + O valor de ({0}) deve conter somente hifens (-). + + + O valor de ({0}) deve conter pelo menos um caractere que não seja dígito. + + + O valor de ({0}) deve ser formado somente por zeros. + + + O valor de ({0}) deve ser 0, 1 ou 9. + + + O valor de ({0}) deve ser 0 ou 1. + + + O valor de ({0}) deve ser 0, 1, 2 ou 9. + + + O valor "{1}" de ({0}) não é um código de país de 3 dígitos válido (ISO 3166). Verifique-o. + + + O valor "{1}" de ({0}) não é um código de país. Use um código ISO 3166 de 3 dígitos ou 999. + + + O valor "{1}" de ({0}) não é um código de país de 2 letras válido (ISO 3166). Verifique-o. + + + O valor "{1}" de ({0}) não é um código numérico de moeda válido (ISO 4217). Verifique-o. + + + O valor "{1}" de ({0}) não é um código de tipo de embalagem válido. Verifique-o. + + + O valor de ({0}) deve ser uma única letra, dígito, hífen ou sublinhado. + + + O valor de ({0}) deve ter 10 dígitos e representar uma latitude entre -90 e 90 graus. + + + O valor de ({0}) deve ter 10 dígitos e representar uma longitude entre -180 e 180 graus. + + + O caractere "{1}" no valor de ({0}) não é um dígito. Este identificador aceita somente dígitos. + + + O caractere "{1}" no valor de ({0}) não pode ser usado em dados GS1. Use somente as letras, dígitos e símbolos que o GS1 permite. + + + O caractere "{1}" no valor de ({0}) não é permitido. Use somente letras maiúsculas, dígitos, # - e /. + + + O caractere "{1}" no valor de ({0}) não é permitido em texto Base64. Use letras, dígitos, - e _. + + + O preenchimento "=" no final do valor de ({0}) não está correto. + + + O dígito verificador de ({0}) está errado ou faltando (esperado: {1}). Corrija-o. + + + Os dois caracteres de verificação no final do valor de ({0}) estão errados. Corrija-os. + + + O valor de ({0}) deve conter um prefixo de empresa GS1 de pelo menos 4 dígitos na posição esperada. + + + A data de ({0}) deve ser escrita como {1}. + + + O mês "{1}" na data de ({0}) deve ser de 01 a 12. + + + O dia "{1}" na data de ({0}) não é válido para esse mês. + + + O horário de ({0}) deve ser escrito como {1}. + + + A hora "{1}" em ({0}) deve ser de 00 a 23. + + + Os minutos "{1}" em ({0}) devem ser de 00 a 59. + + + Os segundos "{1}" em ({0}) devem ser de 00 a 59. + + + O valor de ({0}) não pode ser zero. + + + O valor de ({0}) não pode começar com zero. + + + O valor de ({0}) deve ser formado por dois números do mesmo comprimento: a peça e o total (por exemplo 0204). + + + Nem o número da peça nem o total de ({0}) podem ser zero. + + + O número da peça de ({0}) é maior que o total. Verifique os dois números. + + + O valor de ({0}) deve ser formado por dois números separados por uma barra (por exemplo 2/5). + + + O primeiro número de ({0}) é maior que o segundo. Verifique os dois números. + + + O valor de ({0}) tem um código % incompleto ou inválido. + + + O tipo de mídia "{1}" de ({0}) não é válido. Use de 01 a 10 ou de 80 a 99. + + + O valor de ({0}) não é um IBAN válido. Verifique-o. + + + + Somente dígitos são permitidos. + + + O dígito verificador está errado. Ele deveria ser {0}. + + + Um GTIN tem 8, 12, 13 ou 14 dígitos. + + + O dígito indicador deve ser de 0 a 9. + + + Um prefixo de empresa GS1 tem de 4 a 12 dígitos. + + + A referência não pode ficar vazia e deve ser formada por dígitos. + + + O prefixo de empresa é longo demais: ele não deixa espaço para a referência. + + + A referência é longa demais. São permitidos no máximo {0} caracteres. + + + O dígito de extensão deve ser de 0 a 9. + + + O caractere "{0}" não é permitido em dados GS1. + + + O identificador ({0}) não é uma medida com posição de ponto decimal. + + + A medida não pode ser negativa e pode ter no máximo {0} dígitos. + + + + O código QR está {0}% cheio (versão {1}). Ele pode ser difícil de ler. Encurte o conteúdo ou escolha um nível de correção de erros mais baixo. + + + O conteúdo não cabe em um código QR com o nível de correção de erros "{2}": ele precisa de {0} e o limite é {1}. + + + Encurte o conteúdo para que ele caiba. + + + Escolher o nível de correção de erros "{0}" faria o conteúdo caber. + + + O endereço de e-mail não é válido. Verifique-o (por exemplo nome@exemplo.com). + + + Informe pelo menos um endereço de e-mail. + + + O evento termina antes de começar. Verifique as datas de início e de término. + + + A data não tem fuso horário, por isso é lida como horário UTC e pode aparecer deslocada em um calendário. Adicione o fuso, por exemplo -03:00. + + + Informe um título para o evento. + + + A altitude não é um número válido. + + + A latitude deve ser um número entre -90 e 90. + + + A longitude deve ser um número entre -180 e 180. + + + Informe um nome ou um sobrenome para o contato. + + + Informe um nome, sobrenome ou organização para o contato. + + + O número de telefone não é válido. Use dígitos, opcionalmente com + e o código do país (por exemplo +5511912345678). + + + A mensagem tem mais de {0} caracteres, por isso pode ser enviada como várias mensagens. + + + Informe o endereço da web. + + + O endereço da web não é válido. Escreva-o por completo, sem espaços (por exemplo https://exemplo.com). + + + O endereço começa com "{0}", que muitas câmeras de celular não abrem. Use https:// se puder. + + + Esta rede não tem segurança, por isso a senha é ignorada. Apague a senha ou escolha um tipo de segurança. + + + O comprimento da senha não é válido para este tipo de segurança. Ela deve ter {0} caracteres. + + + Informe a senha da rede. + + + Informe o nome da rede Wi-Fi. + + + O nome da rede é longo demais (máximo de {0} bytes; caracteres acentuados usam mais de um). + + + Este campo é obrigatório. + + + Este texto é longo demais (máximo de {1} caracteres). Encurte-o. + + + Escolha um dos valores disponíveis. + + + Informe um número válido (use ponto para as casas decimais). + + + Informe uma data válida, ou uma data e hora com o fuso (por exemplo 2026-03-14T09:00:00-03:00). + + + + Os dados são GS1 (GS1 DataMatrix) + + + Os dados são um GS1 Digital Link + + + Padrão de máscara + + + Modo de entrada de dados + + + Conteúdo estruturado + + + Baixa (7%) + + + Média (15%) + + + Quartil (25%) + + + Alta (30%) + + + Modelo 1 (original) + + + Modelo 2 (recomendado) + + + Automático (a impressora escolhe) + + + Padrão 0 + + + Padrão 1 + + + Padrão 2 + + + Padrão 3 + + + Padrão 4 + + + Padrão 5 + + + Padrão 6 + + + Padrão 7 + + + Automático + + + Manual: somente dígitos + + + Manual: maiúsculas e dígitos + + + Manual: qualquer texto (bytes) + + + Manual: kanji + + + + Endereço da web + + + Texto + + + Wi-Fi + + + Contato (vCard) + + + Contato (MeCard) + + + GS1 Digital Link + + + E-mail + + + Ligação telefônica + + + Mensagem SMS + + + Localização + + + Evento de calendário + + + + Endereço da web + + + Remover parâmetros de rastreamento + + + Texto + + + Nome da rede + + + Senha + + + Segurança + + + Rede oculta + + + Nome + + + Sobrenome + + + Organização + + + Cargo + + + Telefone + + + Celular + + + E-mail + + + Rua + + + Cidade + + + Estado ou região + + + CEP + + + País + + + Observação + + + Prefixo do endereço da web + + + GTIN + + + Lote + + + Número de série + + + Data de validade (AAMMDD) + + + Consumir preferencialmente antes de (AAMMDD) + + + Data de fabricação (AAMMDD) + + + Para + + + Assunto + + + Corpo da mensagem + + + Número de telefone + + + Mensagem + + + Latitude + + + Longitude + + + Nome do local + + + Início + + + Término + + + Local + + + Descrição + + + Dia inteiro + + + + WPA / WPA2 + + + WPA3 + + + WEP (antigo) + + + Nenhuma (rede aberta) + + + + O servidor fechou a conexão durante o login. O nome de usuário ou a senha provavelmente estão errados. Se você usa uma conexão criptografada, o certificado do servidor também pode ser o problema. + + + O banco de dados não consegue saber o tipo deste parâmetro. + + + Indique o tipo do parâmetro na consulta, por exemplo @x::text. + + + O parâmetro tem um tipo diferente do da coluna com a qual é comparado. + + + Passe um valor do tipo da coluna ou converta o parâmetro, por exemplo @x::numeric ou @x::date. + + + Aceita um certificado que não pode ser verificado. No MariaDB com uma conta com senha, o certificado é verificado pela impressão digital, por isso um servidor com certificado autoassinado normalmente se conecta sem esta opção. + + + Nome da tabela + + + + Arquivo DuckDB + + + Firebird + + + Oracle Database + + + ClickHouse + + + Arquivo de banco de dados DuckDB + + + O arquivo .duckdb neste computador. + + + Limite de memória (MB) + + + Limite opcional de memória que uma consulta pode usar. + + + Caminho ou alias do banco de dados no servidor + + + O caminho como o servidor o vê (C:\dados\vendas.fdb) ou um alias do databases.conf do servidor. + + + Criptografa toda a conexão. Com nome de usuário e senha, é obrigatório: se o servidor não puder criptografar, a conexão falha. + + + Função SQL (opcional) + + + Use uma função que só possa ler (SELECT). + + + Nome do serviço + + + O serviço oferecido pelo listener (por exemplo ORCLPDB1). + + + Usa TLS. Desative somente para um listener sem TLS. + + + Não verificar o nome do servidor no certificado + + + Mantém o TLS ativo, mas pula a verificação do nome do host. Reduz a segurança. + + + O nome acima é um + + + Nome do serviço + + + SID (estilo antigo) + + + Nome do tnsnames.ora + + + Pasta com o tnsnames.ora + + + Somente para nomes do tnsnames.ora. + + + Pasta da wallet (certificados TLS) + + + Uma wallet do Oracle com os certificados confiáveis, quando o repositório de certificados do Windows não é suficiente. + + + Deixar o servidor interromper consultas longas (requer uma conta que possa alterar configurações) + + + Desativado por padrão: contas com perfil somente leitura são recusadas quando uma configuração muda. + + + Assistente de conteúdo... + + + Assistente GS1... + + + Criado com o assistente de conteúdo: {0}. Editar o texto manualmente remove esta definição. + + + Não é possível ler a definição de conteúdo salva. Abra o assistente de conteúdo para criá-la novamente. + + + Você editou o texto manualmente, por isso a definição do assistente de conteúdo foi removida. Abra o assistente de conteúdo para recomeçar a partir de um formulário. + + + assistente de conteúdo QR + + + assistente GS1 + + + Ainda não há nada para medir. O medidor aparece quando o código tem conteúdo. + + + Cabe: {0}% da capacidade no nível {1}, versão {2} + + + Cabe: {0}% da capacidade no nível {1} (modelo 1) + + + Quase cheio: {0}% da capacidade no nível {1}, versão {2}. Reduza o nível ou encurte o texto para facilitar a leitura. + + + Quase cheio: {0}% da capacidade no nível {1} (modelo 1). Reduza o nível ou encurte o texto para facilitar a leitura. + + + Não cabe no nível {0}: precisa de {1} e o limite é {2}. Reduza o nível ou encurte o texto. + + + No nível {0}, caberia. + + + Nem o nível mais baixo é suficiente: encurte o texto. + + + Nível sugerido para este conteúdo: {0}. + + + Medido no mais longo dos {0} registros carregados. + + + Tamanho impresso: {0} mm ({1} pol) de lado a {2} dpi (versão {3}). + + + Cada módulo tem {0} mm de largura a {1} dpi. + + + Pequeno demais para ser lido: cada módulo tem {0} mm de largura. Use pelo menos {1} pontos (cerca de {2} mm) por módulo a {3} dpi. + + + Assistente de conteúdo QR + + + Aplicar ao código + + + O que o código deve fazer ao ser lido? + + + Visualização + + + Texto no código + + + Capacidade + + + A corrigir + + + Usar um valor fixo + + + {0} caracteres + + + A senha é impressa no código como texto simples: qualquer pessoa que o ler poderá vê-la. Ela é mostrada aqui de propósito, para que você possa conferi-la. + + + Exemplo: {0} + + + Você pode escrever várias linhas. Exemplo: {0} + + + Um número de telefone com o código do país. Exemplo: {0} + + + Um endereço de e-mail. Exemplo: {0} + + + Um endereço da web completo que comece com https://. Exemplo: {0} + + + Um número; use ponto para as casas decimais. Exemplo: {0} + + + Somente dígitos. Exemplo: {0} + + + Escolha a data, escreva o horário em horas e minutos (09:30) ou vincule um campo. Exemplo: {0} + + + Preencha o formulário e o código aparecerá aqui. + + + O código aparece quando os problemas à direita forem corrigidos. + + + Os campos vinculados mostram o valor do registro exibido na área de design, ou o exemplo deles. + + + Preencha os campos marcados com * para continuar. + + + Assistente GS1-128 + + + Assistente GS1 DataMatrix + + + Aplicar ao código de barras + + + Valor + + + Valor + + + Identificador desconhecido + + + Formato {0}, até {1} caracteres. + + + Expedição (SSCC) + + + Um palete ou volume: o seu código seriado de unidade logística. + + + Produto (GTIN, lote, validade) + + + O código do produto com o lote e a data de validade. + + + Serialização (GTIN, série) + + + O código do produto com um número de série para cada unidade. + + + Identificadores comuns. Digite para pesquisar entre todos. + + + {0} identificadores encontrados + + + {0} de {1} caracteres + + + Cerca de {0} de {1} caracteres (os campos vinculados são estimados) + + + {0} caracteres + + + A mensagem precisa de {0} caracteres e o GS1-128 comporta no máximo {1}. Remova um identificador ou use valores mais curtos. + + + Este valor vem de um campo. Ele é verificado com os dados na hora de imprimir. + + + Escolha um uso predefinido ou adicione identificadores da lista para começar. + + + Preencha o valor de cada identificador para continuar. + + + Mover para cima + + + Mover para baixo + + + Remover este identificador + + + Começar a partir de um uso + + + Adicionar um identificador + + + Pesquisar identificadores + + + Digite o número de um identificador (10) ou palavras do nome dele em inglês (expiry). + + + Enter ou clique duplo adiciona o identificador. Seta para baixo entra na lista. + + + Identificadores correspondentes + + + A mensagem + + + Ainda não há identificadores. Escolha um uso à esquerda ou pesquise um identificador e adicione-o. + + + Visualização + + + O símbolo aparece quando todos os valores forem válidos. + + + Forma legível + + + Caracteres codificados com FNC1 + + + [FNC1] marca o caractere especial que inicia o símbolo e separa os valores de comprimento variável. + + + Comprimento + + + Sim + + + Hora do dia em horas e minutos, por exemplo 09:30 + + + Antes de imprimir + + + Esta etiqueta faz algumas perguntas. Suas respostas são usadas em todas as etiquetas desta impressão. + + + Continuar + + + Digite a data como aaaa-MM-dd, por exemplo 2026-03-07. + + + Digite um número, por exemplo 12 ou 3.5. + + + Mostrar ou ocultar a lista de objetos + + + O texto não cabe na caixa: parte dele fica cortada. Aumente a caixa, permita mais linhas, use um tamanho menor ou encurte o texto. + + + O texto pode não caber na caixa. A impressora não informa a largura das letras, então isto é uma estimativa: imprima uma etiqueta de teste para conferir, ou aumente a caixa ou permita mais linhas. + + + O texto usa a fonte do Windows "{0}", que precisa ser desenhada como imagem, mas este programa não consegue desenhá-la aqui, então o texto não foi impresso. Escolha uma fonte da impressora. + + + Um texto em fonte do Windows é impresso como imagem, então a impressora não consegue numerá-lo, tirá-lo de um campo armazenado nem incorporar caracteres nele. Remova essas opções do campo ou escolha uma fonte da impressora. + + + A data "{0}" usa o relógio da impressora, que não pode ser usado dentro de uma imagem de texto. Foi usado o relógio do computador. + + + A direção e o espaçamento entre caracteres de um texto são ignorados quando ele usa uma fonte do Windows. + + + O texto é grande demais para ser impresso como imagem. Use um tamanho menor ou uma caixa mais estreita. + + + Este computador não tem uma fonte chamada "{0}", então "{1}" é usada no lugar. Instale a fonte ou escolha outra; caso contrário, o texto impresso ficará diferente. + + + A fonte "{0}" não pode ser usada: ela precisa de um nome e de um tamanho de 1 a 1000 pontos. + + + Negrito, itálico e sublinhado não existem nas fontes próprias da impressora e não são impressos. Escolha uma fonte do Windows para usá-los. + + + "{0}" não é um nome de arquivo de fonte aceito pela impressora. Use um nome como E:ARIAL.TTF. + + + Esta etiqueta tem um contador, então cada cópia precisa do próprio número, e isso é limitado a {0} cópias por impressão. Imprima menos cópias por vez ou use a janela Mesclar dados. + + + Formatação + + + Quebra automática de texto + + + Tamanho em pontos da impressora (avançado) + + + Formatação do texto + + + Fonte + + + Tamanho (pt) + + + Tamanho em pontos tipográficos (1 ponto é 1/72 de polegada), como em um editor de texto. Escolha um tamanho ou digite o seu. + + + Escolha uma fonte da impressora (impressa como texto real) ou uma fonte do Windows (impressa como imagem). Digite para pesquisar. + + + Fontes da impressora + + + Fontes do Windows + + + Fonte da impressora {0} (escalável) + + + Fonte da impressora {0} (forma fixa) + + + Fonte da impressora {0} + + + Fonte armazenada na impressora ({0}) + + + {0} (não instalada) + + + Negrito + + + Itálico + + + Sublinhado + + + Negrito (Ctrl+B) + + + Itálico (Ctrl+I) + + + Sublinhado (Ctrl+U) + + + Negrito, itálico e sublinhado não existem nas fontes próprias da impressora. Escolha uma fonte do Windows na lista Fonte para usá-los. + + + O alinhamento funciona dentro de uma caixa de texto. Ative a quebra automática de texto para usá-lo. + + + Alinhar à esquerda + + + Centralizar + + + Alinhar à direita + + + Justificar + + + Este texto é impresso como imagem. Ele fica nítido na resolução da impressora, mas a impressora não pode editá-lo nem tirá-lo dos próprios campos. As fontes da impressora são impressas como texto real. + + + Entendi + + + Fonte do Windows: impressa como imagem + + + Aumentar a caixa + + + Diminuir o texto + + + Clique em um dos botões abaixo para corrigir em um passo. + + + Este computador não tem uma fonte chamada "{0}", então "{1}" é usada no lugar. Instale a fonte ou escolha outra; caso contrário, o texto impresso ficará diferente. + + + Negrito, itálico e sublinhado precisam de uma fonte do Windows. Escolha uma na lista Fonte. + + + Largura da caixa: {0} pontos ({1} mm) + + + Agora o texto cabe na caixa. + + + O texto ainda não cabe; tente uma caixa maior ou um tamanho menor. + + + troca de fonte + + + estilo do texto + + + tamanho da fonte + + + alinhamento + + + quebra automática de texto + + + ajuste do texto à caixa + + + Não é possível desenhar a visualização agora. Reduza o zoom ou diminua a etiqueta e tente de novo; sua etiqueta não é afetada. + + + Ajuste do texto + + + Quando o texto for longo demais + + + Deixar como foi criado + + + Reduzir para caber + + + Aumentar a altura + + + A caixa fica como foi criada. O texto que não couber é cortado na impressão. + + + Cada etiqueta usa o maior tamanho, entre o menor e o maior abaixo, em que todo o texto cabe na caixa. Com dados, cada registro tem o próprio tamanho. + + + O tamanho continua o mesmo e a caixa ganha quantas linhas o texto precisar, até o limite abaixo. O que estiver embaixo dela não se move. + + + Menor tamanho (pt) + + + Maior tamanho (pt) + + + Máximo de linhas + + + Não avisar quando o texto não couber + + + Use quando você quiser que o texto seja cortado. + + + O menor tamanho não pode ser maior que o maior tamanho. + + + mudança do ajuste do texto + + + mudança do limite do ajuste do texto + + + Impressão + + + Não imprimir este objeto + + + O objeto continua na etiqueta no editor, por exemplo como nota ou guia, mas nunca é impresso nem exportado. + + + Imprimir somente quando + + + Omite este objeto nas etiquetas em que a regra abaixo não for verdadeira, por exemplo para imprimir um aviso somente em alguns registros. + + + Campo a verificar + + + A coluna de dados ou variável cujo valor decide se este objeto é impresso. + + + Escolher campo + + + Comparação + + + Valor a comparar + + + Maiúsculas e espaços em volta do texto não importam: Sim, sim e " SIM " são iguais. + + + Regra de impressão + + + Bloquear posição + + + Um objeto bloqueado não pode ser movido, redimensionado nem excluído com o mouse ou o teclado até você desbloqueá-lo. Você ainda pode selecioná-lo e alterar as propriedades dele aqui. Bloquear não muda o que é impresso. + + + é igual a + + + é diferente de + + + está vazio + + + não está vazio + + + contém + + + Imprime somente quando {0} é igual a "{1}". + + + Imprime somente quando {0} é diferente de "{1}". + + + Imprime somente quando {0} está vazio. + + + Imprime somente quando {0} não está vazio. + + + Imprime somente quando {0} contém "{1}". + + + Escolha o campo a verificar. Até lá, este objeto sempre é impresso. + + + Este objeto nunca é impresso, seja qual for a regra. + + + Escolha o campo a verificar. + + + Não há nenhum campo ou variável chamado "{0}" nos dados carregados nem na etiqueta. Ele é tratado como vazio, então confira o nome. + + + A regra de impressão deste objeto verifica "{0}", mas nenhuma coluna de dados ou variável tem esse nome. Ele é tratado como vazio, então confira o nome. + + + Os objetos bloqueados não foram alterados. Desmarque "Bloquear posição" nas propriedades para alterá-los. + + + Não imprime + + + Marcado como "Não imprimir": este objeto nunca é impresso nem exportado. + + + Oculto + + + A regra de impressão deste objeto não é verdadeira para o registro mostrado, por isso ele fica fora desta etiqueta. + + + Bloqueado + + + Bloqueado: este objeto não pode ser movido, redimensionado nem excluído até você desbloqueá-lo. + + + Nada foi enviado: a impressora "{0}" informa que a cabeça de impressão está aberta. Feche a cabeça até ouvir o clique e imprima novamente. + + + Nada foi enviado: a impressora "{0}" informa que está sem etiquetas. Coloque etiquetas, feche a cabeça, pressione Feed uma vez e imprima novamente. + + + Nada foi enviado: a impressora "{0}" informa que o ribbon acabou. Coloque um ribbon novo, feche a cabeça e imprima novamente. + + + Nada foi enviado: a impressora "{0}" informa que a cabeça de impressão está quente demais. Aguarde alguns minutos até ela esfriar e imprima novamente. + + + Nada foi enviado: a impressora "{0}" está no modo de diagnóstico de comunicação e imprimiria os dados como texto em vez de etiquetas. Desative esse modo na impressora (ou reinicie-a) e imprima novamente. + + + Nada foi enviado: a impressora "{0}" informa que a memória para trabalhos recebidos está cheia. Aguarde até que ela imprima o que já recebeu e imprima novamente. + + + Nada foi enviado: a impressora "{0}" está em pausa. Pressione Pause na impressora para continuar e imprima novamente. + + + A impressora também informa: {0}. + + + Não foi possível ler o status da impressora antes de imprimir ({0}), por isso as etiquetas foram enviadas sem essa verificação. + + + A impressora informa: {0}. As etiquetas foram enviadas; confira a qualidade de impressão. + + + Impresso e verificado: a impressora informa que concluiu o trabalho sem problemas. + + + As etiquetas foram enviadas, mas depois a impressora informou um problema: {0}. Algumas etiquetas podem não ter sido impressas. Resolva o problema na impressora e confira as etiquetas antes de imprimir novamente. + + + As etiquetas foram enviadas, mas o Rotula não conseguiu confirmar que foram impressas ({0}). Verifique a impressora. + + + esta impressora ou o driver dela no Windows não responde a consultas de status, o que é comum com drivers USB + + + o Windows informa que a impressora está offline + + + não foi possível contatar a impressora + + + a impressora não respondeu a tempo + + + a resposta da impressora não era uma resposta de status ZPL + + + ela ainda estava imprimindo quando o Rotula parou de esperar + + + a verificação foi interrompida + + + o motivo é desconhecido + + + cabeça de impressão aberta + + + sem etiquetas + + + sem ribbon + + + cabeça de impressão quente demais + + + modo de diagnóstico de comunicação ativado + + + memória para trabalhos recebidos cheia + + + em pausa + + + cabeça de impressão fria demais (as etiquetas podem sair mais claras) + + + configurações perdidas (a impressora está usando os valores de fábrica) + + + um trabalho ainda está chegando + + + uma etiqueta impressa está esperando ser retirada + + + desconhecido + + + rebobinar + + + destacar (peel-off) + + + destacar manualmente (tear-off) + + + cortador + + + aplicador + + + corte retardado + + + destacar sem liner + + + rebobinar sem liner + + + corte parcial + + + RFID + + + quiosque + + + contínuo + + + Verificar status da impressora + + + Pergunta à impressora o status dela (papel, cabeça, ribbon, pausa) com um pequeno comando ZPL. Nada é impresso em uma impressora compatível com ZPL. + + + Consultando o status da impressora... + + + A impressora está pronta. + + + A impressora não pode imprimir agora: {0}. + + + A impressora informa: {0}. + + + Não foi possível ler o status da impressora: {0}. Você ainda pode imprimir. + + + Só parte do status foi recebida, por isso alguns problemas podem não aparecer na lista. + + + Etiquetas ainda a imprimir: {0}. Trabalhos aguardando na impressora: {1}. + + + Modo de impressão: {0}. {1}. Comprimento da etiqueta: {2} pontos. + + + Transferência térmica (com ribbon) + + + Térmica direta (sem ribbon) + + + Verificar a impressora antes e depois de imprimir + + + Antes de cada trabalho, o Rotula consulta o status da impressora e não envia nada enquanto ela estiver sem etiquetas, aberta, em pausa ou sem ribbon. Depois do trabalho, espera até a impressora informar que terminou. Para impressoras compatíveis com ZPL; muitos drivers USB não conseguem responder e, nesse caso, a impressão continua sem a verificação. + + + Abrir posto de impressão... + + + Criar PIN do posto de impressão... + + + Posto de impressão + + + Escolha a pasta do posto de impressão (com o station.json dele ou com as etiquetas a oferecer) + + + Não é possível abrir o posto de impressão. + + + Sair + + + Todas as etiquetas + + + Pesquise ou leia uma etiqueta + + + Digite um nome ou leia o código da etiqueta e pressione Enter. Ou toque em uma etiqueta abaixo. + + + Nenhuma etiqueta corresponde à pesquisa. + + + Nenhuma etiqueta tem o código "{0}". Leia-o novamente ou escolha uma etiqueta da lista. + + + Algumas etiquetas não estão disponíveis: + + + A etiqueta "{0}" não pode ser usada: {1} + + + Impressora: {0} + + + Nenhuma impressora está configurada para esta etiqueta. Peça a quem configurou o posto para adicionar uma no station.json. + + + Quantidade + + + De 1 a {0} etiquetas + + + Informe uma quantidade de 1 a {0} e pressione Imprimir novamente. + + + Imprimir + + + Imprimir todos os registros + + + {0} registros dos dados da etiqueta estão prontos para imprimir. + + + Não foi possível ler os dados da etiqueta: {0} + + + os dados não têm registros. + + + Esta etiqueta não faz perguntas. Defina a quantidade e pressione Imprimir. + + + Algumas respostas não são aceitas. Corrija os campos marcados em vermelho e imprima novamente. + + + Visualização + + + Verificando a impressora... + + + Impressora pronta + + + Status da impressora desconhecido + + + A impressora precisa de atenção + + + Imprimindo... + + + O Rotula verifica a impressora antes de enviar e espera até ela informar que terminou. + + + Não impresso: a impressora precisa de atenção + + + Enviado para a impressora + + + Impresso e verificado + + + Enviado, mas não confirmado + + + Enviado, mas a impressora informa um problema + + + Não impresso + + + Digite o PIN para sair do posto de impressão + + + PIN + + + Sair do posto + + + Esse PIN não está certo. Tente novamente. + + + Muitos PINs errados. Aguarde {0} segundos e tente novamente. + + + Criar um PIN para o posto de impressão + + + O PIN é necessário para sair do posto de impressão. O Rotula guarda apenas um código protegido criado a partir dele, nunca o próprio PIN. Copie a linha para o station.json do posto. + + + Novo PIN + + + Digite o PIN novamente + + + Criar + + + Linha para o station.json + + + Copiar + + + Copiado. Cole-o no station.json, junto com as outras configurações. + + + Um PIN precisa ter de {0} a {1} caracteres. + + + Os dois PINs não são iguais. Digite-os novamente. + + + "{0}" não foi encontrado. Confira o caminho informado ao posto de impressão. + + + Não foi possível ler "{0}". Verifique se o arquivo não está bloqueado e se este usuário tem permissão para lê-lo. + + + "{0}" tem um erro perto da linha {1} ({2}): uma configuração está escrita errado, tem um valor do tipo errado, ou falta uma vírgula ou aspas. + + + As configurações do posto foram gravadas para uma versão mais recente do Rotula (formato {0}). Atualize o Rotula neste computador. + + + Não há nenhuma etiqueta para oferecer. Coloque arquivos .rotula na pasta do posto ou liste-os em "labels" no station.json. + + + A etiqueta "{0}" listada no station.json não foi encontrada e foi deixada de fora. + + + "{0}" não é uma etiqueta do Rotula (arquivo .rotula). Corrija no station.json. + + + A entrada de etiqueta {0} do station.json não tem "file". Adicione o nome do arquivo da etiqueta. + + + Duas etiquetas usam o código "{0}". Dê a cada etiqueta o próprio código, para que uma leitura abra a etiqueta certa. + + + A impressora "{0}" não está definida em "printers" no station.json. + + + A impressora "{0}" precisa de "windowsPrinter" (uma impressora instalada) ou de "host" (um endereço de rede), não dos dois. + + + A porta da impressora "{0}" deve ser de 1 a 65535 (normalmente 9100). + + + A resolução da impressora "{0}" deve ser 203, 300 ou 600. + + + A impressora "{0}" tem uma intensidade fora de 0 a 30 ou uma velocidade fora de 1 a 14. + + + As configurações de cópias do posto não são válidas: "maxCopies" deve ser de 1 a 99999999 e "defaultCopies" de 1 a "maxCopies". + + + As configurações de cópias da etiqueta "{0}" não são válidas: "maxCopies" deve ser de 1 a 99999999 e "defaultCopies" de 1 a "maxCopies". + + + "exitPinHash" não é um código de PIN criado pelo Rotula. Crie-o em Arquivo > Criar PIN do posto de impressão (um PIN nunca é guardado como texto simples). + + + + Gerenciado pela sua organização + + + Verificar atualizações uma vez por dia + + + Quando ativado, o Rotula pergunta uma vez por dia à página do projeto no GitHub se existe uma versão mais recente. Nada sobre você ou este computador é enviado, e nada é baixado ou instalado. + + + O Rotula {0} está disponível. Você pode baixá-lo na página da versão. + + + Atualização disponível + + + Ver a versão + + + Fechar este aviso + + + Não foi possível abrir o navegador. A página da versão é {0} + + diff --git a/src/Rotula.App/Rotula.App.csproj b/src/Rotula.App/Rotula.App.csproj index 80ef5de..5449ed4 100644 --- a/src/Rotula.App/Rotula.App.csproj +++ b/src/Rotula.App/Rotula.App.csproj @@ -40,8 +40,8 @@ Assets/rotula.ico true - - en;es + + en;es;pt-BR;fr-CA diff --git a/src/Rotula.App/Services/AppSettings.cs b/src/Rotula.App/Services/AppSettings.cs index 4a7a80a..1845f44 100644 --- a/src/Rotula.App/Services/AppSettings.cs +++ b/src/Rotula.App/Services/AppSettings.cs @@ -6,7 +6,7 @@ namespace Rotula.App.Services; /// User preferences stored in %AppData%\Rotula\settings.json. public sealed class AppSettings { - /// "auto" (follow Windows), "en" or "es". + /// "auto" (follow Windows), "en", "es", "pt-BR" or "fr-CA". public string Language { get; set; } = "auto"; /// Ruler unit: "Millimeters", "Inches" or "Dots". @@ -131,7 +131,7 @@ public sealed class JsonSettingsStore : ISettingsStore { private const string Header = "// Rotula settings. Edit with the program closed, or change them from the menus.\n" + - "// language: \"auto\" follows Windows, or use \"en\" / \"es\".\n" + + "// language: \"auto\" follows Windows, or use \"en\" / \"es\" / \"pt-BR\" / \"fr-CA\".\n" + "// unit: \"Millimeters\", \"Inches\" or \"Dots\".\n" + "// updateCheckEnabled: true asks GitHub once a day whether a newer version exists (off by default; nothing is sent about you).\n"; diff --git a/src/Rotula.App/ViewModels/FieldsViewModel.cs b/src/Rotula.App/ViewModels/FieldsViewModel.cs index 2d44210..62bc7d4 100644 --- a/src/Rotula.App/ViewModels/FieldsViewModel.cs +++ b/src/Rotula.App/ViewModels/FieldsViewModel.cs @@ -429,9 +429,9 @@ private static bool IsPlaceholderContent(LabelElement e, string content) private static string DefaultTextIn(string language) { - var current = Loc.Instance.Culture.TwoLetterISOLanguageName; - if (current == language) return Loc.Get("Element.DefaultText"); - // The label may have been designed in the other language: compare with that language's default text too. + // Full culture names ("pt-BR"), as in Loc.SupportedLanguages: a two-letter name would never match them. + if (Loc.Instance.LanguageCode == language) return Loc.Get("Element.DefaultText"); + // The label may have been designed in another language: compare with that language's default text too. var rm = new System.Resources.ResourceManager("Rotula.App.Resources.Strings", typeof(Loc).Assembly); try { return rm.GetString("Element.DefaultText", CultureInfo.GetCultureInfo(language)) ?? string.Empty; } catch (System.Resources.MissingManifestResourceException) { return string.Empty; } diff --git a/src/Rotula.App/ViewModels/MainViewModel.cs b/src/Rotula.App/ViewModels/MainViewModel.cs index e155f8b..8ff7964 100644 --- a/src/Rotula.App/ViewModels/MainViewModel.cs +++ b/src/Rotula.App/ViewModels/MainViewModel.cs @@ -392,7 +392,10 @@ partial void OnUnitChanged(LengthUnit value) /// Grid configuration for the canvas. public GridSettings Grid => new(LengthUnit.Millimeters, _settings.GridSpacingMm, GridVisible, SnapToGrid); - /// The language setting in use: "auto", "en" or "es" (the organization's choice when a policy sets one). + /// + /// The language setting in use: "auto" or one of ("en", "es", "pt-BR", "fr-CA"); the + /// organization's choice when a policy sets one. + /// public string LanguageSetting => _settings.LanguageIn(_policy); /// True when the organization fixed the language; the menu entries are then disabled with a note. @@ -459,6 +462,10 @@ public async Task CheckForUpdatesAsync(CancellationToken cancellationToken = def public bool IsLanguageEn => LanguageSetting == "en"; /// Menu check state for Spanish. public bool IsLanguageEs => LanguageSetting == "es"; + /// Menu check state for Portuguese (Brazil). + public bool IsLanguagePtBr => LanguageSetting == "pt-BR"; + /// Menu check state for French (Canada). + public bool IsLanguageFrCa => LanguageSetting == "fr-CA"; /// Raised when the view should zoom so the whole label fits. public event EventHandler? ZoomToFitRequested; @@ -745,6 +752,8 @@ private void OnLanguageChanged() OnPropertyChanged(nameof(IsLanguageAuto)); OnPropertyChanged(nameof(IsLanguageEn)); OnPropertyChanged(nameof(IsLanguageEs)); + OnPropertyChanged(nameof(IsLanguagePtBr)); + OnPropertyChanged(nameof(IsLanguageFrCa)); } /// The label name used in titles and prompts. @@ -1353,12 +1362,15 @@ private bool ChooseImageFor(string elementId) [RelayCommand] private void ToggleGrid() => GridVisible = !GridVisible; - /// Switch the language: "auto", "en" or "es". The change is live; no restart is needed. Disabled when a policy fixes the language. + /// + /// Switch the language: "auto" or one of ; anything else means "auto". The change is + /// live; no restart is needed. Disabled when a policy fixes the language. + /// [RelayCommand(CanExecute = nameof(CanChooseLanguage))] private void SetLanguage(string code) { if (IsLanguageManaged) return; - _settings.Language = code is "en" or "es" ? code : "auto"; + _settings.Language = Loc.SupportedLanguages.FirstOrDefault(l => string.Equals(l, code, StringComparison.OrdinalIgnoreCase)) ?? "auto"; Loc.Instance.SetLanguage(_settings.Language); // SetLanguage does nothing when the resolved language is unchanged (auto -> en on an English PC), but the menu // check marks still have to move. diff --git a/src/Rotula.Files/Policy/RotulaPolicy.cs b/src/Rotula.Files/Policy/RotulaPolicy.cs index 59d1bb5..62a2936 100644 --- a/src/Rotula.Files/Policy/RotulaPolicy.cs +++ b/src/Rotula.Files/Policy/RotulaPolicy.cs @@ -9,7 +9,7 @@ public static class PolicyNames /// Key under HKLM (computer) and HKCU (user). The computer value wins. public const string KeyPath = @"SOFTWARE\Policies\P4Software\Rotula"; - /// Text: "auto", "en" or "es". Sets the language and locks the menu. + /// Text: "auto", "en", "es", "pt-BR" or "fr-CA". Sets the language and locks the menu. public const string Language = "Language"; /// Number: 1 turns the update check on, 0 turns it off; either way the user cannot change it. @@ -41,7 +41,13 @@ public sealed record RotulaPolicy /// No policy at all. public static readonly RotulaPolicy None = new(); - /// "auto", "en" or "es" when the language is managed; null otherwise. + /// + /// The values the Language policy accepts: "auto" and the culture names of the shipped languages, in their canonical + /// spelling. They must match the app's Loc.SupportedLanguages and the ADMX enum (tests compare them). + /// + public static readonly IReadOnlyList Languages = new[] { "auto", "en", "es", "pt-BR", "fr-CA" }; + + /// One of when the language is managed; null otherwise. public string? Language { get; init; } /// True or false when the update check is managed; null when the user decides. @@ -72,11 +78,12 @@ public sealed record RotulaPolicy public static RotulaPolicy Read(IPolicySource source) { ArgumentNullException.ThrowIfNull(source); - string? language = source.GetString(PolicyNames.Language)?.Trim().ToLowerInvariant(); + string? language = source.GetString(PolicyNames.Language)?.Trim(); string? printer = source.GetString(PolicyNames.DefaultPrinter)?.Trim(); return new RotulaPolicy { - Language = language is "auto" or "en" or "es" ? language : null, + // Case does not matter in the registry ("PT-br" works), but the value handed on is the canonical name. + Language = Languages.FirstOrDefault(l => string.Equals(l, language, StringComparison.OrdinalIgnoreCase)), UpdateCheck = source.GetInt(PolicyNames.UpdateCheck) switch { 0 => false, 1 => true, _ => null }, // Windows printer names are at most 220 characters; anything longer is not a printer name. DefaultPrinter = string.IsNullOrEmpty(printer) || printer.Length > 220 ? null : printer, diff --git a/tests/Rotula.Tests/AppConnectionDatabaseListTests.cs b/tests/Rotula.Tests/AppConnectionDatabaseListTests.cs index 1c0de67..2ccb0ac 100644 --- a/tests/Rotula.Tests/AppConnectionDatabaseListTests.cs +++ b/tests/Rotula.Tests/AppConnectionDatabaseListTests.cs @@ -493,15 +493,18 @@ public async Task NoOdbcDataSources_IsExplained_AndTypingStillWorks() [InlineData("Conn.Dsn.Hint")] [InlineData("Conn.Dsn.None")] [InlineData("Conn.Lookup.SystemTag")] - public void EveryListText_ExistsInBothLanguages_AndDiffers(string key) + public void EveryListText_ExistsInEveryLanguage_AndDiffers(string key) { Loc.Instance.SetLanguage("en"); string en = Loc.Get(key, "x"); - Loc.Instance.SetLanguage("es"); - string es = Loc.Get(key, "x"); Assert.False(string.IsNullOrWhiteSpace(en)); - Assert.False(string.IsNullOrWhiteSpace(es)); - Assert.NotEqual(en, es); + foreach (var lang in UiStrings.Translations) + { + Loc.Instance.SetLanguage(lang); + string other = Loc.Get(key, "x"); + Assert.False(string.IsNullOrWhiteSpace(other), lang); + Assert.NotEqual(en, other); + } Assert.True(Loc.Instance.HasKey(key)); } } diff --git a/tests/Rotula.Tests/AppDatabaseEndToEndTests.cs b/tests/Rotula.Tests/AppDatabaseEndToEndTests.cs index df38ebb..8128be2 100644 --- a/tests/Rotula.Tests/AppDatabaseEndToEndTests.cs +++ b/tests/Rotula.Tests/AppDatabaseEndToEndTests.cs @@ -268,7 +268,7 @@ public async Task AWriteQueryIsRefused_AndTheFileIsUntouched() } } -/// Every Data.* key that Rotula.Data can raise has a plain-language text in both languages. +/// Every Data.* key that Rotula.Data can raise has a plain-language text in every language. [Collection("App")] public class AppDatabaseLocalizationTests { @@ -284,10 +284,9 @@ private static Dictionary ReadResx(string language) => .ToDictionary(d => d.Attribute("name")!.Value, d => d.Element("value")!.Value); [Fact] - public void EveryDataKeyEmittedByTheLibrary_HasEnglishAndSpanishText() + public void EveryDataKeyEmittedByTheLibrary_HasTextInEveryLanguage() { var en = ReadResx("en"); - var es = ReadResx("es"); var keys = new HashSet(); string data = Path.Combine(RepoRoot(), "src", "Rotula.Data"); foreach (var file in Directory.EnumerateFiles(data, "*.cs", SearchOption.AllDirectories).Where(f => !f.Contains(@"\obj\") && !f.Contains(@"\bin\"))) @@ -298,22 +297,19 @@ public void EveryDataKeyEmittedByTheLibrary_HasEnglishAndSpanishText() Assert.Contains("Data.Error.CertificateNotTrusted", keys); Assert.Contains("Data.Query.Truncated", keys); Assert.Contains("Data.Store.ProtectionUnavailable", keys); - Assert.Empty(keys.Where(k => !en.ContainsKey(k)).OrderBy(k => k)); - Assert.Empty(keys.Where(k => !es.ContainsKey(k)).OrderBy(k => k)); - // The texts that take an argument keep the same holes in both languages (the general test checks all keys too). - foreach (string k in keys) - Assert.Equal(Regex.Matches(en[k], @"\{\d\}").Count, Regex.Matches(es[k], @"\{\d\}").Count); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); + // The texts that take an argument keep the same holes in every language (the general test checks all keys too). + foreach (var lang in UiStrings.Translations) + { + var other = ReadResx(lang); + foreach (string k in keys) + Assert.Equal(Regex.Matches(en[k], @"\{\d\}").Count, Regex.Matches(other[k], @"\{\d\}").Count); + } } [Fact] public void TheConnectionFieldNames_AreTranslated_ForEveryPropertyTheEngineCanReport() { - var en = ReadResx("en"); - var es = ReadResx("es"); - foreach (var p in typeof(DatabaseConnectionSettings).GetProperties()) - { - string key = "Conn.Field." + p.Name; - Assert.True(en.ContainsKey(key) && es.ContainsKey(key), key); - } + Assert.Empty(UiStrings.MissingInAnyLanguage(typeof(DatabaseConnectionSettings).GetProperties().Select(p => "Conn.Field." + p.Name))); } } diff --git a/tests/Rotula.Tests/AppDatabaseTests.cs b/tests/Rotula.Tests/AppDatabaseTests.cs index 8d9f24c..569a63f 100644 --- a/tests/Rotula.Tests/AppDatabaseTests.cs +++ b/tests/Rotula.Tests/AppDatabaseTests.cs @@ -336,7 +336,7 @@ public async Task EveryErrorKeyOfTheLibrary_HasAMessage_InBothLanguages() var keys = typeof(DataKeys).GetFields(BindingFlags.Public | BindingFlags.Static).Where(f => f.FieldType == typeof(string)) .Select(f => (string)f.GetRawConstantValue()!).Where(k => k.StartsWith("Data.Error.") || k.StartsWith("Data.Store.")).ToList(); Assert.True(keys.Count >= 18); - foreach (string lang in new[] { "en", "es" }) + foreach (string lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); foreach (string key in keys) @@ -648,7 +648,7 @@ public async Task Manager_WarnsBeforeEncryptionIsTurnedOff_AndWhileACertificateI m.Provider = DatabaseProvider.Sqlite; // not applicable to a file Assert.False(m.ShowEncryptWarning); Assert.False(m.ShowTrustWarning); - foreach (string lang in new[] { "en", "es" }) + foreach (string lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); Assert.False(Loc.Get("Conn.Encrypt.Warning").StartsWith('!')); diff --git a/tests/Rotula.Tests/AppDpiConversionTests.cs b/tests/Rotula.Tests/AppDpiConversionTests.cs index 945cfa9..95c2f30 100644 --- a/tests/Rotula.Tests/AppDpiConversionTests.cs +++ b/tests/Rotula.Tests/AppDpiConversionTests.cs @@ -109,8 +109,7 @@ public void ConversionIssues_AreListed_InBothLanguages() } [Theory] - [InlineData("en")] - [InlineData("es")] + [MemberData(nameof(UiStrings.LanguageData), MemberType = typeof(UiStrings))] public void EveryDpiIssueKey_HasText_AndUnknownDpiKeysGetAFallback(string lang) { Loc.Instance.SetLanguage(lang); diff --git a/tests/Rotula.Tests/AppFieldsTests.cs b/tests/Rotula.Tests/AppFieldsTests.cs index 2f24229..8bc13ff 100644 --- a/tests/Rotula.Tests/AppFieldsTests.cs +++ b/tests/Rotula.Tests/AppFieldsTests.cs @@ -413,6 +413,22 @@ public async Task UseHere_PutsTheFieldIntoTheSelectedElement_ReplacingSampleText Assert.Equal(Loc.Get("Fields.Selected.None"), Fields.SelectionText); } + [Theory] + [InlineData("fr-CA", "en")] + [InlineData("pt-BR", "fr-CA")] + [InlineData("en", "pt-BR")] + public async Task UseHere_ReplacesTheSampleText_OfALabelDesignedInAnotherLanguage(string designedIn, string shownIn) + { + // The sample text "Texte" of a label made in French is still sample text after switching to English. + await LoadCsv(Parts); + Loc.Instance.SetLanguage(designedIn); + string sampleText = Loc.Get("Element.DefaultText"); + Loc.Instance.SetLanguage(shownIn); + var sample = AddAndSelectText(sampleText); + Fields.UseHereCommand.Execute(Fields.Find("Sku")); + Assert.Equal("{{Sku}}", ((TextElement)_main.Session.Document.Elements.Single(e => e.Id == sample.Id)).Text); + } + // ------------------------------------------------------------------------------------ missing columns, disabled state [Fact] @@ -490,23 +506,24 @@ public void Autocomplete_FindsTheOpenBraces_AndFiltersTheFields() // ------------------------------------------------------------------------------------ strings [Fact] - public void EveryFieldsString_ExistsInBothLanguages_AndIsTranslated() + public void EveryFieldsString_ExistsInEveryLanguage_AndIsTranslated() { - var root = new DirectoryInfo(AppContext.BaseDirectory); - while (root is not null && !File.Exists(Path.Combine(root.FullName, "Rotula.sln"))) root = root.Parent; - Dictionary Read(string lang) => XDocument.Load(Path.Combine(root!.FullName, "src", "Rotula.App", "Resources", $"Strings.{lang}.resx")).Root! - .Elements("data").ToDictionary(d => d.Attribute("name")!.Value, d => d.Element("value")!.Value); - var en = Read("en"); - var es = Read("es"); + var en = UiStrings.Read("en"); var keys = en.Keys.Where(k => k.StartsWith("Fields.") || k is "Undo.InsertField" or "Undo.AddFields" or "Undo.UnbindField").ToList(); Assert.True(keys.Count > 40); - foreach (var k in keys) + foreach (var lang in UiStrings.Translations) { - Assert.True(es.ContainsKey(k), k); - Assert.False(string.IsNullOrWhiteSpace(es[k]), k); + var other = UiStrings.Read(lang); + foreach (var k in keys) + { + Assert.True(other.ContainsKey(k), lang + ": " + k); + Assert.False(string.IsNullOrWhiteSpace(other[k]), lang + ": " + k); + } } Assert.Equal("Add as barcode", en["Fields.AddAsBarcode"]); - Assert.Equal("Añadir como código QR", es["Fields.AddAsQr"]); + Assert.Equal("Añadir como código QR", UiStrings.Read("es")["Fields.AddAsQr"]); + Assert.Equal("Adicionar como código QR", UiStrings.Read("pt-BR")["Fields.AddAsQr"]); + Assert.Equal("Ajouter comme code QR", UiStrings.Read("fr-CA")["Fields.AddAsQr"]); } // ------------------------------------------------------------------------------------ the real SQLite path diff --git a/tests/Rotula.Tests/AppLocalizationTests.cs b/tests/Rotula.Tests/AppLocalizationTests.cs index 6698bcc..0619df0 100644 --- a/tests/Rotula.Tests/AppLocalizationTests.cs +++ b/tests/Rotula.Tests/AppLocalizationTests.cs @@ -1,6 +1,6 @@ using System.Globalization; using System.Text.RegularExpressions; -using System.Xml.Linq; +using System.ComponentModel; using Rotula.App.Localization; using Rotula.Core.Model; using Rotula.Core.Validation; @@ -14,50 +14,83 @@ public class AppLocalizationTests : IDisposable public void Dispose() => Loc.Instance.SetLanguage("en"); - private static string RepoRoot() + private static string RepoRoot() => UiStrings.RepoRoot(); + + private static IReadOnlyDictionary ReadResx(string language) => UiStrings.Read(language); + + /// A format hole such as {0}, {1:N0} or {2,-5}; escaped braces ({{ and }}) are removed before matching. + private static readonly Regex Hole = new(@"\{\d+(?:,-?\d+)?(?::[^{}]*)?\}"); + + private static List Holes(string text) => + Hole.Matches(text.Replace("{{", string.Empty).Replace("}}", string.Empty)).Select(m => m.Value).OrderBy(x => x, StringComparer.Ordinal).ToList(); + + [Fact] + public void EveryResourceFile_IsAShippedLanguage_AndEveryShippedLanguageHasAFile() + { + // A Strings.xx.resx nobody can pick, or a menu language with no file, is a mistake either way. + Assert.Equal(UiStrings.Languages.Order(StringComparer.Ordinal), UiStrings.FileLanguages().Order(StringComparer.Ordinal)); + Assert.Equal("en", UiStrings.Languages[0]); + } + + [Theory] + [MemberData(nameof(UiStrings.TranslationData), MemberType = typeof(UiStrings))] + public void EveryTranslation_HasExactlyTheEnglishKeys(string language) { - var dir = new DirectoryInfo(AppContext.BaseDirectory); - while (dir is not null && !File.Exists(Path.Combine(dir.FullName, "Rotula.sln"))) dir = dir.Parent; - return dir?.FullName ?? throw new InvalidOperationException("Rotula.sln not found above the test folder."); + var en = UiStrings.Keys("en"); + var other = UiStrings.Keys(language); + Assert.Empty(en.Except(other).Order(StringComparer.Ordinal)); + Assert.Empty(other.Except(en).Order(StringComparer.Ordinal)); } - private static Dictionary ReadResx(string language) + [Theory] + [MemberData(nameof(UiStrings.LanguageData), MemberType = typeof(UiStrings))] + public void NoTranslationIsEmpty_AndPlaceholdersMatchEnglish(string language) { - var path = Path.Combine(RepoRoot(), "src", "Rotula.App", "Resources", $"Strings.{language}.resx"); - return XDocument.Load(path).Root!.Elements("data") - .ToDictionary(d => d.Attribute("name")!.Value, d => d.Element("value")!.Value); + var en = ReadResx("en"); + var other = ReadResx(language); + var empty = other.Where(p => string.IsNullOrWhiteSpace(p.Value)).Select(p => p.Key).ToList(); + Assert.Empty(empty); + // A message that uses {0} in English must use it in every language too, otherwise arguments silently vanish, and a + // hole English does not have would throw a FormatException at run time. + var differ = en.Where(p => other.TryGetValue(p.Key, out var t) && !Holes(p.Value).SequenceEqual(Holes(t))).Select(p => p.Key).ToList(); + Assert.Empty(differ); + } + + [Theory] + [MemberData(nameof(UiStrings.TranslationData), MemberType = typeof(UiStrings))] + public void AccessKeys_AreKeptInEveryTranslation(string language) + { + // "_File" gives Alt+F; a translation must keep exactly one access key where English has one, and add none. + static int Marks(string s) => Regex.Matches(s, "(? Marks(p.Value) != Marks(other[p.Key])).Select(p => p.Key)); + // The top-level menus must still get distinct letters, or Alt+letter would stop at the first one. + var menus = new[] { "Menu.File", "Menu.Edit", "Menu.View", "Menu.Help" } + .Select(k => char.ToLowerInvariant(other[k][other[k].IndexOf('_') + 1])).ToList(); + Assert.Equal(menus.Count, menus.Distinct().Count()); } [Fact] - public void BothLanguageFiles_HaveExactlyTheSameKeys() + public void CanadianFrench_UsesNonBreakingSpacesBeforeDoublePunctuation_AndInsideGuillemets() { - var en = ReadResx("en").Keys.ToHashSet(); - var es = ReadResx("es").Keys.ToHashSet(); - Assert.Empty(en.Except(es)); - Assert.Empty(es.Except(en)); + // OQLF typography: "Exemple : {0}" and « texte » must not break at the end of a line, so the space is a no-break one. + var fr = ReadResx("fr-CA"); + Assert.Empty(fr.Where(p => Regex.IsMatch(p.Value, @"[\w»)] [:;!?](\s|$)")).Select(p => p.Key)); + Assert.Empty(fr.Where(p => p.Value.Contains("« ") || p.Value.Contains(" »")).Select(p => p.Key)); + Assert.Contains(" :", fr["QrContent.Hint.Text"]); } [Fact] - public void NoTranslationIsEmpty_AndPlaceholdersMatchBetweenLanguages() + public void Translations_DoNotTranslateTheProductName() { - var en = ReadResx("en"); - var es = ReadResx("es"); - foreach (var (key, text) in en) - { - Assert.False(string.IsNullOrWhiteSpace(text), key); - Assert.False(string.IsNullOrWhiteSpace(es[key]), key); - // A message that uses {0} in English must use it in Spanish too, otherwise arguments silently vanish. - var enHoles = Regex.Matches(text, @"(? m.Groups[1].Value).OrderBy(x => x); - var esHoles = Regex.Matches(es[key], @"(? m.Groups[1].Value).OrderBy(x => x); - Assert.True(enHoles.SequenceEqual(esHoles), $"placeholders differ for {key}"); - } + foreach (var lang in UiStrings.Translations) + Assert.Contains("Rotula", ReadResx(lang)["About.Title"]); } [Fact] - public void EveryKeyUsedInXamlOrCode_ExistsInBothLanguages() + public void EveryKeyUsedInXamlOrCode_ExistsInEveryLanguage() { - var en = ReadResx("en").Keys.ToHashSet(); - var es = ReadResx("es").Keys.ToHashSet(); var src = Path.Combine(RepoRoot(), "src", "Rotula.App"); var used = new HashSet(); @@ -75,15 +108,12 @@ public void EveryKeyUsedInXamlOrCode_ExistsInBothLanguages() used.Add(m.Groups[1].Value); Assert.NotEmpty(used); - Assert.Empty(used.Where(k => !en.Contains(k)).OrderBy(k => k)); - Assert.Empty(used.Where(k => !es.Contains(k)).OrderBy(k => k)); + Assert.Empty(UiStrings.MissingInAnyLanguage(used)); } [Fact] public void EveryMessageKeyEmittedByCore_HasALocalizedIssueMessage() { - var en = ReadResx("en"); - var es = ReadResx("es"); var core = Path.Combine(RepoRoot(), "src", "Rotula.Core"); var keys = new HashSet(); foreach (var file in Directory.EnumerateFiles(core, "*.cs", SearchOption.AllDirectories).Where(f => !f.Contains(@"\obj\") && !f.Contains(@"\bin\"))) @@ -110,17 +140,14 @@ public void EveryMessageKeyEmittedByCore_HasALocalizedIssueMessage() } } Assert.True(keys.Count > 30, "expected to find Core message keys, found " + keys.Count); - Assert.Empty(keys.Where(k => !en.ContainsKey("Issue." + k)).OrderBy(k => k)); - Assert.Empty(keys.Where(k => !es.ContainsKey("Issue." + k)).OrderBy(k => k)); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys.Select(k => "Issue." + k))); Assert.Contains("Dpi.Barcode.ModuleRounded", keys); Assert.Contains("Dpi.Raw.NotScaled", keys); } [Fact] - public void EveryKeyEmittedByRotulaData_HasTextInBothLanguages() + public void EveryKeyEmittedByRotulaData_HasTextInEveryLanguage() { - var en = ReadResx("en"); - var es = ReadResx("es"); var keys = new HashSet(); var registry = Rotula.Data.ProviderRegistry.Default; // Providers: name, every option label and help, every choice label (this reaches the Data.Dialect.* ids of the ODBC engine list). @@ -151,14 +178,12 @@ public void EveryKeyEmittedByRotulaData_HasTextInBothLanguages() Assert.Contains("Data.Preset.Supabase", keys); Assert.Contains("Data.Dialect.jet", keys); Assert.Contains("Data.Pack.UnsafeFolder", keys); - Assert.Empty(keys.Where(k => !en.ContainsKey(k)).OrderBy(k => k)); - Assert.Empty(keys.Where(k => !es.ContainsKey(k)).OrderBy(k => k)); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); } [Theory] - [InlineData("en")] - [InlineData("es")] - public void EveryPackWarningKey_FormatsWithItsArguments_InBothLanguages(string lang) + [MemberData(nameof(UiStrings.LanguageData), MemberType = typeof(UiStrings))] + public void EveryPackWarningKey_FormatsWithItsArguments_InEveryLanguage(string lang) { Loc.Instance.SetLanguage(lang); foreach (var f in typeof(Rotula.Data.PackKeys).GetFields().Where(f => f.IsLiteral)) @@ -173,10 +198,9 @@ public void EveryPackWarningKey_FormatsWithItsArguments_InBothLanguages(string l } [Fact] - public void EveryMessageKeyEmittedByPrinting_IsTranslatedInBothLanguages() + public void EveryMessageKeyEmittedByPrinting_IsTranslatedInEveryLanguage() { var en = ReadResx("en"); - var es = ReadResx("es"); var keys = new HashSet(); // Every failure category has a Print.Error. key (PrintError.Create derives the key from the kind). foreach (var kind in Enum.GetValues()) keys.Add("Print.Error." + kind); @@ -186,26 +210,19 @@ public void EveryMessageKeyEmittedByPrinting_IsTranslatedInBothLanguages() foreach (Match m in Regex.Matches(File.ReadAllText(file), @"""(Print\.[A-Za-z]+(?:\.[A-Za-z]+)+)""")) keys.Add(m.Groups[1].Value); Assert.True(keys.Count >= 16, "expected to find the Printing keys, found " + keys.Count); - Assert.Empty(keys.Where(k => !en.ContainsKey(k)).OrderBy(k => k)); - Assert.Empty(keys.Where(k => !es.ContainsKey(k)).OrderBy(k => k)); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); // Messages with holes must not leave an unreplaced {n} when the library supplies fewer arguments than holes. foreach (var k in keys.Where(k => k.StartsWith("Print.Error."))) Assert.True(Regex.Matches(en[k], @"(?(); void Check() where T : struct, Enum { - foreach (var v in Enum.GetValues()) - { - string key = $"Enum.{typeof(T).Name}.{v}"; - Assert.True(en.Contains(key), key); - Assert.True(es.Contains(key), key); - } + foreach (var v in Enum.GetValues()) keys.Add($"Enum.{typeof(T).Name}.{v}"); } Check(); Check(); Check(); Check(); Check(); Check(); Check(); Check(); Check(); Check(); @@ -214,13 +231,13 @@ void Check() where T : struct, Enum Check(); Check(); Check(); Check(); Check(); Check(); Check(); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); } [Fact] public void EveryBarcodeOption_HasALabel_AndEveryPreviewNote_HasATranslation() { - var en = ReadResx("en"); - var es = ReadResx("es"); + var keys = new List { "Preview.Note.AztecSpecial" }; // Option rows are built from the catalogue by option name, so a new BarcodeOption without a label would show a missing-key text. var directLabels = new Dictionary { @@ -228,18 +245,15 @@ public void EveryBarcodeOption_HasALabel_AndEveryPreviewNote_HasATranslation() }; foreach (var option in Enum.GetValues()) { - string key = directLabels.TryGetValue(option, out var k) ? k : "Prop." + option; - Assert.True(en.ContainsKey(key), key); - Assert.True(es.ContainsKey(key), key); + keys.Add(directLabels.TryGetValue(option, out var k) ? k : "Prop." + option); } foreach (var info in Rotula.Core.Barcodes.BarcodeCatalog.All.Where(i => i.PreviewNote is not null)) { string? key = Rotula.App.Editing.BarcodePreviewNotes.KeyFor(info.Symbology); Assert.NotNull(key); - Assert.True(en.ContainsKey(key!), key); - Assert.True(es.ContainsKey(key!), key); + keys.Add(key!); } - Assert.True(en.ContainsKey("Preview.Note.AztecSpecial") && es.ContainsKey("Preview.Note.AztecSpecial")); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); } [Fact] @@ -247,11 +261,110 @@ public void ResolveLanguage_FollowsWindowsUnlessChosen() { Assert.Equal("es", Loc.ResolveLanguage("auto", new CultureInfo("es-PA"))); Assert.Equal("es", Loc.ResolveLanguage(null, new CultureInfo("es-ES"))); - Assert.Equal("en", Loc.ResolveLanguage("auto", new CultureInfo("fr-FR"))); // unsupported -> English + Assert.Equal("en", Loc.ResolveLanguage("auto", new CultureInfo("de-DE"))); // unsupported -> English + Assert.Equal("en", Loc.ResolveLanguage("auto", new CultureInfo("ja-JP"))); Assert.Equal("en", Loc.ResolveLanguage("auto", new CultureInfo("en-US"))); + Assert.Equal("en", Loc.ResolveLanguage("auto", CultureInfo.InvariantCulture)); Assert.Equal("en", Loc.ResolveLanguage("en", new CultureInfo("es-ES"))); // explicit choice wins Assert.Equal("es", Loc.ResolveLanguage("es", new CultureInfo("en-US"))); - Assert.Equal("en", Loc.ResolveLanguage("klingon", new CultureInfo("fr-FR"))); + Assert.Equal("en", Loc.ResolveLanguage("klingon", new CultureInfo("de-DE"))); + } + + [Theory] + [InlineData("pt-BR", "pt-BR")] + [InlineData("pt-PT", "pt-BR")] // one Portuguese ships: Portugal gets it rather than English + [InlineData("pt-AO", "pt-BR")] + [InlineData("pt", "pt-BR")] + [InlineData("fr-CA", "fr-CA")] + [InlineData("fr-FR", "fr-CA")] // one French ships: France, Belgium and Switzerland get it rather than English + [InlineData("fr-BE", "fr-CA")] + [InlineData("fr-CH", "fr-CA")] + [InlineData("fr", "fr-CA")] + [InlineData("es-MX", "es")] + [InlineData("es-419", "es")] + [InlineData("en-GB", "en")] + [InlineData("it-IT", "en")] + public void ResolveLanguage_MapsTheWindowsLanguage_ToTheClosestShippedOne(string windows, string expected) + { + Assert.Equal(expected, Loc.ResolveLanguage("auto", new CultureInfo(windows))); + Assert.Equal(expected, Loc.ResolveLanguage(null, new CultureInfo(windows))); + Assert.Contains(expected, Loc.SupportedLanguages); + } + + [Theory] + [InlineData("pt-BR", "fr-FR", "pt-BR")] + [InlineData("fr-CA", "pt-BR", "fr-CA")] + [InlineData("pt-BR", "en-US", "pt-BR")] + [InlineData("fr-CA", "es-ES", "fr-CA")] + [InlineData("PT-br", "en-US", "pt-BR")] // a hand-edited settings.json in another case still counts + [InlineData("fr-ca", "en-US", "fr-CA")] + public void ResolveLanguage_AnExplicitChoiceWins(string setting, string windows, string expected) + { + Assert.Equal(expected, Loc.ResolveLanguage(setting, new CultureInfo(windows))); + } + + [Theory] + [InlineData("en", "fr-CA", "en")] + [InlineData("es", "pt-BR", "es")] + [InlineData("auto", "pt-BR", "pt-BR")] + [InlineData("auto", "fr-CA", "fr-CA")] + // Codes that were never saved by any version fall back to "follow Windows", as before. + [InlineData("pt", "en-US", "en")] + [InlineData("fr", "en-US", "en")] + [InlineData("", "fr-FR", "fr-CA")] + public void ResolveLanguage_SettingsSavedBeforeTheNewLanguages_KeepTheirMeaning(string setting, string windows, string expected) + { + Assert.Equal(expected, Loc.ResolveLanguage(setting, new CultureInfo(windows))); + } + + [Theory] + [InlineData("pt-BR", "Cancelar")] + [InlineData("fr-CA", "Annuler")] + [InlineData("es", "Cancelar")] + [InlineData("en", "Cancel")] + public void EveryShippedLanguage_IsServedFromItsOwnResources(string language, string cancel) + { + Loc.Instance.SetLanguage(language); + Assert.Equal(language, Loc.Instance.LanguageCode); + Assert.Equal(language, Loc.Instance.Culture.Name); + Assert.Equal(cancel, Loc.Instance["Common.Cancel"]); + // Every key comes back from the language's own file, not the English fallback. + var expected = UiStrings.Read(language); + foreach (var key in new[] { "Menu.File", "Menu.Edit", "Menu.Language", "About.Title" }) + Assert.Equal(expected[key], Loc.Instance[key]); + } + + [Fact] + public void NumbersAndDates_FollowTheChosenLanguage() + { + // Loc.Get formats with the language's culture: Brazil and Canada write a decimal comma. + Loc.Instance.SetLanguage("pt-BR"); + Assert.Equal("1,5", string.Format(Loc.Instance.Culture, "{0}", 1.5)); + Assert.Contains("1,5", Loc.Get("Qr.Size.Module", 1.5, 203)); + Loc.Instance.SetLanguage("fr-CA"); + Assert.Contains("1,5", Loc.Get("Qr.Size.Module", 1.5, 203)); + Loc.Instance.SetLanguage("en"); + Assert.Contains("1.5", Loc.Get("Qr.Size.Module", 1.5, 203)); + } + + [Fact] + public void SwitchingToAndFromTheNewLanguages_RaisesTheIndexerChange() + { + var changes = new List(); + PropertyChangedEventHandler handler = (_, e) => changes.Add(e.PropertyName); + Loc.Instance.PropertyChanged += handler; + try + { + Loc.Instance.SetLanguage("fr-CA"); + Assert.Equal("Annuler", Loc.Instance["Common.Cancel"]); + Loc.Instance.SetLanguage("pt-BR"); + Assert.Equal("Cancelar", Loc.Instance["Common.Cancel"]); + Assert.Equal(2, changes.Count(c => c == "Item[]")); + } + finally + { + Loc.Instance.PropertyChanged -= handler; + } } [Fact] diff --git a/tests/Rotula.Tests/AppPackLocalizationTests.cs b/tests/Rotula.Tests/AppPackLocalizationTests.cs index 1963380..77c8ab9 100644 --- a/tests/Rotula.Tests/AppPackLocalizationTests.cs +++ b/tests/Rotula.Tests/AppPackLocalizationTests.cs @@ -1,27 +1,17 @@ using System.Text.RegularExpressions; -using System.Xml.Linq; namespace Rotula.Tests; /// /// The built-in registry test cannot see the database packs (they are loaded at run time), so this scan reads the pack -/// sources for string literals shaped like resource keys and checks that both languages have a text for each. +/// sources for string literals shaped like resource keys and checks that every language has a text for each. /// public class AppPackLocalizationTests { - private static string RepoRoot() - { - var dir = new DirectoryInfo(AppContext.BaseDirectory); - while (dir is not null && !File.Exists(Path.Combine(dir.FullName, "Rotula.sln"))) dir = dir.Parent; - return dir?.FullName ?? throw new DirectoryNotFoundException("Repository root not found."); - } - - private static HashSet ResxKeys(string lang) => - XDocument.Load(Path.Combine(RepoRoot(), "src", "Rotula.App", "Resources", $"Strings.{lang}.resx")) - .Descendants("data").Select(d => (string)d.Attribute("name")!).ToHashSet(); + private static string RepoRoot() => UiStrings.RepoRoot(); [Fact] - public void EveryResourceKeyLiteralInTheDatabasePacks_HasTextInBothLanguages() + public void EveryResourceKeyLiteralInTheDatabasePacks_HasTextInEveryLanguage() { var src = Path.Combine(RepoRoot(), "src"); var shape = new Regex(@"""((?:Conn\.Provider|Data\.(?:Option|Preset|Dialect|Hint|Pack|Error))(?:\.[A-Za-z0-9]+)+)"""); @@ -32,7 +22,6 @@ public void EveryResourceKeyLiteralInTheDatabasePacks_HasTextInBothLanguages() foreach (Match m in shape.Matches(line)) keys.Add(m.Groups[1].Value); Assert.NotEmpty(keys); - Assert.Empty(keys.Where(k => !ResxKeys("en").Contains(k)).OrderBy(k => k)); - Assert.Empty(keys.Where(k => !ResxKeys("es").Contains(k)).OrderBy(k => k)); + Assert.Empty(UiStrings.MissingInAnyLanguage(keys)); } } diff --git a/tests/Rotula.Tests/AppPreviewAndSettingsTests.cs b/tests/Rotula.Tests/AppPreviewAndSettingsTests.cs index 3d7538a..d629844 100644 --- a/tests/Rotula.Tests/AppPreviewAndSettingsTests.cs +++ b/tests/Rotula.Tests/AppPreviewAndSettingsTests.cs @@ -119,6 +119,23 @@ public void FirstRun_CreatesACommentedStarterFile_ThatLoadsBack() finally { Directory.Delete(dir, true); } } + [Theory] + [InlineData("pt-BR")] + [InlineData("fr-CA")] + [InlineData("es")] + [InlineData("auto")] + public void Settings_KeepTheLanguageAsSaved(string language) + { + string dir = AppTestSupport.TempDir(); + try + { + string path = Path.Combine(dir, "settings.json"); + Assert.True(new JsonSettingsStore(path).Save(new AppSettings { Language = language })); + Assert.Equal(language, new JsonSettingsStore(path).Load().Language); + } + finally { Directory.Delete(dir, true); } + } + [Fact] public void Settings_RoundTrip_AndSurviveHandEditing() { diff --git a/tests/Rotula.Tests/AppPrintTests.cs b/tests/Rotula.Tests/AppPrintTests.cs index 8bfd051..3312265 100644 --- a/tests/Rotula.Tests/AppPrintTests.cs +++ b/tests/Rotula.Tests/AppPrintTests.cs @@ -221,9 +221,9 @@ public async Task PrintTestLabel_SendsTheProfile() [InlineData(PrintErrorKind.EncodingFailed)] [InlineData(PrintErrorKind.Unsupported)] [InlineData(PrintErrorKind.Unknown)] - public async Task EveryPrintError_BecomesAPlainSentence_InBothLanguages(PrintErrorKind kind) + public async Task EveryPrintError_BecomesAPlainSentence_InEveryLanguage(PrintErrorKind kind) { - foreach (var lang in new[] { "en", "es" }) + foreach (var lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); _fake.Printer.Result = _ => PrintResult.Fail(PrintError.Create(kind, "Z", "9100", "detail")); diff --git a/tests/Rotula.Tests/AppPrinterStatusTests.cs b/tests/Rotula.Tests/AppPrinterStatusTests.cs index 247b710..d916d33 100644 --- a/tests/Rotula.Tests/AppPrinterStatusTests.cs +++ b/tests/Rotula.Tests/AppPrinterStatusTests.cs @@ -193,8 +193,7 @@ public void StatusNotes_ReadAsSentences(string key, string arg, string expected) } [Theory] - [InlineData("en")] - [InlineData("es")] + [MemberData(nameof(UiStrings.LanguageData), MemberType = typeof(UiStrings))] public void EveryReasonAndEveryHeldBackKind_HasText(string lang) { Loc.Instance.SetLanguage(lang); @@ -209,7 +208,8 @@ public void EveryReasonAndEveryHeldBackKind_HasText(string lang) { var error = PrintError.Create(Enum.Parse(condition.ToString()), "P", condition.ToString(), "Paused"); string text = PrintMessages.Describe(error); - Assert.Contains("\"P\"", text); + // The printer name is quoted in the language's own style: "P" in English, « P » in Canadian French. + Assert.Matches("(\"P\"|«\u00A0P\u00A0»)", text); Assert.DoesNotContain("{", text); } } diff --git a/tests/Rotula.Tests/AppStockPickerTests.cs b/tests/Rotula.Tests/AppStockPickerTests.cs index 8ec509a..6b58978 100644 --- a/tests/Rotula.Tests/AppStockPickerTests.cs +++ b/tests/Rotula.Tests/AppStockPickerTests.cs @@ -584,13 +584,13 @@ public async Task SwitchingTheLanguage_RebuildsTheListAndTheDetail_InSpanish() } [Fact] - public async Task EveryStockWarningKey_FormatsInBothLanguages_WithoutLeftoverPlaceholders() + public async Task EveryStockWarningKey_FormatsInEveryLanguage_WithoutLeftoverPlaceholders() { var stock = RealStock(); var issues = typeof(StockMessageKeys).GetFields().Where(f => f.IsLiteral && ((string)f.GetRawConstantValue()!).StartsWith("Stocks.Apply.", StringComparison.Ordinal)) .Select(f => new ValidationIssue(ValidationSeverity.Warning, (string)f.GetRawConstantValue()!, null, new[] { stock.Id, "2", "30" })).ToList(); Assert.True(issues.Count >= 8); - foreach (string lang in new[] { "en", "es" }) + foreach (string lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); foreach (var issue in issues) @@ -629,21 +629,13 @@ public async Task TheLabelPanel_ShowsTheNameOfTheStockTheLabelCameFrom() } [Fact] - public void EveryStockKeyUsedByTheDialog_ExistsInBothLanguages() + public void EveryStockKeyUsedByTheDialog_ExistsInEveryLanguage() { - string? root = AppContext.BaseDirectory; - while (root is not null && !File.Exists(Path.Combine(root, "Rotula.sln"))) root = Path.GetDirectoryName(root); - Assert.NotNull(root); - var keys = new[] { "en", "es" }.ToDictionary(l => l, l => XDocument.Load(Path.Combine(root, "src", "Rotula.App", "Resources", $"Strings.{l}.resx")).Root!.Elements("data").Select(d => d.Attribute("name")!.Value).ToHashSet()); // Keys built from enum values in StockText. var built = new List(); foreach (var m in Enum.GetValues()) built.Add("Stock.Media." + m); foreach (var f in Enum.GetValues()) built.Add("Stock.Format." + f); foreach (var l in Enum.GetValues()) built.Add("Stock.Layout." + l); - foreach (var k in built) - { - Assert.Contains(k, keys["en"]); - Assert.Contains(k, keys["es"]); - } + Assert.Empty(UiStrings.MissingInAnyLanguage(built)); } } diff --git a/tests/Rotula.Tests/AppTextFormatTests.cs b/tests/Rotula.Tests/AppTextFormatTests.cs index 13cfe86..24e29ba 100644 --- a/tests/Rotula.Tests/AppTextFormatTests.cs +++ b/tests/Rotula.Tests/AppTextFormatTests.cs @@ -722,9 +722,9 @@ private static (EditorSession Session, TextFormatViewModel Format) WindowsTextWi } [Fact] - public void EveryControlOfThePanelAndTheBar_HasAnAccessibleName_InBothLanguages() + public void EveryControlOfThePanelAndTheBar_HasAnAccessibleName_InEveryLanguage() { - foreach (var lang in new[] { "en", "es" }) + foreach (var lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); var problems = WpfTestHost.Run(() => diff --git a/tests/Rotula.Tests/AppUpdateCheckTests.cs b/tests/Rotula.Tests/AppUpdateCheckTests.cs index 1ff3e1b..8b0bcc8 100644 --- a/tests/Rotula.Tests/AppUpdateCheckTests.cs +++ b/tests/Rotula.Tests/AppUpdateCheckTests.cs @@ -363,6 +363,27 @@ public void AManagedLanguage_IsAppliedAndLocked() Assert.Equal("Administrado por tu organización", Loc.Get("Policy.Managed")); } + [Theory] + [InlineData("pt-BR", "Gerenciado pela sua organização")] + [InlineData("fr-CA", "Géré par votre organisation")] + public void AManagedPortugueseOrFrench_IsAppliedAndLocksEveryLanguageEntry(string language, string managed) + { + _fake.Settings.Current.Language = "es"; + var vm = Main(new RotulaPolicy { Language = language }); + Assert.Equal(language, Loc.Instance.LanguageCode); + Assert.Equal(language, vm.LanguageSetting); + Assert.Equal(language == "pt-BR", vm.IsLanguagePtBr); + Assert.Equal(language == "fr-CA", vm.IsLanguageFrCa); + Assert.False(vm.IsLanguageEs); + // The four language entries and "Same as Windows" share one command, so all of them are disabled. + foreach (var code in new[] { "auto" }.Concat(Loc.SupportedLanguages)) + Assert.False(vm.SetLanguageCommand.CanExecute(code), code); + vm.SetLanguageCommand.Execute("en"); + Assert.Equal(language, Loc.Instance.LanguageCode); + Assert.Equal("es", _fake.Settings.Current.Language); // the user's own choice waits for the policy to go + Assert.Equal(managed, Loc.Get("Policy.Managed")); + } + [Fact] public void AnUnmanagedLanguage_StaysTheUsersChoice() { diff --git a/tests/Rotula.Tests/AppViewModelTests.cs b/tests/Rotula.Tests/AppViewModelTests.cs index 20de84b..adf8a7e 100644 --- a/tests/Rotula.Tests/AppViewModelTests.cs +++ b/tests/Rotula.Tests/AppViewModelTests.cs @@ -478,6 +478,42 @@ public void Language_StartsFromSettings_SwitchesLive_AndIsSaved() Assert.True(vm.IsLanguageEs); } + [Fact] + public void Language_PortugueseAndFrench_AreSavedByTheirFullName_AndCheckTheirMenuEntry() + { + var vm = Create(); + vm.SetLanguageCommand.Execute("pt-BR"); + Assert.Equal("pt-BR", Loc.Instance.LanguageCode); + Assert.Equal("pt-BR", _fake.Settings.Current.Language); + Assert.StartsWith("Sem título", vm.Title); + Assert.True(vm.IsLanguagePtBr); + Assert.False(vm.IsLanguageEs || vm.IsLanguageEn || vm.IsLanguageFrCa || vm.IsLanguageAuto); + + vm.SetLanguageCommand.Execute("fr-CA"); + Assert.Equal("fr-CA", _fake.Settings.Current.Language); + Assert.StartsWith("Sans titre", vm.Title); + Assert.Equal("Texte", vm.Toolbox[0].Name); + Assert.True(vm.IsLanguageFrCa); + Assert.False(vm.IsLanguagePtBr); + + // Anything that is not a shipped language means "follow Windows", as before. + vm.SetLanguageCommand.Execute("pt"); + Assert.Equal("auto", _fake.Settings.Current.Language); + Assert.True(vm.IsLanguageAuto); + vm.SetLanguageCommand.Execute("en"); + } + + [Theory] + [InlineData("pt-BR", "Sem título")] + [InlineData("fr-CA", "Sans titre")] + public void Language_SavedAsPortugueseOrFrench_IsUsedAtStart(string saved, string untitled) + { + _fake.Settings.Current.Language = saved; + var vm = Create(); + Assert.Equal(saved, Loc.Instance.LanguageCode); + Assert.StartsWith(untitled, vm.Title); + } + [Fact] public void ApproximatePreviewNotice_IsAlwaysAvailable() { diff --git a/tests/Rotula.Tests/DeploymentPolicyTests.cs b/tests/Rotula.Tests/DeploymentPolicyTests.cs index 52375be..9c93790 100644 --- a/tests/Rotula.Tests/DeploymentPolicyTests.cs +++ b/tests/Rotula.Tests/DeploymentPolicyTests.cs @@ -56,8 +56,32 @@ public void EveryValueIsRead() Assert.True(p.IsUpdateCheckManaged); } + [Theory] + [InlineData("pt-BR", "pt-BR")] + [InlineData("fr-CA", "fr-CA")] + [InlineData(" PT-br ", "pt-BR")] // case and spaces in the registry do not matter; the canonical name is handed on + [InlineData("FR-CA", "fr-CA")] + [InlineData("Auto", "auto")] + [InlineData("EN", "en")] + public void EveryShippedLanguage_IsAccepted_UnderItsCanonicalName(string value, string expected) + { + var p = RotulaPolicy.Read(new FakePolicySource().Set(PolicyNames.Language, value)); + Assert.Equal(expected, p.Language); + Assert.True(p.IsLanguageManaged); + } + + [Fact] + public void PolicyLanguages_AreAutoPlusTheLanguagesTheAppShips() + { + // Rotula.Files cannot see the app's Loc, so the list is repeated there; this keeps the two in step. + Assert.Equal(new[] { "auto" }.Concat(Rotula.App.Localization.Loc.SupportedLanguages), RotulaPolicy.Languages); + } + [Theory] [InlineData("fr")] + [InlineData("pt")] + [InlineData("fr-FR")] + [InlineData("pt-PT")] [InlineData("")] [InlineData("english")] public void AnUnknownLanguage_IsIgnored(string value) => @@ -187,7 +211,7 @@ public void Admx_LanguageChoicesAreTheOnesRotulaAccepts() { var values = Admx().Descendants(Gp + "enum").Single(e => (string?)e.Attribute("valueName") == PolicyNames.Language) .Descendants(Gp + "string").Select(s => s.Value).ToList(); - Assert.Equal(new[] { "auto", "en", "es" }, values); + Assert.Equal(RotulaPolicy.Languages, values); Assert.All(values, v => Assert.Equal(v, RotulaPolicy.Read(new FakePolicySource().Set(PolicyNames.Language, v)).Language)); } diff --git a/tests/Rotula.Tests/ObjectConditionsTests.cs b/tests/Rotula.Tests/ObjectConditionsTests.cs index a324cd9..4771bf2 100644 --- a/tests/Rotula.Tests/ObjectConditionsTests.cs +++ b/tests/Rotula.Tests/ObjectConditionsTests.cs @@ -573,14 +573,19 @@ public void KeysAndMenus_SayWhyNothingMoved_WhenOnlyLockedObjectsAreSelected() } [Fact] - public void EveryNewTextIsInBothLanguages() + public void EveryNewTextIsInEveryLanguage() { - foreach (var lang in new[] { "en", "es" }) + foreach (var lang in Loc.SupportedLanguages) { Loc.Instance.SetLanguage(lang); + // HasKey only looks at English, so the language's own file is checked as well. + var own = UiStrings.Keys(lang); foreach (var key in new[] { "Panel.Printing", "Prop.NotPrintable", "Prop.Condition.Enable", "Prop.Locked", "Status.LockedSkipped", "Badge.Locked", "Badge.HiddenByCondition", "Badge.NotPrintable", "Condition.FieldMissing", "Issue.Element.Condition.FieldMissing" }) + { Assert.True(Loc.Instance.HasKey(key), key + " / " + lang); + Assert.Contains(key, own); + } foreach (var op in Enum.GetValues()) { Assert.True(Loc.Instance.HasKey("Enum.ConditionOperator." + op), op + " / " + lang); diff --git a/tests/Rotula.Tests/StationConfigTests.cs b/tests/Rotula.Tests/StationConfigTests.cs index 56f5e81..3f15aa5 100644 --- a/tests/Rotula.Tests/StationConfigTests.cs +++ b/tests/Rotula.Tests/StationConfigTests.cs @@ -209,18 +209,10 @@ public void AConfigurationFile_CanBeGivenDirectly_AndAMissingPathIsExplained() } [Fact] - public void EveryStationKey_HasAnIssueMessage_InBothLanguages() + public void EveryStationKey_HasAnIssueMessage_InEveryLanguage() { - var dir = new DirectoryInfo(AppContext.BaseDirectory); - while (dir is not null && !File.Exists(Path.Combine(dir.FullName, "Rotula.sln"))) dir = dir.Parent; - Assert.NotNull(dir); var keys = typeof(StationKeys).GetFields().Where(f => f.IsLiteral).Select(f => (string)f.GetRawConstantValue()!).ToList(); Assert.True(keys.Count >= 15); - foreach (var lang in new[] { "en", "es" }) - { - var names = XDocument.Load(Path.Combine(dir!.FullName, "src", "Rotula.App", "Resources", $"Strings.{lang}.resx")).Root! - .Elements("data").Select(d => d.Attribute("name")!.Value).ToHashSet(); - Assert.DoesNotContain(keys, k => !names.Contains("Issue." + k)); - } + Assert.Empty(UiStrings.MissingInAnyLanguage(keys.Select(k => "Issue." + k))); } } diff --git a/tests/Rotula.Tests/UiStrings.cs b/tests/Rotula.Tests/UiStrings.cs new file mode 100644 index 0000000..3ce2235 --- /dev/null +++ b/tests/Rotula.Tests/UiStrings.cs @@ -0,0 +1,66 @@ +using System.Collections.Concurrent; +using System.Xml.Linq; +using Rotula.App.Localization; + +namespace Rotula.Tests; + +/// +/// Reads the application's string tables (src/Rotula.App/Resources/Strings.<language>.resx) for the tests that check +/// translations. Every check goes through , so adding a language to +/// puts it under the same checks with no test to edit. +/// +public static class UiStrings +{ + // The files are large and many tests read them; parse each once per test run. + private static readonly ConcurrentDictionary> Cache = new(StringComparer.Ordinal); + + /// Every shipped language, English (the reference) first. + public static IReadOnlyList Languages => Loc.SupportedLanguages; + + /// Every shipped language except English. + public static IEnumerable Translations => Languages.Where(l => l != "en"); + + /// as theory data. + public static TheoryData LanguageData => ToData(Languages); + + /// as theory data. + public static TheoryData TranslationData => ToData(Translations); + + private static TheoryData ToData(IEnumerable values) + { + var data = new TheoryData(); + foreach (var v in values) data.Add(v); + return data; + } + + /// The repository root (the folder that holds Rotula.sln). + public static string RepoRoot() + { + var dir = new DirectoryInfo(AppContext.BaseDirectory); + while (dir is not null && !File.Exists(Path.Combine(dir.FullName, "Rotula.sln"))) dir = dir.Parent; + return dir?.FullName ?? throw new DirectoryNotFoundException("Rotula.sln not found above the test folder."); + } + + /// The folder that holds the Strings.*.resx files. + public static string ResourcesFolder() => Path.Combine(RepoRoot(), "src", "Rotula.App", "Resources"); + + /// The culture names of the Strings.<name>.resx files that exist on disk. + public static IEnumerable FileLanguages() => + Directory.EnumerateFiles(ResourcesFolder(), "Strings.*.resx") + .Select(f => Path.GetFileNameWithoutExtension(f)["Strings.".Length..]); + + /// Key to text for one language. + public static IReadOnlyDictionary Read(string language) => + Cache.GetOrAdd(language, l => XDocument.Load(Path.Combine(ResourcesFolder(), $"Strings.{l}.resx")).Root!.Elements("data") + .ToDictionary(d => d.Attribute("name")!.Value, d => d.Element("value")!.Value, StringComparer.Ordinal)); + + /// The keys of one language. + public static HashSet Keys(string language) => Read(language).Keys.ToHashSet(StringComparer.Ordinal); + + /// The keys of that some language lacks, as "language: key" (empty when all are present). + public static List MissingInAnyLanguage(IEnumerable wanted) + { + var list = wanted.ToList(); + return Languages.SelectMany(l => list.Where(k => !Read(l).ContainsKey(k)).Select(k => $"{l}: {k}")).OrderBy(x => x, StringComparer.Ordinal).ToList(); + } +} diff --git a/tests/Rotula.Tests/VarKeysTests.cs b/tests/Rotula.Tests/VarKeysTests.cs index a7024d4..5d3131e 100644 --- a/tests/Rotula.Tests/VarKeysTests.cs +++ b/tests/Rotula.Tests/VarKeysTests.cs @@ -3,7 +3,7 @@ namespace Rotula.Tests; -/// The message keys of the variable engine: well formed, unique, and translated in both languages. +/// The message keys of the variable engine: well formed, unique, and translated in every language. public class VarKeysTests { private static string RepoRoot() @@ -13,9 +13,7 @@ private static string RepoRoot() return dir?.FullName ?? throw new DirectoryNotFoundException("Repository root not found."); } - private static HashSet ResxKeys(string lang) => - XDocument.Load(Path.Combine(RepoRoot(), "src", "Rotula.App", "Resources", $"Strings.{lang}.resx")) - .Descendants("data").Select(d => (string)d.Attribute("name")!).ToHashSet(); + private static HashSet ResxKeys(string lang) => UiStrings.Keys(lang); [Fact] public void KeysAreUniqueAndShapedLikeTheOthers() @@ -39,12 +37,11 @@ public void EveryKeyTheEngineCanRaise_IsListed() } /// - /// Expected to FAIL until the UI work adds the texts: each key needs Issue.<key> in Strings.en.resx and Strings.es.resx. + /// Expected to FAIL until the UI work adds the texts: each key needs Issue.<key> in every Strings.<language>.resx. /// The failure message lists exactly what is missing. /// [Theory] - [InlineData("en")] - [InlineData("es")] + [MemberData(nameof(UiStrings.LanguageData), MemberType = typeof(UiStrings))] public void EveryKeyHasTextInTheAppResources(string lang) { var have = ResxKeys(lang);