| 1 | # Slides' English catalog. Every user-visible string this app writes is |
| 2 | # a key here, never a literal in a template or a handler, resolved |
| 3 | # through rastrillo.T at render time. |
| 4 | # |
| 5 | # Flat TOML, one key per line, dotted names grouped by screen — the |
| 6 | # format rastrillo.Options.LocaleFS reads as locales/<code>.toml. |
| 7 | # Adding a language means adding a file beside this one with the same |
| 8 | # keys; nothing else in the app has to change. |
| 9 | |
| 10 | # slides.signin.* — GET /signin (auth.go's signin handler): the errors |
| 11 | # estilo's sign-in door shows, on the way back from rastrillo/auth, for |
| 12 | # whichever outcome it was redirected here with |
| 13 | # (?err=rate|address|expired|keymail|removed|refused|1), and the card |
| 14 | # between the form and Keymail (slides.signin.keymail.*), and the line on the |
| 15 | # confirm step an emailed link opens on (slides.signin.confirm.lede, under |
| 16 | # the door's own "Sign in" heading and button). The door's own words |
| 17 | # (form, check-your-email, signed out) are estilo's chrome.English, not |
| 18 | # keys here, so no app can drift from the others (shared chrome spec §9.2). |
| 19 | # |
| 20 | # error.unknown covers both the keymail outcome and a bare failure: |
| 21 | # rastrillo/auth's Verify deliberately answers the same way for an |
| 22 | # unknown, a used and an expired token, so there is no finer |
| 23 | # distinction for this page to draw — and every outcome on this screen |
| 24 | # means one operational thing, "ask for a new link". |
| 25 | slides.signin.error.rate = "Too many attempts. Wait a few minutes, then try again." |
| 26 | slides.signin.error.address = "That doesn’t look like an email address." |
| 27 | slides.signin.error.expired = "That link has expired or was already used. Enter your email to get a new one." |
| 28 | slides.signin.error.unknown = "We couldn’t sign you in. Enter your email to get a new link." |
| 29 | slides.signin.error.removed = "Your access has been removed, so you’ve been signed out. Ask whoever runs this team if that’s wrong." |
| 30 | slides.signin.error.refused = "That address can’t sign in to Slides. Use a different address, or ask whoever runs this team to add it." |
| 31 | slides.signin.confirm.lede = "Select Sign in to finish signing in." |
| 32 | slides.signin.keymail.title = "Continue signing in" |
| 33 | slides.signin.keymail.body = "Taking you to Keymail to finish signing in." |
| 34 | slides.signin.keymail.action = "Continue to Keymail" |
| 35 | |
| 36 | # slides.chrome.* — estilo's shared bar and account menu (chrome.go). |
| 37 | slides.chrome.skip = "Skip to content" |
| 38 | slides.chrome.menu = "Menu" |
| 39 | slides.chrome.signin = "Sign in" |
| 40 | slides.chrome.account = "Account" |
| 41 | slides.chrome.account.who = "Account: {address}" |
| 42 | slides.chrome.signed_in_as = "Signed in as" |
| 43 | slides.chrome.appearance = "Appearance" |
| 44 | slides.chrome.appearance.light = "Light" |
| 45 | slides.chrome.appearance.dark = "Dark" |
| 46 | slides.chrome.appearance.system = "System" |
| 47 | slides.chrome.switcher = "Oficina apps" |
| 48 | slides.chrome.switcher.current = "(this app)" |
| 49 | slides.chrome.switcher.all = "All apps" |
| 50 | |
| 51 | # slides.error.* — the error page (errors.go), shared chrome spec §3.2. |
| 52 | # title is the <title>'s first part; heading the page's h1. |
| 53 | slides.error.404.title = "Page not found" |
| 54 | slides.error.404.heading = "We can’t find that page" |
| 55 | slides.error.404.body = "The link may be out of date, or the page may have moved." |
| 56 | slides.error.deck.title = "Deck not available" |
| 57 | slides.error.deck.heading = "This deck isn’t available" |
| 58 | slides.error.deck.body = "It may have been deleted, or it hasn’t been shared with you." |
| 59 | slides.error.403.title = "No access" |
| 60 | slides.error.403.heading = "You don’t have access to this page" |
| 61 | slides.error.403.body = "Ask whoever runs this team if you think you should." |
| 62 | slides.error.422.title = "That didn’t work" |
| 63 | slides.error.422.heading = "That didn’t work" |
| 64 | slides.error.422.body = "Go back and try again." |
| 65 | slides.error.500.title = "Something went wrong" |
| 66 | slides.error.500.heading = "Something went wrong" |
| 67 | slides.error.500.body = "Try again in a moment. If it keeps happening, quote the reference below." |
| 68 | slides.error.503.title = "Slides is unavailable" |
| 69 | slides.error.503.heading = "Slides is unavailable right now" |
| 70 | slides.error.503.body = "Try again in a few minutes." |
| 71 | slides.error.home = "Go to Slides" |
| 72 | slides.error.again = "Try again" |
| 73 | slides.error.ref = "Reference:" |
| 74 | slides.error.back = "Back" |
| 75 | |
| 76 | # slides.decks.* — GET /, the deck list, and GET /decks/new. Title is |
| 77 | # the screen's noun, per page-header's own contract ("Decks", not |
| 78 | # "Home"). |
| 79 | # |
| 80 | # The empty state is a designed screen, not a blank page: it says what |
| 81 | # this screen is for rather than only that there is nothing on it. In |
| 82 | # practice a new person never sees it — their first sign-in seeds a |
| 83 | # sample deck — so it is what somebody meets after deleting the last |
| 84 | # deck they had, which is exactly when a screen should say what it is |
| 85 | # for. |
| 86 | slides.decks.title = "Decks" |
| 87 | slides.decks.empty.title = "No decks yet" |
| 88 | slides.decks.empty.body = "A deck is a set of slides you write, present and share. Start one and it will show up here." |
| 89 | slides.decks.new = "New deck" |
| 90 | slides.decks.new.body = "Give it a name and a look. Both are easy to change later." |
| 91 | slides.decks.new.submit = "Create deck" |
| 92 | |
| 93 | # A list row's meta line: how many slides, and when it last changed. |
| 94 | # Two keys for the count because English has two forms and the catalog |
| 95 | # has no plural machinery — the handler picks (decks.go's rowSub). |
| 96 | slides.decks.row.slides.one = "1 slide" |
| 97 | slides.decks.row.slides = "{n} slides" |
| 98 | slides.decks.row.sub = "{slides} · edited {when}" |
| 99 | # The same line for a deck whose document would not open: the time is |
| 100 | # still true, and a slide count would be a guess. |
| 101 | slides.decks.row.sub.plain = "edited {when}" |
| 102 | # Who made that last change (spec §6.2's actor). A person is their |
| 103 | # address; an agent is the robot mark and its principal, so a deck a |
| 104 | # program has been editing says so on the row rather than only in a |
| 105 | # history nobody opens. |
| 106 | slides.decks.row.by = "{sub} · by {who}" |
| 107 | |
| 108 | # slides.when.* — day-grained relative time. A deck list is scanned for |
| 109 | # which deck, never for what minute, so nothing here is finer than a |
| 110 | # day, and past a week the date itself is easier to read than a count. |
| 111 | slides.when.today = "today" |
| 112 | slides.when.yesterday = "yesterday" |
| 113 | slides.when.days = "{n} days ago" |
| 114 | slides.when.on = "on {date}" |
| 115 | |
| 116 | # slides.deck.* — one deck: its own page, its settings, its deletion. |
| 117 | # |
| 118 | # slide is the fallback name for a slide with no heading of its own — |
| 119 | # what the filmstrip and the notes page call it when there is nothing |
| 120 | # better to call it (viewer.go's slideLabel). |
| 121 | slides.deck.settings = "Deck settings" |
| 122 | slides.deck.settings.submit = "Save settings" |
| 123 | slides.deck.back = "Back to the deck" |
| 124 | slides.deck.slide = "Slide {n}" |
| 125 | slides.deck.title.label = "Title" |
| 126 | slides.deck.title.required = "Give the deck a title." |
| 127 | slides.deck.theme.label = "Theme" |
| 128 | slides.deck.theme.invalid = "Pick one of the themes listed." |
| 129 | slides.deck.rung.legend = "Who can open this deck" |
| 130 | slides.deck.rung.invalid = "Pick who can open this deck." |
| 131 | |
| 132 | # Deleting: its own page, its own question. The title names the deck, |
| 133 | # because "Delete this deck?" on a page you reached by accident is a |
| 134 | # question you cannot answer. |
| 135 | slides.deck.delete = "Delete this deck" |
| 136 | slides.deck.delete.lead = "Deleting a deck removes it and everything written in it. Nobody else can open it afterwards, including people it was shared with." |
| 137 | slides.deck.delete.title = "Delete “{title}”?" |
| 138 | slides.deck.delete.body = "The slides, the speaker notes and the whole edit history go with it. This cannot be undone." |
| 139 | slides.deck.delete.confirm = "Delete the deck" |
| 140 | |
| 141 | # slides.rung.* — spec §5's sharing rungs, as a person reads them. Each |
| 142 | # is a short title plus the line that says who it leaves out; "Private" |
| 143 | # on its own does not. Only private and team are offered by a screen |
| 144 | # today, but a deck already on the granted rung still has to be |
| 145 | # labelled, so all three are here. |
| 146 | slides.rung.private = "Only me" |
| 147 | slides.rung.private.desc = "Nobody else on this instance can open it." |
| 148 | slides.rung.granted = "People I've named" |
| 149 | slides.rung.granted.desc = "Only the people who have been given access." |
| 150 | slides.rung.team = "Everyone here" |
| 151 | slides.rung.team.desc = "Anyone signed in to this instance can open and edit it." |
| 152 | |
| 153 | # slides.theme.* — the six themes, by name. The ids themselves |
| 154 | # (paper, ink, …) are identifiers and never rendered. |
| 155 | slides.theme.paper = "Paper" |
| 156 | slides.theme.ink = "Ink" |
| 157 | slides.theme.sunset = "Sunset" |
| 158 | slides.theme.forest = "Forest" |
| 159 | slides.theme.slate = "Slate" |
| 160 | slides.theme.candy = "Candy" |
| 161 | |
| 162 | # slides.cancel — leaving a form. One key, because it means the same |
| 163 | # thing on every screen that has one. |
| 164 | slides.cancel = "Cancel" |
| 165 | |
| 166 | # slides.account.* — the shell's account menu. |
| 167 | slides.account.agents = "Agents" |
| 168 | slides.account.signout = "Sign out" |
| 169 | |
| 170 | # slides.agents.* — GET/POST /agents, the tokens that let a program |
| 171 | # drive this person's decks (spec §7.1). |
| 172 | # |
| 173 | # The warning is stated before the button rather than in a help page, |
| 174 | # the share screen's rule: a token is genuinely useful and genuinely |
| 175 | # means a program can write everything you can write, and the person |
| 176 | # deciding should see both. |
| 177 | slides.agents.title = "Agents" |
| 178 | slides.agents.lead = "An agent is a program that edits your decks over the API — a coding assistant, a script, a bot. It gets its own token and its own name, and every change it makes is recorded under that name rather than yours." |
| 179 | slides.agents.warning.title = "What a token can do" |
| 180 | slides.agents.warning = "A token can read and change every deck you can, and start a presentation from any of them. It cannot mint another token, and it stops working the moment you revoke it." |
| 181 | slides.agents.create = "Create an agent" |
| 182 | slides.agents.name.label = "Name" |
| 183 | slides.agents.name.hint = "Lowercase letters, digits and hyphens, 2 to 32 characters — claude, codex, release-bot." |
| 184 | slides.agents.name.invalid = "Use 2 to 32 lowercase letters, digits or hyphens." |
| 185 | slides.agents.name.taken = "You already have an agent with that name. Revoke it first, or pick another name." |
| 186 | slides.agents.revoke = "Revoke" |
| 187 | # "Revoke" repeated down a list does not say which agent it revokes, |
| 188 | # so the button carries a full accessible name of its own. |
| 189 | slides.agents.revoke.aria = "Revoke {principal}" |
| 190 | slides.agents.active = "Active" |
| 191 | slides.agents.revoked = "Revoked" |
| 192 | slides.agents.empty.title = "No agents yet" |
| 193 | slides.agents.empty.body = "Nothing is driving your decks but you. Create an agent when you want a program to write slides on your behalf." |
| 194 | slides.agents.row.created = "Created {when}" |
| 195 | |
| 196 | # Shown once, at the moment of minting, because only the token's |
| 197 | # fingerprint is stored and there is nothing to show a second time. |
| 198 | slides.agents.new.title = "Copy this now — it is not shown again" |
| 199 | slides.agents.new.body = "Only a fingerprint of this token is stored, so it cannot be shown again. If you lose it, revoke the agent and create another." |
| 200 | slides.agents.new.label = "Agent token" |
| 201 | slides.agents.new.copy = "Select the whole field and copy it." |
| 202 | slides.agents.new.use = "Send it as: Authorization: Bearer <token> to {origin}/api/v1" |
| 203 | |
| 204 | # slides.error.generic is this app's one fallback error string: a |
| 205 | # failure with nowhere styled to land. Still a key, never a literal, |
| 206 | # even though it is plain text today. |
| 207 | slides.error.generic = "Something went wrong." |
| 208 | |
| 209 | # slides.viewer.* — GET /d/{sqid} and GET /s/{token}, the paged viewer. |
| 210 | # One slide per page, and every control on it named in words: the |
| 211 | # counter is text rather than a position in a scrollbar, and the pager's |
| 212 | # ends are text rather than a greyed-out shape. |
| 213 | slides.viewer.counter = "{n} of {total}" |
| 214 | slides.viewer.prev = "Previous slide" |
| 215 | slides.viewer.next = "Next slide" |
| 216 | slides.viewer.pager = "Slides" |
| 217 | slides.viewer.film = "All slides" |
| 218 | slides.viewer.tools = "This deck" |
| 219 | slides.viewer.notes = "Speaker notes" |
| 220 | slides.viewer.notes.page = "All notes" |
| 221 | slides.viewer.share = "Share" |
| 222 | slides.viewer.present = "Present" |
| 223 | slides.viewer.edit = "Edit" |
| 224 | # A link, not a form: the export asks a question first (with the notes |
| 225 | # or without), so the button opens the screen that asks it. |
| 226 | slides.viewer.export = "Export PDF" |
| 227 | # A deck whose document has nothing in it. Reachable today only after a |
| 228 | # document was emptied by something other than a screen, which is |
| 229 | # exactly when a page saying "not found" would read as data loss. |
| 230 | slides.viewer.empty.title = "No slides yet" |
| 231 | slides.viewer.empty.body = "This deck has no slides yet. Open the editor to add one." |
| 232 | slides.viewer.empty.body.link = "This deck has no slides yet." |
| 233 | |
| 234 | # slides.editor.* — GET /d/{sqid}/edit, the editor (editor.go). The |
| 235 | # status and link strings are rendered into data attributes on the page |
| 236 | # and shown by the bundle, which is why they are here and not in a JS |
| 237 | # file: the bundle carries no copy of its own. |
| 238 | slides.editor.menu = "Slide" |
| 239 | slides.editor.slide.new = "New slide" |
| 240 | slides.editor.slide.duplicate = "Duplicate slide" |
| 241 | slides.editor.undo = "Undo" |
| 242 | slides.editor.redo = "Redo" |
| 243 | slides.editor.strip = "Slides" |
| 244 | slides.editor.strip.current = "Current slide" |
| 245 | slides.editor.stage = "Stage" |
| 246 | slides.editor.empty.body = "This deck has no slides yet. Add the first one from the Slide menu." |
| 247 | slides.editor.inspector = "Inspector" |
| 248 | slides.editor.inspector.empty = "Select a block to see its settings." |
| 249 | slides.editor.status = "Save status" |
| 250 | slides.editor.status.saved = "Saved" |
| 251 | slides.editor.status.saving = "Saving…" |
| 252 | slides.editor.status.offline = "Offline, retrying" |
| 253 | slides.editor.status.failed = "Some changes could not be saved. Reload to continue." |
| 254 | slides.editor.status.error = "Couldn't load that slide. Check the connection and try again." |
| 255 | slides.editor.link.title = "Link" |
| 256 | slides.editor.link.url = "Address" |
| 257 | slides.editor.link.insert = "Insert link" |
| 258 | slides.editor.link.remove = "Remove link" |
| 259 | slides.editor.link.cancel = "Cancel" |
| 260 | slides.editor.noscript = "Editing needs scripts, which are off in this browser. You can still read the deck." |
| 261 | slides.editor.noscript.link = "Open the deck" |
| 262 | |
| 263 | # The strip's per-slide menu. "Slide actions" names the menu button, |
| 264 | # which otherwise shows only an icon; the items repeat the Slide |
| 265 | # section's commands so a slide can be reordered, copied or removed |
| 266 | # from where it is listed. |
| 267 | slides.editor.strip.actions = "Slide actions" |
| 268 | slides.editor.strip.reorder = "Drag to reorder, or press Alt with the up or down arrow." |
| 269 | |
| 270 | # Presence (spec §3.3): who else has this deck open, and where they |
| 271 | # are. Every one of these names the person — the colour of an avatar or |
| 272 | # an outline is a second way of saying it, never the only one. The |
| 273 | # arrivals and departures are the only presence a screen reader is |
| 274 | # interrupted for; moving around a deck is not announced. |
| 275 | slides.editor.presence.slide = "{name} is on this slide" |
| 276 | slides.editor.presence.block = "{name} is editing this block" |
| 277 | slides.editor.presence.more = "{n} more people on this slide" |
| 278 | slides.editor.presence.joined = "{name} opened this deck" |
| 279 | slides.editor.presence.left = "{name} closed this deck" |
| 280 | |
| 281 | # The desktop/phone switcher on the stage (spec §3.2). Three visible |
| 282 | # words, never icons alone: which view is on decides where an edit |
| 283 | # lands. |
| 284 | slides.editor.view = "View" |
| 285 | slides.editor.view.desktop = "Desktop" |
| 286 | slides.editor.view.phone = "Phone" |
| 287 | slides.editor.view.both = "Both" |
| 288 | slides.editor.view.phone.readonly = "Phone preview, read-only" |
| 289 | |
| 290 | # The inspector's three sections and the Blocks list. |
| 291 | slides.editor.inspector.deck = "Deck" |
| 292 | slides.editor.inspector.slide = "Slide" |
| 293 | slides.editor.inspector.block = "Block" |
| 294 | slides.editor.inspector.blocks = "Blocks on this slide" |
| 295 | slides.editor.inspector.blocks.none = "No blocks yet. Add one below." |
| 296 | |
| 297 | # Deck settings: every control is one set_meta. |
| 298 | slides.editor.deck.title = "Title" |
| 299 | slides.editor.deck.theme = "Theme" |
| 300 | slides.editor.deck.accent = "Accent colour" |
| 301 | slides.editor.deck.accent.reset = "Use the theme's accent" |
| 302 | # Unused images: the Deck section's list of assets no image block on any |
| 303 | # slide refers to any more. Removing one is `remove_asset`; the bytes |
| 304 | # stay in the object store, which is content-addressed and shared. |
| 305 | slides.editor.assets.unused = "Unused images" |
| 306 | slides.editor.assets.unused.none = "Every image is on a slide." |
| 307 | slides.editor.assets.remove = "Remove" |
| 308 | slides.editor.deck.font.heading = "Heading font" |
| 309 | slides.editor.deck.font.body = "Body font" |
| 310 | slides.editor.font.theme = "Theme's" |
| 311 | slides.editor.font.system = "System" |
| 312 | slides.editor.font.serif = "Serif" |
| 313 | slides.editor.font.mono = "Mono" |
| 314 | |
| 315 | # Slide settings: every control is one set_slide, and the structure |
| 316 | # buttons are add_slide, duplicate_slide, move_slide, remove_slide. |
| 317 | slides.editor.slide.layout = "Layout" |
| 318 | slides.editor.layout.flow = "Flow" |
| 319 | slides.editor.layout.flow.desc = "Blocks stack in the template's regions. Switching from canvas drops every box." |
| 320 | slides.editor.layout.canvas = "Canvas" |
| 321 | slides.editor.layout.canvas.desc = "Blocks sit where you put them. Switching from flow gives each block its region's box." |
| 322 | slides.editor.slide.template = "Template" |
| 323 | slides.editor.template.title = "Title" |
| 324 | slides.editor.template.title-body = "Title and body" |
| 325 | slides.editor.template.two-column = "Two columns" |
| 326 | slides.editor.template.section = "Section" |
| 327 | slides.editor.template.image-full = "Full image" |
| 328 | slides.editor.template.quote = "Quote" |
| 329 | slides.editor.template.blank = "Blank" |
| 330 | slides.editor.slide.background = "Background" |
| 331 | slides.editor.background.theme = "Theme's" |
| 332 | slides.editor.background.color = "A colour" |
| 333 | slides.editor.slide.background.color = "Background colour" |
| 334 | slides.editor.slide.transition = "Transition" |
| 335 | slides.editor.transition.none = "None" |
| 336 | slides.editor.transition.fade = "Fade" |
| 337 | slides.editor.slide.phone = "On a phone" |
| 338 | slides.editor.slide.phone.inherit = "Scale the canvas to fit" |
| 339 | slides.editor.slide.phone.reflow = "Reflow the blocks as a column" |
| 340 | slides.editor.slide.notes.show = "Show speaker notes" |
| 341 | slides.editor.slide.add = "Add slide after" |
| 342 | slides.editor.slide.move.up = "Move up" |
| 343 | slides.editor.slide.move.down = "Move down" |
| 344 | slides.editor.slide.delete = "Delete slide" |
| 345 | slides.editor.slide.delete.confirm = "Delete this slide? Undo brings it back." |
| 346 | slides.editor.slide.delete.cancel = "Keep it" |
| 347 | |
| 348 | # Blocks: the add menu lists the eleven types by name, and the same |
| 349 | # names label the Blocks list. |
| 350 | slides.editor.block.add = "Add block" |
| 351 | slides.editor.type.heading = "Heading" |
| 352 | slides.editor.type.text = "Text" |
| 353 | slides.editor.type.list = "List" |
| 354 | slides.editor.type.quote = "Quote" |
| 355 | slides.editor.type.image = "Image" |
| 356 | slides.editor.type.columns = "Columns" |
| 357 | slides.editor.type.code = "Code" |
| 358 | slides.editor.type.shape = "Shape" |
| 359 | slides.editor.type.table = "Table" |
| 360 | slides.editor.type.divider = "Divider" |
| 361 | slides.editor.type.spacer = "Spacer" |
| 362 | |
| 363 | # Block settings: every control is one set_block (or set_text for a |
| 364 | # shape's label), the position fields are set_block on the desktop and |
| 365 | # set_phone in the phone view, and the phone fields are set_phone. |
| 366 | slides.editor.block.level = "Level" |
| 367 | slides.editor.block.size = "Size" |
| 368 | slides.editor.size.s = "Small" |
| 369 | slides.editor.size.m = "Medium" |
| 370 | slides.editor.size.l = "Large" |
| 371 | slides.editor.block.align = "Alignment" |
| 372 | slides.editor.align.start = "Start" |
| 373 | slides.editor.align.center = "Centre" |
| 374 | slides.editor.align.end = "End" |
| 375 | slides.editor.block.style = "List style" |
| 376 | slides.editor.style.bullet = "Bullets" |
| 377 | slides.editor.style.number = "Numbers" |
| 378 | slides.editor.block.cite = "Citation" |
| 379 | slides.editor.block.fit = "Fit" |
| 380 | slides.editor.fit.cover = "Cover" |
| 381 | slides.editor.fit.contain = "Contain" |
| 382 | slides.editor.block.alt = "Alternative text" |
| 383 | slides.editor.block.decorative = "Decorative, no description needed" |
| 384 | # The image block's upload. The bundle reads these off data attributes |
| 385 | # and shows one at a time as the upload moves through choosing, putting |
| 386 | # and registering; the file input is disabled and nostore is what shows |
| 387 | # instead when this deployment has no object store bound. |
| 388 | slides.editor.block.image.file = "Image file" |
| 389 | slides.editor.block.image.hint = "PNG, JPEG, WebP or SVG, up to 20 MB." |
| 390 | slides.editor.block.image.nostore = "Uploading needs an object store. This deployment doesn't have one yet." |
| 391 | slides.editor.block.image.uploading = "Uploading…" |
| 392 | slides.editor.block.image.checking = "Checking the image…" |
| 393 | slides.editor.block.image.done = "Uploaded." |
| 394 | slides.editor.block.image.failed = "That upload didn't finish. Try again." |
| 395 | slides.editor.block.image.toolarge = "That file is bigger than 20 MB." |
| 396 | slides.editor.block.image.type = "Use a PNG, JPEG, WebP or SVG file." |
| 397 | slides.editor.block.image.altfirst = "Write the alternative text first, or mark the image decorative." |
| 398 | slides.editor.block.radius = "Corner radius" |
| 399 | slides.editor.block.count = "Number of columns" |
| 400 | slides.editor.block.language = "Language" |
| 401 | slides.editor.block.kind = "Shape" |
| 402 | slides.editor.kind.rect = "Rectangle" |
| 403 | slides.editor.kind.ellipse = "Ellipse" |
| 404 | slides.editor.kind.line = "Line" |
| 405 | slides.editor.kind.arrow = "Arrow" |
| 406 | slides.editor.block.fill = "Fill" |
| 407 | slides.editor.block.stroke = "Stroke" |
| 408 | slides.editor.block.strokeWidth = "Stroke width" |
| 409 | slides.editor.block.label = "Label" |
| 410 | slides.editor.block.rows = "Rows" |
| 411 | slides.editor.block.cols = "Columns" |
| 412 | slides.editor.block.header = "First row is a header" |
| 413 | slides.editor.block.region = "Region" |
| 414 | slides.editor.region.heading = "Heading" |
| 415 | slides.editor.region.body = "Body" |
| 416 | slides.editor.region.aside = "Aside" |
| 417 | slides.editor.region.media = "Media" |
| 418 | slides.editor.block.box = "Position and size, as a percentage of the frame" |
| 419 | slides.editor.box.x = "Left" |
| 420 | slides.editor.box.y = "Top" |
| 421 | slides.editor.box.w = "Width" |
| 422 | slides.editor.box.h = "Height" |
| 423 | slides.editor.block.forward = "Bring forward" |
| 424 | slides.editor.block.back = "Send back" |
| 425 | slides.editor.block.move.up = "Move up" |
| 426 | slides.editor.block.move.down = "Move down" |
| 427 | slides.editor.block.delete = "Delete block" |
| 428 | slides.editor.block.phone = "On a phone" |
| 429 | slides.editor.block.phone.hidden = "Hidden on a phone" |
| 430 | slides.editor.block.phone.order = "Order on a phone" |
| 431 | slides.editor.block.phone.size = "Size on a phone" |
| 432 | slides.editor.block.phone.same = "Same as the desktop" |
| 433 | slides.editor.block.phone.override = "Phone override" |
| 434 | slides.editor.block.phone.reset = "Reset to desktop" |
| 435 | |
| 436 | # The canvas overlay: the selected block's drag surface, named for a |
| 437 | # screen reader, with the keys said out loud. |
| 438 | slides.editor.canvas.selected = "Selected block. Arrow keys move it, Shift moves further, Alt resizes." |
| 439 | |
| 440 | # slides.notes.* — GET /d/{sqid}/notes, every slide's notes on one page. |
| 441 | slides.notes.title = "Speaker notes" |
| 442 | slides.notes.body = "Every slide's notes, in order. Print this, or keep it open on a second screen while you present." |
| 443 | slides.notes.none = "No notes on this slide." |
| 444 | |
| 445 | # slides.share.* — GET/POST /d/{sqid}/share, the deck's read-only links. |
| 446 | # |
| 447 | # The warning is stated before the button rather than in a help page: a |
| 448 | # share link is genuinely useful and genuinely means anyone who has it |
| 449 | # can read the deck, and the person deciding should see both. |
| 450 | slides.share.title = "Share links" |
| 451 | slides.share.lead = "A share link opens this deck read-only, with no sign-in. The slides are what it shows — never the speaker notes, and never the settings." |
| 452 | slides.share.warning.title = "What a share link does" |
| 453 | slides.share.warning = "Anyone who has the link can open this deck, including anyone it gets forwarded to. It shows the deck as it is now, so later edits are visible through it too. Revoke it and the URL stops working." |
| 454 | slides.share.create = "Create a share link" |
| 455 | slides.share.revoke = "Revoke" |
| 456 | # "Revoke" repeated down a list does not say which link it revokes, and |
| 457 | # a link has no name — the URL is shown once — so the date it was made |
| 458 | # is what the accessible name has to carry. |
| 459 | slides.share.revoke.aria = "Revoke the link created {when}" |
| 460 | slides.share.active = "Active" |
| 461 | slides.share.revoked = "Revoked" |
| 462 | slides.share.empty.title = "No share links" |
| 463 | slides.share.empty.body = "A link lets somebody read this deck without signing in. Nothing is shared until you make one." |
| 464 | |
| 465 | # Shown once, at the moment of minting, because only the link's |
| 466 | # fingerprint is stored and there is nothing to show a second time. |
| 467 | slides.share.new.title = "Copy this now — it is not shown again" |
| 468 | slides.share.new.body = "Only a fingerprint of this link is stored, so it cannot be shown again. If you lose it, revoke it and make another." |
| 469 | slides.share.new.label = "Share link" |
| 470 | slides.share.new.copy = "Select the whole field and copy it." |
| 471 | |
| 472 | # A link's row: when it was made, and how much it has been used. Three |
| 473 | # keys for the count because English has three shapes here and the |
| 474 | # catalog has no plural machinery — the handler picks (share.go). |
| 475 | slides.share.row.created = "Created {when}" |
| 476 | slides.share.row.views.none = "Never opened" |
| 477 | slides.share.row.views.one = "1 view" |
| 478 | slides.share.row.views = "{n} views" |
| 479 | |
| 480 | # slides.present.* — presenting (spec §3.4): the fullscreen surface, |
| 481 | # the presenter view, and the commands all three driving surfaces send. |
| 482 | # |
| 483 | # The blackout has two keys rather than one label that changes colour: |
| 484 | # what the button does next is the thing a person needs to know, and a |
| 485 | # room that is dark is not a state to signal with a tint. |
| 486 | slides.present.progress = "{n} / {total}" |
| 487 | slides.present.progress.label = "Where you are in the deck" |
| 488 | slides.present.next = "Next slide" |
| 489 | slides.present.prev = "Previous slide" |
| 490 | slides.present.next.label = "Coming next" |
| 491 | slides.present.current = "On screen now" |
| 492 | slides.present.blackout = "Black the screen" |
| 493 | slides.present.unblackout = "Show the screen" |
| 494 | slides.present.blacked = "The screen is blacked out." |
| 495 | slides.present.end = "End the presentation" |
| 496 | slides.present.notes.title = "Presenter view" |
| 497 | slides.present.stage = "Full screen" |
| 498 | slides.present.clock = "Time now" |
| 499 | slides.present.started = "Started {when}" |
| 500 | slides.present.elapsed = "Running {n} min" |
| 501 | |
| 502 | # A session that is over — ended, or past its twelve hours. A 410, and |
| 503 | # worded as one: the talk finished, which is a different thing from an |
| 504 | # address that was never real. |
| 505 | slides.present.over.title = "Presentation over" |
| 506 | slides.present.over.heading = "That presentation is over" |
| 507 | slides.present.over.body = "The talk it was showing has ended. Ask whoever presented it for the deck, or open it again from your own list." |
| 508 | |
| 509 | # Pairing a phone. Shown once, at the moment of pairing, because only |
| 510 | # a fingerprint of the key is stored — the share link's bargain, and |
| 511 | # the reason the body says what pressing Present again does. |
| 512 | slides.present.pair.title = "Use your phone as the remote" |
| 513 | slides.present.pair.body = "Scan this, or open the address and type the code and key. It is shown once: press Present again to pair a different phone, which retires this one." |
| 514 | slides.present.pair.code = "Pairing code" |
| 515 | slides.present.pair.url = "Remote address" |
| 516 | slides.present.pair.qr = "QR code for the remote, pairing code {code}" |
| 517 | |
| 518 | # slides.remote.* — the phone, and the page that pairs it. |
| 519 | slides.remote.title = "Remote" |
| 520 | slides.remote.pair.title = "Pair this phone" |
| 521 | slides.remote.pair.body = "Type the code from the presenter's screen and the key beside it. Scanning the QR fills both in." |
| 522 | slides.remote.pair.code = "Pairing code" |
| 523 | slides.remote.pair.code.hint = "Six characters, from the presenter's screen." |
| 524 | slides.remote.pair.token = "Remote key" |
| 525 | slides.remote.pair.token.hint = "The long string beside the code. The QR carries it for you." |
| 526 | slides.remote.pair.submit = "Open the remote" |
| 527 | slides.remote.pair.error = "That code and key do not go together. Check both, or scan the QR." |
| 528 | |
| 529 | # slides.follow.* — the audience, watching a live talk through a share |
| 530 | # link. Following is read-only: it moves with the presenter and never |
| 531 | # moves them. |
| 532 | slides.follow.offer = "Follow the presenter" |
| 533 | slides.follow.browse = "Browse on your own" |
| 534 | |
| 535 | # slides.live.* — the live-sync transport (live.go). These four are |
| 536 | # read by a script rather than by a person, so each is written for the |
| 537 | # person who WILL read it: whoever has the network tab open when |
| 538 | # something has gone wrong. Plain sentences, no codes, and never a |
| 539 | # reason the client cannot act on. |
| 540 | slides.live.error.badsince = "That cursor isn't a number. Reload the page." |
| 541 | slides.live.error.toolarge = "That change is too large to save in one piece." |
| 542 | slides.live.error.invalid = "This change couldn't be applied. Reload the page and try again." |
| 543 | slides.live.error.busy = "Somebody else saved at the same moment. Try again." |
| 544 | |
| 545 | # slides.assets.* — the three image endpoints (assets.go, spec §2.7). |
| 546 | # Read by the editor's bundle, which shows them beside the file input, |
| 547 | # so each says what happened and what to do about it. The machine- |
| 548 | # readable half of the same answer is a fixed identifier the bundle |
| 549 | # branches on ("no_store", "too_large", …) and is deliberately not a |
| 550 | # catalog key. |
| 551 | slides.assets.error.nostore = "This deployment has no object store, so images can't be uploaded yet." |
| 552 | slides.assets.error.invalid = "That upload request didn't make sense. Reload the page and try again." |
| 553 | slides.assets.error.type = "Images must be PNG, JPEG, WebP or SVG." |
| 554 | slides.assets.error.toolarge = "An image may be at most 20 MB." |
| 555 | slides.assets.error.missing = "Those bytes never arrived. Try the upload again." |
| 556 | slides.assets.error.notimage = "That file isn't a PNG, JPEG, WebP or SVG image." |
| 557 | slides.assets.error.svg = "That SVG carries something we can't make safe — a script, or a reference to another site." |
| 558 | slides.assets.error.altrequired = "An image needs alternative text unless it's marked decorative." |
| 559 | slides.assets.error.failed = "The image couldn't be stored. Try again." |
| 560 | |
| 561 | # slides.export.* — the PDF export (exports.go, spec §4.3): the little |
| 562 | # form that starts it, the status page it lands on, and everything the |
| 563 | # job may have to say to the person who pressed the button. |
| 564 | # |
| 565 | # The job's sentences are resolved from this catalog while the request |
| 566 | # is still here and carried into the goroutine (exportWords), because a |
| 567 | # job outlives the request and rastrillo.T reads the locale off one. So |
| 568 | # an export answers in the language of whoever started it, which is the |
| 569 | # only person who ever sees it. |
| 570 | # |
| 571 | # progress carries {n} and {total} and is filled in Go, one substitution |
| 572 | # per slide, for the same reason. |
| 573 | slides.export.title = "Export as PDF" |
| 574 | slides.export.body = "Every slide becomes a page, 16:9, with the text as real text you can search and copy." |
| 575 | slides.export.notes = "Add the speaker notes as pages of their own" |
| 576 | slides.export.submit = "Make the PDF" |
| 577 | slides.export.held = "The file is kept for an hour, then it goes. Make another whenever you like." |
| 578 | slides.export.job = "Exporting {title}" |
| 579 | slides.export.progress = "slide {n} of {total}" |
| 580 | slides.export.done = "The PDF is ready." |
| 581 | slides.export.download = "Download the PDF" |
| 582 | slides.export.again = "Export this deck again" |
| 583 | # What the deck looks like in the file, said before somebody finds it |
| 584 | # in a printed handout (§11's degrade loudly). Every line names the |
| 585 | # slide it is about. |
| 586 | slides.export.warnings = "Worth knowing" |
| 587 | slides.export.warnings.body = "The PDF is complete, but these are the places it doesn't match the deck on screen." |
| 588 | # The bytes were held in this process and the process no longer has |
| 589 | # them: the hour is up, or the instance was replaced under it. |
| 590 | slides.export.gone = "This export has expired. Make another one — it takes a few seconds." |
| 591 | slides.export.error.busy = "You already have several exports running. Wait for one to finish and try again." |
| 592 | slides.export.error.toomany = "This deck has more than {max} slides, which is more than one PDF will take." |
| 593 | slides.export.error.open = "This deck couldn't be opened. Try again in a moment." |
| 594 | slides.export.error.render = "The PDF couldn't be made. Try again, and tell us if it keeps happening." |
| 595 | slides.export.error.toobig = "This PDF is larger than we can hold. Export it without the notes, or split the deck." |
| 596 | slides.export.error.store = "The PDF was made but couldn't be stored. Try again." |
| 597 | |
| 598 | # slides.home.* — connect's account-connection pages. The hub is never |
| 599 | # named: it is "your Oficina account", and the verb is Connect (Paul's |
| 600 | # answer 3 to the shared chrome spec's §13). |
| 601 | slides.home.start_title = "Connect your Oficina account" |
| 602 | slides.home.start_body = "Use your Oficina account to sign in to this Slides account. Your decks and sharing settings stay as they are." |
| 603 | slides.home.start_action = "Connect" |
| 604 | slides.home.cancel_action = "Back" |
| 605 | slides.home.confirm_title = "Confirm account connection" |
| 606 | slides.home.confirm_body = "Connect the account below to the Oficina account you just signed in to." |
| 607 | slides.home.confirm_action = "Connect accounts" |
| 608 | slides.home.unknown_title = "Oficina account not connected" |
| 609 | slides.home.unknown_body = "Sign in to your existing Slides account, then connect your Oficina account from the account menu." |
| 610 | slides.home.local_action = "Sign in to your existing Slides account" |
| 611 | slides.home.failed_title = "Could not connect accounts" |
| 612 | slides.home.failed_body = "Return to Slides and start again." |
| 613 | slides.home.success_title = "Accounts connected" |
| 614 | slides.home.success_body = "You can now use your Oficina account to sign in to this Slides account." |
| 615 | slides.home.documents_action = "Back to Slides" |
| 616 | slides.home.menu_action = "Connect your Oficina account" |
| 617 | |
| 618 | slides.credits.title = "Open source" |
| 619 | slides.credits.help = "Help" |
| 620 | slides.credits.missing = "No notice file is included in this release." |
| 621 | |