- A GIF squares its pixels before the size, so an anamorphic source keeps
its shown shape (a 720x480 DVD at 16:9 was 480x320).
- An editor GIF of an HDR upload is tonemapped, as a clip GIF is.
- The length caps are judged in whole milliseconds: a range exactly at a
cap is no longer refused for a float hair over it.
- A GIF is made of a video only: an audio file is refused with its reason
and the editor offers no GIF for it.
- A GIF clip keeps no audio track: the track neither splits its cache key
nor fails it.
- The editor's GIF notes keep their live region mounted; one size reads
as one ("about 1 MB"), none is shown with nothing kept; the size choices
show their unit; a shared picture that fails to load says so.
- Copy: the two-sentence GIF notes keep their last stop (a copy-rule test
now holds it); the English warns of "only a still picture".
114 lines
4.8 KiB
TypeScript
114 lines
4.8 KiB
TypeScript
// The public /watch page's own strings. The page is opened by whoever got the link, signed out and
|
|
// with no app language preference, so it reads the browser's language against this small dict
|
|
// instead of loading the app's i18n (every locale of every area — half of what the page weighed).
|
|
|
|
const STR = {
|
|
en: {
|
|
loading: "Loading…",
|
|
gone: "This link is no longer available.",
|
|
goneHint: "It may have expired or been revoked by the owner.",
|
|
passwordTitle: "This video is password-protected",
|
|
passwordPlaceholder: "Enter password",
|
|
watch: "Watch",
|
|
wrong: "Wrong password.",
|
|
download: "Download",
|
|
file: "File",
|
|
links: "Links",
|
|
brand: "Shared via Siftlode",
|
|
repeat: "Repeat",
|
|
failed: "Couldn't load this link.",
|
|
failedHint: "Check your connection and try again.",
|
|
preparing: "This video is being prepared.",
|
|
preparingHint: "Try again in a few minutes.",
|
|
retry: "Try again",
|
|
tooMany: "Too many attempts. Try again in a few minutes.",
|
|
unlockFailed: "Couldn't check the password. Try again.",
|
|
crashTitle: "Something went wrong.",
|
|
crashHint: "Reload the page to try again.",
|
|
reload: "Reload",
|
|
passwordTitleFolder: "This folder is password-protected",
|
|
passwordTitleFile: "This file is password-protected",
|
|
open: "Open",
|
|
folderEmpty: "This folder is empty.",
|
|
play: "Play",
|
|
gifTip: "To share it in a chat, drag the downloaded file in: it plays everywhere.",
|
|
pictureFailed: "Couldn't load the picture.",
|
|
files: (n: number) => (n === 1 ? "1 file" : `${n} files`),
|
|
},
|
|
hu: {
|
|
loading: "Betöltés…",
|
|
gone: "Ez a link már nem elérhető.",
|
|
goneHint: "Lehet, hogy lejárt, vagy a tulajdonos visszavonta.",
|
|
passwordTitle: "Ez a videó jelszóval védett",
|
|
passwordPlaceholder: "Add meg a jelszót",
|
|
watch: "Megtekintés",
|
|
wrong: "Hibás jelszó.",
|
|
download: "Letöltés",
|
|
file: "Fájl",
|
|
links: "Linkek",
|
|
brand: "Megosztva a Siftlode-dal",
|
|
repeat: "Ismétlés",
|
|
failed: "Nem sikerült betölteni a linket.",
|
|
failedHint: "Ellenőrizd a kapcsolatot, és próbáld újra.",
|
|
preparing: "A videó előkészítése folyamatban.",
|
|
preparingHint: "Próbáld újra néhány perc múlva.",
|
|
retry: "Újrapróbálás",
|
|
tooMany: "Túl sok próbálkozás. Próbáld újra pár perc múlva.",
|
|
unlockFailed: "Nem sikerült ellenőrizni a jelszót. Próbáld újra.",
|
|
crashTitle: "Valami hiba történt.",
|
|
crashHint: "Töltsd újra az oldalt, és próbáld újra.",
|
|
reload: "Újratöltés",
|
|
passwordTitleFolder: "Ez a mappa jelszóval védett",
|
|
passwordTitleFile: "Ez a fájl jelszóval védett",
|
|
open: "Megnyitás",
|
|
folderEmpty: "Ez a mappa üres.",
|
|
play: "Lejátszás",
|
|
gifTip: "Csetbe a letöltött fájlt húzd be: az mindenhol mozog.",
|
|
pictureFailed: "Nem sikerült betölteni a képet.",
|
|
files: (n: number) => `${n} fájl`,
|
|
},
|
|
de: {
|
|
loading: "Wird geladen…",
|
|
gone: "Dieser Link ist nicht mehr verfügbar.",
|
|
goneHint: "Er ist möglicherweise abgelaufen oder wurde widerrufen.",
|
|
passwordTitle: "Dieses Video ist passwortgeschützt",
|
|
passwordPlaceholder: "Passwort eingeben",
|
|
watch: "Ansehen",
|
|
wrong: "Falsches Passwort.",
|
|
download: "Herunterladen",
|
|
file: "Datei",
|
|
links: "Links",
|
|
brand: "Geteilt über Siftlode",
|
|
repeat: "Wiederholen",
|
|
failed: "Der Link konnte nicht geladen werden.",
|
|
failedHint: "Prüfe deine Verbindung und versuche es erneut.",
|
|
preparing: "Dieses Video wird gerade vorbereitet.",
|
|
preparingHint: "Versuche es in ein paar Minuten erneut.",
|
|
retry: "Erneut versuchen",
|
|
tooMany: "Zu viele Versuche. Versuche es in ein paar Minuten erneut.",
|
|
unlockFailed: "Das Passwort konnte nicht geprüft werden. Versuche es erneut.",
|
|
crashTitle: "Etwas ist schiefgelaufen.",
|
|
crashHint: "Lade die Seite neu und versuche es erneut.",
|
|
reload: "Neu laden",
|
|
passwordTitleFolder: "Dieser Ordner ist passwortgeschützt",
|
|
passwordTitleFile: "Diese Datei ist passwortgeschützt",
|
|
open: "Öffnen",
|
|
folderEmpty: "Dieser Ordner ist leer.",
|
|
play: "Abspielen",
|
|
gifTip:
|
|
"Zum Teilen in einem Chat die heruntergeladene Datei hineinziehen: Sie läuft überall als Animation.",
|
|
pictureFailed: "Das Bild konnte nicht geladen werden.",
|
|
files: (n: number) => (n === 1 ? "1 Datei" : `${n} Dateien`),
|
|
},
|
|
} as const;
|
|
|
|
export const lang =
|
|
((navigator.language || "en").slice(0, 2) as keyof typeof STR) in STR
|
|
? ((navigator.language || "en").slice(0, 2) as keyof typeof STR)
|
|
: "en";
|
|
export const T = STR[lang];
|
|
|
|
// The document says the language its text is in: a screen reader picks its voice by it, and the
|
|
// browser offers to translate by it. watch.html can only ship one; this page picks its own.
|
|
document.documentElement.lang = lang;
|