mirror of
https://git.sr.ht/~phw/scotty
synced 2025-04-30 13:47:05 +02:00
Sync translations with new strings
This commit is contained in:
parent
90e101080f
commit
a5442b477e
6 changed files with 78 additions and 78 deletions
|
@ -88,7 +88,7 @@ func (c *TransferCmd[E, I, R]) resolveBackends(source string, target string) err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *TransferCmd[E, I, R]) Transfer(exp backends.ExportProcessor[R], imp backends.ImportProcessor[R]) error {
|
func (c *TransferCmd[E, I, R]) Transfer(exp backends.ExportProcessor[R], imp backends.ImportProcessor[R]) error {
|
||||||
fmt.Println(i18n.Tr("Transferring %s from %s to %s...", c.entity, c.sourceName, c.targetName))
|
fmt.Println(i18n.Tr("Transferring %s from %s to %s…", c.entity, c.sourceName, c.targetName))
|
||||||
|
|
||||||
// Authenticate backends, if needed
|
// Authenticate backends, if needed
|
||||||
config := viper.GetViper()
|
config := viper.GetViper()
|
||||||
|
|
|
@ -76,7 +76,7 @@ var messageKeyToIndex = map[string]int{
|
||||||
"Specify a time zone for the listen timestamps": 52,
|
"Specify a time zone for the listen timestamps": 52,
|
||||||
"The backend %v requires authentication. Authenticate now?": 6,
|
"The backend %v requires authentication. Authenticate now?": 6,
|
||||||
"Token received, you can close this window now.": 12,
|
"Token received, you can close this window now.": 12,
|
||||||
"Transferring %s from %s to %s...": 40,
|
"Transferring %s from %s to %s…": 40,
|
||||||
"Unique playlist identifier": 23,
|
"Unique playlist identifier": 23,
|
||||||
"Updated service %v using backend %v\n": 10,
|
"Updated service %v using backend %v\n": 10,
|
||||||
"User name": 18,
|
"User name": 18,
|
||||||
|
@ -123,7 +123,7 @@ const deData string = "" + // Size: 1596 bytes
|
||||||
"\x02Abgebrochen\x04\x00\x01\x0a\x1e\x02Service „%[1]v“ gelöscht\x04\x00" +
|
"\x02Abgebrochen\x04\x00\x01\x0a\x1e\x02Service „%[1]v“ gelöscht\x04\x00" +
|
||||||
"\x01\x0a1\x02Service %[1]v mit dem Backend %[2]v aktualisiert\x04\x01" +
|
"\x01\x0a1\x02Service %[1]v mit dem Backend %[2]v aktualisiert\x04\x01" +
|
||||||
"\x09\x00\x0f\x02Backend: %[1]v\x02Token erhalten, das Fenster kann jetzt" +
|
"\x09\x00\x0f\x02Backend: %[1]v\x02Token erhalten, das Fenster kann jetzt" +
|
||||||
" geschlossen werden.\x02das backend %[1]s implementiert %[2]s nicht\x02u" +
|
" geschlossen werden.\x02das Backend %[1]s implementiert %[2]s nicht\x02u" +
|
||||||
"nbekanntes Backend „%[1]s“\x02Client-ID\x02Client-Secret\x02Server-URL" +
|
"nbekanntes Backend „%[1]s“\x02Client-ID\x02Client-Secret\x02Server-URL" +
|
||||||
"\x02Benutzername\x02Zugriffstoken\x02Dateipfad\x02An Datei anhängen\x02T" +
|
"\x02Benutzername\x02Zugriffstoken\x02Dateipfad\x02An Datei anhängen\x02T" +
|
||||||
"itel der Playlist\x02Eindeutige Playlist-ID\x02Beim Import auf Listen-Du" +
|
"itel der Playlist\x02Eindeutige Playlist-ID\x02Beim Import auf Listen-Du" +
|
||||||
|
@ -134,13 +134,13 @@ const deData string = "" + // Size: 1596 bytes
|
||||||
"\x00\x01\x0a;\x02Zugriffstoken erhalten, %[1]v kann jetzt verwendet werd" +
|
"\x00\x01\x0a;\x02Zugriffstoken erhalten, %[1]v kann jetzt verwendet werd" +
|
||||||
"en.\x02exportiere\x02importiere\x02fertig\x02Ja\x02Nein\x02keine bestehe" +
|
"en.\x02exportiere\x02importiere\x02fertig\x02Ja\x02Nein\x02keine bestehe" +
|
||||||
"nden Servicekonfigurationen\x02Service\x02Backend\x02Übertrage %[1]s von" +
|
"nden Servicekonfigurationen\x02Service\x02Backend\x02Übertrage %[1]s von" +
|
||||||
" %[2]s nach %[3]s...\x02Ab Zeitstempel: %[1]v (%[2]v)\x02Import fehlgesc" +
|
" %[2]s nach %[3]s…\x02Ab Zeitstempel: %[1]v (%[2]v)\x02Import fehlgeschl" +
|
||||||
"hlagen, letzter Zeitstempel war %[1]v (%[2]s)\x02%[1]v von %[2]v %[3]s i" +
|
"agen, letzter Zeitstempel war %[1]v (%[2]s)\x02%[1]v von %[2]v %[3]s in " +
|
||||||
"n %[4]v importiert.\x02Importlog:\x02%[1]v: %[2]v\x02ungültiger Zeitstem" +
|
"%[4]v importiert.\x02Importlog:\x02%[1]v: %[2]v\x02ungültiger Zeitstempe" +
|
||||||
"pel „%[1]v“\x02Letzter Zeitstempel: %[1]v (%[2]v)\x02keine Konfiguration" +
|
"l „%[1]v“\x02Letzter Zeitstempel: %[1]v (%[2]v)\x02keine Konfigurationsd" +
|
||||||
"sdatei definiert, Konfiguration kann nicht geschrieben werden\x02Schlüss" +
|
"atei definiert, Konfiguration kann nicht geschrieben werden\x02Schlüssel" +
|
||||||
"el darf nur die Zeichen A-Za-z0-9_- beinhalten\x02keine Servicekonfigura" +
|
" darf nur die Zeichen A-Za-z0-9_- beinhalten\x02keine Servicekonfigurati" +
|
||||||
"tion „%[1]v“"
|
"on „%[1]v“"
|
||||||
|
|
||||||
var enIndex = []uint32{ // 55 elements
|
var enIndex = []uint32{ // 55 elements
|
||||||
// Entry 0 - 1F
|
// Entry 0 - 1F
|
||||||
|
@ -179,13 +179,13 @@ const enData string = "" + // Size: 1507 bytes
|
||||||
"\x02Error: OAuth state mismatch\x04\x00\x01\x0a.\x02Access token receive" +
|
"\x02Error: OAuth state mismatch\x04\x00\x01\x0a.\x02Access token receive" +
|
||||||
"d, you can use %[1]v now.\x02exporting\x02importing\x02done\x02Yes\x02No" +
|
"d, you can use %[1]v now.\x02exporting\x02importing\x02done\x02Yes\x02No" +
|
||||||
"\x02no existing service configurations\x02Service\x02Backend\x02Transfer" +
|
"\x02no existing service configurations\x02Service\x02Backend\x02Transfer" +
|
||||||
"ring %[1]s from %[2]s to %[3]s...\x02From timestamp: %[1]v (%[2]v)\x02Im" +
|
"ring %[1]s from %[2]s to %[3]s…\x02From timestamp: %[1]v (%[2]v)\x02Impo" +
|
||||||
"port failed, last reported timestamp was %[1]v (%[2]s)\x02Imported %[1]v" +
|
"rt failed, last reported timestamp was %[1]v (%[2]s)\x02Imported %[1]v o" +
|
||||||
" of %[2]v %[3]s into %[4]v.\x02Import log:\x02%[1]v: %[2]v\x02invalid ti" +
|
"f %[2]v %[3]s into %[4]v.\x02Import log:\x02%[1]v: %[2]v\x02invalid time" +
|
||||||
"mestamp string \x22%[1]v\x22\x02Latest timestamp: %[1]v (%[2]v)\x02no co" +
|
"stamp string \x22%[1]v\x22\x02Latest timestamp: %[1]v (%[2]v)\x02no conf" +
|
||||||
"nfiguration file defined, cannot write config\x02key must only consist o" +
|
"iguration file defined, cannot write config\x02key must only consist of " +
|
||||||
"f A-Za-z0-9_-\x02no service configuration \x22%[1]v\x22\x02Ignored dupli" +
|
"A-Za-z0-9_-\x02no service configuration \x22%[1]v\x22\x02Ignored duplica" +
|
||||||
"cate listen %[1]v: \x22%[2]v\x22 by %[3]v (%[4]v)\x02Specify a time zone" +
|
"te listen %[1]v: \x22%[2]v\x22 by %[3]v (%[4]v)\x02Specify a time zone f" +
|
||||||
" for the listen timestamps\x02Visit the URL for authorization: %[1]v"
|
"or the listen timestamps\x02Visit the URL for authorization: %[1]v"
|
||||||
|
|
||||||
// Total table size 3591 bytes (3KiB); checksum: 6C862242
|
// Total table size 3591 bytes (3KiB); checksum: 2A4B9572
|
||||||
|
|
|
@ -261,9 +261,9 @@
|
||||||
"translation": "Beim Import auf Listen-Duplikate prüfen (langsamer)"
|
"translation": "Beim Import auf Listen-Duplikate prüfen (langsamer)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMbid})",
|
"id": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMBID})",
|
||||||
"message": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMbid})",
|
"message": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMBID})",
|
||||||
"translation": "Listen-Duplikat ignoriert {ListenedAt}: „{TrackName}“ von {ArtistName} ({RecordingMbid})",
|
"translation": "",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
"id": "ListenedAt",
|
"id": "ListenedAt",
|
||||||
|
@ -290,12 +290,12 @@
|
||||||
"expr": "l.ArtistName()"
|
"expr": "l.ArtistName()"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "RecordingMbid",
|
"id": "RecordingMBID",
|
||||||
"string": "%[4]v",
|
"string": "%[4]v",
|
||||||
"type": "go.uploadedlobster.com/scotty/internal/models.MBID",
|
"type": "go.uploadedlobster.com/mbtypes.MBID",
|
||||||
"underlyingType": "string",
|
"underlyingType": "string",
|
||||||
"argNum": 4,
|
"argNum": 4,
|
||||||
"expr": "l.RecordingMbid"
|
"expr": "l.RecordingMBID"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -305,9 +305,14 @@
|
||||||
"translation": "Autokorrektur für übermittelte Titel deaktivieren"
|
"translation": "Autokorrektur für übermittelte Titel deaktivieren"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Include skipped listens",
|
"id": "Ignore skipped listens",
|
||||||
"message": "Include skipped listens",
|
"message": "Ignore skipped listens",
|
||||||
"translation": "Übersprungene Titel einbeziehen"
|
"translation": "Übersprungene Listens ignorieren"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Specify a time zone for the listen timestamps",
|
||||||
|
"message": "Specify a time zone for the listen timestamps",
|
||||||
|
"translation": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Directory path",
|
"id": "Directory path",
|
||||||
|
@ -319,28 +324,23 @@
|
||||||
"message": "Ignore listens in incognito mode",
|
"message": "Ignore listens in incognito mode",
|
||||||
"translation": "Listens im Inkognito-Modus ignorieren"
|
"translation": "Listens im Inkognito-Modus ignorieren"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "Ignore skipped listens",
|
|
||||||
"message": "Ignore skipped listens",
|
|
||||||
"translation": "Übersprungene Listens ignorieren"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "Minimum playback duration for skipped tracks (seconds)",
|
"id": "Minimum playback duration for skipped tracks (seconds)",
|
||||||
"message": "Minimum playback duration for skipped tracks (seconds)",
|
"message": "Minimum playback duration for skipped tracks (seconds)",
|
||||||
"translation": "Minimale Wiedergabedauer für übersprungene Titel (Sekunden)"
|
"translation": "Minimale Wiedergabedauer für übersprungene Titel (Sekunden)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Visit the URL for authorization: {Url}",
|
"id": "Visit the URL for authorization: {URL}",
|
||||||
"message": "Visit the URL for authorization: {Url}",
|
"message": "Visit the URL for authorization: {URL}",
|
||||||
"translation": "URL für Autorisierung öffnen: {Url}",
|
"translation": "",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
"id": "Url",
|
"id": "URL",
|
||||||
"string": "%[1]v",
|
"string": "%[1]v",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"underlyingType": "string",
|
"underlyingType": "string",
|
||||||
"argNum": 1,
|
"argNum": 1,
|
||||||
"expr": "authUrl.Url"
|
"expr": "authURL.URL"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -367,23 +367,23 @@
|
||||||
{
|
{
|
||||||
"id": "exporting",
|
"id": "exporting",
|
||||||
"message": "exporting",
|
"message": "exporting",
|
||||||
|
"translation": "exportiere",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"fuzzy": true,
|
"fuzzy": true
|
||||||
"translation": "exportiere"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "importing",
|
"id": "importing",
|
||||||
"message": "importing",
|
"message": "importing",
|
||||||
|
"translation": "importiere",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"fuzzy": true,
|
"fuzzy": true
|
||||||
"translation": "importiere"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "done",
|
"id": "done",
|
||||||
"message": "done",
|
"message": "done",
|
||||||
|
"translation": "fertig",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"fuzzy": true,
|
"fuzzy": true
|
||||||
"translation": "fertig"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Yes",
|
"id": "Yes",
|
||||||
|
@ -411,8 +411,8 @@
|
||||||
"translation": "Backend"
|
"translation": "Backend"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"id": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"message": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"message": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translation": "Übertrage {Entity} von {SourceName} nach {TargetName}…",
|
"translation": "Übertrage {Entity} von {SourceName} nach {TargetName}…",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -175,7 +175,7 @@
|
||||||
{
|
{
|
||||||
"id": "backend {Backend} does not implement {InterfaceName}",
|
"id": "backend {Backend} does not implement {InterfaceName}",
|
||||||
"message": "backend {Backend} does not implement {InterfaceName}",
|
"message": "backend {Backend} does not implement {InterfaceName}",
|
||||||
"translation": "das backend {Backend} implementiert {InterfaceName} nicht",
|
"translation": "das Backend {Backend} implementiert {InterfaceName} nicht",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
"id": "Backend",
|
"id": "Backend",
|
||||||
|
@ -411,9 +411,9 @@
|
||||||
"translation": "Backend"
|
"translation": "Backend"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"id": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"message": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"message": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translation": "Übertrage {Entity} von {SourceName} nach {TargetName}...",
|
"translation": "Übertrage {Entity} von {SourceName} nach {TargetName}…",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
"id": "Entity",
|
"id": "Entity",
|
||||||
|
|
|
@ -311,9 +311,9 @@
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMbid})",
|
"id": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMBID})",
|
||||||
"message": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMbid})",
|
"message": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMBID})",
|
||||||
"translation": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMbid})",
|
"translation": "Ignored duplicate listen {ListenedAt}: \"{TrackName}\" by {ArtistName} ({RecordingMBID})",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
|
@ -341,12 +341,12 @@
|
||||||
"expr": "l.ArtistName()"
|
"expr": "l.ArtistName()"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "RecordingMbid",
|
"id": "RecordingMBID",
|
||||||
"string": "%[4]v",
|
"string": "%[4]v",
|
||||||
"type": "go.uploadedlobster.com/scotty/internal/models.MBID",
|
"type": "go.uploadedlobster.com/mbtypes.MBID",
|
||||||
"underlyingType": "string",
|
"underlyingType": "string",
|
||||||
"argNum": 4,
|
"argNum": 4,
|
||||||
"expr": "l.RecordingMbid"
|
"expr": "l.RecordingMBID"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
|
@ -359,9 +359,16 @@
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Include skipped listens",
|
"id": "Ignore skipped listens",
|
||||||
"message": "Include skipped listens",
|
"message": "Ignore skipped listens",
|
||||||
"translation": "Include skipped listens",
|
"translation": "Ignore skipped listens",
|
||||||
|
"translatorComment": "Copied from source.",
|
||||||
|
"fuzzy": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Specify a time zone for the listen timestamps",
|
||||||
|
"message": "Specify a time zone for the listen timestamps",
|
||||||
|
"translation": "Specify a time zone for the listen timestamps",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
|
@ -379,13 +386,6 @@
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"id": "Ignore skipped listens",
|
|
||||||
"message": "Ignore skipped listens",
|
|
||||||
"translation": "Ignore skipped listens",
|
|
||||||
"translatorComment": "Copied from source.",
|
|
||||||
"fuzzy": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"id": "Minimum playback duration for skipped tracks (seconds)",
|
"id": "Minimum playback duration for skipped tracks (seconds)",
|
||||||
"message": "Minimum playback duration for skipped tracks (seconds)",
|
"message": "Minimum playback duration for skipped tracks (seconds)",
|
||||||
|
@ -394,18 +394,18 @@
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Visit the URL for authorization: {Url}",
|
"id": "Visit the URL for authorization: {URL}",
|
||||||
"message": "Visit the URL for authorization: {Url}",
|
"message": "Visit the URL for authorization: {URL}",
|
||||||
"translation": "Visit the URL for authorization: {Url}",
|
"translation": "Visit the URL for authorization: {URL}",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
"id": "Url",
|
"id": "URL",
|
||||||
"string": "%[1]v",
|
"string": "%[1]v",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"underlyingType": "string",
|
"underlyingType": "string",
|
||||||
"argNum": 1,
|
"argNum": 1,
|
||||||
"expr": "authUrl.Url"
|
"expr": "authURL.URL"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
|
@ -491,9 +491,9 @@
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"id": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"message": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"message": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translation": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"translation": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -491,9 +491,9 @@
|
||||||
"fuzzy": true
|
"fuzzy": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"id": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"message": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"message": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translation": "Transferring {Entity} from {SourceName} to {TargetName}...",
|
"translation": "Transferring {Entity} from {SourceName} to {TargetName}…",
|
||||||
"translatorComment": "Copied from source.",
|
"translatorComment": "Copied from source.",
|
||||||
"placeholders": [
|
"placeholders": [
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue