mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-14 19:26:51 -04:00
CI: restore tests, catalogs, and web size gate (#3923)
* ci: restore test and Clippy gates * ci: keep browser wasm below size gate * CI: restore plural catalog and MCP resource test gates Adapted the catalog, parser, and shared-cache test fixes from PhotoCraft PR #3821 by @bommerts. The source-key test, bundled-catalog test, and MCP resource test pass locally. * CI: expect saved native document name in CLI test The native save path intentionally writes the output filename into the reopened bundle. Keep the pre-save Run assertion and assert r.pcraft after reopening. * CI: compare orientation round trips without saved filenames Native saves encode the output filename in document name. Check each expected name, then compare the remaining document fields and pixels.
This commit is contained in:
1 parent
9237a8bdde
commit
d380309338
20 files changed
+207
-29
No files matched your search
+11
-2
@@ -81,8 +81,8 @@ codegen-units = 1
|
||||
|
||||
# The browser build (apps/photocraft-web, `data-cargo-profile` in its index.html). Hosts cap the
|
||||
# size of a single file (Cloudflare Pages/Workers: 25 MiB), and the wasm is downloaded on every
|
||||
# visit, so this profile optimizes for size: fat LTO, opt-level "z" for the UI shell, and "s" for
|
||||
# other crates except pixel processing, which keeps opt-level 3 for filters and compositing. panic
|
||||
# visit, so this profile optimizes for size: fat LTO, opt-level "z" for the UI, command, and I/O
|
||||
# shells, and "s" for other crates except pixel processing, which keeps opt-level 3. panic
|
||||
# stays the target default (wasm32-unknown-unknown aborts; AGENTS.md's `panic = "unwind"` is for
|
||||
# the native app shell). packaging/web/package.sh fails the build above 24 MiB.
|
||||
[profile.wasm-release]
|
||||
@@ -100,6 +100,15 @@ opt-level = "s"
|
||||
[profile.wasm-release.package.photocraft-ui-egui]
|
||||
opt-level = "z"
|
||||
|
||||
# Keep browser command dispatch, import/export glue, and the entry point compact. Native
|
||||
# builds and the speed-oriented pixel-processing overrides below retain their settings.
|
||||
[profile.wasm-release.package.photocraft-engine]
|
||||
opt-level = "z"
|
||||
[profile.wasm-release.package.photocraft-io]
|
||||
opt-level = "z"
|
||||
[profile.wasm-release.package.photocraft-web]
|
||||
opt-level = "z"
|
||||
|
||||
[profile.wasm-release.package.photocraft-raster]
|
||||
opt-level = 3
|
||||
[profile.wasm-release.package.photocraft-color]
|
||||
|
||||
@@ -189,9 +189,11 @@ fn run_commands_and_save() {
|
||||
let lines: Vec<Value> = out.lines().map(|l| serde_json::from_str(l).unwrap()).collect();
|
||||
assert_eq!(lines.len(), 3);
|
||||
assert_eq!(lines[2]["command"], "document.inspect");
|
||||
assert_eq!(lines[2]["result"]["name"], "Run");
|
||||
let (info, _) = ok(bin().arg("info").arg(&out_pc));
|
||||
let v: Value = serde_json::from_str(&info).unwrap();
|
||||
assert_eq!(v["name"], "Run");
|
||||
// Saving a native document gives the reopened bundle its output filename.
|
||||
assert_eq!(v["name"], "r.pcraft");
|
||||
let names: Vec<&str> = v["layers"].as_array().unwrap().iter().filter_map(|l| l["name"].as_str()).collect();
|
||||
assert_eq!(names, ["Ink", "Background"]);
|
||||
// Continue from the saved file and export PNG.
|
||||
|
||||
@@ -125,15 +125,19 @@ fn orientation_6_jpeg_converts_upright_and_rotates_back() {
|
||||
let (a, b) = (d.join("a.pcraft"), d.join("b.pcraft"));
|
||||
ok(bin().arg("convert").arg(&jpg).arg(&a));
|
||||
ok(bin().arg("convert").arg(&a).arg(&b));
|
||||
// Everything but the file's own path must match.
|
||||
// Everything but the file's own path and saved document name must match.
|
||||
let info = |p: &Path| {
|
||||
let mut v = serde_json::from_str::<Value>(&ok(bin().arg("info").arg(p))).unwrap();
|
||||
v.as_object_mut().unwrap().remove("file");
|
||||
v.as_object_mut().unwrap().remove("path");
|
||||
v
|
||||
};
|
||||
let (ia, ib) = (info(&a), info(&b));
|
||||
let (mut ia, mut ib) = (info(&a), info(&b));
|
||||
assert_eq!((ia["width"].as_u64(), ia["height"].as_u64()), (Some(16), Some(32)));
|
||||
assert_eq!(ia["name"], "a.pcraft");
|
||||
assert_eq!(ib["name"], "b.pcraft");
|
||||
ia.as_object_mut().unwrap().remove("name");
|
||||
ib.as_object_mut().unwrap().remove("name");
|
||||
assert_eq!(ia, ib);
|
||||
let (pa, pb) = (d.join("a.png"), d.join("b.png"));
|
||||
ok(bin().arg("convert").arg(&a).arg(&pa));
|
||||
|
||||
@@ -186,7 +186,7 @@ pub fn quad_size(q: &[[f64; 2]; 4]) -> (f64, f64) {
|
||||
/// Mapping and Image Warping", 1989, §2.2.3) scaled to the rectangle. `None` when `q` isn't a
|
||||
/// [`convex_quad`] or the size isn't positive.
|
||||
pub fn quad_to_rect(q: &[[f64; 2]; 4], w: f64, h: f64) -> Option<Homography> {
|
||||
if !convex_quad(q) || !(w.is_finite() && h.is_finite() && w > 0.0 && h > 0.0) {
|
||||
if !(convex_quad(q) && w.is_finite() && h.is_finite() && w > 0.0 && h > 0.0) {
|
||||
return None;
|
||||
}
|
||||
Homography::rect_to_quad([0.0, 0.0, w, h], *q)?.inverse()
|
||||
|
||||
@@ -1228,7 +1228,20 @@ async fn convention_resources_are_live_json() {
|
||||
assert!(read("photocraft://document").await["document"].is_null());
|
||||
json_of(&call(&client, "doc_new", json!({"width":8,"height":6})).await);
|
||||
assert_eq!(read("photocraft://document").await["width"], 8);
|
||||
assert_eq!(read("photocraft://commands").await, json_of(&call(&client, "command_list", json!({})).await));
|
||||
// Edit › Purge › All is enabled while the process-wide effect, mask and stack caches hold
|
||||
// anything, and the other tests in this binary fill and purge those caches concurrently, so
|
||||
// its `enabled` flag can flip between the two reads. Every other field must match exactly.
|
||||
let stable = |mut v: Value| {
|
||||
for c in v.as_array_mut().into_iter().flatten() {
|
||||
if c["id"] == "edit.purge.all" {
|
||||
c.as_object_mut().map(|o| o.remove("enabled"));
|
||||
}
|
||||
}
|
||||
v
|
||||
};
|
||||
let commands = stable(read("photocraft://commands").await);
|
||||
assert!(commands.as_array().is_some_and(|a| a.len() > 100), "{commands}");
|
||||
assert_eq!(commands, stable(json_of(&call(&client, "command_list", json!({})).await)));
|
||||
assert!(client.read_resource(rmcp::model::ReadResourceRequestParams::new("photocraft://missing")).await.is_err());
|
||||
let preview = call(&client, "render_preview", json!({"max_side":4})).await;
|
||||
assert!(preview.content.iter().any(|c| c.as_image().is_some()));
|
||||
|
||||
@@ -1624,10 +1624,10 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn destructive_levels_dont_clip_in_32_bit() {
|
||||
// Input 15..230, gamma 1.3, output 10..245: black and white land on the output range in
|
||||
// integer documents, but in a 32-bit document the curve runs on past it (then 0..1).
|
||||
// Input 15..230, gamma 1.3, output 10..245: integer documents stop at the output range,
|
||||
// while float documents preserve the curve's signed and HDR values beyond it.
|
||||
let params = json!({"inBlack": 15, "inWhite": 230, "gamma": 1.3, "outBlack": 10, "outWhite": 245});
|
||||
for (depth, low, high) in [(8, 10.0, 245.0), (16, 10.0, 245.0), (32, 0.0, 255.0)] {
|
||||
for depth in [8, 16, 32] {
|
||||
let mut s = crate::Session::new();
|
||||
s.execute("file.new", json!({"width": 16, "height": 16, "depth": depth, "background": "white"})).unwrap();
|
||||
s.execute("select.rect", json!({"x": 0, "y": 0, "width": 8, "height": 16})).unwrap();
|
||||
@@ -1635,8 +1635,13 @@ mod tests {
|
||||
s.execute("select.deselect", json!({})).unwrap();
|
||||
s.execute("image.adjustments.levels", params.clone()).unwrap();
|
||||
let px = pixels(&s);
|
||||
assert!((px[0][0] * 255.0 - low).abs() < 0.6, "black @{depth}: {:?}", px[0]);
|
||||
assert!((px[1][0] * 255.0 - high).abs() < 0.6, "white @{depth}: {:?}", px[1]);
|
||||
if depth == 32 {
|
||||
assert!(px[0][0].is_finite() && px[0][0] < 0.0, "float black keeps its signed result: {:?}", px[0]);
|
||||
assert!(px[1][0].is_finite() && px[1][0] > 1.0, "float white keeps its HDR result: {:?}", px[1]);
|
||||
} else {
|
||||
assert!((px[0][0] * 255.0 - 10.0).abs() < 0.6, "black @{depth}: {:?}", px[0]);
|
||||
assert!((px[1][0] * 255.0 - 245.0).abs() < 0.6, "white @{depth}: {:?}", px[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -125,10 +125,10 @@ pub(crate) fn fix_view(st: &mut DocState) {
|
||||
match v.target {
|
||||
ChannelTarget::Alpha(i) if i >= n => v.target = ChannelTarget::Composite,
|
||||
ChannelTarget::Color(k) if k >= colors || colors < 2 => v.target = ChannelTarget::Composite,
|
||||
ChannelTarget::LayerMask if !st.active_layer.and_then(|id| st.doc.layer(id)).is_some_and(|l| l.mask.is_some()) => {
|
||||
ChannelTarget::LayerMask if st.active_layer.and_then(|id| st.doc.layer(id)).is_none_or(|l| l.mask.is_none()) => {
|
||||
v.target = ChannelTarget::Composite;
|
||||
}
|
||||
ChannelTarget::VectorMask if !st.active_layer.and_then(|id| st.doc.layer(id)).is_some_and(|l| l.vector_mask.is_some()) => {
|
||||
ChannelTarget::VectorMask if st.active_layer.and_then(|id| st.doc.layer(id)).is_none_or(|l| l.vector_mask.is_none()) => {
|
||||
v.target = ChannelTarget::Composite;
|
||||
}
|
||||
_ => {}
|
||||
|
||||
@@ -247,12 +247,7 @@ impl BrushContext {
|
||||
let small_reach2 = (rm + 0.75) * (rm + 0.75);
|
||||
// Keep ordinary computed tips separate from the feature loop, so their dense rows
|
||||
// can be vectorised without the per-pixel sampled-mask and stroke-depth branches.
|
||||
if mips.is_none()
|
||||
&& !small
|
||||
&& !(aliased && b.square)
|
||||
&& !noise
|
||||
&& !tex_tip
|
||||
&& !wet
|
||||
if !(mips.is_some() || small || (aliased && b.square) || noise || tex_tip || wet)
|
||||
&& depth.is_none()
|
||||
&& proj.is_none()
|
||||
&& d.angle == 0.0
|
||||
|
||||
@@ -3430,18 +3430,11 @@ cameraRaw Vibrance Živost
|
||||
cameraRaw Whites Bílé
|
||||
layerLabel No Color Žádná barva
|
||||
Loading fonts… Načítání písem…
|
||||
Tool Nástroj
|
||||
Simulate Pressure Simulovat přítlak
|
||||
Stroke Path… Vytáhnout cestu…
|
||||
Background Eraser Guma pozadí
|
||||
Clone Stamp Klonovací razítko
|
||||
Healing Brush Retušovací štětec
|
||||
Spot Healing Brush Bodový retušovací štětec
|
||||
History Brush Štětec historie
|
||||
Smudge Rozmazání
|
||||
Dodge Zesvětlení
|
||||
Burn Ztmavení
|
||||
Sponge Houba
|
||||
Amount: Míra:
|
||||
Protect: Chránit:
|
||||
Protect skin tones Chránit tóny pleti
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -2666,3 +2666,18 @@ curves Smooth Glätten
|
||||
Apply mask to layer before removing? Maske vor dem Entfernen auf die Ebene anwenden?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. Die Ebene oder ihre Maske hat sich geändert. Ziehen Sie die Maske erneut in den Papierkorb.
|
||||
Delete the vector mask? Vektormaske löschen?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} {n} Farbfeld nach {file} exportiert|{n} Farbfelder nach {file} exportiert
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} {n} Pinsel aus {group} importiert|{n} Pinsel aus {group} importiert
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} {n} Farbfeld aus {file} importiert|{n} Farbfelder aus {file} importiert
|
||||
@plural Played {n} step|Played {n} steps {n} Schritt wiedergegeben|{n} Schritte wiedergegeben
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk {n} verknüpftes Smart-Objekt aktualisiert, das auf dem Datenträger geändert wurde|{n} verknüpfte Smart-Objekte aktualisiert, die auf dem Datenträger geändert wurden
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Für Web gespeichert: {n} Datei|Für Web gespeichert: {n} Dateien
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. {n} von dieser Komposition erfasste Ebene wurde gelöscht. Aktualisiere die Komposition oder lösche die Warnung.|{n} von dieser Komposition erfasste Ebenen wurden gelöscht. Aktualisiere die Komposition oder lösche die Warnung.
|
||||
@plural {n} plane|{n} planes {n} Fläche|{n} Flächen
|
||||
@plural {n} preset|{n} presets {n} Vorgabe|{n} Vorgaben
|
||||
@plural {n} sample point removed|{n} sample points removed {n} Messpunkt entfernt|{n} Messpunkte entfernt
|
||||
@plural {n} slice|{n} slices {n} Slice|{n} Slices
|
||||
@plural {n} step|{n} steps {n} Schritt|{n} Schritte
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} weitere Pinselvorgaben-Warnung)|{warning} (+{n} weitere Pinselvorgaben-Warnungen)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} mit {n} Warnung|{what} mit {n} Warnungen
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -3724,3 +3724,18 @@ curves Smooth Εξομάλυνση
|
||||
Apply mask to layer before removing? Εφαρμογή της μάσκας στο επίπεδο πριν από την αφαίρεση;
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. Το επίπεδο ή η μάσκα του άλλαξε. Σύρετε ξανά τη μάσκα στον Κάδο.
|
||||
Delete the vector mask? Διαγραφή της διανυσματικής μάσκας;
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} Εξήχθη {n} δείγμα χρώματος στο {file}|Εξήχθησαν {n} δείγματα χρωμάτων στο {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} Εισήχθη {n} πινέλο από την ομάδα {group}|Εισήχθησαν {n} πινέλα από την ομάδα {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} Εισήχθη {n} δείγμα χρώματος από το {file}|Εισήχθησαν {n} δείγματα χρωμάτων από το {file}
|
||||
@plural Played {n} step|Played {n} steps Αναπαράχθηκε {n} βήμα|Αναπαράχθηκαν {n} βήματα
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk Ενημερώθηκε {n} συνδεδεμένο έξυπνο αντικείμενο που άλλαξε στον δίσκο|Ενημερώθηκαν {n} συνδεδεμένα έξυπνα αντικείμενα που άλλαξαν στον δίσκο
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Αποθήκευση για Web: {n} αρχείο|Αποθήκευση για Web: {n} αρχεία
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. Διαγράφηκε {n} επίπεδο που καταγράφει αυτή η σύνθεση. Ενημερώστε τη σύνθεση ή καταργήστε την προειδοποίηση.|Διαγράφηκαν {n} επίπεδα που καταγράφει αυτή η σύνθεση. Ενημερώστε τη σύνθεση ή καταργήστε την προειδοποίηση.
|
||||
@plural {n} plane|{n} planes {n} επίπεδο προοπτικής|{n} επίπεδα προοπτικής
|
||||
@plural {n} preset|{n} presets {n} προεπιλογή|{n} προεπιλογές
|
||||
@plural {n} sample point removed|{n} sample points removed Αφαιρέθηκε {n} σημείο δειγματοληψίας|Αφαιρέθηκαν {n} σημεία δειγματοληψίας
|
||||
@plural {n} slice|{n} slices {n} τομή|{n} τομές
|
||||
@plural {n} step|{n} steps {n} βήμα|{n} βήματα
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} ακόμη προειδοποίηση προεπιλογών πινέλων)|{warning} (+{n} ακόμη προειδοποιήσεις προεπιλογών πινέλων)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} με {n} προειδοποίηση|{what} με {n} προειδοποιήσεις
|
||||
|
Can't render this file because it contains an unexpected character in line 1000 and column 18.
|
@@ -2707,3 +2707,18 @@ curves Smooth Suavizar
|
||||
Apply mask to layer before removing? ¿Aplicar la máscara a la capa antes de eliminarla?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. La capa o su máscara ha cambiado. Arrastre de nuevo la máscara a la papelera.
|
||||
Delete the vector mask? ¿Eliminar la máscara vectorial?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} Se exportó {n} muestra a {file}|Se exportaron {n} muestras a {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} Se importó {n} pincel de {group}|Se importaron {n} pinceles de {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} Se importó {n} muestra de {file}|Se importaron {n} muestras de {file}
|
||||
@plural Played {n} step|Played {n} steps Se reprodujo {n} paso|Se reprodujeron {n} pasos
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk Se actualizó {n} objeto inteligente enlazado modificado en el disco|Se actualizaron {n} objetos inteligentes enlazados modificados en el disco
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Guardado para Web: {n} archivo|Guardado para Web: {n} archivos
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. Se eliminó {n} capa registrada por esta composición. Actualice la composición o borre la advertencia.|Se eliminaron {n} capas registradas por esta composición. Actualice la composición o borre la advertencia.
|
||||
@plural {n} plane|{n} planes {n} plano|{n} planos
|
||||
@plural {n} preset|{n} presets {n} ajuste preestablecido|{n} ajustes preestablecidos
|
||||
@plural {n} sample point removed|{n} sample points removed Se quitó {n} punto de muestreo|Se quitaron {n} puntos de muestreo
|
||||
@plural {n} slice|{n} slices {n} sector|{n} sectores
|
||||
@plural {n} step|{n} steps {n} paso|{n} pasos
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} advertencia más de ajustes preestablecidos de pincel)|{warning} (+{n} advertencias más de ajustes preestablecidos de pincel)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} con {n} advertencia|{what} con {n} advertencias
|
||||
|
Can't render this file because it contains an unexpected character in line 4 and column 47.
|
@@ -2698,3 +2698,18 @@ curves Smooth Leviga
|
||||
Apply mask to layer before removing? Applicare la maschera al livello prima di rimuoverla?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. Il livello o la sua maschera è cambiato. Trascina di nuovo la maschera nel cestino.
|
||||
Delete the vector mask? Eliminare la maschera vettoriale?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} {n} campione esportato in {file}|{n} campioni esportati in {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} {n} pennello importato da {group}|{n} pennelli importati da {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} {n} campione importato da {file}|{n} campioni importati da {file}
|
||||
@plural Played {n} step|Played {n} steps {n} passaggio riprodotto|{n} passaggi riprodotti
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk {n} oggetto avanzato collegato modificato su disco aggiornato|{n} oggetti avanzati collegati modificati su disco aggiornati
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Salvato per il Web: {n} file|Salvato per il Web: {n} file
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. {n} livello registrato da questa composizione è stato eliminato. Aggiorna la composizione o cancella l'avviso.|{n} livelli registrati da questa composizione sono stati eliminati. Aggiorna la composizione o cancella l'avviso.
|
||||
@plural {n} plane|{n} planes {n} piano|{n} piani
|
||||
@plural {n} preset|{n} presets {n} predefinito|{n} predefiniti
|
||||
@plural {n} sample point removed|{n} sample points removed {n} punto di campionamento rimosso|{n} punti di campionamento rimossi
|
||||
@plural {n} slice|{n} slices {n} sezione|{n} sezioni
|
||||
@plural {n} step|{n} steps {n} passaggio|{n} passaggi
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} altro avviso sui predefiniti pennello)|{warning} (+{n} altri avvisi sui predefiniti pennello)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} con {n} avviso|{what} con {n} avvisi
|
||||
|
Can't render this file because it contains an unexpected character in line 2589 and column 53.
|
@@ -3636,3 +3636,18 @@ curves Smooth スムーズ
|
||||
Apply mask to layer before removing? 削除する前にマスクをレイヤーに適用しますか?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. レイヤーまたはそのマスクが変更されました。もう一度マスクをゴミ箱にドラッグしてください。
|
||||
Delete the vector mask? ベクトルマスクを削除しますか?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} スウォッチ {n} 個を {file} に書き出しました
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} {group} からブラシ {n} 個を読み込みました
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} {file} からスウォッチ {n} 個を読み込みました
|
||||
@plural Played {n} step|Played {n} steps {n} ステップを再生しました
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk ディスク上で変更されたリンクされたスマートオブジェクト {n} 個を更新しました
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Web 用に保存: {n} ファイル
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. このカンプに記録されたレイヤー {n} 個が削除されました。カンプを更新するか、警告を消去してください。
|
||||
@plural {n} plane|{n} planes {n} 個の平面
|
||||
@plural {n} preset|{n} presets {n} 個のプリセット
|
||||
@plural {n} sample point removed|{n} sample points removed サンプルポイント {n} 個を削除しました
|
||||
@plural {n} slice|{n} slices {n} 個のスライス
|
||||
@plural {n} step|{n} steps {n} ステップ
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning}(ほかにブラシプリセットの警告 {n} 件)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what}(警告 {n} 件)
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -3786,3 +3786,18 @@ curves Smooth Vloeiend maken
|
||||
Apply mask to layer before removing? Masker toepassen op laag voordat het wordt verwijderd?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. De laag of het masker is gewijzigd. Sleep het masker opnieuw naar de prullenbak.
|
||||
Delete the vector mask? Het vectormasker verwijderen?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} {n} staal geëxporteerd naar {file}|{n} stalen geëxporteerd naar {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} {n} penseel geïmporteerd uit {group}|{n} penselen geïmporteerd uit {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} {n} staal geïmporteerd uit {file}|{n} stalen geïmporteerd uit {file}
|
||||
@plural Played {n} step|Played {n} steps {n} stap afgespeeld|{n} stappen afgespeeld
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk {n} gekoppeld slim object bijgewerkt dat op schijf is gewijzigd|{n} gekoppelde slimme objecten bijgewerkt die op schijf zijn gewijzigd
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Opgeslagen voor web: {n} bestand|Opgeslagen voor web: {n} bestanden
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. {n} laag die deze compositie vastlegt, is verwijderd. Werk de compositie bij of wis de waarschuwing.|{n} lagen die deze compositie vastlegt, zijn verwijderd. Werk de compositie bij of wis de waarschuwing.
|
||||
@plural {n} plane|{n} planes {n} vlak|{n} vlakken
|
||||
@plural {n} preset|{n} presets {n} voorinstelling|{n} voorinstellingen
|
||||
@plural {n} sample point removed|{n} sample points removed {n} steekproefpunt verwijderd|{n} steekproefpunten verwijderd
|
||||
@plural {n} slice|{n} slices {n} segment|{n} segmenten
|
||||
@plural {n} step|{n} steps {n} stap|{n} stappen
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} andere waarschuwing over penseelvoorinstellingen)|{warning} (+{n} andere waarschuwingen over penseelvoorinstellingen)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} met {n} waarschuwing|{what} met {n} waarschuwingen
|
||||
|
Can't render this file because it contains an unexpected character in line 8 and column 34.
|
@@ -3816,3 +3816,18 @@ layerLabel No Color Sem cor
|
||||
Apply mask to layer before removing? Aplicar a máscara à camada antes de removê-la?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. A camada ou a máscara mudou. Arraste a máscara para a Lixeira novamente.
|
||||
Delete the vector mask? Excluir a máscara vetorial?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} {n} amostra exportada para {file}|{n} amostras exportadas para {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} {n} pincel importado de {group}|{n} pincéis importados de {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} {n} amostra importada de {file}|{n} amostras importadas de {file}
|
||||
@plural Played {n} step|Played {n} steps {n} etapa reproduzida|{n} etapas reproduzidas
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk {n} objeto inteligente vinculado alterado no disco foi atualizado|{n} objetos inteligentes vinculados alterados no disco foram atualizados
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Salvo para Web: {n} arquivo|Salvo para Web: {n} arquivos
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. {n} camada registrada por esta composição foi excluída. Atualize a composição ou limpe o aviso.|{n} camadas registradas por esta composição foram excluídas. Atualize a composição ou limpe o aviso.
|
||||
@plural {n} plane|{n} planes {n} plano|{n} planos
|
||||
@plural {n} preset|{n} presets {n} predefinição|{n} predefinições
|
||||
@plural {n} sample point removed|{n} sample points removed {n} ponto de amostragem removido|{n} pontos de amostragem removidos
|
||||
@plural {n} slice|{n} slices {n} fatia|{n} fatias
|
||||
@plural {n} step|{n} steps {n} etapa|{n} etapas
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (+{n} outro aviso de predefinição de pincel)|{warning} (+{n} outros avisos de predefinição de pincel)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} com {n} aviso|{what} com {n} avisos
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -2971,3 +2971,18 @@ curves Smooth Сгладить
|
||||
Apply mask to layer before removing? Применить маску к слою перед удалением?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. Слой или его маска изменились. Перетащите маску в корзину ещё раз.
|
||||
Delete the vector mask? Удалить векторную маску?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} Экспортирован {n} образец в {file}|Экспортировано {n} образца в {file}|Экспортировано {n} образцов в {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} Импортирована {n} кисть из {group}|Импортировано {n} кисти из {group}|Импортировано {n} кистей из {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} Импортирован {n} образец из {file}|Импортировано {n} образца из {file}|Импортировано {n} образцов из {file}
|
||||
@plural Played {n} step|Played {n} steps Воспроизведён {n} шаг|Воспроизведено {n} шага|Воспроизведено {n} шагов
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk Обновлён {n} связанный смарт-объект, изменённый на диске|Обновлено {n} связанных смарт-объекта, изменённых на диске|Обновлено {n} связанных смарт-объектов, изменённых на диске
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Сохранено для Web: {n} файл|Сохранено для Web: {n} файла|Сохранено для Web: {n} файлов
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. Удалён {n} слой, записанный в этом варианте. Обновите вариант или сбросьте предупреждение.|Удалено {n} слоя, записанных в этом варианте. Обновите вариант или сбросьте предупреждение.|Удалено {n} слоёв, записанных в этом варианте. Обновите вариант или сбросьте предупреждение.
|
||||
@plural {n} plane|{n} planes {n} плоскость|{n} плоскости|{n} плоскостей
|
||||
@plural {n} preset|{n} presets {n} набор|{n} набора|{n} наборов
|
||||
@plural {n} sample point removed|{n} sample points removed Удалена {n} точка замера|Удалено {n} точки замера|Удалено {n} точек замера
|
||||
@plural {n} slice|{n} slices {n} фрагмент|{n} фрагмента|{n} фрагментов
|
||||
@plural {n} step|{n} steps {n} шаг|{n} шага|{n} шагов
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (и ещё {n} предупреждение о наборах кистей)|{warning} (и ещё {n} предупреждения о наборах кистей)|{warning} (и ещё {n} предупреждений о наборах кистей)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what}: {n} предупреждение|{what}: {n} предупреждения|{what}: {n} предупреждений
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -3724,3 +3724,18 @@ curves Smooth Згладити
|
||||
Apply mask to layer before removing? Застосувати маску до шару перед видаленням?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. Шар або його маска змінилися. Перетягніть маску до кошика ще раз.
|
||||
Delete the vector mask? Видалити векторну маску?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} Експортовано {n} зразок кольору до {file}|Експортовано {n} зразки кольорів до {file}|Експортовано {n} зразків кольорів до {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} Імпортовано {n} пензель з {group}|Імпортовано {n} пензлі з {group}|Імпортовано {n} пензлів з {group}
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} Імпортовано {n} зразок кольору з {file}|Імпортовано {n} зразки кольорів з {file}|Імпортовано {n} зразків кольорів з {file}
|
||||
@plural Played {n} step|Played {n} steps Відтворено {n} крок|Відтворено {n} кроки|Відтворено {n} кроків
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk Оновлено {n} пов'язаний смартоб'єкт, змінений на диску|Оновлено {n} пов'язані смартоб'єкти, змінені на диску|Оновлено {n} пов'язаних смартоб'єктів, змінених на диску
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files Збережено для вебу: {n} файл|Збережено для вебу: {n} файли|Збережено для вебу: {n} файлів
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. Видалено {n} шар, записаний у цій композиції. Оновіть композицію або скиньте попередження.|Видалено {n} шари, записані в цій композиції. Оновіть композицію або скиньте попередження.|Видалено {n} шарів, записаних у цій композиції. Оновіть композицію або скиньте попередження.
|
||||
@plural {n} plane|{n} planes {n} площина|{n} площини|{n} площин
|
||||
@plural {n} preset|{n} presets {n} набір|{n} набори|{n} наборів
|
||||
@plural {n} sample point removed|{n} sample points removed Вилучено {n} точку вимірювання|Вилучено {n} точки вимірювання|Вилучено {n} точок вимірювання
|
||||
@plural {n} slice|{n} slices {n} фрагмент|{n} фрагменти|{n} фрагментів
|
||||
@plural {n} step|{n} steps {n} крок|{n} кроки|{n} кроків
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (і ще {n} попередження щодо наборів пензлів)|{warning} (і ще {n} попередження щодо наборів пензлів)|{warning} (і ще {n} попереджень щодо наборів пензлів)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what}: {n} попередження|{what}: {n} попередження|{what}: {n} попереджень
|
||||
|
Can't render this file because it contains an unexpected character in line 1356 and column 18.
|
@@ -2616,3 +2616,18 @@ curves Smooth 平滑
|
||||
Apply mask to layer before removing? 移除之前將遮色片套用到圖層嗎?
|
||||
The layer or its mask changed. Drag the mask onto the Trash again. 圖層或其遮色片已變更。請再次將遮色片拖曳到垃圾桶。
|
||||
Delete the vector mask? 要刪除向量遮色片嗎?
|
||||
# Counted status messages and labels (#3454; adapted from PR #3821)
|
||||
@plural Exported {n} swatch to {file}|Exported {n} swatches to {file} 已將 {n} 個色票匯出至 {file}
|
||||
@plural Imported {n} brush from {group}|Imported {n} brushes from {group} 已從 {group} 匯入 {n} 個筆刷
|
||||
@plural Imported {n} swatch from {file}|Imported {n} swatches from {file} 已從 {file} 匯入 {n} 個色票
|
||||
@plural Played {n} step|Played {n} steps 已播放 {n} 個步驟
|
||||
@plural Updated {n} linked smart object changed on disk|Updated {n} linked smart objects changed on disk 已更新 {n} 個在磁碟上變更的連結智慧型物件
|
||||
@plural Saved for Web: {n} file|Saved for Web: {n} files 儲存為網頁用:{n} 個檔案
|
||||
@plural {n} layer recorded by this comp was deleted. Update the comp, or clear the warning.|{n} layers recorded by this comp were deleted. Update the comp, or clear the warning. 此構圖記錄的 {n} 個圖層已刪除。請更新構圖,或清除警告。
|
||||
@plural {n} plane|{n} planes {n} 個平面
|
||||
@plural {n} preset|{n} presets {n} 個預設集
|
||||
@plural {n} sample point removed|{n} sample points removed 已移除 {n} 個取樣點
|
||||
@plural {n} slice|{n} slices {n} 個切片
|
||||
@plural {n} step|{n} steps {n} 個步驟
|
||||
@plural {warning} (+{n} more brush preset warning)|{warning} (+{n} more brush preset warnings) {warning} (另有 {n} 個筆刷預設集警告)
|
||||
@plural {what} with {n} warning|{what} with {n} warnings {what} ({n} 個警告)
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -185,9 +185,11 @@ fn plural_keys(sources: &[(PathBuf, String)]) -> BTreeSet<Key> {
|
||||
rest = rest.get(at + 4..).unwrap_or("");
|
||||
let Some(end) = call_end(rest) else { break };
|
||||
let args = rest.get(..end).unwrap_or("");
|
||||
// `trn(lang, n, one, other)`: the forms are the last two literals, so a string in the
|
||||
// count expression (`r["files"].len()`) is not mistaken for one.
|
||||
let forms = quoted_strings(args);
|
||||
if forms.len() >= 2 {
|
||||
keys.insert(Key { context: "@plural".into(), source: format!("{}|{}", forms[0], forms[1]) });
|
||||
if let [.., one, other] = forms.as_slice() {
|
||||
keys.insert(Key { context: "@plural".into(), source: format!("{one}|{other}") });
|
||||
}
|
||||
rest = rest.get(end + 1..).unwrap_or("");
|
||||
}
|
||||
@@ -543,6 +545,11 @@ mod tests {
|
||||
fn plural_keys_come_from_source_calls() {
|
||||
let sources = vec![(PathBuf::from("ui.rs"), r#"trn(lang, count, "{n} layer", "{n} layers");"#.into())];
|
||||
assert!(plural_keys(&sources).contains(&Key { context: "@plural".into(), source: "{n} layer|{n} layers".into() }));
|
||||
// A string literal in the count expression is not one of the forms.
|
||||
let sources = vec![(PathBuf::from("ui.rs"), r#"trn(lang, r["files"].len() as u64, "{n} file", "{n} files");"#.into())];
|
||||
let keys = plural_keys(&sources);
|
||||
assert!(keys.contains(&Key { context: "@plural".into(), source: "{n} file|{n} files".into() }), "{keys:?}");
|
||||
assert_eq!(keys.len(), 1, "{keys:?}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in new issue
Block a user