/** * German Translation / Deutsche Übersetzung * @author JPG & Mace * @author tora60 from pragmaMx.org * @author Timo-Linde * @author OSWorX * @author Maximilian Schwarz * @author SF Webdesign * @version 2019-12-13 */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['elfinder'], factory); } else if (typeof exports !== 'undefined') { module.exports = factory(require('elfinder')); } else { factory(root.elFinder); } }(this, function(elFinder) { elFinder.prototype.i18.de = { translator : 'JPG & Mace <dev@flying-datacenter.de>, tora60 from pragmaMx.org, Timo-Linde <info@timo-linde.de>, OSWorX <info@osworx.net>, Maximilian Schwarz <info@deefuse.de>, SF Webdesign <webdesign@stephan-frank.de>', language : 'Deutsch', direction : 'ltr', dateFormat : 'j. F Y H:i', // 3. März 2020 14:58 fancyDateFormat : '$1 H:i', // will produce smth like: Today 12:25 PM nonameDateFormat : 'ymd-His', // to apply if upload file is noname: 120513172700 messages : { /********************************** errors **********************************/ 'error' : 'Fehler', 'errUnknown' : 'Unbekannter Fehler.', 'errUnknownCmd' : 'Unbekannter Befehl.', 'errJqui' : 'Ungültige jQuery UI-Konfiguration. Die Komponenten Selectable, Draggable und Droppable müssen inkludiert sein.', 'errNode' : 'Für elFinder muss das DOM-Element erstellt werden.', 'errURL' : 'Ungültige elFinder-Konfiguration! Die URL-Option ist nicht gesetzt.', 'errAccess' : 'Zugriff verweigert.', 'errConnect' : 'Verbindung zum Backend fehlgeschlagen.', 'errAbort' : 'Verbindung abgebrochen.', 'errTimeout' : 'Zeitüberschreitung der Verbindung.', 'errNotFound' : 'Backend nicht gefunden.', 'errResponse' : 'Ungültige Backend-Antwort.', 'errConf' : 'Ungültige Backend-Konfiguration.', 'errJSON' : 'PHP JSON-Modul nicht vorhanden.', 'errNoVolumes' : 'Keine lesbaren Laufwerke vorhanden.', 'errCmdParams' : 'Ungültige Parameter für Befehl: "$1".', 'errDataNotJSON' : 'Daten nicht im JSON-Format.', 'errDataEmpty' : 'Daten sind leer.', 'errCmdReq' : 'Backend-Anfrage benötigt Befehl.', 'errOpen' : 'Kann "$1" nicht öffnen.', 'errNotFolder' : 'Objekt ist kein Ordner.', 'errNotFile' : 'Objekt ist keine Datei.', 'errRead' : 'Kann "$1" nicht öffnen.', 'errWrite' : 'Kann nicht in "$1" schreiben.', 'errPerm' : 'Zugriff verweigert.', 'errLocked' : '"$1" ist gesperrt und kann nicht umbenannt, verschoben oder gelöscht werden.', 'errExists' : 'Die Datei "$1" existiert bereits.', 'errInvName' : 'Ungültiger Dateiname.', 'errInvDirname' : 'Ungültiger Ordnername.', // from v2.1.24 added 12.4.2017 'errFolderNotFound' : 'Ordner nicht gefunden.', 'errFileNotFound' : 'Datei nicht gefunden.', 'errTrgFolderNotFound' : 'Zielordner "$1" nicht gefunden.', 'errPopup' : 'Der Browser hat das Pop-Up-Fenster unterbunden. Um die Datei zu öffnen, Pop-Ups in den Browsereinstellungen aktivieren.', 'errMkdir' : 'Kann Ordner "$1" nicht erstellen.', 'errMkfile' : 'Kann Datei "$1" nicht erstellen.', 'errRename' : 'Kann "$1" nicht umbenennen.', 'errCopyFrom' : 'Kopieren von Dateien von "$1" nicht erlaubt.', 'errCopyTo' : 'Kopieren von Dateien nach "$1" nicht erlaubt.', 'errMkOutLink' : 'Der Link kann nicht außerhalb der Partition führen.', // from v2.1 added 03.10.2015 'errUpload' : 'Upload-Fehler.', // old name - errUploadCommon 'errUploadFile' : 'Kann "$1" nicht hochladen.', // old name - errUpload 'errUploadNoFiles' : 'Keine Dateien zum Hochladen gefunden.', 'errUploadTotalSize' : 'Gesamtgröße überschreitet die Maximalgröße.', // old name - errMaxSize 'errUploadFileSize' : 'Die Datei überschreitet die Maximalgröße.', // old name - errFileMaxSize 'errUploadMime' : 'Dateiart (mime) nicht zulässig.', 'errUploadTransfer' : '"$1" Übertragungsfehler.', 'errUploadTemp' : 'Kann temporäre Datei nicht erstellen.', // from v2.1 added 26.09.2015 'errNotReplace' : 'Das Objekt "$1" existiert bereits an dieser Stelle und kann nicht durch ein Objekt eines anderen Typs ersetzt werden.', // new 'errReplace' : 'Kann "$1" nicht ersetzen.', 'errSave' : 'Kann "$1" nicht speichern.', 'errCopy' : 'Kann "$1" nicht kopieren.', 'errMove' : 'Kann "$1" nicht verschieben.', 'errCopyInItself' : '"$1" kann sich nicht in sich selbst kopieren.', 'errRm' : 'Kann "$1" nicht entfernen.', 'errTrash' : 'Kann Objekt nicht in Mülleimer legen.', // from v2.1.24 added 30.4.2017 'errRmSrc' : 'Kann Quelldatei(en) nicht entfernen.', 'errExtract' : 'Kann "$1" nicht entpacken.', 'errArchive' : 'Archiv konnte nicht erstellt werden.', 'errArcType' : 'Archivtyp nicht untersützt.', 'errNoArchive' : 'Bei der Datei handelt es sich nicht um ein Archiv, oder die Archivart wird nicht unterstützt.', 'errCmdNoSupport' : 'Das Backend unterstützt diesen Befehl nicht.', 'errReplByChild' : 'Der Ordner "$1" kann nicht durch etwas ersetzt werden, das ihn selbst enthält.', 'errArcSymlinks' : 'Aus Sicherheitsgründen ist es verboten, ein Archiv mit symbolischen Links zu extrahieren.', // edited 24.06.2012 'errArcMaxSize' : 'Die Archivdateien übersteigen die maximal erlaubte Größe.', 'errResize' : 'Größe von "$1" kann nicht geändert werden.', 'errResizeDegree' : 'Ungültiger Rotationswert.', // added 7.3.2013 'errResizeRotate' : 'Bild konnte nicht gedreht werden.', // added 7.3.2013 'errResizeSize' : 'Ungültige Bildgröße.', // added 7.3.2013 'errResizeNoChange' : 'Bildmaße nicht geändert.', // added 7.3.2013 'errUsupportType' : 'Nicht unterstützte Dateiart.', 'errNotUTF8Content' : 'Die Datei "$1" ist nicht im UTF-8-Format und kann nicht bearbeitet werden.', // added 9.11.2011 'errNetMount' : 'Verbindung mit "$1" nicht möglich.', // added 17.04.2012 'errNetMountNoDriver' : 'Nicht unterstütztes Protokoll.', // added 17.04.2012 'errNetMountFailed' : 'Verbindung fehlgeschlagen.', // added 17.04.2012 'errNetMountHostReq' : 'Host benötigt.', // added 18.04.2012 'errSessionExpires' : 'Diese Sitzung ist aufgrund von Inaktivität abgelaufen.', 'errCreatingTempDir' : 'Erstellung des temporären Ordners nicht möglich: "$1"', 'errFtpDownloadFile' : 'Download der Datei über FTP nicht möglich: "$1"', 'errFtpUploadFile' : 'Upload der Datei zu FTP nicht möglich: "$1"', 'errFtpMkdir' : 'Erstellung des Remote-Ordners mit FTP nicht möglich: "$1"', 'errArchiveExec' : 'Fehler beim Archivieren der Dateien: "$1"', 'errExtractExec' : 'Fehler beim Extrahieren der Dateien: "$1"', 'errNetUnMount' : 'Kann nicht ausgehängt werden.', // from v2.1 added 30.04.2012 'errConvUTF8' : 'Kann nicht zu UTF-8 konvertiert werden.', // from v2.1 added 08.04.2014 'errFolderUpload' : 'Ordner kann nich hochladen werden, eventuell mit Google Chrome versuchen.', // from v2.1 added 26.6.2015 'errSearchTimeout' : 'Zeitüberschreitung während der Suche nach "$1". Suchergebnis ist unvollständig.', // from v2.1 added 12.1.2016 'errReauthRequire' : 'Erneutes Anmelden ist erforderlich.', // from v2.1.10 added 24.3.2016 'errMaxTargets' : 'Die maximale Anzahl auswählbarer Elemente ist $1', // from v2.1.17 added 17.10.2016 'errRestore' : 'Datei konnte nicht aus Mülleimer wieder hergestellt werden bzw. Ziel für Wiederherstellung nicht gefunden.', // from v2.1.24 added 3.5.2017 'errEditorNotFound' : 'Kein Editor für diesen Dateityp gefunden.', // from v2.1.25 added 23.5.2017 'errServerError' : 'Ein serverseitiger Fehler trat auf.', // from v2.1.25 added 16.6.2017 'errEmpty' : 'Konnte Ordner "$1" nicht Leeren.', // from v2.1.25 added 22.6.2017 'moreErrors' : 'Es sind noch $1 weitere Fehler.', // from v2.1.44 added 13.12.2019 /******************************* commands names ********************************/ 'cmdarchive' : 'Archiv erstellen', 'cmdback' : 'Zurück', 'cmdcopy' : 'Kopieren', 'cmdcut' : 'Ausschneiden', 'cmddownload' : 'Herunterladen', 'cmdduplicate' : 'Duplizieren', 'cmdedit' : 'Datei bearbeiten', 'cmdextract' : 'Archiv entpacken', 'cmdforward' : 'Vorwärts', 'cmdgetfile' : 'Datei auswählen', 'cmdhelp' : 'Über diese Software', 'cmdhome' : 'Startordner', 'cmdinfo' : 'Informationen', 'cmdmkdir' : 'Neuer Ordner', 'cmdmkdirin' : 'In neuen Ordner', // from v2.1.7 added 19.2.2016 'cmdmkfile' : 'Neuer Datei', 'cmdopen' : 'Öffnen', 'cmdpaste' : 'Einfügen', 'cmdquicklook' : 'Vorschau', 'cmdreload' : 'Aktualisieren', 'cmdrename' : 'Umbenennen', 'cmdrm' : 'Löschen', 'cmdtrash' : 'In den Mülleimer legen', //from v2.1.24 added 29.4.2017 'cmdrestore' : 'Wiederherstellen', //from v2.1.24 added 3.5.2017 'cmdsearch' : 'Suchen', 'cmdup' : 'In übergeordneten Ordner wechseln', 'cmdupload' : 'Datei hochladen', 'cmdview' : 'Ansehen', 'cmdresize' : 'Größe ändern & drehen', 'cmdsort' : 'Sortieren', 'cmdnetmount' : 'Verbinde mit Netzwerkspeicher', // added 18.04.2012 'cmdnetunmount': 'Abhängen', // from v2.1 added 30.04.2012 'cmdplaces' : 'Favoriten', // added 28.12.2014 'cmdchmod' : 'Berechtigung ändern', // from v2.1 added 20.6.2015 'cmdopendir' : 'Einen Ordner öffnen', // from v2.1 added 13.1.2016 'cmdcolwidth' : 'Spaltenbreite zurücksetzen', // from v2.1.13 added 12.06.2016 'cmdfullscreen': 'Vollbild', // from v2.1.15 added 03.08.2016 'cmdmove' : 'Verschieben', // from v2.1.15 added 21.08.2016 'cmdempty' : 'Ordner Leeren', // from v2.1.25 added 22.06.2017 'cmdundo' : 'Rückgängig', // from v2.1.27 added 31.07.2017 'cmdredo' : 'Wiederholen', // from v2.1.27 added 31.07.2017 'cmdpreference': 'Einstellungen', // from v2.1.27 added 03.08.2017 'cmdselectall' : 'Alle auswählen', // from v2.1.28 added 15.08.2017 'cmdselectnone': 'Keine auswählen', // from v2.1.28 added 15.08.2017 'cmdselectinvert': 'Auswahl rückgängig machen', // from v2.1.28 added 15.08.2017 'cmdopennew' : 'In neuem Fenster öffnen', // from v2.1.38 added 3.4.2018 'cmdhide' : 'Verstecken', // from v2.1.41 added 13.12.2019 /*********************************** buttons ***********************************/ 'btnClose' : 'Schließen', 'btnSave' : 'Speichern', 'btnRm' : 'Entfernen', 'btnApply' : 'Anwenden', 'btnCancel' : 'Abbrechen', 'btnNo' : 'Nein', 'btnYes' : 'Ja', 'btnDiscard': 'Änderungen verwerfen', 'btnMount' : 'Verbinden', // added 18.04.2012 'btnApprove': 'Gehe zu $1 und genehmige', // from v2.1 added 26.04.2012 'btnUnmount': 'Auswerfen', // from v2.1 added 30.04.2012 'btnConv' : 'Konvertieren', // from v2.1 added 08.04.2014 'btnCwd' : 'Arbeitspfad', // from v2.1 added 22.5.2015 'btnVolume' : 'Partition', // from v2.1 added 22.5.2015 'btnAll' : 'Alle', // from v2.1 added 22.5.2015 'btnMime' : 'MIME-Typ', // from v2.1 added 22.5.2015 'btnFileName':'Dateiname', // from v2.1 added 22.5.2015 'btnSaveClose': 'Speichern & Schließen', // from v2.1 added 12.6.2015 'btnBackup' : 'Sicherung', // fromv2.1 added 28.11.2015 'btnRename' : 'Umbenennen', // from v2.1.24 added 6.4.2017 'btnRenameAll' : 'Alle Umbenennen', // from v2.1.24 added 6.4.2017 'btnPrevious' : 'Zurück ($1/$2)', // from v2.1.24 added 11.5.2017 'btnNext' : 'Weiter ($1/$2)', // from v2.1.24 added 11.5.2017 'btnSaveAs' : 'Speichern als', // from v2.1.25 added 24.5.2017 /******************************** notifications ********************************/ 'ntfopen' : 'Öffne Ordner', 'ntffile' : 'Öffne Datei', 'ntfreload' : 'Ordnerinhalt neu', 'ntfmkdir' : 'Erstelle Ordner', 'ntfmkfile' : 'Erstelle Dateien', 'ntfrm' : 'Lösche Dateien', 'ntfcopy' : 'Kopiere Dateien', 'ntfmove' : 'Verschiebe Dateien', 'ntfprepare' : 'Kopiervorgang initialisieren', 'ntfrename' : 'Benenne Dateien um', 'ntfupload' : 'Dateien hochladen', 'ntfdownload' : 'Dateien herunterladen', 'ntfsave' : 'Speichere Datei', 'ntfarchive' : 'Erstelle Archiv', 'ntfextract' : 'Entpacke Dateien', 'ntfsearch' : 'Suche', 'ntfresize' : 'Bildgrößen ändern', 'ntfsmth' : 'Bin beschäftigt ..', 'ntfloadimg' : 'Lade Bild ..', 'ntfnetmount' : 'Mit Netzwerkspeicher verbinden', // added 18.04.2012 'ntfnetunmount': 'Netzwerkspeicher auswerfen', // from v2.1 added 30.04.2012 'ntfdim' : 'Bildgröße erfassen', // added 20.05.2013 'ntfreaddir' : 'Lese Ordnerinformationen', // from v2.1 added 01.07.2013 'ntfurl' : 'Hole URL von Link', // from v2.1 added 11.03.2014 'ntfchmod' : 'Ändere Dateiberechtigungen', // from v2.1 added 20.6.2015 'ntfpreupload': 'Upload-Dateinamen überprüfen', // from v2.1 added 31.11.2015 'ntfzipdl' : 'Erstelle Datei zum Download', // from v2.1.7 added 23.1.2016 'ntfparents' : 'Beziehe Pfad Informationen', // from v2.1.17 added 2.11.2016 'ntfchunkmerge': 'Upload läuft', // from v2.1.17 added 2.11.2016 'ntftrash' : 'Bewege in den Mülleimer', // from v2.1.24 added 2.5.2017 'ntfrestore' : 'Wiederherstellung aus Mülleimer', // from v2.1.24 added 3.5.2017 'ntfchkdir' : 'Prüfe Zielordner', // from v2.1.24 added 3.5.2017 'ntfundo' : 'Vorherige Operation rückgängig machen', // from v2.1.27 added 31.07.2017 'ntfredo' : 'Wiederherstellen', // from v2.1.27 added 31.07.2017 'ntfchkcontent' : 'Überprüfe Inhalte', // from v2.1.41 added 13.12.2019 /*********************************** volumes *********************************/ 'volume_Trash' : 'Mülleimer', //from v2.1.24 added 29.4.2017 /************************************ dates **********************************/ 'dateUnknown' : 'unbekannt', 'Today' : 'Heute', 'Yesterday' : 'Gestern', 'msJan' : 'Jan', 'msFeb' : 'Feb', 'msMar' : 'Mär', 'msApr' : 'Apr', 'msMay' : 'Mai', 'msJun' : 'Jun', 'msJul' : 'Jul', 'msAug' : 'Aug', 'msSep' : 'Sep', 'msOct' : 'Okt', 'msNov' : 'Nov', 'msDec' : 'Dez', 'January' : 'Januar', 'February' : 'Februar', 'March' : 'März', 'April' : 'April', 'May' : 'Mai', 'June' : 'Juni', 'July' : 'Juli', 'August' : 'August', 'September' : 'September', 'October' : 'Oktober', 'November' : 'November', 'December' : 'Dezember', 'Sunday' : 'Sonntag', 'Monday' : 'Montag', 'Tuesday' : 'Dienstag', 'Wednesday' : 'Mittwoch', 'Thursday' : 'Donnerstag', 'Friday' : 'Freitag', 'Saturday' : 'Samstag', 'Sun' : 'So', 'Mon' : 'Mo', 'Tue' : 'Di', 'Wed' : 'Mi', 'Thu' : 'Do', 'Fri' : 'Fr', 'Sat' : 'Sa', /******************************** sort variants ********************************/ 'sortname' : 'nach Name', 'sortkind' : 'nach Art', 'sortsize' : 'nach Größe', 'sortdate' : 'nach Datum', 'sortFoldersFirst' : 'Ordner zuerst', 'sortperm' : 'nach Berechtigung', // from v2.1.13 added 13.06.2016 'sortmode' : 'nach Modus', // from v2.1.13 added 13.06.2016 'sortowner' : 'nach Besitzer', // from v2.1.13 added 13.06.2016 'sortgroup' : 'nach Gruppe', // from v2.1.13 added 13.06.2016 'sortAlsoTreeview' : 'auch Baumansicht', // from v2.1.15 added 01.08.2016 /********************************** new items **********************************/ 'untitled file.txt' : 'Neues Textdokument (.txt)', // added 10.11.2015 'untitled folder' : 'Neuer Ordner', // added 10.11.2015 'Archive' : 'Neues Archiv', // from v2.1 added 10.11.2015 'untitled file' : 'Neue Datei $1', // from v2.1.41 added 13.12.2019 'extentionfile' : '$1: Datei', // from v2.1.41 added 13.12.2019 'extentiontype' : '$1: $2', // from v2.1.43 added 13.12.2018 /********************************** messages **********************************/ 'confirmReq' : 'Bestätigung benötigt', 'confirmRm' : 'Sollen die Dateien gelöscht werden?
Vorgang ist endgültig!', 'confirmRepl' : 'Datei ersetzen?', 'confirmRest' : 'Vorhandenes Element durch das Element aus Mülleimer ersetzen?', // fromv2.1.24 added 5.5.2017 'confirmConvUTF8' : 'Nicht UTF-8 kodiert
Zu UTF-8 konvertieren?
Inhalte werden zu UTF-8 konvertiert bei Speicherung.', // from v2.1 added 08.04.2014 'confirmNonUTF8' : 'Die Zeichencodierung dieser Datei konnte nicht erkannt werden. Es muss vorübergehend in UTF-8 zur Bearbeitung konvertiert werden.
Bitte eine Zeichenkodierung dieser Datei auswählen.', // from v2.1.19 added 28.11.2016 'confirmNotSave' : 'Die Datei wurde geändert.
Änderungen gehen verloren, wenn nicht gespeichert wird.', // from v2.1 added 15.7.2015 'confirmTrash' : 'Sicher diese Elemente in den Mülleimer verschieben?', // from v2.1.24 added 29.4.2017 'confirmMove' : 'Sicher alle Elemente nach "$1" verschieben?', // from v2.1.50 added 13.12.2019 'apllyAll' : 'Alles bestätigen', 'name' : 'Name', 'size' : 'Größe', 'perms' : 'Berechtigungen', 'modify' : 'Geändert', 'kind' : 'Typ', 'read' : 'Lesen', 'write' : 'Schreiben', 'noaccess' : 'Kein Zugriff', 'and' : 'und', 'unknown' : 'unbekannt', 'selectall' : 'Alle Dateien auswählen', 'selectfiles' : 'Dateien auswählen', 'selectffile' : 'Erste Datei auswählen', 'selectlfile' : 'Letzte Datei auswählen', 'viewlist' : 'Spaltenansicht', 'viewicons' : 'Symbolansicht', 'viewSmall' : 'Kleine Icons', // from v2.1.39 added 13.12.2019 'viewMedium' : 'Medium Icons', // from v2.1.39 added 13.12.2019 'viewLarge' : 'Große Icons', // from v2.1.39 added 13.12.2019 'viewExtraLarge' : 'Extragroße Icons', // from v2.1.39 added 13.12.2019 'places' : 'Favoriten', 'calc' : 'Berechne', 'path' : 'Pfad', 'aliasfor' : 'Verknüpfung zu', 'locked' : 'Gesperrt', 'dim' : 'Bildgröße', 'files' : 'Dateien', 'folders' : 'Ordner', 'items' : 'Objekte', 'yes' : 'ja', 'no' : 'nein', 'link' : 'Link', 'searcresult' : 'Suchergebnisse', 'selected' : 'Objekte ausgewählt', 'about' : 'Über', 'shortcuts' : 'Tastenkombinationen', 'help' : 'Hilfe', 'webfm' : 'Web-Dateiverwaltung', 'ver' : 'Version', 'protocolver' : 'Protokoll-Version', 'homepage' : 'Projekt-Webseite', 'docs' : 'Dokumentation', 'github' : 'Forke uns auf Github', 'twitter' : 'Folge uns auf twitter', 'facebook' : 'Begleite uns auf facebook', 'team' : 'Team', 'chiefdev' : 'Chefentwickler', 'developer' : 'Entwickler', 'contributor' : 'Unterstützer', 'maintainer' : 'Maintainer', 'translator' : 'Übersetzer', 'icons' : 'Icons', 'dontforget' : 'und vergiss nicht .. morgen ist auch noch ein Tag ..', 'shortcutsof' : 'Tastenkombinationen deaktiviert', 'dropFiles' : 'Dateien hier ablegen', 'or' : 'oder', 'selectForUpload' : 'Dateien zum Upload auswählen', 'moveFiles' : 'Dateien verschieben', 'copyFiles' : 'Dateien kopieren', 'restoreFiles' : 'Elemente wiederherstellen', // from v2.1.24 added 5.5.2017 'rmFromPlaces' : 'Lösche von Favoriten', 'aspectRatio' : 'Seitenverhältnis', 'scale' : 'Maßstab', 'width' : 'Breite', 'height' : 'Höhe', 'resize' : 'Größe ändern', 'crop' : 'Zuschneiden', 'rotate' : 'Drehen', 'rotate-cw' : 'Drehe 90° im Uhrzeigersinn', 'rotate-ccw' : 'Drehe 90° gegen Uhrzeigersinn', 'degree' : '°', 'netMountDialogTitle' : 'verbinde Netzwerkspeicher', // added 18.04.2012 'protocol' : 'Protokoll', // added 18.04.2012 'host' : 'Host', // added 18.04.2012 'port' : 'Port', // added 18.04.2012 'user' : 'Benutzer', // added 18.04.2012 'pass' : 'Passwort', // added 18.04.2012 'confirmUnmount' : 'Soll "$1" ausgehängt werden', // from v2.1 added 30.04.2012 'dropFilesBrowser': 'Dateien in den Browser ziehen', // from v2.1 added 30.05.2012 'dropPasteFiles' : 'Dateien hier loslassen', // from v2.1 added 07.04.2014 'encoding' : 'Kodierung', // from v2.1 added 19.12.2014 'locale' : 'Lokal', // from v2.1 added 19.12.2014 'searchTarget' : 'Ziel: $1', // from v2.1 added 22.5.2015 'searchMime' : 'Suche nach MIME-Typ', // from v2.1 added 22.5.2015 'owner' : 'Besitzer', // from v2.1 added 20.6.2015 'group' : 'Gruppe', // from v2.1 added 20.6.2015 'other' : 'Andere', // from v2.1 added 20.6.2015 'execute' : 'Ausführen', // from v2.1 added 20.6.2015 'perm' : 'Berechtigung', // from v2.1 added 20.6.2015 'mode' : 'Modus', // from v2.1 added 20.6.2015 'emptyFolder' : 'Der Ordner ist leer', // from v2.1.6 added 30.12.2015 'emptyFolderDrop' : 'Der Ordner ist leer\\A Elemente durch Ziehen hinzufügen', // from v2.1.6 added 30.12.2015 'emptyFolderLTap' : 'Der Ordner ist leer\\A Elemente durch langes Tippen hinzufügen', // from v2.1.6 added 30.12.2015 'quality' : 'Qualität', // from v2.1.6 added 5.1.2016 'autoSync' : 'Automatische Synchronisation', // from v2.1.6 added 10.1.2016 'moveUp' : 'Nach oben bewegen', // from v2.1.6 added 18.1.2016 'getLink' : 'URL-Link holen', // from v2.1.7 added 9.2.2016 'selectedItems' : 'Ausgewählte Objekte ($1)', // from v2.1.7 added 2.19.2016 'folderId' : 'Ordner-ID', // from v2.1.10 added 3.25.2016 'offlineAccess' : 'Offline-Zugriff erlauben', // from v2.1.10 added 3.25.2016 'reAuth' : 'Erneut anmelden', // from v2.1.10 added 3.25.2016 'nowLoading' : 'Wird geladen...', // from v2.1.12 added 4.26.2016 'openMulti' : 'mehrere Dateien öffnen', // from v2.1.12 added 5.14.2016 'openMultiConfirm': 'Es wird versucht die $1 Dateien zu öffnen .. sicher im Browser öffnen?', // from v2.1.12 added 5.14.2016 'emptySearch' : 'Kein Suchergebnis', // from v2.1.12 added 5.16.2016 'editingFile' : 'Datei wird bearbeitet.', // from v2.1.13 added 6.3.2016 'hasSelected' : '$1 Objekt(e) ausgewählt.', // from v2.1.13 added 6.3.2016 'hasClipboard' : '$1 Objekte im Clipboard.', // from v2.1.13 added 6.3.2016 'incSearchOnly' : 'Inkrementelle Suche bezieht sich nur auf die aktuelle Ansicht.', // from v2.1.13 added 6.30.2016 'reinstate' : 'Wiederherstellen', // from v2.1.15 added 3.8.2016 'complete' : '$1 abgeschlossen', // from v2.1.15 added 21.8.2016 'contextmenu' : 'Kontextmenü', // from v2.1.15 added 9.9.2016 'pageTurning' : 'Seite umblättern', // from v2.1.15 added 10.9.2016 'volumeRoots' : 'Volume-Rootverzeichnisse', // from v2.1.16 added 16.9.2016 'reset' : 'Neustart', // from v2.1.16 added 1.10.2016 'bgcolor' : 'Hintergrund Farbe', // from v2.1.16 added 1.10.2016 'colorPicker' : 'Farbauswahl', // from v2.1.16 added 1.10.2016 '8pxgrid' : '8px Raster', // from v2.1.16 added 4.10.2016 'enabled' : 'Ein', // from v2.1.16 added 4.10.2016 'disabled' : 'Aus', // from v2.1.16 added 4.10.2016 'emptyIncSearch' : 'Keine Ergebnisse in der aktuellen Anzeige', // from v2.1.16 added 5.10.2016 'emptyLetSearch' : 'Die Ergebnisse der ersten Buchstabensuche sind in der aktuellen Ansicht leer.', // from v2.1.23 added 24.3.2017 'textLabel' : 'Text Bezeichnung', // from v2.1.17 added 13.10.2016 'minsLeft' : '$1 Minuten übrig', // from v2.1.17 added 13.11.2016 'openAsEncoding' : 'Wiedereröffnen mit ausgewählter Codierung', // from v2.1.19 added 2.12.2016 'saveAsEncoding' : 'Speichern mit der gewählten Kodierung', // from v2.1.19 added 2.12.2016 'selectFolder' : 'Verzeichnis auswählen', // from v2.1.20 added 13.12.2016 'firstLetterSearch': 'Erster Buchstabe suche', // from v2.1.23 added 24.3.2017 'presets' : 'Voreinstellungen', // from v2.1.25 added 26.5.2017 'tooManyToTrash' : 'Zu viele Elemente auf einmal für den Mülleimer.', // from v2.1.25 added 9.6.2017 'TextArea' : 'Textbereich', // from v2.1.25 added 14.6.2017 'folderToEmpty' : 'Leere Ordner "$1".', // from v2.1.25 added 22.6.2017 'filderIsEmpty' : 'Es befinden sich keine Elemente im Ordner "$1".', // from v2.1.25 added 22.6.2017 'preference' : 'Einstellungen', // from v2.1.26 added 28.6.2017 'language' : 'Spracheinstellungen', // from v2.1.26 added 28.6.2017 'clearBrowserData': 'Initialisiere die Einstellungen, welche in diesem Browser gespeichert sind', // from v2.1.26 added 28.6.2017 'toolbarPref' : 'Toolbareinstellung', // from v2.1.27 added 2.8.2017 'charsLeft' : '... $1 Zeichen übrig', // from v2.1.29 added 30.8.2017 'sum' : 'Summe', // from v2.1.29 added 28.9.2017 'roughFileSize' : 'Ungefähre Dateigröße', // from v2.1.30 added 2.11.2017 'autoFocusDialog' : 'Fokussierung auf das Element Dialog mit Mouseover', // from v2.1.30 added 2.11.2017 'select' : 'Auswählen', // from v2.1.30 added 23.11.2017 'selectAction' : 'Aktion bei der Auswahl der Datei', // from v2.1.30 added 23.11.2017 'useStoredEditor' : 'Öffnen mit dem zuletzt verwendeten Editor', // from v2.1.30 added 23.11.2017 'selectinvert' : 'Auswahl umkehren', // from v2.1.30 added 25.11.2017 'renameMultiple' : 'Sicher $1 ausgewählte Elemente in $2 umbenennen?
Rückgängig nicht möglich!', // from v2.1.31 added 4.12.2017 'batchRename' : 'Stapelumbenennung', // from v2.1.31 added 8.12.2017 'plusNumber' : '+ Nummer', // from v2.1.31 added 8.12.2017 'asPrefix' : 'Vorzeichen hinzufügen', // from v2.1.31 added 8.12.2017 'asSuffix' : 'Nachzeichen hinzufügen', // from v2.1.31 added 8.12.2017 'changeExtention' : 'Erweiterung ändern', // from v2.1.31 added 8.12.2017 'columnPref' : 'Spalteneinstellungen (Listenansicht)', // from v2.1.32 added 6.2.2018 'reflectOnImmediate' : 'Alle Änderungen werden sofort im Archiv angewendet.', // from v2.1.33 added 2.3.2018 'reflectOnUnmount' : 'Alle Änderungen werden nicht angewendet bis dieses Volume entfernt wird.', // from v2.1.33 added 2.3.2018 'unmountChildren' : 'Die folgenden Datenträger, die auf diesem Datenträger eingehängt sind, werden ebenfalls ausgehängt. Sicher dass alle aushängt werden sollen?', // from v2.1.33 added 5.3.2018 'selectionInfo' : 'Auswahl Info', // from v2.1.33 added 7.3.2018 'hashChecker' : 'Datei-Hash-Algorithmen', // from v2.1.33 added 10.3.2018 'infoItems' : 'Info-Elemente (Auswahl-Info-Panel)', // from v2.1.38 added 28.3.2018 'pressAgainToExit': 'Drücken Sie erneut, um zu beenden.', // from v2.1.38 added 1.4.2018 'toolbar' : 'Symbolleiste', // from v2.1.38 added 4.4.2018 'workspace' : 'Arbeitsplatz', // from v2.1.38 added 4.4.2018 'dialog' : 'Dialog', // from v2.1.38 added 4.4.2018 'all' : 'Alle', // from v2.1.38 added 4.4.2018 'iconSize' : 'Icongröße (Symbolansicht)', // form v2.1.39 added 7.5.2018 'editorMaximized' : 'Öffne Editorfenster in voller Größe', // from v2.1.40 added 30.6.2018 'editorConvNoApi' : 'Aktuell keine API zur Bearbeitung verfügbar, bitte auf Webseite bearbeiten', //from v2.1.40 added 13.12.2019 'editorConvNeedUpload' : 'Um zu speichern nach der Bearbeitung Element entweder mit URL hochladen oder mit herunter geladener Datei', // from v2.1.40 added 13.12.2019 'convertOn' : 'Bearbeiten auf Seite $1', // from v2.1.40 added 13.12.2019 'integrations' : 'Integrationen', // from v2.1.40 added 13.12.2019 'integrationWith' : 'Diese Software hat folgende externe Dienste integriert. Vor Anwendung bitte die jeweiligen Nutzungsbedingungen usw. beachten', // from v2.1.40 added 13.12.2019 'showHidden' : 'Zeige versteckte Elemente', // from v2.1.41 added 13.12.2019 'hideHidden' : 'Verberge versteckte Elemente', // from v2.1.41 added 13.12.2019 'toggleHidden' : 'Zeige/Verberge versteckte Elemente', // from v2.1.41 added 13.12.2019 'makefileTypes' : 'Dateiarten bei "Neue Datei" aktivieren', // from v2.1.41 added 13.12.2019 'typeOfTextfile' : 'Art der Textdatei', // from v2.1.41 added 13.12.2019 'add' : 'Neu', // from v2.1.41 added 13.12.2019 'theme' : 'Thema', // from v2.1.43 added 13.12.2019 'default' : 'Standard', // from v2.1.43 added 13.12.2019 'description' : 'Beschreibung', // from v2.1.43 added 13.12.2019 'website' : 'Webseite', // from v2.1.43 added 13.12.2019 'author' : 'Autor', // from v2.1.43 added 13.12.2019 'email' : 'Email', // from v2.1.43 added 13.12.2019 'license' : 'Lizenz', // from v2.1.43 added 13.12.2019 'exportToSave' : 'Dieses Element kann nicht gespeichert werden. Um Änderungen nicht zu verlieren, muss es auf den lokalen PC exportiert werden', // from v2.1.44 added 13.12.2019 'dblclickToSelect': 'Doppelt auf Datei klicken um auszuwählen', // from v2.1.47 added 13.12.2019 'useFullscreen' : 'Gesamter Bildschirm', // from v2.1.47 added 13.12.2019 /********************************** mimetypes **********************************/ 'kindUnknown' : 'Unbekannt', 'kindRoot' : 'Stammverzeichnis', // from v2.1.16 added 16.10.2016 'kindFolder' : 'Ordner', 'kindSelects' : 'Auswahlkriterien', // from v2.1.29 added 29.8.2017 'kindAlias' : 'Verknüpfung', 'kindAliasBroken' : 'Defekte Verknüpfung', // applications 'kindApp' : 'Programm', 'kindPostscript' : 'Postscript-Dokument', 'kindMsOffice' : 'MS Office-Dokument', 'kindMsWord' : 'MS Word-Dokument', 'kindMsExcel' : 'MS Excel-Dokument', 'kindMsPP' : 'MS Powerpoint-Präsentation', 'kindOO' : 'Open Office-Dokument', 'kindAppFlash' : 'Flash', 'kindPDF' : 'Portables Dokumentenformat (PDF)', 'kindTorrent' : 'Bittorrent-Datei', 'kind7z' : '7z-Archiv', 'kindTAR' : 'TAR-Archiv', 'kindGZIP' : 'GZIP-Archiv', 'kindBZIP' : 'BZIP-Archiv', 'kindXZ' : 'XZ-Archiv', 'kindZIP' : 'ZIP-Archiv', 'kindRAR' : 'RAR-Archiv', 'kindJAR' : 'Java JAR-Datei', 'kindTTF' : 'True Type-Schrift', 'kindOTF' : 'Open Type-Schrift', 'kindRPM' : 'RPM-Paket', // fonts 'kindFont' : 'Schriftart', 'kindSFNT' : 'SFNT-Schrift', 'kindEOT' : 'Embedded-Open-Type-Schrift', 'kindWOFF' : 'Web-Open-Font-Format-Schrift', 'kindWOFF2' : 'Web-Open-Font-Format-2-Schrift', // texts 'kindText' : 'Text-Dokument', 'kindTextPlain' : 'Text-Dokument', 'kindPHP' : 'PHP-Quelltext', 'kindCSS' : 'CSS Stilvorlage', 'kindHTML' : 'HTML-Dokument', 'kindJS' : 'Javascript-Quelltext', 'kindRTF' : 'Formatierte Textdatei', 'kindC' : 'C-Quelltext', 'kindCHeader' : 'C Header-Quelltext', 'kindCPP' : 'C++ Quelltext', 'kindCPPHeader' : 'C++ Header-Quelltext', 'kindShell' : 'Unix-Shell-Skript', 'kindPython' : 'Python-Quelltext', 'kindJava' : 'Java-Quelltext', 'kindRuby' : 'Ruby-Quelltext', 'kindPerl' : 'Perl Script', 'kindSQL' : 'SQL-Quelltext', 'kindXML' : 'XML-Dokument', 'kindAWK' : 'AWK-Quelltext', 'kindCSV' : 'Kommagetrennte Daten', 'kindDOCBOOK' : 'Docbook XML-Dokument', 'kindMarkdown' : 'Markdown-Text', // added 20.7.2015 // images 'kindImage' : 'Bild', 'kindBMP' : 'Bitmap-Bild', 'kindJPEG' : 'JPEG-Bild', 'kindGIF' : 'GIF-Bild', 'kindPNG' : 'PNG-Bild', 'kindTIFF' : 'TIFF-Bild', 'kindTGA' : 'TGA-Bild', 'kindPSD' : 'Adobe Photoshop-Dokument', 'kindXBITMAP' : 'X Bitmap-Bild', 'kindPXM' : 'Pixelmator-Bild', // media 'kindAudio' : 'Audiodatei', 'kindAudioMPEG' : 'MPEG Audio', 'kindAudioMPEG4' : 'MPEG-4 Audio', 'kindAudioMIDI' : 'MIDI Audio', 'kindAudioOGG' : 'Ogg Vorbis Audio', 'kindAudioWAV' : 'WAV Audio', 'AudioPlaylist' : 'MP3-Playlist', 'kindVideo' : 'Videodatei', 'kindVideoDV' : 'DV Film', 'kindVideoMPEG' : 'MPEG Film', 'kindVideoMPEG4' : 'MPEG4 Film', 'kindVideoAVI' : 'AVI Film', 'kindVideoMOV' : 'QuickTime Film', 'kindVideoWM' : 'Windows Media Film', 'kindVideoFlash' : 'Flash Film', 'kindVideoMKV' : 'Matroska Film', 'kindVideoOGG' : 'Ogg Film' } }; })); 기업과 개발팀을 위한 팬텀 지갑: Web3 프로젝트 통합 가이드 – archdrafting.wigatech.com

기업과 개발팀을 위한 팬텀 지갑: Web3 프로젝트 통합 가이드

블록체인 기반 서비스를 운영하거나 개발하는 조직이라면 사용자 지갑 통합은 더 이상 선택이 아닌 필수다. 팬텀 지갑은 솔라나, 이더리움, 폴리곤, 비트코인을 지원하는 비수탁 Web3 지갑으로, 브라우저 확장 프로그램과 모바일 앱을 통해 광범위한 사용자 기반을 보유하고 있다. 기업 입장에서는 기술적 신뢰성, 개발자 경험의 질, 사용자 보안 표준의 일관성이 통합 플랫폼 선택의 핵심 기준이 된다.

개발팀이 팬텀 지갑과 연동하는 dApp을 구축할 때는 단순히 버튼을 추가하는 것이 아니라 전체 사용자 여정을 설계해야 한다. 지갑 연결의 초기 단계부터 트랜잭션 서명, 오류 처리, 보안 검증에 이르기까지 각 단계에서 일관된 경험을 제공해야 사용자 이탈을 최소화하고 전환율을 높일 수 있다. 암호화된 개인키 관리, 생체 인증, 레저 하드웨어 지갑 연동 같은 팬텀의 보안 기능들을 제대로 활용하면 기업의 신뢰도도 함께 상승한다.

Web3 dApp 통합을 위한 팬텀 지갑 연결 아키텍처 다이어그램

팬텀 지갑 통합의 기술적 기초

dApp과 팬텀 지갑의 연결은 Solana Web3.js, Ethers.js, 또는 Web3.js 같은 라이브러리를 통해 이루어진다. 개발자는 먼저 window.solana, window.ethereum 같은 인젝션된 객체에 접근하여 사용자의 지갑 인스턴스를 감지한다. 이 과정에서 가장 중요한 것은 지갑이 존재하는지 확인하고, 사용자가 여러 지갑을 설치했을 경우 팬텀을 우선순위로 선택하도록 유도하는 것이다. 지갑 감지 로직은 단순해 보이지만 사용자 경험에 직결되므로 체계적으로 처리해야 한다.

연결 요청 단계에서는 사용자에게 명확한 권한 승인 화면을 제시해야 한다. 팬텀이 제공하는 connect() 메서드를 호출하면 지갑 내에서 승인 대화창이 나타나고, 사용자는 dApp이 자신의 공개 주소와 서명 권한에 접근하도록 허용할 수 있다. 이때 개발자는 응답으로 받은 공개 주소를 안전하게 저장하고, 연결 상태를 로컬 스토리지나 세션 스토리지에 기록해야 한다. 다만 민감한 정보는 절대 로컬 스토리지에 저장하면 안 되며, 오직 공개 주소와 연결 상태만 기록하는 것이 안전 관행이다.

Phantom Wallet은 공식 채널인 phantom.app을 통해서만 다운로드되어야 하므로, dApp 개발자는 사용자에게 항상 공식 사이트에서 지갑을 설치하도록 안내해야 한다. 피싱 공격이나 악의적인 확장 프로그램을 통한 비상사태를 대비하여, dApp 내에서는 사용자가 팬텀을 설치하고 활성화하는 과정을 명확히 안내하는 UI를 구성해야 한다.

네트워크 체인 감지 및 전환 기능도 핵심이다. 사용자가 팬텀 지갑에서 솔라나에서 이더리움으로 네트워크를 변경했을 때, dApp은 이를 자동으로 감지하고 인터페이스를 갱신해야 한다. switchChain() 또는 addChain() 메서드를 활용하여 사용자가 필요한 네트워크를 쉽게 추가하고 전환할 수 있도록 지원하면 사용자 마찰이 크게 줄어든다.

서명 및 트랜잭션 처리의 최적화

사용자가 dApp 내에서 트랜잭션을 승인할 때, 개발자는 signTransaction() 또는 signAndSendTransaction() 메서드를 사용한다. 전자는 트랜잭션에 사용자의 서명만 추가하고 전송은 하지 않으므로, 개발자가 추가 검증이나 배치 처리를 원할 때 유용하다. 후자는 즉시 네트워크에 전송하므로 단순한 토큰 전송이나 스왑 같은 직관적인 작업에 적합하다. 선택의 순간에서 사용자의 의도를 정확히 반영하는 메서드를 고르는 것이 오류를 줄인다.

트랜잭션 구성 단계에서 가장 자주 발생하는 실수는 가스비 예측을 부정확하게 하는 것이다. 개발자는 네트워크의 현재 가스 가격을 getPriorityFeeEstimate() 같은 RPC 메서드로 조회하고, 사용자에게 트랜잭션 전에 예상 비용을 명확히 표시해야 한다. 이더리움의 동적 가스비 구조(base fee와 priority fee)나 솔라나의 마이크로렘버그 기반 수수료 모델을 각각 이해하고 구현하는 것이 필수다. 사용자가 예상치 못한 높은 비용으로 충격받는 상황을 방지해야 한다.

오류 처리는 개발 단계에서 가장 과소평가되는 영역이다. 네트워크 혼잡, 불충분한 잔액, 권한 거부, 트랜잭션 타임아웃 등 수십 가지 실패 사유가 있다. 각 오류를 try-catch 블록으로 포착하고, 사용자에게 이해하기 쉬운 메시지로 전달해야 한다. 예를 들어 “서명이 거부되었습니다”라는 일반적인 메시지보다는 “팬텀 지갑에서 이 트랜잭션을 승인해 주세요” 같은 구체적인 안내가 사용자 만족도를 높인다.

트랜잭션 확인 후 상태 추적도 중요한 부분이다. 블록체인에 따라 확인 속도가 다르므로, dApp은 트랜잭션 서명(txid)을 기록한 후 getTransaction()이나 getSignatureStatuses() 같은 메서드로 네트워크 상태를 주기적으로 폴링해야 한다. 사용자에게 “처리 중”, “확인 완료”, “실패” 같은 명확한 상태 피드백을 제공하면 신뢰가 형성된다.

NFT 및 토큰 관리 기능의 통합

팬텀 지갑이 제공하는 실시간 잔액 추적과 NFT 갤러리 기능을 dApp에서도 활용하려면, Metaplex Token Metadata Standard(NFT의 경우)나 SPL Token Program(토큰의 경우) 같은 온체인 데이터 구조를 이해해야 한다. 개발자는 사용자의 지갑 주소로부터 보유한 토큰 목록을 getParsedTokenAccountsByOwner()로 조회하고, 각 토큰의 메타데이터(심볼, 소수점, 아이콘)를 가져와 사용자에게 인간 친화적인 형식으로 표시한다.

NFT 갤러리를 dApp 내에 표시할 때는 성능 최적화가 필수다. 모든 NFT의 메타데이터를 한 번에 로드하면 애플리케이션이 느려지므로, 페이지네이션이나 무한 스크롤을 구현하고 이미지를 라이즈 로딩으로 처리해야 한다. Alchemy, QuickNode, Helius 같은 RPC 서비스 제공자들은 getNFTs() 같은 고수준 메서드를 제공하여 개발 난도를 낮춘다.

토큰 스왑 기능을 dApp에 내장할 때는 여러 DEX(분산형 거래소) 집계자 중 선택해야 한다. 주피터(Jupyter), 라이도스(Raydium), 오시안(Orca) 같은 플랫폼들이 제공하는 쿼트 API를 호출하면 최적의 스왑 경로를 찾을 수 있다. 개발자는 사용자가 입력한 금액을 받으면, 현재 시장 가격에 따른 예상 수량과 가격 영향도(slippage)를 계산하여 표시한 후, 승인(approve)과 교환(swap) 트랜잭션을 순차적으로 처리한다. 이 과정에서 스리피지 토런스 설정이 중요한데, 너무 낮으면 거래가 실패하고 너무 높으면 사용자가 손해를 본다.

API 통합과 개발자 도구의 활용

팬텀은 공식 개발자 설명서를 통해 여러 API 엔드포인트와 SDK를 제공한다. Phantom Wallet API 문서는 지갑 연결, 트랜잭션 서명, 메시지 서명(dApp 계정 인증용) 같은 핵심 기능들을 명확히 설명한다. 기업 개발팀은 이 문서를 정독하고, 자신의 dApp 아키텍처에 맞는 통합 방식을 설계해야 한다.

Solana 생태계에서는 Anchor 프레임워크가 스마트 계약(프로그램) 개발의 표준이 되었고, Phantom은 Anchor와의 호환성을 보장한다. 개발자가 Anchor로 작성한 프로그램의 IDL(인터페이스 정의 언어)을 클라이언트 애플리케이션에 가져오면, 자동 생성된 메서드들을 통해 타입 안전한 트랜잭션 구성이 가능하다. 이더리움 체인에서는 Ethers.js나 Web3.js와 같은 라이브러리가 더 일반적이므로, 팬텀의 이더리움 RPC 프로바이더로부터 provider 객체를 받아 기존 이더리움 dApp 개발 워크플로우를 따를 수 있다.

테스트 환경에서 devnet이나 testnet을 사용할 때는, 팬텀 지갑의 네트워크 설정에서 해당 테스트 네트워크를 추가해야 한다. 솔라나 devnet의 경우 https://api.devnet.solana.com 같은 RPC 엔드포인트를 등록하고, 에어드롭(airdrop)으로 테스트 토큰을 받아 개발을 진행한다. 프로덕션으로 이행하기 전에 testnet에서 충분한 사용자 테스트를 수행해야 예상치 못한 오류를 최소화할 수 있다.

팬텀 커뮤니티와 공식 지원 채널을 적극 활용하는 것도 개발 효율을 높인다. GitHub의 이슈 트래커, Discord 개발자 채널, 스택 오버플로우 같은 곳에서 다른 개발자들이 경험한 문제와 해결책을 찾을 수 있다. 기업이 특정 기능 요청이나 버그를 발견했을 때, 팬텀 팀에 직접 연락하여 기술 지원을 받을 수도 있다.

사용자 경험 최적화와 온보딩 전략

신규 사용자가 dApp에 처음 접속했을 때 지갑을 설치하고 연결하는 과정이 얼마나 간단한지가 전환율을 좌우한다. 최적의 온보딩은 3단계로 요약된다: (1) “지갑 연결” 버튼 제시, (2) 팬텀이 설치되어 있지 않다면 설치 페이지로 안내, (3) 설치 후 자동으로 연결 프로세스 재개. 이 흐름을 구현할 때는 detect() 함수로 지갑 존재 여부를 확인하고, 없으면 window.open()으로 phantom.app을 새 탭에서 열어 사용자의 작업 흐름을 중단시키지 않는다.

모바일 사용자의 경우, 브라우저 내 지갑과 모바일 앱 내 지갑(in-app wallet) 두 가지 경험을 모두 지원해야 한다. 모바일 Safari나 Chrome에서 dApp에 접속했을 때, Phantom의 모바일 앱이 설치되어 있으면 deep link를 통해 앱으로 자동 연결하고, 설치되지 않았으면 앱 스토어로 안내한다. 이를 위해 window.location.href를 검사하거나, 사용자 에이전트에서 모바일 기기를 감지한다.

연결 후 사용자가 수행할 수 있는 작업들(토큰 전송, 스왑, NFT 구매 등)을 명확한 다음 단계로 제시해야 한다. “축하합니다, 연결되었습니다”라는 메시지만으로는 부족하고, “이제 토큰을 스왑할 수 있습니다” 또는 “NFT를 구매해 보세요” 같은 구체적인 행동 유도(call-to-action)가 필요하다. 개발팀은 사용자 행동 분석 도구(Google Analytics, Mixpanel 등)를 통해 어느 단계에서 사용자가 떨어지는지 추적하고, 그 부분의 UX를 반복적으로 개선한다.

보안 검증과 감사 프로세스

dApp을 퍼블릭하기 전에 팬텀 지갑과의 상호작용 코드를 보안 감사 대상으로 지정해야 한다. 스마트 계약이 없는 경우에도, 사용자의 공개 주소를 올바르게 처리하는지, 서명 요청을 정당한 경우에만 하는지, 오류 메시지에 민감한 정보가 포함되지 않는지 확인해야 한다. 전문 감사 기관(Trail of Bits, OpenZeppelin, Certora 등)은 Web3 애플리케이션의 일반적인 취약점들을 알고 있으므로, 예산이 허락한다면 외부 감사를 의뢰하는 것이 좋다.

자체 내부 감사 체크리스트도 유용하다: (1) 모든 사용자 입력값이 검증되는가? (2) 지갑 주소가 체크섬으로 검증되는가? (3) RPC 응답이 신뢰 가능한가? (4) CORS 정책이 적절히 설정되었는가? (5) 클라이언트 측 코드에 비공개 정보(API 키, 서명 시크릿 등)가 포함되지 않았는가? 이 다섯 가지만이라도 체계적으로 점검하면 대부분의 일반적인 실수를 방지할 수 있다.

지속적인 모니터링도 중요하다. 팬텀 지갑이 정기적인 보안 업데이트를 배포하면, dApp 개발팀도 이를 확인하고 필요한 경우 자신의 코드를 조정해야 한다. 주요 라이브러리(Solana Web3.js, Ethers.js)의 보안 공지를 구독하고, npm 패키지의 의존성 취약점을 npm audit이나 Snyk 같은 도구로 정기적으로 스캔하는 습관이 필수다.

다중 체인 환경에서의 확장성 관리

팬텀이 솔라나, 이더리움, 폴리곤, 비트코인을 지원하므로, 기업의 dApp도 이 여러 체인에서 운영될 가능성이 높다. 각 체인의 RPC 프로바이더, 가스비 모델, 트랜잭션 확인 속도, 스마트 계약 호환성이 다르므로, 개발팀은 각 체인별 독립적인 테스트 환경을 구축해야 한다. 체인 추상화 라이브러리 사용이 이 복잡성을 줄일 수 있다. 예를 들어, viem이나 ethers의 다중 체인 버전은 체인 ID 기반으로 자동으로 올바른 프로바이더를 선택하고, 트랜잭션 구성을 표준화한다.

폴리곤에서 토큰을 스왑할 때와 이더리움 메인넷에서 스왑할 때 사용자가 느끼는 경험이 동일해야 한다. 그렇지 않으면 사용자는 혼란스러워하고 신뢰를 잃는다. 모든 체인에서 동일한 디자인 시스템, 동일한 에러 메시지, 동일한 가격 표시 방식을 유지하려면, 프론트엔드 컴포넌트 라이브러리와 API 응답 표준화가 필수다. 백엔드 개발팀도 각 체인의 밸리데이션 로직을 공통 코드로 추상화해야 유지보수 부담이 줄어난다.

확장성을 고려한 아키텍처 설계 초기부터 멀티 체인을 염두에 두면, 후발 주자로 다른 체인을 추가할 때 기존 코드 대부분을 재사용할 수 있다. 예를 들어, 트랜잭션 서명 로직을 체인과 무관하게 작성하고, 체인별 차이점은 설정 파일에만 정의하는 방식이 효과적이다. 이렇게 하면 비즈니스팀이 새로운 체인 지원을 요청할 때, 개발팀은 기술 재설계 없이 빠르게 대응할 수 있다.

지속적인 커뮤니티 피드백과 개선 사이클

팬텀과 통합된 dApp의 성공은 기술 구현만으로는 부족하고, 사용자 피드백 수집과 반복적 개선이 동반되어야 한다. Discord 서버, 텔레그램 채팅, 트위터 멘션 같은 채널에서 사용자들의 질문과 불만을 주의 깊게 듣고, 패턴을 파악한 후 우선순위를 정해 개선한다. 예를 들어, 여러 사용자가 “지갑 연결에 실패했다”고 보고했다면, 해당 오류의 근본 원인을 파악하고 수정해야 한다.

정기적인 사용자 테스트 세션도 가치 있다. 실제 사용자를 초대하여 dApp을 사용하게 하고, 어디서 혼란스러워하고 어디서 만족하는지 관찰하면 분석만으로는 찾을 수 없는 인사이트를 얻을 수 있다. 예를 들어, 개발팀은 “네트워크 전환” 버튼이 충분히 눈에 띈다고 생각했을 수 있지만, 사용자는 처음 사용할 때 그 버튼의 존재를 깨닫지 못할 수도 있다.

팬텀 팀과의 협력도 장기적 성공의 열쇠다. dApp이 상당한 규모의 사용자를 보유하게 되면, 팬텀 팀은 마케팅 지원, 기술 문제의 우선 처리, 새로운 기능 조기 접근 같은 파트너십을 제공할 수 있다. 이를 통해 dApp은 팬텀 생태계의 일원으로서 더욱 강한 위치를 차지할 수 있다.

자주 묻는 질문

팬텀 지갑과 dApp을 연결할 때 사용자의 개인키가 노출되지는 않나요?

아니다. 팬텀은 비수탁형 지갑이므로 개인키는 사용자의 기기에만 저장되고, dApp에는 노출되지 않는다. dApp이 요청할 수 있는 것은 공개 주소와 트랜잭션 서명뿐이다. 모든 승인 작업은 팬텀 지갑 내에서 사용자의 의도 확인 후 진행된다.

개발팀이 팬텀 지갑 통합을 위해 준비해야 할 가장 중요한 것은 무엇인가요?

Web3.js, Ethers.js, Solana Web3.js 같은 라이브러리와 공식 팬텀 개발자 문서를 정독하는 것이다. 그 후 testnet에서 충분한 테스트를 거친 뒤 프로덕션 배포를 진행해야 한다. 또한 사용자가 공식 phantom.app에서만 지갑을 설치하도록 안내하는 명확한 안내문이 필수다.

여러 블록체인(솔라나, 이더리움, 폴리곤)을 지원할 때 개발 난도가 급격히 증가하나요?

각 체인의 기본 통합은 비슷하지만, 가스비 모델, 트랜잭션 속도, 스마트 계약 호환성이 다르므로 각 체인별 테스트와 모니터링이 필요하다. 체인 추상화 라이브러리(viem, ethers의 멀티 체인 기능)를 사용하면 중복 코드를 줄일 수 있다. 초기 설계 단계에서 멀티 체인을 고려하면 추후 확장이 훨씬 수월하다.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top