Compare commits
73 Commits
tyiu/deepl
...
tyiu/fix-l
| Author | SHA1 | Date | |
|---|---|---|---|
|
1e10ef80e6
|
|||
|
|
679c0ac424 | ||
|
|
48050f5e69 | ||
|
|
b5c967e161 | ||
|
|
715d4aa35d | ||
|
|
4b54278378 | ||
|
|
6e700e5726 | ||
|
|
18ad113198 | ||
|
|
7415671900 | ||
|
|
d5b6d935e8 | ||
| 543fd67f35 | |||
|
|
c24689d3ef | ||
| bf7120dc08 | |||
|
|
dbe938ad9b | ||
|
|
289d55b918 | ||
|
|
771fa845e3 | ||
|
|
5f1545b86a | ||
|
|
fe444228e6 | ||
|
|
10596ddb09 | ||
|
|
989684cd37 | ||
|
|
9ab03034a2 | ||
| c602c754f8 | |||
|
c5db887ab1
|
|||
|
|
0563ec8bf8 | ||
|
|
29c4170833 | ||
|
|
3c629621eb | ||
|
|
09f12845c0 | ||
|
|
b882a96206 | ||
|
|
fb82cc0531 | ||
|
|
90cd48ead7 | ||
|
|
f71b67f036 | ||
|
4406e44424
|
|||
|
|
ae6608cf7d | ||
|
|
04759107a2 | ||
|
|
552402f2b5 | ||
| 852609ee30 | |||
|
|
1e44d97a97 | ||
| 567303e680 | |||
| 7d1bac4028 | |||
|
|
eae844e081 | ||
|
|
140b0e4fc4 | ||
| 0b476faff7 | |||
|
|
53ec89551b | ||
|
|
638052492d | ||
|
|
45f8c37498 | ||
|
|
f96ad99790 | ||
|
|
1f79c20973 | ||
| e8b23daa3d | |||
|
|
a2eb77a5e9 | ||
|
|
29a8206586 | ||
|
|
07676a1f95 | ||
|
|
79ca3b2262 | ||
|
|
ba8425dedb | ||
|
|
4faf63f29d | ||
|
|
84ad0e03d0 | ||
|
|
7d3d23def3 | ||
|
|
ac1a5d237e | ||
|
|
cfcd799d63 | ||
|
|
351b32308f | ||
|
|
5a4299edaa | ||
|
|
99b619e011 | ||
|
|
d5ee9e4780 | ||
|
|
ced5b4974f | ||
| 9be55b08fd | |||
|
|
ac5f39a922 | ||
|
|
0e9691ae7a | ||
| 1441d339a7 | |||
|
|
2517132041 | ||
|
|
71acb16387 | ||
|
|
9e2e8595e8 | ||
|
|
1a2e9464af | ||
|
|
63dd39c7e4 | ||
|
|
40be9885c5 |
49
CHANGELOG.md
49
CHANGELOG.md
@@ -1,3 +1,50 @@
|
||||
## [1.0.0-15] - 2023-02-10
|
||||
|
||||
### Added
|
||||
|
||||
- Japanese translations (Terry Yiu)
|
||||
- Add password autofill on account login and creation (Terry Yiu)
|
||||
- Show if relay is paid (William Casarin)
|
||||
- Add "Follows You" indicator on profile (William Casarin)
|
||||
- Add screen to select individual relays when posting/broadcasting (Andrii Sievrikov)
|
||||
- Relay Detail View (Joel Klabo)
|
||||
- Warn when attempting to post an nsec key (Terry Yiu)
|
||||
- DeepL translation integration (Terry Yiu)
|
||||
- Use local authentication (faceid) to access private key (Andrii Sievrikov)
|
||||
- Add accessibility labels to action bar (Bryan Montz)
|
||||
- Copy invoice button (Joel Klabo)
|
||||
- Ability to change remote image loading policy (radixrat)
|
||||
- Receive Lightning Zaps (William Casarin)
|
||||
- Allow text selection in bio (Suhail Saqan)
|
||||
|
||||
|
||||
### Changed
|
||||
|
||||
- Show "Follow Back" button on profile page (William Casarin)
|
||||
- When on your profile page, open relay view instead for your own relays (Terry Yiu)
|
||||
- Updated QR code view, include profile image, etc (ericholguin)
|
||||
- Make app smaller by optimizing pngs (pea-sys)
|
||||
- Clicking relay numbers now goes to relay config (radixrat)
|
||||
|
||||
|
||||
### Fixed
|
||||
|
||||
- Load zaps, likes and reposts when you open a thread (William Casarin)
|
||||
- Fix bug where sidebar navigation fails to pop when switching timelines (William Casarin)
|
||||
- Use lnaddress before lnurl for tip addresses to avoid Anigma scamming (William Casarin)
|
||||
- Fix sidebar navigation bugs (OlegAba)
|
||||
- Fix issue where navigation fails pop to root when switching timelines (William Casarin)
|
||||
- Make @ mentions case insensitive (William Casarin)
|
||||
- Fix some lnurls not getting decoded properly (William Casarin)
|
||||
- Hide incoming DMs from blocked users (William Casarin)
|
||||
- Hide blocked users from search results (William Casarin)
|
||||
- Fix Cash App invoice payments (Rob Seward)
|
||||
- DM Padding (OlegAba)
|
||||
- Check for broken lnurls (William Casarin)
|
||||
|
||||
|
||||
|
||||
[1.0.0-15]: https://github.com/damus-io/damus/releases/tag/v1.0.0-15
|
||||
## [1.0.0-13] - 2023-01-30
|
||||
|
||||
### Added
|
||||
@@ -514,5 +561,3 @@
|
||||
|
||||
[0.1.2]: https://github.com/damus-io/damus/releases/tag/v0.1.2
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
[](https://github.com/damus-io/damus/actions/workflows/run-tests.yaml)
|
||||
|
||||
# damus
|
||||
|
||||
@@ -25,7 +26,7 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
||||
## Getting Started on Damus
|
||||
|
||||
### Damus iOS
|
||||
1) Get the Damus app on TestFlight: https://testflight.apple.com/join/CLwjLxWl
|
||||
1) Get the Damus app on the iOS App Store: https://apps.apple.com/ca/app/damus/id1628663131
|
||||
|
||||
#### ⚙️ Settings (gear icon, top right)
|
||||
- Relays: You can add more relays to send your notes to by tapping the "+".
|
||||
@@ -48,7 +49,7 @@ damus implements the following [Nostr Implementation Possibilities][nips]
|
||||
4. Add @ direcly followed by the pubkey (e.g., `@npub1xtscya34g58tk0z605fvr788k263gsu6cy9x0mhnm87echrgufzsevkk5s`)
|
||||
- You can also long-press a Note to grab their User ID aka pubkey or Note ID to link directly to a Note.
|
||||
- Currently you can't delete your Notes in the iOS app
|
||||
- Share images by pasting the image url which you can grab from imgbb, imgur, etc. (i.e., `(https://i.ibb.co/2SHZbwm/alpha60.jpg)`). Currently images only load for people you follow in the 🏠 Personal Feed. Images are not automatically loaded in 🔍 Global Feed
|
||||
- Share images by pasting the image url which you can grab from imgbb, imgur, etc. (i.e., `https://i.ibb.co/2SHZbwm/alpha60.jpg`). Currently images only load for people you follow in the 🏠 Personal Feed. Images are not automatically loaded in 🔍 Global Feed
|
||||
- Engaging with Notes
|
||||
- 💬 Replying to a Note: Tap the chat icon underneath the note. This will show up in the users’ notifications and in your 🏠 Personal and 🔍 Global Feeds
|
||||
- ♺ Reposts: Tap the repost icon which will show up in your 🏠 Personal and 🔍 Global Feeds
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
4C0A3F8F280F640A000448DE /* ThreadModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F8E280F640A000448DE /* ThreadModel.swift */; };
|
||||
4C0A3F91280F6528000448DE /* ChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F90280F6528000448DE /* ChatView.swift */; };
|
||||
4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F92280F66F5000448DE /* ReplyMap.swift */; };
|
||||
4C0A3F97280F8E02000448DE /* ThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F96280F8E02000448DE /* ThreadView.swift */; };
|
||||
4C216F32286E388800040376 /* DMChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F31286E388800040376 /* DMChatView.swift */; };
|
||||
4C216F34286F5ACD00040376 /* DMView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F33286F5ACD00040376 /* DMView.swift */; };
|
||||
4C216F362870A9A700040376 /* InputDismissKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F352870A9A700040376 /* InputDismissKeyboard.swift */; };
|
||||
@@ -72,6 +71,8 @@
|
||||
4C3BEFDA281DCA1400B3DE84 /* LikeCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFD9281DCA1400B3DE84 /* LikeCounter.swift */; };
|
||||
4C3BEFDC281DCE6100B3DE84 /* Liked.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFDB281DCE6100B3DE84 /* Liked.swift */; };
|
||||
4C3BEFE0281DE1ED00B3DE84 /* DamusState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFDF281DE1ED00B3DE84 /* DamusState.swift */; };
|
||||
4C3D52B6298DB4E6001C5831 /* ZapEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D52B5298DB4E6001C5831 /* ZapEvent.swift */; };
|
||||
4C3D52B8298DB5C6001C5831 /* TextEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D52B7298DB5C6001C5831 /* TextEvent.swift */; };
|
||||
4C3EA63D28FF52D600C48A62 /* bolt11.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA63C28FF52D600C48A62 /* bolt11.c */; };
|
||||
4C3EA64128FF553900C48A62 /* hash_u5.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64028FF553900C48A62 /* hash_u5.c */; };
|
||||
4C3EA64428FF558100C48A62 /* sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64328FF558100C48A62 /* sha256.c */; };
|
||||
@@ -140,6 +141,8 @@
|
||||
4CB883AE2976FA9300DC99E7 /* FormatTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883AD2976FA9300DC99E7 /* FormatTests.swift */; };
|
||||
4CB883B0297705DD00DC99E7 /* ZapButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883AF297705DD00DC99E7 /* ZapButton.swift */; };
|
||||
4CB883B6297730E400DC99E7 /* LNUrls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883B5297730E400DC99E7 /* LNUrls.swift */; };
|
||||
4CB9D4A72992D02B00A9A7E4 /* ProfileNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */; };
|
||||
4CB9D4A92992D2F400A9A7E4 /* FollowsYou.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */; };
|
||||
4CBCA930297DB57F00EC6B2F /* WebsiteLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCA92F297DB57F00EC6B2F /* WebsiteLink.swift */; };
|
||||
4CC7AAE7297EFA7B00430951 /* Zap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAE6297EFA7B00430951 /* Zap.swift */; };
|
||||
4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAEA297F0AEC00430951 /* BuilderEventView.swift */; };
|
||||
@@ -164,6 +167,14 @@
|
||||
4CE6DF0427F7A08200C66700 /* damusUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DF0327F7A08200C66700 /* damusUITestsLaunchTests.swift */; };
|
||||
4CE6DF1227F7A2B300C66700 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 4CE6DF1127F7A2B300C66700 /* Starscream */; };
|
||||
4CE6DF1627F8DEBF00C66700 /* RelayConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DF1527F8DEBF00C66700 /* RelayConnection.swift */; };
|
||||
4CE8794829941DA700F758CC /* RelayFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794729941DA700F758CC /* RelayFilters.swift */; };
|
||||
4CE8794C2995B59E00F758CC /* RelayMetadatas.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */; };
|
||||
4CE8794E2996B16A00F758CC /* RelayToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794D2996B16A00F758CC /* RelayToggle.swift */; };
|
||||
4CE879502996B2BD00F758CC /* RelayStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794F2996B2BD00F758CC /* RelayStatus.swift */; };
|
||||
4CE879522996B68900F758CC /* RelayType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879512996B68900F758CC /* RelayType.swift */; };
|
||||
4CE879552996BAB900F758CC /* RelayPaidDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879542996BAB900F758CC /* RelayPaidDetail.swift */; };
|
||||
4CE879582996C45300F758CC /* ZapsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879572996C45300F758CC /* ZapsView.swift */; };
|
||||
4CE8795B2996C47A00F758CC /* ZapsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8795A2996C47A00F758CC /* ZapsModel.swift */; };
|
||||
4CEE2AED2805B22500AB5EEF /* NostrRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AEC2805B22500AB5EEF /* NostrRequest.swift */; };
|
||||
4CEE2AF1280B216B00AB5EEF /* EventDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF0280B216B00AB5EEF /* EventDetailView.swift */; };
|
||||
4CEE2AF3280B25C500AB5EEF /* ProfilePicView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF2280B25C500AB5EEF /* ProfilePicView.swift */; };
|
||||
@@ -189,6 +200,7 @@
|
||||
5C513FBA297F72980072348F /* CustomPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FB9297F72980072348F /* CustomPicker.swift */; };
|
||||
5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FCB2984ACA60072348F /* QRCodeView.swift */; };
|
||||
6439E014296790CF0020672B /* ProfileZoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfileZoomView.swift */; };
|
||||
643EA5C8296B764E005081BB /* RelayFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643EA5C7296B764E005081BB /* RelayFilterView.swift */; };
|
||||
647D9A8D2968520300A295DE /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D9A8C2968520300A295DE /* SideMenuView.swift */; };
|
||||
64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FBD06E296255C400D9D3B2 /* Theme.swift */; };
|
||||
6C7DE41F2955169800E66263 /* Vault in Frameworks */ = {isa = PBXBuildFile; productRef = 6C7DE41E2955169800E66263 /* Vault */; };
|
||||
@@ -201,6 +213,8 @@
|
||||
DD597CBD2963D85A00C64D32 /* MarkdownTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */; };
|
||||
E990020F2955F837003BBC5A /* EditMetadataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E990020E2955F837003BBC5A /* EditMetadataView.swift */; };
|
||||
E9E4ED0B295867B900DD7078 /* ThreadV2View.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */; };
|
||||
F7908E92298B0F0700AB113A /* RelayDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7908E91298B0F0700AB113A /* RelayDetailView.swift */; };
|
||||
F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */; };
|
||||
F7F0BA25297892BD009531F3 /* SwipeToDismiss.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */; };
|
||||
F7F0BA272978E54D009531F3 /* ParicipantsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F0BA262978E54D009531F3 /* ParicipantsView.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
@@ -230,20 +244,29 @@
|
||||
3A185A04297F2C3800F4BDC0 /* lv-LV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "lv-LV"; path = "lv-LV.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A185A05297F2C3800F4BDC0 /* lv-LV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "lv-LV"; path = "lv-LV.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A185A06297F2C3800F4BDC0 /* lv-LV */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "lv-LV"; path = "lv-LV.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A25EF132992DA5D008ABE69 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "el-GR"; path = "el-GR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A25EF142992DA5D008ABE69 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "el-GR"; path = "el-GR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A25EF152992DA5D008ABE69 /* el-GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "el-GR"; path = "el-GR.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A2B8B0A296A8982009CC16D /* en-US */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "en-US"; path = "en-US.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A4F3320297CCFEE004B5F72 /* fr-FR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-FR"; path = "fr-FR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A4F3321297CCFEE004B5F72 /* fr-FR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "fr-FR"; path = "fr-FR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A4F3322297CCFEE004B5F72 /* fr-FR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "fr-FR"; path = "fr-FR.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A5C4575296A879E0032D398 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "es-419"; path = "es-419.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A5EA10F297CCF6C00569477 /* de-AT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de-AT"; path = "de-AT.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A5EA110297CCF6C00569477 /* de-AT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "de-AT"; path = "de-AT.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A5EA111297CCF6C00569477 /* de-AT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "de-AT"; path = "de-AT.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A5CAE1D298DC0DB00B5334F /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A5CAE1E298DC0DB00B5334F /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-CN"; path = "zh-CN.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A5CAE1F298DC0DB00B5334F /* zh-CN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-CN"; path = "zh-CN.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A66D927299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
3A66D928299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3A66D929299472FA008B44F4 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ja; path = ja.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
3A929C20297F2CF80090925E /* it-IT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "it-IT"; path = "it-IT.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A929C21297F2CF80090925E /* it-IT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "it-IT"; path = "it-IT.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A929C22297F2CF80090925E /* it-IT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "it-IT"; path = "it-IT.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A93342929884CA600D6A8F3 /* pl-PL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pl-PL"; path = "pl-PL.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3A93342A29884CA600D6A8F3 /* pl-PL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pl-PL"; path = "pl-PL.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3A93342B29884CA600D6A8F3 /* pl-PL */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pl-PL"; path = "pl-PL.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3A96D41A298DA94500388A2A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
3A96D41B298DA94500388A2A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3A96D41C298DA94500388A2A /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = nl; path = nl.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
3AA247FC297E3CFF0090C62D /* RepostsModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RepostsModel.swift; sourceTree = "<group>"; };
|
||||
3AA247FE297E3D900090C62D /* RepostsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepostsView.swift; sourceTree = "<group>"; };
|
||||
3AA24801297E3DC20090C62D /* RepostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RepostView.swift; sourceTree = "<group>"; };
|
||||
@@ -263,9 +286,6 @@
|
||||
3AEB8003297CCEA800713A25 /* tr-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "tr-TR"; path = "tr-TR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3AEB8004297CCEA800713A25 /* tr-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "tr-TR"; path = "tr-TR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3AEB8005297CCEA900713A25 /* tr-TR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "tr-TR"; path = "tr-TR.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
3AF0BC09298C1F66008E2AB8 /* zh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh; path = zh.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
3AF0BC0A298C1F66008E2AB8 /* zh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh; path = zh.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3AF0BC0B298C1F66008E2AB8 /* zh */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = zh; path = zh.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
3AF6336829884C6B0005672A /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
3AF6336929884C6B0005672A /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
3AF6336A29884C6B0005672A /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-PT"; path = "pt-PT.lproj/Localizable.stringsdict"; sourceTree = "<group>"; };
|
||||
@@ -280,7 +300,6 @@
|
||||
4C0A3F8E280F640A000448DE /* ThreadModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadModel.swift; sourceTree = "<group>"; };
|
||||
4C0A3F90280F6528000448DE /* ChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatView.swift; sourceTree = "<group>"; };
|
||||
4C0A3F92280F66F5000448DE /* ReplyMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyMap.swift; sourceTree = "<group>"; };
|
||||
4C0A3F96280F8E02000448DE /* ThreadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadView.swift; sourceTree = "<group>"; };
|
||||
4C216F31286E388800040376 /* DMChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DMChatView.swift; sourceTree = "<group>"; };
|
||||
4C216F33286F5ACD00040376 /* DMView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DMView.swift; sourceTree = "<group>"; };
|
||||
4C216F352870A9A700040376 /* InputDismissKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputDismissKeyboard.swift; sourceTree = "<group>"; };
|
||||
@@ -321,6 +340,8 @@
|
||||
4C3BEFD9281DCA1400B3DE84 /* LikeCounter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeCounter.swift; sourceTree = "<group>"; };
|
||||
4C3BEFDB281DCE6100B3DE84 /* Liked.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Liked.swift; sourceTree = "<group>"; };
|
||||
4C3BEFDF281DE1ED00B3DE84 /* DamusState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DamusState.swift; sourceTree = "<group>"; };
|
||||
4C3D52B5298DB4E6001C5831 /* ZapEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapEvent.swift; sourceTree = "<group>"; };
|
||||
4C3D52B7298DB5C6001C5831 /* TextEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEvent.swift; sourceTree = "<group>"; };
|
||||
4C3EA63B28FF52D600C48A62 /* bolt11.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bolt11.h; sourceTree = "<group>"; };
|
||||
4C3EA63C28FF52D600C48A62 /* bolt11.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bolt11.c; sourceTree = "<group>"; };
|
||||
4C3EA63E28FF54BD00C48A62 /* short_types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = short_types.h; sourceTree = "<group>"; };
|
||||
@@ -419,6 +440,8 @@
|
||||
4CB883AD2976FA9300DC99E7 /* FormatTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormatTests.swift; sourceTree = "<group>"; };
|
||||
4CB883AF297705DD00DC99E7 /* ZapButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapButton.swift; sourceTree = "<group>"; };
|
||||
4CB883B5297730E400DC99E7 /* LNUrls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LNUrls.swift; sourceTree = "<group>"; };
|
||||
4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileNameView.swift; sourceTree = "<group>"; };
|
||||
4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowsYou.swift; sourceTree = "<group>"; };
|
||||
4CBCA92F297DB57F00EC6B2F /* WebsiteLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebsiteLink.swift; sourceTree = "<group>"; };
|
||||
4CC7AAE6297EFA7B00430951 /* Zap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Zap.swift; sourceTree = "<group>"; };
|
||||
4CC7AAEA297F0AEC00430951 /* BuilderEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuilderEventView.swift; sourceTree = "<group>"; };
|
||||
@@ -445,6 +468,14 @@
|
||||
4CE6DF0127F7A08200C66700 /* damusUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = damusUITests.swift; sourceTree = "<group>"; };
|
||||
4CE6DF0327F7A08200C66700 /* damusUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = damusUITestsLaunchTests.swift; sourceTree = "<group>"; };
|
||||
4CE6DF1527F8DEBF00C66700 /* RelayConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayConnection.swift; sourceTree = "<group>"; };
|
||||
4CE8794729941DA700F758CC /* RelayFilters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayFilters.swift; sourceTree = "<group>"; };
|
||||
4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayMetadatas.swift; sourceTree = "<group>"; };
|
||||
4CE8794D2996B16A00F758CC /* RelayToggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayToggle.swift; sourceTree = "<group>"; };
|
||||
4CE8794F2996B2BD00F758CC /* RelayStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayStatus.swift; sourceTree = "<group>"; };
|
||||
4CE879512996B68900F758CC /* RelayType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayType.swift; sourceTree = "<group>"; };
|
||||
4CE879542996BAB900F758CC /* RelayPaidDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayPaidDetail.swift; sourceTree = "<group>"; };
|
||||
4CE879572996C45300F758CC /* ZapsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapsView.swift; sourceTree = "<group>"; };
|
||||
4CE8795A2996C47A00F758CC /* ZapsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZapsModel.swift; sourceTree = "<group>"; };
|
||||
4CEE2AE72804F57C00AB5EEF /* libsecp256k1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libsecp256k1.a; sourceTree = "<group>"; };
|
||||
4CEE2AEC2805B22500AB5EEF /* NostrRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NostrRequest.swift; sourceTree = "<group>"; };
|
||||
4CEE2AF0280B216B00AB5EEF /* EventDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventDetailView.swift; sourceTree = "<group>"; };
|
||||
@@ -471,6 +502,7 @@
|
||||
5C513FB9297F72980072348F /* CustomPicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPicker.swift; sourceTree = "<group>"; };
|
||||
5C513FCB2984ACA60072348F /* QRCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeView.swift; sourceTree = "<group>"; };
|
||||
6439E013296790CF0020672B /* ProfileZoomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileZoomView.swift; sourceTree = "<group>"; };
|
||||
643EA5C7296B764E005081BB /* RelayFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayFilterView.swift; sourceTree = "<group>"; };
|
||||
647D9A8C2968520300A295DE /* SideMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; };
|
||||
64FBD06E296255C400D9D3B2 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; };
|
||||
7C45AE70297353390031D7BC /* KFImageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KFImageModel.swift; sourceTree = "<group>"; };
|
||||
@@ -482,6 +514,8 @@
|
||||
DD597CBC2963D85A00C64D32 /* MarkdownTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarkdownTests.swift; sourceTree = "<group>"; };
|
||||
E990020E2955F837003BBC5A /* EditMetadataView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditMetadataView.swift; sourceTree = "<group>"; };
|
||||
E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadV2View.swift; sourceTree = "<group>"; };
|
||||
F7908E91298B0F0700AB113A /* RelayDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayDetailView.swift; sourceTree = "<group>"; };
|
||||
F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NIPURLBuilder.swift; sourceTree = "<group>"; };
|
||||
F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwipeToDismiss.swift; sourceTree = "<group>"; };
|
||||
F7F0BA262978E54D009531F3 /* ParicipantsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParicipantsView.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
@@ -625,6 +659,7 @@
|
||||
3AE45AF5297BB2E700C1D842 /* LibreTranslateServer.swift */,
|
||||
3AAA95C9298DF87B00F3D526 /* TranslationService.swift */,
|
||||
3AAA95CB298E07E900F3D526 /* DeepLPlan.swift */,
|
||||
4CE8795A2996C47A00F758CC /* ZapsModel.swift */,
|
||||
);
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
@@ -632,6 +667,8 @@
|
||||
4C75EFA227FA576C0006080F /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE879562996C44A00F758CC /* Zaps */,
|
||||
4CB9D4A52992D01900A9A7E4 /* Profile */,
|
||||
4CAAD8AE29888A9B00060CEA /* Relays */,
|
||||
4CF0ABF42985CD4200D66079 /* Posting */,
|
||||
4CF0ABDF2981A83000D66079 /* Muting */,
|
||||
@@ -676,7 +713,6 @@
|
||||
BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */,
|
||||
4C3AC7A02835A81400E1F516 /* SetupView.swift */,
|
||||
E9E4ED0A295867B900DD7078 /* ThreadV2View.swift */,
|
||||
4C0A3F96280F8E02000448DE /* ThreadView.swift */,
|
||||
4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */,
|
||||
4CB55EF4295E679D007FD187 /* UserRelaysView.swift */,
|
||||
647D9A8C2968520300A295DE /* SideMenuView.swift */,
|
||||
@@ -687,6 +723,7 @@
|
||||
4CF0ABE42981EE0C00D66079 /* EULAView.swift */,
|
||||
3AA247FE297E3D900090C62D /* RepostsView.swift */,
|
||||
5C513FCB2984ACA60072348F /* QRCodeView.swift */,
|
||||
643EA5C7296B764E005081BB /* RelayFilterView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
@@ -714,9 +751,11 @@
|
||||
4C7FF7D628233637009601DB /* Util */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE879492995B58700F758CC /* Relays */,
|
||||
4CF0ABEA29844B2F00D66079 /* AnyCodable */,
|
||||
4CC7AAE6297EFA7B00430951 /* Zap.swift */,
|
||||
4C3A1D322960DB0500558C0F /* Markdown.swift */,
|
||||
F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */,
|
||||
4CEE2AF4280B29E600AB5EEF /* TimeAgo.swift */,
|
||||
4CE4F8CC281352B30009DFBB /* Notifications.swift */,
|
||||
4C363A8328233689006E126D /* Parser.swift */,
|
||||
@@ -745,9 +784,14 @@
|
||||
4CAAD8AE29888A9B00060CEA /* Relays */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE879532996BA0000F758CC /* Detail */,
|
||||
4CB55EF2295E5D59007FD187 /* RecommendedRelayView.swift */,
|
||||
4C06670028FC7C5900038D2A /* RelayView.swift */,
|
||||
4CAAD8AF29888AD200060CEA /* RelayConfigView.swift */,
|
||||
F7908E91298B0F0700AB113A /* RelayDetailView.swift */,
|
||||
4CE8794D2996B16A00F758CC /* RelayToggle.swift */,
|
||||
4CE8794F2996B2BD00F758CC /* RelayStatus.swift */,
|
||||
4CE879512996B68900F758CC /* RelayType.swift */,
|
||||
);
|
||||
path = Relays;
|
||||
sourceTree = "<group>";
|
||||
@@ -769,6 +813,15 @@
|
||||
path = Reactions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CB9D4A52992D01900A9A7E4 /* Profile */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */,
|
||||
4CB9D4A82992D2F400A9A7E4 /* FollowsYou.swift */,
|
||||
);
|
||||
path = Profile;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CC7AAEE297F11B300430951 /* Events */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -780,6 +833,8 @@
|
||||
4CC7AAF7297F1CEE00430951 /* EventProfile.swift */,
|
||||
4CC7AAF9297F64AC00430951 /* EventMenu.swift */,
|
||||
4CF0ABE6298444FC00D66079 /* MutedEventView.swift */,
|
||||
4C3D52B5298DB4E6001C5831 /* ZapEvent.swift */,
|
||||
4C3D52B7298DB5C6001C5831 /* TextEvent.swift */,
|
||||
);
|
||||
path = Events;
|
||||
sourceTree = "<group>";
|
||||
@@ -885,6 +940,31 @@
|
||||
path = damusUITests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CE879492995B58700F758CC /* Relays */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE8794729941DA700F758CC /* RelayFilters.swift */,
|
||||
4CE8794B2995B59E00F758CC /* RelayMetadatas.swift */,
|
||||
);
|
||||
path = Relays;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CE879532996BA0000F758CC /* Detail */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE879542996BAB900F758CC /* RelayPaidDetail.swift */,
|
||||
);
|
||||
path = Detail;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CE879562996C44A00F758CC /* Zaps */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CE879572996C45300F758CC /* ZapsView.swift */,
|
||||
);
|
||||
path = Zaps;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
4CEE2AE62804F57B00AB5EEF /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1021,7 +1101,6 @@
|
||||
Base,
|
||||
"es-419",
|
||||
"en-US",
|
||||
"de-AT",
|
||||
"tr-TR",
|
||||
"fr-FR",
|
||||
"lv-LV",
|
||||
@@ -1029,8 +1108,11 @@
|
||||
de,
|
||||
"pt-PT",
|
||||
"pl-PL",
|
||||
zh,
|
||||
ar,
|
||||
nl,
|
||||
"zh-CN",
|
||||
"el-GR",
|
||||
ja,
|
||||
);
|
||||
mainGroup = 4CE6DEDA27F7A08100C66700;
|
||||
packageReferences = (
|
||||
@@ -1096,6 +1178,7 @@
|
||||
4C285C86283892E7008A31F1 /* CreateAccountModel.swift in Sources */,
|
||||
4C64987C286D03E000EAE2B3 /* DirectMessagesView.swift in Sources */,
|
||||
7C902AE32981D55B002AB16E /* ZoomableScrollView.swift in Sources */,
|
||||
4CE8794C2995B59E00F758CC /* RelayMetadatas.swift in Sources */,
|
||||
4C363A8C28236B92006E126D /* PubkeyView.swift in Sources */,
|
||||
4C5C7E68284ED36500A22DF5 /* SearchHomeModel.swift in Sources */,
|
||||
4C75EFB728049D990006080F /* RelayPool.swift in Sources */,
|
||||
@@ -1119,11 +1202,13 @@
|
||||
4C363A9028247A1D006E126D /* NostrLink.swift in Sources */,
|
||||
4C0A3F8C280F5FCA000448DE /* ChatroomView.swift in Sources */,
|
||||
4C477C9E282C3A4800033AA3 /* TipCounter.swift in Sources */,
|
||||
4C3D52B6298DB4E6001C5831 /* ZapEvent.swift in Sources */,
|
||||
647D9A8D2968520300A295DE /* SideMenuView.swift in Sources */,
|
||||
F7F0BA272978E54D009531F3 /* ParicipantsView.swift in Sources */,
|
||||
4C0A3F91280F6528000448DE /* ChatView.swift in Sources */,
|
||||
4CF0ABE32981BC7D00D66079 /* UserView.swift in Sources */,
|
||||
4CF0ABF029857E9200D66079 /* Bech32Object.swift in Sources */,
|
||||
4C3D52B8298DB5C6001C5831 /* TextEvent.swift in Sources */,
|
||||
4C216F362870A9A700040376 /* InputDismissKeyboard.swift in Sources */,
|
||||
4C216F382871EDE300040376 /* DirectMessageModel.swift in Sources */,
|
||||
4C75EFA627FF87A20006080F /* Nostr.swift in Sources */,
|
||||
@@ -1152,8 +1237,10 @@
|
||||
4CEE2AF7280B2DEA00AB5EEF /* ProfileName.swift in Sources */,
|
||||
4CC7AAEB297F0AEC00430951 /* BuilderEventView.swift in Sources */,
|
||||
31D2E847295218AF006D67F8 /* Shimmer.swift in Sources */,
|
||||
F7908E97298B1FDF00AB113A /* NIPURLBuilder.swift in Sources */,
|
||||
4C285C8228385570008A31F1 /* CarouselView.swift in Sources */,
|
||||
4C3EA67F28FFC01D00C48A62 /* InvoiceView.swift in Sources */,
|
||||
4CE8794829941DA700F758CC /* RelayFilters.swift in Sources */,
|
||||
4CEE2B02280B39E800AB5EEF /* EventActionBar.swift in Sources */,
|
||||
4C3BEFE0281DE1ED00B3DE84 /* DamusState.swift in Sources */,
|
||||
7C45AE71297353390031D7BC /* KFImageModel.swift in Sources */,
|
||||
@@ -1170,13 +1257,16 @@
|
||||
4CC7AAF8297F1CEE00430951 /* EventProfile.swift in Sources */,
|
||||
64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */,
|
||||
4C3EA64928FF597700C48A62 /* bech32.c in Sources */,
|
||||
4CE879522996B68900F758CC /* RelayType.swift in Sources */,
|
||||
4C90BD162839DB54008EE7EF /* NostrMetadata.swift in Sources */,
|
||||
4CE8795B2996C47A00F758CC /* ZapsModel.swift in Sources */,
|
||||
4C3A1D3729637E0500558C0F /* PreviewCache.swift in Sources */,
|
||||
4C3EA67528FF7A5A00C48A62 /* take.c in Sources */,
|
||||
4C3AC7A12835A81400E1F516 /* SetupView.swift in Sources */,
|
||||
4C06670128FC7C5900038D2A /* RelayView.swift in Sources */,
|
||||
4C285C8C28398BC7008A31F1 /* Keys.swift in Sources */,
|
||||
4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */,
|
||||
4CE879582996C45300F758CC /* ZapsView.swift in Sources */,
|
||||
4C633352283D419F00B1C9C3 /* SignalModel.swift in Sources */,
|
||||
9609F058296E220800069BF3 /* BannerImageView.swift in Sources */,
|
||||
4C363A94282704FA006E126D /* Post.swift in Sources */,
|
||||
@@ -1227,28 +1317,33 @@
|
||||
4C3AC7A728369BA200E1F516 /* SearchHomeView.swift in Sources */,
|
||||
4CB883B0297705DD00DC99E7 /* ZapButton.swift in Sources */,
|
||||
4C363A922825FCF2006E126D /* ProfileUpdate.swift in Sources */,
|
||||
4CB9D4A92992D2F400A9A7E4 /* FollowsYou.swift in Sources */,
|
||||
4C3BEFDA281DCA1400B3DE84 /* LikeCounter.swift in Sources */,
|
||||
4CB88389296AF99A00DC99E7 /* EventDetailBar.swift in Sources */,
|
||||
4CF0ABDE2981A69500D66079 /* MutelistModel.swift in Sources */,
|
||||
4CE8794E2996B16A00F758CC /* RelayToggle.swift in Sources */,
|
||||
4C3AC79B28306D7B00E1F516 /* Contacts.swift in Sources */,
|
||||
4C3EA63D28FF52D600C48A62 /* bolt11.c in Sources */,
|
||||
4CB55EF3295E5D59007FD187 /* RecommendedRelayView.swift in Sources */,
|
||||
4CF0ABEC29844B4700D66079 /* AnyDecodable.swift in Sources */,
|
||||
4C5F9118283D88E40052CD1C /* FollowingModel.swift in Sources */,
|
||||
643EA5C8296B764E005081BB /* RelayFilterView.swift in Sources */,
|
||||
4C3EA67D28FFBBA300C48A62 /* InvoicesView.swift in Sources */,
|
||||
4C363A8E28236FE4006E126D /* NoteContentView.swift in Sources */,
|
||||
4C90BD1A283AA67F008EE7EF /* Bech32.swift in Sources */,
|
||||
E990020F2955F837003BBC5A /* EditMetadataView.swift in Sources */,
|
||||
5C513FBA297F72980072348F /* CustomPicker.swift in Sources */,
|
||||
4CACA9D5280C31E100D9BBE8 /* ReplyView.swift in Sources */,
|
||||
F7908E92298B0F0700AB113A /* RelayDetailView.swift in Sources */,
|
||||
4C3A1D332960DB0500558C0F /* Markdown.swift in Sources */,
|
||||
4CE879552996BAB900F758CC /* RelayPaidDetail.swift in Sources */,
|
||||
4CF0ABD42980996B00D66079 /* Report.swift in Sources */,
|
||||
4C0A3F97280F8E02000448DE /* ThreadView.swift in Sources */,
|
||||
4C06670B28FDE64700038D2A /* damus.c in Sources */,
|
||||
3AAA95CC298E07E900F3D526 /* DeepLPlan.swift in Sources */,
|
||||
4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */,
|
||||
3AA247FF297E3D900090C62D /* RepostsView.swift in Sources */,
|
||||
3AE45AF6297BB2E700C1D842 /* LibreTranslateServer.swift in Sources */,
|
||||
4CE879502996B2BD00F758CC /* RelayStatus.swift in Sources */,
|
||||
4C99737B28C92A9200E53835 /* ChatroomMetadata.swift in Sources */,
|
||||
4CC7AAF4297F18B400430951 /* ReplyDescription.swift in Sources */,
|
||||
4C75EFA427FA577B0006080F /* PostView.swift in Sources */,
|
||||
@@ -1258,6 +1353,7 @@
|
||||
4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */,
|
||||
4C3AC7A52836987600E1F516 /* MainTabView.swift in Sources */,
|
||||
3169CAED294FCCFC00EE4006 /* Constants.swift in Sources */,
|
||||
4CB9D4A72992D02B00A9A7E4 /* ProfileNameView.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -1309,7 +1405,6 @@
|
||||
children = (
|
||||
3A5C4575296A879E0032D398 /* es-419 */,
|
||||
3A2B8B0A296A8982009CC16D /* en-US */,
|
||||
3A5EA111297CCF6C00569477 /* de-AT */,
|
||||
3AEB8005297CCEA900713A25 /* tr-TR */,
|
||||
3A4F3322297CCFEE004B5F72 /* fr-FR */,
|
||||
3A185A06297F2C3800F4BDC0 /* lv-LV */,
|
||||
@@ -1317,8 +1412,11 @@
|
||||
3AB5B86C2986D8A3006599D2 /* de */,
|
||||
3AF6336A29884C6B0005672A /* pt-PT */,
|
||||
3A93342B29884CA600D6A8F3 /* pl-PL */,
|
||||
3AF0BC0B298C1F66008E2AB8 /* zh */,
|
||||
3AC524F0298C000B00693EBF /* ar */,
|
||||
3A96D41C298DA94500388A2A /* nl */,
|
||||
3A5CAE1F298DC0DB00B5334F /* zh-CN */,
|
||||
3A25EF152992DA5D008ABE69 /* el-GR */,
|
||||
3A66D929299472FA008B44F4 /* ja */,
|
||||
);
|
||||
name = Localizable.stringsdict;
|
||||
sourceTree = "<group>";
|
||||
@@ -1327,7 +1425,6 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3ACB685B297633BC00C46468 /* es-419 */,
|
||||
3A5EA10F297CCF6C00569477 /* de-AT */,
|
||||
3AEB8003297CCEA800713A25 /* tr-TR */,
|
||||
3A4F3320297CCFEE004B5F72 /* fr-FR */,
|
||||
3A185A04297F2C3800F4BDC0 /* lv-LV */,
|
||||
@@ -1335,8 +1432,11 @@
|
||||
3AB5B86A2986D8A3006599D2 /* de */,
|
||||
3AF6336829884C6B0005672A /* pt-PT */,
|
||||
3A93342929884CA600D6A8F3 /* pl-PL */,
|
||||
3AF0BC09298C1F66008E2AB8 /* zh */,
|
||||
3AC524EE298C000B00693EBF /* ar */,
|
||||
3A96D41A298DA94500388A2A /* nl */,
|
||||
3A5CAE1D298DC0DB00B5334F /* zh-CN */,
|
||||
3A25EF132992DA5D008ABE69 /* el-GR */,
|
||||
3A66D927299472FA008B44F4 /* ja */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
@@ -1345,7 +1445,6 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3ACB685E297633BC00C46468 /* es-419 */,
|
||||
3A5EA110297CCF6C00569477 /* de-AT */,
|
||||
3AEB8004297CCEA800713A25 /* tr-TR */,
|
||||
3A4F3321297CCFEE004B5F72 /* fr-FR */,
|
||||
3A185A05297F2C3800F4BDC0 /* lv-LV */,
|
||||
@@ -1353,8 +1452,11 @@
|
||||
3AB5B86B2986D8A3006599D2 /* de */,
|
||||
3AF6336929884C6B0005672A /* pt-PT */,
|
||||
3A93342A29884CA600D6A8F3 /* pl-PL */,
|
||||
3AF0BC0A298C1F66008E2AB8 /* zh */,
|
||||
3AC524EF298C000B00693EBF /* ar */,
|
||||
3A96D41B298DA94500388A2A /* nl */,
|
||||
3A5CAE1E298DC0DB00B5334F /* zh-CN */,
|
||||
3A25EF142992DA5D008ABE69 /* el-GR */,
|
||||
3A66D928299472FA008B44F4 /* ja */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
@@ -1490,7 +1592,7 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 13;
|
||||
CURRENT_PROJECT_VERSION = 15;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = XK7H4JAB3D;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1498,6 +1600,7 @@
|
||||
INFOPLIST_FILE = damus/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Damus;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
INFOPLIST_KEY_NSFaceIDUsageDescription = "Local authentication to access private key";
|
||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Granting Damus access to your photos allows you to save images.";
|
||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
@@ -1531,7 +1634,7 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = damus/damus.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 13;
|
||||
CURRENT_PROJECT_VERSION = 15;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"damus/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = XK7H4JAB3D;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
@@ -1539,6 +1642,7 @@
|
||||
INFOPLIST_FILE = damus/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Damus;
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
INFOPLIST_KEY_NSFaceIDUsageDescription = "Local authentication to access private key";
|
||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "Granting Damus access to your photos allows you to save images.";
|
||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
|
||||
@@ -7,6 +7,84 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct InvoiceView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@Environment(\.openURL) private var openURL
|
||||
let our_pubkey: String
|
||||
let invoice: Invoice
|
||||
@State var showing_select_wallet: Bool = false
|
||||
@State var copied = false
|
||||
|
||||
var CopyButton: some View {
|
||||
Button {
|
||||
copied = true
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
|
||||
copied = false
|
||||
}
|
||||
UIImpactFeedbackGenerator(style: .medium).impactOccurred()
|
||||
UIPasteboard.general.string = invoice.string
|
||||
} label: {
|
||||
if !copied {
|
||||
Image(systemName: "doc.on.clipboard")
|
||||
.foregroundColor(.gray)
|
||||
} else {
|
||||
Image(systemName: "checkmark.circle")
|
||||
.foregroundColor(Color("DamusGreen"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var PayButton: some View {
|
||||
Button {
|
||||
if should_show_wallet_selector(our_pubkey) {
|
||||
showing_select_wallet = true
|
||||
} else {
|
||||
open_with_wallet(wallet: get_default_wallet(our_pubkey).model, invoice: invoice.string)
|
||||
}
|
||||
} label: {
|
||||
RoundedRectangle(cornerRadius: 20, style: .circular)
|
||||
.foregroundColor(colorScheme == .light ? .black : .white)
|
||||
.overlay {
|
||||
Text("Pay", comment: "Button to pay a Lightning invoice.")
|
||||
.fontWeight(.medium)
|
||||
.foregroundColor(colorScheme == .light ? .white : .black)
|
||||
}
|
||||
}
|
||||
.onTapGesture {
|
||||
// Temporary solution so that the "pay" button can be clicked (Yes we need an empty tap gesture)
|
||||
print("pay button tap")
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
RoundedRectangle(cornerRadius: 10)
|
||||
.foregroundColor(.secondary.opacity(0.1))
|
||||
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
HStack {
|
||||
Label("", systemImage: "bolt.fill")
|
||||
.foregroundColor(.orange)
|
||||
Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.")
|
||||
Spacer()
|
||||
CopyButton
|
||||
}
|
||||
Divider()
|
||||
Text(invoice.description_string)
|
||||
Text(invoice.amount.amount_sats_str())
|
||||
.font(.title)
|
||||
PayButton
|
||||
.frame(height: 50)
|
||||
.zIndex(10.0)
|
||||
}
|
||||
.padding(30)
|
||||
}
|
||||
.sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) {
|
||||
SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: our_pubkey, invoice: invoice.string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func open_with_wallet(wallet: Wallet.Model, invoice: String) {
|
||||
if let url = URL(string: "\(wallet.link)\(invoice)"), UIApplication.shared.canOpenURL(url) {
|
||||
UIApplication.shared.open(url)
|
||||
@@ -28,67 +106,12 @@ func open_with_wallet(wallet: Wallet.Model, invoice: String) {
|
||||
}
|
||||
}
|
||||
|
||||
struct InvoiceView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
@Environment(\.openURL) private var openURL
|
||||
let our_pubkey: String
|
||||
let invoice: Invoice
|
||||
@State var showing_select_wallet: Bool = false
|
||||
|
||||
var PayButton: some View {
|
||||
Button {
|
||||
if should_show_wallet_selector(our_pubkey) {
|
||||
showing_select_wallet = true
|
||||
} else {
|
||||
open_with_wallet(wallet: get_default_wallet(our_pubkey).model, invoice: invoice.string)
|
||||
}
|
||||
} label: {
|
||||
RoundedRectangle(cornerRadius: 20)
|
||||
.foregroundColor(colorScheme == .light ? .black : .white)
|
||||
.overlay {
|
||||
Text("Pay", comment: "Button to pay a Lightning invoice.")
|
||||
.fontWeight(.medium)
|
||||
.foregroundColor(colorScheme == .light ? .white : .black)
|
||||
}
|
||||
}
|
||||
//.buttonStyle(.bordered)
|
||||
.onTapGesture {
|
||||
// Temporary solution so that the "pay" button can be clicked (Yes we need an empty tap gesture)
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
RoundedRectangle(cornerRadius: 10)
|
||||
.foregroundColor(.secondary.opacity(0.1))
|
||||
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
HStack {
|
||||
Label("", systemImage: "bolt.fill")
|
||||
.foregroundColor(.orange)
|
||||
Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.")
|
||||
}
|
||||
Divider()
|
||||
Text(invoice.description_string)
|
||||
Text(invoice.amount.amount_sats_str())
|
||||
.font(.title)
|
||||
PayButton
|
||||
.frame(height: 50)
|
||||
.zIndex(10.0)
|
||||
}
|
||||
.padding(30)
|
||||
}
|
||||
.sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) {
|
||||
SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: our_pubkey, invoice: invoice.string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let test_invoice = Invoice(description: .description("this is a description"), amount: .specific(10000), string: "lnbc100n1p357sl0sp5t9n56wdztun39lgdqlr30xqwksg3k69q4q2rkr52aplujw0esn0qpp5mrqgljk62z20q4nvgr6lzcyn6fhylzccwdvu4k77apg3zmrkujjqdpzw35xjueqd9ejqcfqv3jhxcmjd9c8g6t0dcxqyjw5qcqpjrzjqt56h4gvp5yx36u2uzqa6qwcsk3e2duunfxppzj9vhypc3wfe2wswz607uqq3xqqqsqqqqqqqqqqqlqqyg9qyysgqagx5h20aeulj3gdwx3kxs8u9f4mcakdkwuakasamm9562ffyr9en8yg20lg0ygnr9zpwp68524kmda0t5xp2wytex35pu8hapyjajxqpsql29r", expiry: 604800, payment_hash: Data(), created_at: 1666139119)
|
||||
|
||||
struct InvoiceView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
InvoiceView(our_pubkey: "", invoice: test_invoice)
|
||||
.frame(width: 200, height: 200)
|
||||
.frame(width: 300, height: 200)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,16 +83,22 @@ struct TranslateView: View {
|
||||
currentLanguage = Locale.current.languageCode ?? "en"
|
||||
}
|
||||
|
||||
// Rely on Apple's NLLanguageRecognizer to tell us which language it thinks the note is in.
|
||||
let content = event.get_content(damus_state.keypair.privkey)
|
||||
noteLanguage = NLLanguageRecognizer.dominantLanguage(for: content)?.rawValue ?? currentLanguage
|
||||
// Rely on Apple's NLLanguageRecognizer to tell us which language it thinks the note is in
|
||||
// and filter on only the text portions of the content as URLs and hashtags confuse the language recognizer.
|
||||
let originalBlocks = event.blocks(damus_state.keypair.privkey)
|
||||
let originalOnlyText = originalBlocks.compactMap { $0.is_text }.joined(separator: " ")
|
||||
|
||||
// Only accept language recognition hypothesis if there's at least a 50% probability that it's accurate.
|
||||
let languageRecognizer = NLLanguageRecognizer()
|
||||
languageRecognizer.processString(originalOnlyText)
|
||||
noteLanguage = languageRecognizer.languageHypotheses(withMaximum: 1).first(where: { $0.value >= 0.5 })?.key.rawValue ?? currentLanguage
|
||||
|
||||
if let lang = noteLanguage, noteLanguage != currentLanguage {
|
||||
// If the detected dominant language is a variant, remove the variant component and just take the language part as translation services typically only supports the variant-less language.
|
||||
if #available(iOS 16, *) {
|
||||
noteLanguage = Locale.LanguageCode(stringLiteral: lang).identifier(.alpha2)
|
||||
} else {
|
||||
noteLanguage = Locale.canonicalLanguageIdentifier(from: lang)
|
||||
noteLanguage = NSLocale(localeIdentifier: lang).languageCode
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +113,14 @@ struct TranslateView: View {
|
||||
do {
|
||||
// If the note language is different from our language, send a translation request.
|
||||
let translator = Translator(damus_state.settings)
|
||||
translated_note = try await translator.translate(content, from: note_lang, to: currentLanguage)
|
||||
let originalContent = event.get_content(damus_state.keypair.privkey)
|
||||
translated_note = try await translator.translate(originalContent, from: note_lang, to: currentLanguage)
|
||||
|
||||
if originalContent == translated_note {
|
||||
// If the translation is the same as the original, don't bother showing it.
|
||||
noteLanguage = currentLanguage
|
||||
translated_note = nil
|
||||
}
|
||||
} catch {
|
||||
// If for whatever reason we're not able to figure out the language of the note, or translate the note, fail gracefully and do not retry. It's not the end of the world. Don't want to take down someone's translation server with an accidental denial of service attack.
|
||||
noteLanguage = currentLanguage
|
||||
@@ -117,8 +130,8 @@ struct TranslateView: View {
|
||||
|
||||
if let translated = translated_note {
|
||||
// Render translated note.
|
||||
let blocks = event.get_blocks(content: translated)
|
||||
translated_artifacts = render_blocks(blocks: blocks, profiles: damus_state.profiles, privkey: damus_state.keypair.privkey)
|
||||
let translatedBlocks = event.get_blocks(content: translated)
|
||||
translated_artifacts = render_blocks(blocks: translatedBlocks, profiles: damus_state.profiles, privkey: damus_state.keypair.privkey)
|
||||
}
|
||||
|
||||
checkingTranslationStatus = false
|
||||
|
||||
@@ -52,7 +52,8 @@ struct ZapButton: View {
|
||||
damus_state.lnurls.endpoints[target.pubkey] = payreq
|
||||
}
|
||||
|
||||
guard let inv = await fetch_zap_invoice(payreq, zapreq: zapreq, amount: 1000000) else {
|
||||
let tip_amount = get_default_tip_amount(pubkey: damus_state.pubkey)
|
||||
guard let inv = await fetch_zap_invoice(payreq, zapreq: zapreq, amount: tip_amount) else {
|
||||
DispatchQueue.main.async {
|
||||
zapping = false
|
||||
}
|
||||
@@ -107,8 +108,10 @@ struct ZapButton: View {
|
||||
send_zap()
|
||||
}
|
||||
}
|
||||
.accessibilityLabel(NSLocalizedString("Zap", comment: "Accessibility label for zap button"))
|
||||
|
||||
Text("\(bar.zap_total > 0 ? "\(format_msats_abbrev(bar.zap_total))" : "")")
|
||||
.offset(x: 22)
|
||||
.font(.footnote)
|
||||
.foregroundColor(bar.zapped ? Color.orange : Color.gray)
|
||||
}
|
||||
@@ -119,12 +122,10 @@ struct ZapButton: View {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
struct ZapButton_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let bar = ActionBarModel.empty()
|
||||
ZapButton(damus_state: test_damus_state(), event: NostrEvent(content: "hi", pubkey: "pk"), bar: bar)
|
||||
let bar = ActionBarModel(likes: 0, boosts: 0, zaps: 10, zap_total: 15623414, our_like: nil, our_boost: nil, our_zap: nil)
|
||||
ZapButton(damus_state: test_damus_state(), event: test_event, lnurl: "lnurl", bar: bar)
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@@ -7,13 +7,12 @@
|
||||
|
||||
import SwiftUI
|
||||
import Starscream
|
||||
import Kingfisher
|
||||
|
||||
var BOOTSTRAP_RELAYS = [
|
||||
"wss://relay.damus.io",
|
||||
"wss://eden.nostr.land",
|
||||
"wss://relay.snort.social",
|
||||
"wss://nostr.orangepill.dev",
|
||||
"wss://offchain.pub",
|
||||
"wss://nos.lol",
|
||||
"wss://relay.current.fyi",
|
||||
"wss://brb.io",
|
||||
@@ -28,12 +27,16 @@ enum Sheets: Identifiable {
|
||||
case post
|
||||
case report(ReportTarget)
|
||||
case reply(NostrEvent)
|
||||
case event(NostrEvent)
|
||||
case filter
|
||||
|
||||
var id: String {
|
||||
switch self {
|
||||
case .report: return "report"
|
||||
case .post: return "post"
|
||||
case .reply(let ev): return "reply-" + ev.id
|
||||
case .event(let ev): return "event-" + ev.id
|
||||
case .filter: return "filter"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -138,6 +141,36 @@ struct ContentView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func popToRoot() {
|
||||
profile_open = false
|
||||
thread_open = false
|
||||
search_open = false
|
||||
isSideBarOpened = false
|
||||
}
|
||||
|
||||
var timelineNavItem: some View {
|
||||
VStack {
|
||||
switch selected_timeline {
|
||||
case .home:
|
||||
Image("damus-home")
|
||||
.resizable()
|
||||
.frame(width:30,height:30)
|
||||
.shadow(color: Color("DamusPurple"), radius: 2)
|
||||
case .dms:
|
||||
Text("DMs", comment: "Toolbar label for DMs view, where DM is the English abbreviation for Direct Message.")
|
||||
.bold()
|
||||
case .notifications:
|
||||
Text("Notifications", comment: "Toolbar label for Notifications view.")
|
||||
.bold()
|
||||
case .search:
|
||||
Text("Global", comment: "Toolbar label for Global view where posts from all connected relay servers appear.")
|
||||
.bold()
|
||||
case .none:
|
||||
Text("", comment: "Toolbar label for unknown views. This label would be displayed only if a new timeline view is added but a toolbar label was not explicitly assigned to it yet.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func MainContent(damus: DamusState) -> some View {
|
||||
VStack {
|
||||
NavigationLink(destination: MaybeProfileView, isActive: $profile_open) {
|
||||
@@ -157,9 +190,10 @@ struct ContentView: View {
|
||||
PostingTimelineView
|
||||
|
||||
case .notifications:
|
||||
TimelineView(events: $home.notifications, loading: $home.loading, damus: damus, show_friend_icon: true, filter: { _ in true })
|
||||
.navigationTitle(NSLocalizedString("Notifications", comment: "Navigation title for notifications."))
|
||||
|
||||
VStack(spacing: 0) {
|
||||
Divider()
|
||||
TimelineView(events: $home.notifications, loading: $home.loading, damus: damus, show_friend_icon: true, filter: { _ in true })
|
||||
}
|
||||
case .dms:
|
||||
DirectMessagesView(damus_state: damus_state!)
|
||||
.environmentObject(home.dms)
|
||||
@@ -171,24 +205,9 @@ struct ContentView: View {
|
||||
.navigationBarTitle(selected_timeline == .home ? NSLocalizedString("Home", comment: "Navigation bar title for Home view where posts and replies appear from those who the user is following.") : NSLocalizedString("Global", comment: "Navigation bar title for Global view where posts from all connected relay servers appear."), displayMode: .inline)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .principal) {
|
||||
switch selected_timeline {
|
||||
case .home:
|
||||
Image("damus-home")
|
||||
.resizable()
|
||||
.frame(width:30,height:30)
|
||||
.shadow(color: Color("DamusPurple"), radius: 2)
|
||||
case .dms:
|
||||
Text("DMs", comment: "Toolbar label for DMs view, where DM is the English abbreviation for Direct Message.")
|
||||
.bold()
|
||||
case .notifications:
|
||||
Text("Notifications", comment: "Toolbar label for Notifications view.")
|
||||
.bold()
|
||||
case .search:
|
||||
Text("Global", comment: "Toolbar label for Global view where posts from all connected relay servers appear.")
|
||||
.bold()
|
||||
case .none:
|
||||
Text("", comment: "Toolbar label for unknown views. This label would be displayed only if a new timeline view is added but a toolbar label was not explicitly assigned to it yet.")
|
||||
}
|
||||
timelineNavItem
|
||||
.opacity(isSideBarOpened ? 0 : 1)
|
||||
.animation(isSideBarOpened ? .none : .default, value: isSideBarOpened)
|
||||
}
|
||||
}
|
||||
.ignoresSafeArea(.keyboard)
|
||||
@@ -197,7 +216,7 @@ struct ContentView: View {
|
||||
var MaybeSearchView: some View {
|
||||
Group {
|
||||
if let search = self.active_search {
|
||||
SearchView(appstate: damus_state!, search: SearchModel(pool: damus_state!.pool, search: search))
|
||||
SearchView(appstate: damus_state!, search: SearchModel(contacts: damus_state!.contacts, pool: damus_state!.pool, search: search))
|
||||
} else {
|
||||
EmptyView()
|
||||
}
|
||||
@@ -245,7 +264,7 @@ struct ContentView: View {
|
||||
if let damus = self.damus_state {
|
||||
NavigationView {
|
||||
ZStack {
|
||||
VStack {
|
||||
TabView { // Prevents navbar appearance change on scroll
|
||||
MainContent(damus: damus)
|
||||
.toolbar() {
|
||||
ToolbarItem(placement: .navigationBarLeading) {
|
||||
@@ -253,7 +272,10 @@ struct ContentView: View {
|
||||
isSideBarOpened.toggle()
|
||||
} label: {
|
||||
ProfilePicView(pubkey: damus_state!.pubkey, size: 32, highlight: .none, profiles: damus_state!.profiles)
|
||||
.opacity(isSideBarOpened ? 0 : 1)
|
||||
.animation(isSideBarOpened ? .none : .default, value: isSideBarOpened)
|
||||
}
|
||||
.disabled(isSideBarOpened)
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .navigationBarTrailing) {
|
||||
@@ -265,19 +287,28 @@ struct ContentView: View {
|
||||
.foregroundColor(.gray)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// maybe expand this to other timelines in the future
|
||||
if selected_timeline == .search {
|
||||
Button(action: {
|
||||
//isFilterVisible.toggle()
|
||||
self.active_sheet = .filter
|
||||
}) {
|
||||
// checklist, checklist.checked, lisdt.bullet, list.bullet.circle, line.3.horizontal.decrease..., line.3.horizontail.decrease
|
||||
Label("Filter", systemImage: "line.3.horizontal.decrease")
|
||||
.foregroundColor(.gray)
|
||||
//.contentShape(Rectangle())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Color.clear
|
||||
.overlay(
|
||||
SideMenuView(damus_state: damus, isSidebarVisible: $isSideBarOpened)
|
||||
)
|
||||
.tabViewStyle(.page(indexDisplayMode: .never))
|
||||
}
|
||||
.navigationBarHidden(isSideBarOpened ? true: false) // Would prefer a different way of doing this.
|
||||
.overlay(
|
||||
SideMenuView(damus_state: damus, isSidebarVisible: $isSideBarOpened.animation())
|
||||
)
|
||||
}
|
||||
.navigationViewStyle(.stack)
|
||||
|
||||
@@ -287,7 +318,6 @@ struct ContentView: View {
|
||||
}
|
||||
.onAppear() {
|
||||
self.connect()
|
||||
//KingfisherManager.shared.cache.clearDiskCache()
|
||||
setup_notifications()
|
||||
}
|
||||
.sheet(item: $active_sheet) { item in
|
||||
@@ -298,6 +328,17 @@ struct ContentView: View {
|
||||
PostView(replying_to: nil, references: [], damus_state: damus_state!)
|
||||
case .reply(let event):
|
||||
ReplyView(replying_to: event, damus: damus_state!)
|
||||
case .event(let event):
|
||||
EventDetailView()
|
||||
case .filter:
|
||||
let timeline = selected_timeline ?? .home
|
||||
if #available(iOS 16.0, *) {
|
||||
RelayFilterView(state: damus_state!, timeline: timeline)
|
||||
.presentationDetents([.height(550)])
|
||||
.presentationDragIndicator(.visible)
|
||||
} else {
|
||||
RelayFilterView(state: damus_state!, timeline: timeline)
|
||||
}
|
||||
}
|
||||
}
|
||||
.onOpenURL { url in
|
||||
@@ -416,6 +457,8 @@ struct ContentView: View {
|
||||
let post_res = obj.object as! NostrPostResult
|
||||
switch post_res {
|
||||
case .post(let post):
|
||||
//let post = tup.0
|
||||
//let to_relays = tup.1
|
||||
print("post \(post.content)")
|
||||
let new_ev = post_to_event(post: post, privkey: privkey, pubkey: pubkey)
|
||||
self.damus_state?.pool.send(.event(new_ev))
|
||||
@@ -520,6 +563,7 @@ struct ContentView: View {
|
||||
}
|
||||
|
||||
func switch_timeline(_ timeline: Timeline) {
|
||||
self.popToRoot()
|
||||
NotificationCenter.default.post(name: .switched_timeline, object: timeline)
|
||||
|
||||
if timeline == self.selected_timeline {
|
||||
@@ -545,9 +589,14 @@ struct ContentView: View {
|
||||
|
||||
func connect() {
|
||||
let pool = RelayPool()
|
||||
let metadatas = RelayMetadatas()
|
||||
let relay_filters = RelayFilters(our_pubkey: pubkey)
|
||||
|
||||
let new_relay_filters = load_relay_filters(pubkey) == nil
|
||||
for relay in BOOTSTRAP_RELAYS {
|
||||
add_relay(pool, relay)
|
||||
if let url = URL(string: relay) {
|
||||
add_new_relay(relay_filters: relay_filters, metadatas: metadatas, pool: pool, url: url, info: .rw, new_relay_filters: new_relay_filters)
|
||||
}
|
||||
}
|
||||
|
||||
pool.register_handler(sub_id: sub_id, handler: home.handle_event)
|
||||
@@ -562,7 +611,9 @@ struct ContentView: View {
|
||||
previews: PreviewCache(),
|
||||
zaps: Zaps(our_pubkey: pubkey),
|
||||
lnurls: LNUrls(),
|
||||
settings: UserSettingsStore()
|
||||
settings: UserSettingsStore(),
|
||||
relay_filters: relay_filters,
|
||||
relay_metadata: metadatas
|
||||
)
|
||||
home.damus_state = self.damus_state!
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
<string>zeusln</string>
|
||||
<string>zebedee</string>
|
||||
<string>lightning</string>
|
||||
<string>squarecash</string>
|
||||
<string>phoenix</string>
|
||||
<string>lnlink</string>
|
||||
<string>strike</string>
|
||||
|
||||
@@ -21,6 +21,8 @@ struct DamusState {
|
||||
let zaps: Zaps
|
||||
let lnurls: LNUrls
|
||||
let settings: UserSettingsStore
|
||||
let relay_filters: RelayFilters
|
||||
let relay_metadata: RelayMetadatas
|
||||
|
||||
var pubkey: String {
|
||||
return keypair.pubkey
|
||||
@@ -32,6 +34,6 @@ struct DamusState {
|
||||
|
||||
|
||||
static var empty: DamusState {
|
||||
return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore())
|
||||
return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), tips: TipCounter(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,11 +51,7 @@ class FollowersModel: ObservableObject {
|
||||
if has_contact.contains(ev.pubkey) {
|
||||
return
|
||||
}
|
||||
process_contact_event(
|
||||
pool: damus_state.pool,
|
||||
contacts: damus_state.contacts,
|
||||
pubkey: damus_state.pubkey, ev: ev
|
||||
)
|
||||
process_contact_event(state: damus_state, ev: ev)
|
||||
contacts?.append(ev.pubkey)
|
||||
has_contact.insert(ev.pubkey)
|
||||
}
|
||||
|
||||
@@ -117,13 +117,17 @@ class HomeModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func handle_zap_event_with_zapper(_ ev: NostrEvent, zapper: String) {
|
||||
func handle_zap_event_with_zapper(_ ev: NostrEvent, our_pubkey: String, zapper: String) {
|
||||
guard let zap = Zap.from_zap_event(zap_ev: ev, zapper: zapper) else {
|
||||
return
|
||||
}
|
||||
|
||||
damus_state.zaps.add_zap(zap: zap)
|
||||
|
||||
guard zap.target.pubkey == our_pubkey else {
|
||||
return
|
||||
}
|
||||
|
||||
if !insert_uniq_sorted_event(events: ¬ifications, new_ev: ev, cmp: { $0.created_at > $1.created_at }) {
|
||||
return
|
||||
}
|
||||
@@ -138,12 +142,8 @@ class HomeModel: ObservableObject {
|
||||
return
|
||||
}
|
||||
|
||||
guard ptag == damus_state.pubkey else {
|
||||
return
|
||||
}
|
||||
|
||||
if let local_zapper = damus_state.profiles.lookup_zapper(pubkey: damus_state.pubkey) {
|
||||
handle_zap_event_with_zapper(ev, zapper: local_zapper)
|
||||
handle_zap_event_with_zapper(ev, our_pubkey: damus_state.pubkey, zapper: local_zapper)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -161,7 +161,8 @@ class HomeModel: ObservableObject {
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
self.handle_zap_event_with_zapper(ev, zapper: zapper)
|
||||
self.damus_state.profiles.zappers[ptag] = zapper
|
||||
self.handle_zap_event_with_zapper(ev, our_pubkey: self.damus_state.pubkey, zapper: zapper)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +194,7 @@ class HomeModel: ObservableObject {
|
||||
}
|
||||
|
||||
func handle_contact_event(sub_id: String, relay_id: String, ev: NostrEvent) {
|
||||
process_contact_event(pool: damus_state.pool, contacts: damus_state.contacts, pubkey: damus_state.pubkey, ev: ev)
|
||||
process_contact_event(state: self.damus_state, ev: ev)
|
||||
|
||||
if sub_id == init_subid {
|
||||
pool.send(.unsubscribe(init_subid), to: [relay_id])
|
||||
@@ -286,7 +287,7 @@ class HomeModel: ObservableObject {
|
||||
switch ev {
|
||||
case .event(let sub_id, let ev):
|
||||
// globally handle likes
|
||||
let always_process = sub_id == notifications_subid || sub_id == contacts_subid || sub_id == home_subid || sub_id == dms_subid || sub_id == init_subid || ev.known_kind == .like || ev.known_kind == .contacts || ev.known_kind == .metadata
|
||||
let always_process = sub_id == notifications_subid || sub_id == contacts_subid || sub_id == home_subid || sub_id == dms_subid || sub_id == init_subid || ev.known_kind == .like || ev.known_kind == .zap || ev.known_kind == .contacts || ev.known_kind == .metadata
|
||||
if !always_process {
|
||||
// TODO: other views like threads might have their own sub ids, so ignore those events... or should we?
|
||||
return
|
||||
@@ -464,7 +465,7 @@ class HomeModel: ObservableObject {
|
||||
}
|
||||
|
||||
func handle_text_event(sub_id: String, _ ev: NostrEvent) {
|
||||
if should_hide_event(contacts: damus_state.contacts, ev: ev) {
|
||||
guard should_show_event(contacts: damus_state.contacts, ev: ev) else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -476,7 +477,7 @@ class HomeModel: ObservableObject {
|
||||
}
|
||||
|
||||
func handle_dm(_ ev: NostrEvent) {
|
||||
if let notifs = handle_incoming_dm(prev_events: self.new_events, dms: self.dms, our_pubkey: self.damus_state.pubkey, ev: ev) {
|
||||
if let notifs = handle_incoming_dm(contacts: damus_state.contacts, prev_events: self.new_events, dms: self.dms, our_pubkey: self.damus_state.pubkey, ev: ev) {
|
||||
self.new_events = notifs
|
||||
}
|
||||
}
|
||||
@@ -643,31 +644,31 @@ func robohash(_ pk: String) -> String {
|
||||
return "https://robohash.org/" + pk
|
||||
}
|
||||
|
||||
func load_our_stuff(pool: RelayPool, contacts: Contacts, pubkey: String, ev: NostrEvent) {
|
||||
guard ev.pubkey == pubkey else {
|
||||
func load_our_stuff(state: DamusState, ev: NostrEvent) {
|
||||
guard ev.pubkey == state.pubkey else {
|
||||
return
|
||||
}
|
||||
|
||||
// only use new stuff
|
||||
if let current_ev = contacts.event {
|
||||
if let current_ev = state.contacts.event {
|
||||
guard ev.created_at > current_ev.created_at else {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let m_old_ev = contacts.event
|
||||
contacts.event = ev
|
||||
let m_old_ev = state.contacts.event
|
||||
state.contacts.event = ev
|
||||
|
||||
load_our_contacts(contacts: contacts, our_pubkey: pubkey, m_old_ev: m_old_ev, ev: ev)
|
||||
load_our_relays(contacts: contacts, our_pubkey: pubkey, pool: pool, m_old_ev: m_old_ev, ev: ev)
|
||||
load_our_contacts(contacts: state.contacts, our_pubkey: state.pubkey, m_old_ev: m_old_ev, ev: ev)
|
||||
load_our_relays(state: state, m_old_ev: m_old_ev, ev: ev)
|
||||
}
|
||||
|
||||
func process_contact_event(pool: RelayPool, contacts: Contacts, pubkey: String, ev: NostrEvent) {
|
||||
load_our_stuff(pool: pool, contacts: contacts, pubkey: pubkey, ev: ev)
|
||||
add_contact_if_friend(contacts: contacts, ev: ev)
|
||||
func process_contact_event(state: DamusState, ev: NostrEvent) {
|
||||
load_our_stuff(state: state, ev: ev)
|
||||
add_contact_if_friend(contacts: state.contacts, ev: ev)
|
||||
}
|
||||
|
||||
func load_our_relays(contacts: Contacts, our_pubkey: String, pool: RelayPool, m_old_ev: NostrEvent?, ev: NostrEvent) {
|
||||
func load_our_relays(state: DamusState, m_old_ev: NostrEvent?, ev: NostrEvent) {
|
||||
let bootstrap_dict: [String: RelayInfo] = [:]
|
||||
let old_decoded = m_old_ev.flatMap { decode_json_relays($0.content) } ?? BOOTSTRAP_RELAYS.reduce(into: bootstrap_dict) { (d, r) in
|
||||
d[r] = .rw
|
||||
@@ -691,14 +692,15 @@ func load_our_relays(contacts: Contacts, our_pubkey: String, pool: RelayPool, m_
|
||||
|
||||
let diff = old.symmetricDifference(new)
|
||||
|
||||
let new_relay_filters = load_relay_filters(state.pubkey) == nil
|
||||
for d in diff {
|
||||
changed = true
|
||||
if new.contains(d) {
|
||||
if let url = URL(string: d) {
|
||||
try? pool.add_relay(url, info: decoded[d] ?? .rw)
|
||||
add_new_relay(relay_filters: state.relay_filters, metadatas: state.relay_metadata, pool: state.pool, url: url, info: decoded[d] ?? .rw, new_relay_filters: new_relay_filters)
|
||||
}
|
||||
} else {
|
||||
pool.remove_relay(d)
|
||||
state.pool.remove_relay(d)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -707,7 +709,62 @@ func load_our_relays(contacts: Contacts, our_pubkey: String, pool: RelayPool, m_
|
||||
}
|
||||
}
|
||||
|
||||
func handle_incoming_dm(prev_events: NewEventsBits, dms: DirectMessagesModel, our_pubkey: String, ev: NostrEvent) -> NewEventsBits? {
|
||||
func add_new_relay(relay_filters: RelayFilters, metadatas: RelayMetadatas, pool: RelayPool, url: URL, info: RelayInfo, new_relay_filters: Bool) {
|
||||
try? pool.add_relay(url, info: info)
|
||||
|
||||
let relay_id = url.absoluteString
|
||||
guard metadatas.lookup(relay_id: relay_id) == nil else {
|
||||
return
|
||||
}
|
||||
|
||||
Task.detached(priority: .background) {
|
||||
guard let meta = try? await fetch_relay_metadata(relay_id: relay_id) else {
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
metadatas.insert(relay_id: relay_id, metadata: meta)
|
||||
|
||||
// if this is the first time adding filters, we should filter non-paid relays
|
||||
if new_relay_filters && !meta.is_paid {
|
||||
relay_filters.insert(timeline: .search, relay_id: relay_id)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func fetch_relay_metadata(relay_id: String) async throws -> RelayMetadata? {
|
||||
var urlString = relay_id.replacingOccurrences(of: "wss://", with: "https://")
|
||||
urlString = urlString.replacingOccurrences(of: "ws://", with: "http://")
|
||||
|
||||
guard let url = URL(string: urlString) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
var request = URLRequest(url: url)
|
||||
request.setValue("application/nostr+json", forHTTPHeaderField: "Accept")
|
||||
|
||||
var res: (Data, URLResponse)? = nil
|
||||
|
||||
res = try await URLSession.shared.data(for: request)
|
||||
|
||||
guard let data = res?.0 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let nip11 = try JSONDecoder().decode(RelayMetadata.self, from: data)
|
||||
return nip11
|
||||
}
|
||||
|
||||
func process_relay_metadata() {
|
||||
}
|
||||
|
||||
func handle_incoming_dm(contacts: Contacts, prev_events: NewEventsBits, dms: DirectMessagesModel, our_pubkey: String, ev: NostrEvent) -> NewEventsBits? {
|
||||
// hide blocked users
|
||||
guard should_show_event(contacts: contacts, ev: ev) else {
|
||||
return prev_events
|
||||
}
|
||||
|
||||
var inserted = false
|
||||
var found = false
|
||||
let ours = ev.pubkey == our_pubkey
|
||||
@@ -781,9 +838,10 @@ func event_has_our_pubkey(_ ev: NostrEvent, our_pubkey: String) -> Bool {
|
||||
}
|
||||
|
||||
|
||||
func should_hide_event(contacts: Contacts, ev: NostrEvent) -> Bool {
|
||||
func should_show_event(contacts: Contacts, ev: NostrEvent) -> Bool {
|
||||
if contacts.is_muted(ev.pubkey) {
|
||||
return true
|
||||
return false
|
||||
}
|
||||
return !ev.should_show_event
|
||||
return ev.should_show_event
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,24 @@ class ProfileModel: ObservableObject, Equatable {
|
||||
var sub_id = UUID().description
|
||||
var prof_subid = UUID().description
|
||||
|
||||
func follows(pubkey: String) -> Bool {
|
||||
guard let contacts = self.contacts else {
|
||||
return false
|
||||
}
|
||||
|
||||
for tag in contacts.tags {
|
||||
guard tag.count >= 2 && tag[0] == "p" else {
|
||||
continue
|
||||
}
|
||||
|
||||
if tag[1] == pubkey {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func get_follow_target() -> FollowTarget {
|
||||
if let contacts = contacts {
|
||||
return .contact(contacts)
|
||||
@@ -70,7 +88,7 @@ class ProfileModel: ObservableObject, Equatable {
|
||||
}
|
||||
|
||||
func handle_profile_contact_event(_ ev: NostrEvent) {
|
||||
process_contact_event(pool: damus.pool, contacts: damus.contacts, pubkey: damus.pubkey, ev: ev)
|
||||
process_contact_event(state: damus, ev: ev)
|
||||
|
||||
// only use new stuff
|
||||
if let current_ev = self.contacts {
|
||||
|
||||
@@ -31,12 +31,13 @@ class SearchHomeModel: ObservableObject {
|
||||
}
|
||||
|
||||
func filter_muted() {
|
||||
events = events.filter { !should_hide_event(contacts: damus_state.contacts, ev: $0) }
|
||||
events = events.filter { should_show_event(contacts: damus_state.contacts, ev: $0) }
|
||||
}
|
||||
|
||||
func subscribe() {
|
||||
loading = true
|
||||
damus_state.pool.subscribe(sub_id: base_subid, filters: [get_base_filter()], handler: handle_event)
|
||||
let to_relays = determine_to_relays(pool: damus_state.pool, filters: damus_state.relay_filters)
|
||||
damus_state.pool.subscribe(sub_id: base_subid, filters: [get_base_filter()], handler: handle_event, to: to_relays)
|
||||
}
|
||||
|
||||
func unsubscribe(to: String? = nil) {
|
||||
@@ -54,7 +55,7 @@ class SearchHomeModel: ObservableObject {
|
||||
guard sub_id == self.base_subid || sub_id == self.profiles_subid else {
|
||||
return
|
||||
}
|
||||
if ev.is_textlike && !should_hide_event(contacts: damus_state.contacts, ev: ev) && !ev.is_reply(nil) {
|
||||
if ev.is_textlike && should_show_event(contacts: damus_state.contacts, ev: ev) && !ev.is_reply(nil) {
|
||||
if seen_pubkey.contains(ev.pubkey) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -15,14 +15,20 @@ class SearchModel: ObservableObject {
|
||||
|
||||
let pool: RelayPool
|
||||
var search: NostrFilter
|
||||
let contacts: Contacts
|
||||
let sub_id = UUID().description
|
||||
let limit: UInt32 = 500
|
||||
|
||||
init(pool: RelayPool, search: NostrFilter) {
|
||||
init(contacts: Contacts, pool: RelayPool, search: NostrFilter) {
|
||||
self.contacts = contacts
|
||||
self.pool = pool
|
||||
self.search = search
|
||||
}
|
||||
|
||||
func filter_muted() {
|
||||
self.events = self.events.filter { should_show_event(contacts: contacts, ev: $0) }
|
||||
}
|
||||
|
||||
func subscribe() {
|
||||
// since 1 month
|
||||
search.limit = self.limit
|
||||
@@ -47,6 +53,10 @@ class SearchModel: ObservableObject {
|
||||
return
|
||||
}
|
||||
|
||||
guard should_show_event(contacts: contacts, ev: ev) else {
|
||||
return
|
||||
}
|
||||
|
||||
if insert_uniq_sorted_event(events: &self.events, new_ev: ev, cmp: { $0.created_at > $1.created_at } ) {
|
||||
objectWillChange.send()
|
||||
}
|
||||
@@ -88,6 +98,21 @@ func event_matches_hashtag(_ ev: NostrEvent, hashtags: [String]) -> Bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func tag_is_hashtag(_ tag: [String]) -> Bool {
|
||||
// "hashtag" is deprecated, will remove in the future
|
||||
return tag.count >= 2 && (tag[0] == "hashtag" || tag[0] == "t")
|
||||
}
|
||||
|
||||
func has_hashtag(_ tags: [[String]], hashtag: String) -> Bool {
|
||||
for tag in tags {
|
||||
if tag_is_hashtag(tag) && tag[1] == hashtag {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func event_matches_filter(_ ev: NostrEvent, filter: NostrFilter) -> Bool {
|
||||
if let hashtags = filter.hashtag {
|
||||
return event_matches_hashtag(ev, hashtags: hashtags)
|
||||
|
||||
@@ -12,6 +12,22 @@ func should_show_wallet_selector(_ pubkey: String) -> Bool {
|
||||
return UserDefaults.standard.object(forKey: "show_wallet_selector") as? Bool ?? true
|
||||
}
|
||||
|
||||
func pk_setting_key(_ pubkey: String, key: String) -> String {
|
||||
return "\(pubkey)_\(key)"
|
||||
}
|
||||
|
||||
let tip_amount_key = "default_tip_amount"
|
||||
func set_default_tip_amount(pubkey: String, amount: Int64) {
|
||||
let key = pk_setting_key(pubkey, key: tip_amount_key)
|
||||
UserDefaults.standard.setValue(amount, forKey: key)
|
||||
}
|
||||
|
||||
func get_default_tip_amount(pubkey: String) -> Int64 {
|
||||
let key = "\(pubkey)_\(tip_amount_key)"
|
||||
return UserDefaults.standard.object(forKey: key) as? Int64 ?? 1000000
|
||||
}
|
||||
|
||||
|
||||
func get_default_wallet(_ pubkey: String) -> Wallet {
|
||||
if let defaultWalletName = UserDefaults.standard.string(forKey: "default_wallet"),
|
||||
let default_wallet = Wallet(rawValue: defaultWalletName)
|
||||
|
||||
@@ -45,7 +45,7 @@ enum Wallet: String, CaseIterable, Identifiable {
|
||||
return .init(index: 0, tag: "strike", displayName: NSLocalizedString("Strike", comment: "Dropdown option label for Lightning wallet, Strike."), link: "strike:",
|
||||
appStoreLink: "https://apps.apple.com/us/app/strike-bitcoin-payments/id1488724463", image: "strike")
|
||||
case .cashapp:
|
||||
return .init(index: 1, tag: "cashapp", displayName: NSLocalizedString("Cash App", comment: "Dropdown option label for Lightning wallet, Cash App."), link: "squarecash://",
|
||||
return .init(index: 1, tag: "cashapp", displayName: NSLocalizedString("Cash App", comment: "Dropdown option label for Lightning wallet, Cash App."), link: "https://cash.app/launch/lightning/",
|
||||
appStoreLink: "https://apps.apple.com/us/app/cash-app/id711923939", image: "cashapp")
|
||||
case .muun:
|
||||
return .init(index: 2, tag: "muun", displayName: NSLocalizedString("Muun", comment: "Dropdown option label for Lightning wallet, Muun."), link: "muun:", appStoreLink: "https://apps.apple.com/us/app/muun-wallet/id1482037683", image: "muun")
|
||||
|
||||
77
damus/Models/ZapsModel.swift
Normal file
77
damus/Models/ZapsModel.swift
Normal file
@@ -0,0 +1,77 @@
|
||||
//
|
||||
// ZapsModel.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class ZapsModel: ObservableObject {
|
||||
let state: DamusState
|
||||
let target: ZapTarget
|
||||
var zaps: [Zap]
|
||||
|
||||
let zaps_subid = UUID().description
|
||||
|
||||
init(state: DamusState, target: ZapTarget) {
|
||||
self.state = state
|
||||
self.target = target
|
||||
self.zaps = []
|
||||
}
|
||||
|
||||
func subscribe() {
|
||||
var filter = NostrFilter.filter_kinds([9735])
|
||||
switch target {
|
||||
case .profile(let profile_id):
|
||||
filter.pubkeys = [profile_id]
|
||||
case .note(let note_target):
|
||||
filter.referenced_ids = [note_target.note_id]
|
||||
}
|
||||
state.pool.subscribe(sub_id: zaps_subid, filters: [filter], handler: handle_event)
|
||||
}
|
||||
|
||||
func unsubscribe() {
|
||||
state.pool.unsubscribe(sub_id: zaps_subid)
|
||||
}
|
||||
|
||||
func handle_event(relay_id: String, conn_ev: NostrConnectionEvent) {
|
||||
guard case .nostr_event(let resp) = conn_ev else {
|
||||
return
|
||||
}
|
||||
|
||||
guard resp.subid == zaps_subid else {
|
||||
return
|
||||
}
|
||||
|
||||
guard case .event(_, let ev) = resp else {
|
||||
return
|
||||
}
|
||||
|
||||
guard ev.kind == 9735 else {
|
||||
return
|
||||
}
|
||||
|
||||
if let zap = state.zaps.zaps[ev.id] {
|
||||
if insert_uniq_sorted_zap(zaps: &zaps, new_zap: zap) {
|
||||
objectWillChange.send()
|
||||
}
|
||||
} else {
|
||||
guard let zapper = state.profiles.lookup_zapper(pubkey: target.pubkey) else {
|
||||
return
|
||||
}
|
||||
|
||||
guard let zap = Zap.from_zap_event(zap_ev: ev, zapper: zapper) else {
|
||||
return
|
||||
}
|
||||
|
||||
state.zaps.add_zap(zap: zap)
|
||||
|
||||
if insert_uniq_sorted_zap(zaps: &zaps, new_zap: zap) {
|
||||
objectWillChange.send()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,7 @@ struct Profile: Codable {
|
||||
}
|
||||
|
||||
var lnurl: String? {
|
||||
guard let addr = lud06 ?? lud16 else {
|
||||
guard let addr = lud16 ?? lud06 else {
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
@@ -370,6 +370,7 @@ func decode_nostr_event(txt: String) -> NostrResponse? {
|
||||
|
||||
func encode_json<T: Encodable>(_ val: T) -> String? {
|
||||
let encoder = JSONEncoder()
|
||||
encoder.outputFormatting = .withoutEscapingSlashes
|
||||
return (try? encoder.encode(val)).map { String(decoding: $0, as: UTF8.self) }
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,30 @@ enum RelayFlags: Int {
|
||||
case broken = 1
|
||||
}
|
||||
|
||||
struct Limitations: Codable {
|
||||
let payment_required: Bool?
|
||||
|
||||
static var empty: Limitations {
|
||||
Limitations(payment_required: nil)
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayMetadata: Codable {
|
||||
let name: String?
|
||||
let description: String?
|
||||
let pubkey: String?
|
||||
let contact: String?
|
||||
let supported_nips: [Int]?
|
||||
let software: String?
|
||||
let version: String?
|
||||
let limitation: Limitations?
|
||||
let payments_url: String?
|
||||
|
||||
var is_paid: Bool {
|
||||
return limitation?.payment_required ?? false
|
||||
}
|
||||
}
|
||||
|
||||
class Relay: Identifiable {
|
||||
let descriptor: RelayDescriptor
|
||||
let connection: RelayConnection
|
||||
|
||||
@@ -118,10 +118,9 @@ func make_nostr_req(_ req: NostrRequest) -> String? {
|
||||
}
|
||||
|
||||
func make_nostr_push_event(ev: NostrEvent) -> String? {
|
||||
let encoder = JSONEncoder()
|
||||
encoder.outputFormatting = .withoutEscapingSlashes
|
||||
let event_data = try! encoder.encode(ev)
|
||||
let event = String(decoding: event_data, as: UTF8.self)
|
||||
guard let event = encode_json(ev) else {
|
||||
return nil
|
||||
}
|
||||
let encoded = "[\"EVENT\",\(event)]"
|
||||
print(encoded)
|
||||
return encoded
|
||||
|
||||
@@ -42,6 +42,8 @@ class RelayPool {
|
||||
var relays: [Relay] = []
|
||||
var handlers: [RelayHandler] = []
|
||||
var request_queue: [QueuedRequest] = []
|
||||
var seen: Set<String> = Set()
|
||||
var counts: [String: UInt64] = [:]
|
||||
|
||||
var descriptors: [RelayDescriptor] {
|
||||
relays.map { $0.descriptor }
|
||||
@@ -149,9 +151,9 @@ class RelayPool {
|
||||
self.send(.unsubscribe(sub_id), to: to)
|
||||
}
|
||||
|
||||
func subscribe(sub_id: String, filters: [NostrFilter], handler: @escaping (String, NostrConnectionEvent) -> ()) {
|
||||
func subscribe(sub_id: String, filters: [NostrFilter], handler: @escaping (String, NostrConnectionEvent) -> (), to: [String]? = nil) {
|
||||
register_handler(sub_id: sub_id, handler: handler)
|
||||
send(.subscribe(.init(filters: filters, sub_id: sub_id)))
|
||||
send(.subscribe(.init(filters: filters, sub_id: sub_id)), to: to)
|
||||
}
|
||||
|
||||
func subscribe_to(sub_id: String, filters: [NostrFilter], to: [String]?, handler: @escaping (String, NostrConnectionEvent) -> ()) {
|
||||
@@ -241,8 +243,25 @@ class RelayPool {
|
||||
}
|
||||
}
|
||||
|
||||
func record_seen(relay_id: String, event: NostrConnectionEvent) {
|
||||
if case .nostr_event(let ev) = event {
|
||||
if case .event(_, let nev) = ev {
|
||||
let k = relay_id + nev.id
|
||||
if !seen.contains(k) {
|
||||
seen.insert(k)
|
||||
if counts[relay_id] == nil {
|
||||
counts[relay_id] = 1
|
||||
} else {
|
||||
counts[relay_id] = (counts[relay_id] ?? 0) + 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func handle_event(relay_id: String, event: NostrConnectionEvent) {
|
||||
record_last_pong(relay_id: relay_id, event: event)
|
||||
record_seen(relay_id: relay_id, event: event)
|
||||
|
||||
// run req queue when we reconnect
|
||||
if case .ws_event(let ws) = event {
|
||||
|
||||
@@ -147,7 +147,7 @@ public func bech32_decode(_ str: String) throws -> (hrp: String, data: Data)? {
|
||||
guard let strBytes = str.data(using: .utf8) else {
|
||||
throw Bech32Error.nonUTF8String
|
||||
}
|
||||
guard strBytes.count <= 90 else {
|
||||
guard strBytes.count <= 2024 else {
|
||||
throw Bech32Error.stringLengthExceeded
|
||||
}
|
||||
var lower: Bool = false
|
||||
|
||||
@@ -29,7 +29,7 @@ public struct DismissKeyboardOnTap: ViewModifier {
|
||||
|
||||
}
|
||||
|
||||
func end_editing() {
|
||||
public func end_editing() {
|
||||
UIApplication.shared.connectedScenes
|
||||
.filter {$0.activationState == .foregroundActive}
|
||||
.map {$0 as? UIWindowScene}
|
||||
|
||||
@@ -158,6 +158,20 @@ func get_saved_privkey() -> String? {
|
||||
return mkey.map { $0.trimmingCharacters(in: .whitespaces) }
|
||||
}
|
||||
|
||||
/**
|
||||
Detects whether a string might contain an nsec1 prefixed private key.
|
||||
It does not determine if it's the current user's private key and does not verify if it is properly encoded or has the right length.
|
||||
*/
|
||||
func contentContainsPrivateKey(_ content: String) -> Bool {
|
||||
if #available(iOS 16.0, *) {
|
||||
return content.contains(/nsec1[02-9ac-z]+/)
|
||||
} else {
|
||||
let regex = try! NSRegularExpression(pattern: "nsec1[02-9ac-z]+")
|
||||
return (regex.firstMatch(in: content, range: NSRange(location: 0, length: content.count)) != nil)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fileprivate func removePrivateKeyFromUserDefaults() throws {
|
||||
guard let privKey = UserDefaults.standard.string(forKey: "privkey") else { return }
|
||||
try save_privkey(privkey: privKey)
|
||||
|
||||
26
damus/Util/NIPURLBuilder.swift
Normal file
26
damus/Util/NIPURLBuilder.swift
Normal file
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// NIPURLBuilder.swift
|
||||
// damus
|
||||
//
|
||||
// Created by Honk on 2/1/23.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct NIPURLBuilder {
|
||||
static private let baseURL = "https://github.com/nostr-protocol/nips/blob/master/"
|
||||
static func url(forNIP nip: Int) -> URL? {
|
||||
let urlString = baseURL + "\(formatNipNumber(nip: nip)).md"
|
||||
return URL(string: urlString)
|
||||
}
|
||||
|
||||
static func formatNipNumber(nip: Int) -> String {
|
||||
let formatted: String
|
||||
if nip < 10 {
|
||||
formatted = "0\(nip)"
|
||||
} else {
|
||||
formatted = "\(nip)"
|
||||
}
|
||||
return formatted
|
||||
}
|
||||
}
|
||||
94
damus/Util/Relays/RelayFilters.swift
Normal file
94
damus/Util/Relays/RelayFilters.swift
Normal file
@@ -0,0 +1,94 @@
|
||||
//
|
||||
// RelayFilters.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-08.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
struct RelayFilter: Hashable {
|
||||
let timeline: Timeline
|
||||
let relay_id: String
|
||||
|
||||
init(timeline: Timeline, relay_id: String, on: Bool = false) {
|
||||
self.timeline = timeline
|
||||
self.relay_id = relay_id
|
||||
}
|
||||
}
|
||||
|
||||
class RelayFilters {
|
||||
private let our_pubkey: String
|
||||
private var disabled: Set<RelayFilter>
|
||||
|
||||
func is_filtered(timeline: Timeline, relay_id: String) -> Bool {
|
||||
let filter = RelayFilter(timeline: timeline, relay_id: relay_id)
|
||||
let contains = disabled.contains(filter)
|
||||
return contains
|
||||
}
|
||||
|
||||
func remove(timeline: Timeline, relay_id: String) {
|
||||
let filter = RelayFilter(timeline: timeline, relay_id: relay_id)
|
||||
if !disabled.contains(filter) {
|
||||
return
|
||||
}
|
||||
|
||||
disabled.remove(filter)
|
||||
save_relay_filters(our_pubkey, filters: disabled)
|
||||
}
|
||||
|
||||
func insert(timeline: Timeline, relay_id: String) {
|
||||
let filter = RelayFilter(timeline: timeline, relay_id: relay_id)
|
||||
if disabled.contains(filter) {
|
||||
return
|
||||
}
|
||||
|
||||
disabled.insert(filter)
|
||||
save_relay_filters(our_pubkey, filters: disabled)
|
||||
}
|
||||
|
||||
init(our_pubkey: String) {
|
||||
self.our_pubkey = our_pubkey
|
||||
disabled = load_relay_filters(our_pubkey) ?? Set()
|
||||
}
|
||||
}
|
||||
|
||||
func save_relay_filters(_ pubkey: String, filters: Set<RelayFilter>) {
|
||||
let key = pk_setting_key(pubkey, key: "relay_filters")
|
||||
let arr = Array(filters.map { filter in "\(filter.timeline)\t\(filter.relay_id)" })
|
||||
UserDefaults.standard.set(arr, forKey: key)
|
||||
}
|
||||
|
||||
func relay_filter_setting_key(_ pubkey: String) -> String {
|
||||
return pk_setting_key(pubkey, key: "relay_filters")
|
||||
}
|
||||
|
||||
func clear_relay_filters(_ pubkey: String) {
|
||||
let key = relay_filter_setting_key(pubkey)
|
||||
UserDefaults.standard.removeObject(forKey: key)
|
||||
}
|
||||
|
||||
func load_relay_filters(_ pubkey: String) -> Set<RelayFilter>? {
|
||||
let key = relay_filter_setting_key(pubkey)
|
||||
guard let filters = UserDefaults.standard.stringArray(forKey: key) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return filters.reduce(into: Set()) { s, str in
|
||||
let parts = str.components(separatedBy: "\t")
|
||||
guard parts.count == 2 else {
|
||||
return
|
||||
}
|
||||
guard let timeline = Timeline.init(rawValue: parts[0]) else {
|
||||
return
|
||||
}
|
||||
let filter = RelayFilter(timeline: timeline, relay_id: parts[1])
|
||||
s.insert(filter)
|
||||
}
|
||||
}
|
||||
|
||||
func determine_to_relays(pool: RelayPool, filters: RelayFilters) -> [String] {
|
||||
return pool.descriptors
|
||||
.map { $0.url.absoluteString }
|
||||
.filter { !filters.is_filtered(timeline: .search, relay_id: $0) }
|
||||
}
|
||||
20
damus/Util/Relays/RelayMetadatas.swift
Normal file
20
damus/Util/Relays/RelayMetadatas.swift
Normal file
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// RelayMetadatas.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-09.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
class RelayMetadatas {
|
||||
private var metadata: [String: RelayMetadata] = [:]
|
||||
|
||||
func lookup(relay_id: String) -> RelayMetadata? {
|
||||
return metadata[relay_id]
|
||||
}
|
||||
|
||||
func insert(relay_id: String, metadata: RelayMetadata) {
|
||||
self.metadata[relay_id] = metadata
|
||||
}
|
||||
}
|
||||
@@ -296,6 +296,7 @@ func fetch_zap_invoice(_ payreq: LNUrlPayRequest, zapreq: NostrEvent, amount: In
|
||||
|
||||
if zappable {
|
||||
if let json = encode_json(zapreq) {
|
||||
print("zapreq json: \(json)")
|
||||
query.append(URLQueryItem(name: "nostr", value: json))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,19 +21,33 @@ enum ActionBarSheet: Identifiable {
|
||||
struct EventActionBar: View {
|
||||
let damus_state: DamusState
|
||||
let event: NostrEvent
|
||||
let test_lnurl: String?
|
||||
let generator = UIImpactFeedbackGenerator(style: .medium)
|
||||
|
||||
// just used for previews
|
||||
@State var sheet: ActionBarSheet? = nil
|
||||
@State var confirm_boost: Bool = false
|
||||
@State var show_share_sheet: Bool = false
|
||||
@StateObject var bar: ActionBarModel
|
||||
|
||||
init(damus_state: DamusState, event: NostrEvent, bar: ActionBarModel, test_lnurl: String? = nil) {
|
||||
self.damus_state = damus_state
|
||||
self.event = event
|
||||
self.test_lnurl = test_lnurl
|
||||
_bar = StateObject.init(wrappedValue: bar)
|
||||
}
|
||||
|
||||
var lnurl: String? {
|
||||
test_lnurl ?? damus_state.profiles.lookup(id: event.pubkey)?.lnurl
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
if damus_state.keypair.privkey != nil {
|
||||
EventActionButton(img: "bubble.left", col: nil) {
|
||||
notify(.reply, event)
|
||||
}
|
||||
.accessibilityLabel(NSLocalizedString("Reply", comment: "Accessibility label for reply button"))
|
||||
}
|
||||
Spacer()
|
||||
ZStack {
|
||||
@@ -45,12 +59,14 @@ struct EventActionBar: View {
|
||||
self.confirm_boost = true
|
||||
}
|
||||
}
|
||||
.accessibilityLabel(NSLocalizedString("Boosts", comment: "Accessibility label for boosts button"))
|
||||
Text("\(bar.boosts > 0 ? "\(bar.boosts)" : "")")
|
||||
.offset(x: 18)
|
||||
.font(.footnote.weight(.medium))
|
||||
.foregroundColor(bar.boosted ? Color.green : Color.gray)
|
||||
}
|
||||
Spacer()
|
||||
|
||||
ZStack {
|
||||
LikeButton(liked: bar.liked) {
|
||||
if bar.liked {
|
||||
@@ -66,7 +82,7 @@ struct EventActionBar: View {
|
||||
|
||||
}
|
||||
|
||||
if let lnurl = damus_state.profiles.lookup(id: event.pubkey)?.lnurl {
|
||||
if let lnurl = self.lnurl {
|
||||
Spacer()
|
||||
ZapButton(damus_state: damus_state, event: event, lnurl: lnurl, bar: bar)
|
||||
}
|
||||
@@ -75,6 +91,7 @@ struct EventActionBar: View {
|
||||
EventActionButton(img: "square.and.arrow.up", col: Color.gray) {
|
||||
show_share_sheet = true
|
||||
}
|
||||
.accessibilityLabel(NSLocalizedString("Share", comment: "Button to share a post"))
|
||||
}
|
||||
.sheet(isPresented: $show_share_sheet) {
|
||||
if let note_id = bech32_note_id(event.id) {
|
||||
@@ -152,6 +169,7 @@ struct LikeButton: View {
|
||||
Image(liked ? "shaka-full" : "shaka-line")
|
||||
.foregroundColor(liked ? .accentColor : .gray)
|
||||
}
|
||||
.accessibilityLabel(NSLocalizedString("Like", comment: "Accessibility Label for Like button"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,7 +195,7 @@ struct EventActionBar_Previews: PreviewProvider {
|
||||
|
||||
EventActionBar(damus_state: ds, event: ev, bar: maxed_bar)
|
||||
|
||||
EventActionBar(damus_state: ds, event: ev, bar: zapbar)
|
||||
EventActionBar(damus_state: ds, event: ev, bar: zapbar, test_lnurl: "lnurl")
|
||||
}
|
||||
.padding(20)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,8 @@ import SwiftUI
|
||||
struct EventDetailBar: View {
|
||||
let state: DamusState
|
||||
let target: String
|
||||
@StateObject var bar: ActionBarModel
|
||||
let target_pk: String
|
||||
@ObservedObject var bar: ActionBarModel
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
@@ -29,7 +30,11 @@ struct EventDetailBar: View {
|
||||
}
|
||||
|
||||
if bar.zaps > 0 {
|
||||
Text("\(Text("\(bar.zaps)", comment: "Number of zap payments on a post.").font(.body.bold())) \(Text(String(format: NSLocalizedString("zaps_count", comment: "Part of a larger sentence to describe how many zap payments there are on a post."), bar.boosts)).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.")
|
||||
let dst = ZapsView(state: state, target: .note(id: target, author: target_pk))
|
||||
NavigationLink(destination: dst) {
|
||||
Text("\(Text("\(bar.zaps)", comment: "Number of zap payments on a post.").font(.body.bold())) \(Text(String(format: NSLocalizedString("zaps_count", comment: "Part of a larger sentence to describe how many zap payments there are on a post."), bar.boosts)).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.")
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,6 +42,6 @@ struct EventDetailBar: View {
|
||||
|
||||
struct EventDetailBar_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
EventDetailBar(state: test_damus_state(), target: "", bar: ActionBarModel.empty())
|
||||
EventDetailBar(state: test_damus_state(), target: "", target_pk: "", bar: ActionBarModel.empty())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,6 +55,7 @@ struct CarouselItemView: View {
|
||||
.font(.title2)
|
||||
.foregroundColor(Color.white)
|
||||
.padding([.leading,.trailing], 50.0)
|
||||
.minimumScaleFactor(0.5)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
import AVFoundation
|
||||
import Kingfisher
|
||||
import SwiftUI
|
||||
import LocalAuthentication
|
||||
|
||||
struct ConfigView: View {
|
||||
let state: DamusState
|
||||
@@ -14,6 +15,7 @@ struct ConfigView: View {
|
||||
@State var confirm_logout: Bool = false
|
||||
@State var confirm_delete_account: Bool = false
|
||||
@State var show_privkey: Bool = false
|
||||
@State var has_authenticated_locally: Bool = false
|
||||
@State var show_api_key: Bool = false
|
||||
@State var privkey: String
|
||||
@State var privkey_copied: Bool = false
|
||||
@@ -30,13 +32,45 @@ struct ConfigView: View {
|
||||
_settings = ObservedObject(initialValue: state.settings)
|
||||
}
|
||||
|
||||
func authenticateLocally(completion: @escaping (Bool) -> Void) {
|
||||
// Need to authenticate only once while ConfigView is presented
|
||||
guard !has_authenticated_locally else {
|
||||
completion(true)
|
||||
return
|
||||
}
|
||||
let context = LAContext()
|
||||
if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil) {
|
||||
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: NSLocalizedString("Local authentication to access private key", comment: "Face ID usage description shown when trying to access private key")) { success, error in
|
||||
DispatchQueue.main.async {
|
||||
has_authenticated_locally = success
|
||||
completion(success)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If there's no authentication set up on the device, let the user copy the key without it
|
||||
has_authenticated_locally = true
|
||||
completion(true)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: (jb55) could be more general but not gonna worry about it atm
|
||||
func CopyButton(is_pk: Bool) -> some View {
|
||||
return Button(action: {
|
||||
UIPasteboard.general.string = is_pk ? self.state.keypair.pubkey_bech32 : self.privkey
|
||||
self.privkey_copied = !is_pk
|
||||
self.pubkey_copied = is_pk
|
||||
generator.impactOccurred()
|
||||
let copyKey = {
|
||||
UIPasteboard.general.string = is_pk ? self.state.keypair.pubkey_bech32 : self.privkey
|
||||
self.privkey_copied = !is_pk
|
||||
self.pubkey_copied = is_pk
|
||||
generator.impactOccurred()
|
||||
}
|
||||
if has_authenticated_locally {
|
||||
copyKey()
|
||||
} else {
|
||||
authenticateLocally { success in
|
||||
if success {
|
||||
copyKey()
|
||||
}
|
||||
}
|
||||
}
|
||||
}) {
|
||||
let copied = is_pk ? self.pubkey_copied : self.privkey_copied
|
||||
Image(systemName: copied ? "checkmark.circle" : "doc.on.doc")
|
||||
@@ -58,7 +92,7 @@ struct ConfigView: View {
|
||||
if let sec = state.keypair.privkey_bech32 {
|
||||
Section(NSLocalizedString("Secret Account Login Key", comment: "Section title for user's secret account login key.")) {
|
||||
HStack {
|
||||
if show_privkey == false {
|
||||
if show_privkey == false || !has_authenticated_locally {
|
||||
SecureField(NSLocalizedString("Private Key", comment: "Title of the secure field that holds the user's private key."), text: $privkey)
|
||||
.disabled(true)
|
||||
} else {
|
||||
@@ -70,6 +104,13 @@ struct ConfigView: View {
|
||||
}
|
||||
|
||||
Toggle(NSLocalizedString("Show", comment: "Toggle to show or hide user's secret account login key."), isOn: $show_privkey)
|
||||
.onChange(of: show_privkey) { newValue in
|
||||
if newValue {
|
||||
authenticateLocally { success in
|
||||
show_privkey = success
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,8 +196,8 @@ struct ConfigView: View {
|
||||
}
|
||||
.navigationTitle(NSLocalizedString("Settings", comment: "Navigation title for Settings view."))
|
||||
.navigationBarTitleDisplayMode(.large)
|
||||
.alert(NSLocalizedString("Delete Account", comment: "Alert for deleting the users account."), isPresented: $confirm_delete_account) {
|
||||
TextField("Type DELETE to delete", text: $delete_text)
|
||||
.alert(NSLocalizedString("Permanently Delete Account", comment: "Alert for deleting the users account."), isPresented: $confirm_delete_account) {
|
||||
TextField(NSLocalizedString("Type DELETE to delete", comment: "Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should."), text: $delete_text)
|
||||
Button(NSLocalizedString("Cancel", comment: "Cancel deleting the user."), role: .cancel) {
|
||||
confirm_delete_account = false
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ struct DMChatView: View {
|
||||
let pubkey: String
|
||||
@EnvironmentObject var dms: DirectMessageModel
|
||||
@State var message: String = ""
|
||||
@State var showPrivateKeyWarning: Bool = false
|
||||
|
||||
var Messages: some View {
|
||||
ScrollViewReader { scroller in
|
||||
@@ -93,7 +94,16 @@ struct DMChatView: View {
|
||||
InputField
|
||||
|
||||
if !message.isEmpty {
|
||||
Button(role: .none, action: send_message) {
|
||||
Button(
|
||||
role: .none,
|
||||
action: {
|
||||
showPrivateKeyWarning = contentContainsPrivateKey(message)
|
||||
|
||||
if !showPrivateKeyWarning {
|
||||
send_message()
|
||||
}
|
||||
}
|
||||
) {
|
||||
Label("", systemImage: "arrow.right.circle")
|
||||
.font(.title)
|
||||
}
|
||||
@@ -147,6 +157,14 @@ struct DMChatView: View {
|
||||
}
|
||||
.navigationTitle(NSLocalizedString("DMs", comment: "Navigation title for DMs view, where DM is the English abbreviation for Direct Message."))
|
||||
.toolbar { Header }
|
||||
.alert(NSLocalizedString("Note contains \"nsec1\" private key. Are you sure?", comment: "Alert user that they might be attempting to paste a private key and ask them to confirm."), isPresented: $showPrivateKeyWarning, actions: {
|
||||
Button(NSLocalizedString("No", comment: "Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key."), role: .cancel) {
|
||||
showPrivateKeyWarning = false
|
||||
}
|
||||
Button(NSLocalizedString("Yes, Post with Private Key", comment: "Button to proceed with posting a note even though it looks like they might be posting a private key."), role: .destructive) {
|
||||
send_message()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ struct DirectMessagesView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +83,6 @@ struct DirectMessagesView: View {
|
||||
}
|
||||
.tabViewStyle(.page(indexDisplayMode: .never))
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.navigationTitle(NSLocalizedString("DMs", comment: "Navigation title for view of DMs, where DM is an English abbreviation for Direct Message."))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,119 +7,10 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct CollapsedEvents: Identifiable {
|
||||
let count: Int
|
||||
let start: Int
|
||||
let end: Int
|
||||
|
||||
var id: String = UUID().description
|
||||
}
|
||||
|
||||
enum CollapsedEvent: Identifiable {
|
||||
case event(NostrEvent, Highlight)
|
||||
case collapsed(CollapsedEvents)
|
||||
|
||||
var id: String {
|
||||
switch self {
|
||||
case .event(let ev, _):
|
||||
return ev.id
|
||||
case .collapsed(let c):
|
||||
return c.id
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct EventDetailView: View {
|
||||
let sub_id = UUID().description
|
||||
let damus: DamusState
|
||||
|
||||
@StateObject var thread: ThreadModel
|
||||
@State var collapsed: Bool = true
|
||||
|
||||
func toggle_collapse_thread(scroller: ScrollViewProxy, id mid: String?, animate: Bool = true) {
|
||||
self.collapsed = !self.collapsed
|
||||
if let id = mid {
|
||||
if !self.collapsed {
|
||||
scroll_to_event(scroller: scroller, id: id, delay: 0.1, animate: animate)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func uncollapse_section(scroller: ScrollViewProxy, c: CollapsedEvents)
|
||||
{
|
||||
let ev = thread.events[c.start]
|
||||
print("uncollapsing section at \(c.start) '\(ev.content.prefix(12))...'")
|
||||
let start_id = ev.id
|
||||
|
||||
toggle_collapse_thread(scroller: scroller, id: start_id, animate: false)
|
||||
}
|
||||
|
||||
func CollapsedEventView(_ cev: CollapsedEvent, scroller: ScrollViewProxy) -> some View {
|
||||
Group {
|
||||
switch cev {
|
||||
case .collapsed(let c):
|
||||
Text(String(format: NSLocalizedString("collapsed_event_view_other_notes", comment: "Text to indicate that the thread was collapsed and that there are other notes to view if tapped."), c.count))
|
||||
.padding([.top,.bottom], 8)
|
||||
.font(.footnote)
|
||||
.foregroundColor(.gray)
|
||||
.onTapGesture {
|
||||
//self.uncollapse_section(scroller: proxy, c: c)
|
||||
//self.toggle_collapse_thread(scroller: proxy, id: nil)
|
||||
if let ev = thread.events[safe: c.start] {
|
||||
thread.set_active_event(ev, privkey: damus.keypair.privkey)
|
||||
}
|
||||
toggle_thread_view()
|
||||
}
|
||||
case .event(let ev, _):
|
||||
EventView(damus: damus, event: ev, has_action_bar: true)
|
||||
.onTapGesture {
|
||||
if thread.initial_event.id == ev.id {
|
||||
toggle_thread_view()
|
||||
} else {
|
||||
thread.set_active_event(ev, privkey: damus.keypair.privkey)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ScrollViewReader { proxy in
|
||||
if thread.loading {
|
||||
ProgressView().progressViewStyle(.circular)
|
||||
}
|
||||
|
||||
ScrollView(.vertical) {
|
||||
LazyVStack {
|
||||
let collapsed_events = calculated_collapsed_events(
|
||||
privkey: damus.keypair.privkey,
|
||||
collapsed: self.collapsed,
|
||||
active: thread.event,
|
||||
events: thread.events
|
||||
)
|
||||
ForEach(collapsed_events, id: \.id) { cev in
|
||||
CollapsedEventView(cev, scroller: proxy)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
.padding(.top)
|
||||
|
||||
EndBlock()
|
||||
}
|
||||
.onChange(of: thread.loading) { val in
|
||||
scroll_after_load(thread: thread, proxy: proxy)
|
||||
}
|
||||
.onAppear() {
|
||||
scroll_after_load(thread: thread, proxy: proxy)
|
||||
}
|
||||
}
|
||||
.navigationBarTitle(NSLocalizedString("Thread", comment: "Navigation bar title for note thread."))
|
||||
|
||||
}
|
||||
|
||||
func toggle_thread_view() {
|
||||
NotificationCenter.default.post(name: .toggle_thread_view, object: nil)
|
||||
Text("EventDetailView")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,167 +21,13 @@ func scroll_after_load(thread: ThreadModel, proxy: ScrollViewProxy) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct EventDetailView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let state = test_damus_state()
|
||||
let tm = ThreadModel(evid: "4da698ceac09a16cdb439276fa3d13ef8f6620ffb45d11b76b3f103483c2d0b0", damus_state: state)
|
||||
EventDetailView(damus: state, thread: tm)
|
||||
EventDetailView()
|
||||
}
|
||||
}
|
||||
|
||||
/// Find the entire reply path for the active event
|
||||
func make_reply_map(active: NostrEvent, events: [NostrEvent], privkey: String?) -> [String: ()]
|
||||
{
|
||||
let event_map: [String: Int] = zip(events,0...events.count).reduce(into: [:]) { (acc, arg1) in
|
||||
let (ev, i) = arg1
|
||||
acc[ev.id] = i
|
||||
}
|
||||
var is_reply: [String: ()] = [:]
|
||||
var i: Int = 0
|
||||
var start: Int = 0
|
||||
var iterations: Int = 0
|
||||
|
||||
if events.count == 0 {
|
||||
return is_reply
|
||||
}
|
||||
|
||||
for ev in events {
|
||||
/// does this event reply to the active event?
|
||||
let ev_refs = ev.event_refs(privkey)
|
||||
for ev_ref in ev_refs {
|
||||
if let reply = ev_ref.is_reply {
|
||||
if reply.ref_id == active.id {
|
||||
is_reply[ev.id] = ()
|
||||
start = i
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// does the active event reply to this event?
|
||||
let active_refs = active.event_refs(privkey)
|
||||
for active_ref in active_refs {
|
||||
if let reply = active_ref.is_reply {
|
||||
if reply.ref_id == ev.id {
|
||||
is_reply[ev.id] = ()
|
||||
start = i
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i += 1
|
||||
}
|
||||
|
||||
i = start
|
||||
|
||||
while true {
|
||||
if iterations > 1024 {
|
||||
// infinite loop? or super large thread
|
||||
print("breaking from large reply_map... big thread??")
|
||||
break
|
||||
}
|
||||
|
||||
let ev = events[i]
|
||||
|
||||
let ref_ids = ev.referenced_ids
|
||||
if ref_ids.count == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
let ref_id = ref_ids[ref_ids.count-1]
|
||||
let pubkey = ref_id.ref_id
|
||||
is_reply[pubkey] = ()
|
||||
|
||||
if let mi = event_map[pubkey] {
|
||||
i = mi
|
||||
} else {
|
||||
break
|
||||
}
|
||||
|
||||
iterations += 1
|
||||
}
|
||||
|
||||
return is_reply
|
||||
}
|
||||
|
||||
func determine_highlight(reply_map: [String: ()], current: NostrEvent, active: NostrEvent) -> Highlight
|
||||
{
|
||||
if current.id == active.id {
|
||||
return .main
|
||||
} else if reply_map[current.id] != nil {
|
||||
return .reply
|
||||
} else {
|
||||
return .none
|
||||
}
|
||||
}
|
||||
|
||||
func calculated_collapsed_events(privkey: String?, collapsed: Bool, active: NostrEvent?, events: [NostrEvent]) -> [CollapsedEvent] {
|
||||
var count: Int = 0
|
||||
|
||||
guard let active = active else {
|
||||
return []
|
||||
}
|
||||
|
||||
let reply_map = make_reply_map(active: active, events: events, privkey: privkey)
|
||||
|
||||
if !collapsed {
|
||||
return events.reduce(into: []) { acc, ev in
|
||||
let highlight = determine_highlight(reply_map: reply_map, current: ev, active: active)
|
||||
return acc.append(.event(ev, highlight))
|
||||
}
|
||||
}
|
||||
|
||||
let nevents = events.count
|
||||
var start: Int = 0
|
||||
var i: Int = 0
|
||||
|
||||
return events.reduce(into: []) { (acc, ev) in
|
||||
let highlight = determine_highlight(reply_map: reply_map, current: ev, active: active)
|
||||
|
||||
switch highlight {
|
||||
case .none:
|
||||
if i == 0 {
|
||||
start = 1
|
||||
}
|
||||
count += 1
|
||||
case .main: fallthrough
|
||||
case .custom: fallthrough
|
||||
case .reply:
|
||||
if count != 0 {
|
||||
let c = CollapsedEvents(count: count, start: start, end: i)
|
||||
acc.append(.collapsed(c))
|
||||
start = i
|
||||
count = 0
|
||||
}
|
||||
acc.append(.event(ev, highlight))
|
||||
}
|
||||
|
||||
if i == nevents-1 {
|
||||
if count != 0 {
|
||||
let c = CollapsedEvents(count: count, start: i-count, end: i)
|
||||
acc.append(.collapsed(c))
|
||||
count = 0
|
||||
}
|
||||
}
|
||||
|
||||
i += 1
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func any_collapsed(_ evs: [CollapsedEvent]) -> Bool {
|
||||
for ev in evs {
|
||||
switch ev {
|
||||
case .collapsed:
|
||||
return true
|
||||
case .event:
|
||||
continue
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
func print_event(_ ev: NostrEvent) {
|
||||
print(ev.description)
|
||||
|
||||
@@ -57,36 +57,33 @@ struct EventView: View {
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
return Group {
|
||||
if event.known_kind == .boost, let inner_ev = event.inner_event {
|
||||
VStack(alignment: .leading) {
|
||||
let prof_model = ProfileModel(pubkey: event.pubkey, damus: damus)
|
||||
let follow_model = FollowersModel(damus_state: damus, target: event.pubkey)
|
||||
let prof = damus.profiles.lookup(id: event.pubkey)
|
||||
let booster_profile = ProfileView(damus_state: damus, profile: prof_model, followers: follow_model)
|
||||
|
||||
NavigationLink(destination: booster_profile) {
|
||||
Reposted(damus: damus, pubkey: event.pubkey, profile: prof)
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
TextEvent(inner_ev, pubkey: inner_ev.pubkey, booster_pubkey: event.pubkey)
|
||||
.padding([.top], 1)
|
||||
}
|
||||
} else if event.known_kind == .zap {
|
||||
if let zap = damus.zaps.zaps[event.id] {
|
||||
VStack {
|
||||
if event.known_kind == .boost {
|
||||
if let inner_ev = event.inner_event {
|
||||
VStack(alignment: .leading) {
|
||||
Text("⚡️ \(format_msats(zap.invoice.amount))")
|
||||
.font(.headline)
|
||||
.padding([.top], 2)
|
||||
|
||||
TextEvent(zap.request.ev, pubkey: zap.request.ev.pubkey, booster_pubkey: nil)
|
||||
let prof_model = ProfileModel(pubkey: event.pubkey, damus: damus)
|
||||
let follow_model = FollowersModel(damus_state: damus, target: event.pubkey)
|
||||
let prof = damus.profiles.lookup(id: event.pubkey)
|
||||
let booster_profile = ProfileView(damus_state: damus, profile: prof_model, followers: follow_model)
|
||||
|
||||
NavigationLink(destination: booster_profile) {
|
||||
Reposted(damus: damus, pubkey: event.pubkey, profile: prof)
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
TextEvent(damus: damus, event: inner_ev, pubkey: inner_ev.pubkey, has_action_bar: has_action_bar, booster_pubkey: event.pubkey)
|
||||
.padding([.top], 1)
|
||||
}
|
||||
} else {
|
||||
EmptyView()
|
||||
}
|
||||
} else if event.known_kind == .zap {
|
||||
if let zap = damus.zaps.zaps[event.id] {
|
||||
ZapEvent(damus: damus, zap: zap)
|
||||
} else {
|
||||
EmptyView()
|
||||
}
|
||||
} else {
|
||||
TextEvent(event, pubkey: pubkey)
|
||||
TextEvent(damus: damus, event: event, pubkey: pubkey, has_action_bar: has_action_bar, booster_pubkey: nil)
|
||||
.padding([.top], 6)
|
||||
}
|
||||
|
||||
@@ -94,56 +91,6 @@ struct EventView: View {
|
||||
.padding([.top], 4)
|
||||
}
|
||||
}
|
||||
|
||||
func TextEvent(_ event: NostrEvent, pubkey: String, booster_pubkey: String? = nil) -> some View {
|
||||
return HStack(alignment: .top) {
|
||||
let profile = damus.profiles.lookup(id: pubkey)
|
||||
|
||||
VStack {
|
||||
let pmodel = ProfileModel(pubkey: pubkey, damus: damus)
|
||||
let pv = ProfileView(damus_state: damus, profile: pmodel, followers: FollowersModel(damus_state: damus, target: pubkey))
|
||||
|
||||
NavigationLink(destination: pv) {
|
||||
ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus.profiles)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
VStack(alignment: .leading) {
|
||||
HStack(alignment: .center) {
|
||||
EventProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true, size: .normal)
|
||||
|
||||
Text("\(format_relative_time(event.created_at))")
|
||||
.foregroundColor(.gray)
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
EventBody(damus_state: damus, event: event, size: .normal)
|
||||
|
||||
if let mention = first_eref_mention(ev: event, privkey: damus.keypair.privkey) {
|
||||
BuilderEventView(damus: damus, event_id: mention.ref.id)
|
||||
}
|
||||
|
||||
if has_action_bar {
|
||||
Rectangle().frame(height: 2).opacity(0)
|
||||
|
||||
let bar = make_actionbar_model(ev: event, damus: damus)
|
||||
|
||||
EventActionBar(damus_state: damus, event: event, bar: bar)
|
||||
.padding([.top], 4)
|
||||
}
|
||||
}
|
||||
.padding([.leading], 2)
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
.background(event_validity_color(event.validity))
|
||||
.id(event.id)
|
||||
.frame(maxWidth: .infinity, minHeight: PFP_SIZE)
|
||||
.padding([.bottom], 2)
|
||||
.event_context_menu(event, keypair: damus.keypair, target_pubkey: pubkey)
|
||||
}
|
||||
}
|
||||
|
||||
// blame the porn bots for this code
|
||||
|
||||
@@ -31,23 +31,30 @@ struct BuilderEventView: View {
|
||||
return
|
||||
}
|
||||
|
||||
// Is current event
|
||||
if id == subscription_uuid {
|
||||
if event != nil {
|
||||
return
|
||||
}
|
||||
|
||||
event = nostr_event
|
||||
|
||||
unsubscribe()
|
||||
guard id == subscription_uuid else {
|
||||
return
|
||||
}
|
||||
|
||||
guard nostr_event.known_kind == .text else {
|
||||
return
|
||||
}
|
||||
|
||||
if event != nil {
|
||||
return
|
||||
}
|
||||
|
||||
event = nostr_event
|
||||
|
||||
unsubscribe()
|
||||
}
|
||||
|
||||
func load() {
|
||||
subscribe(filters: [
|
||||
NostrFilter(ids: [self.event_id], limit: 1),
|
||||
NostrFilter(
|
||||
ids: [self.event_id],
|
||||
limit: 1
|
||||
kinds: [NostrKind.zap.rawValue],
|
||||
referenced_ids: [self.event_id],
|
||||
limit: 500
|
||||
)
|
||||
])
|
||||
}
|
||||
|
||||
@@ -25,11 +25,11 @@ struct MutedEventView: View {
|
||||
self.selected = selected
|
||||
self._nav_target = nav_target
|
||||
self._navigating = navigating
|
||||
self._shown = State(initialValue: !should_hide_event(contacts: damus_state.contacts, ev: event))
|
||||
self._shown = State(initialValue: should_show_event(contacts: damus_state.contacts, ev: event))
|
||||
}
|
||||
|
||||
var should_mute: Bool {
|
||||
return should_hide_event(contacts: damus_state.contacts, ev: event)
|
||||
return !should_show_event(contacts: damus_state.contacts, ev: event)
|
||||
}
|
||||
|
||||
var FillColor: Color {
|
||||
|
||||
@@ -38,7 +38,7 @@ struct SelectedEventView: View {
|
||||
let bar = make_actionbar_model(ev: event, damus: damus)
|
||||
|
||||
if !bar.is_empty {
|
||||
EventDetailBar(state: damus, target: event.id, bar: bar)
|
||||
EventDetailBar(state: damus, target: event.id, target_pk: event.pubkey, bar: bar)
|
||||
Divider()
|
||||
}
|
||||
|
||||
|
||||
72
damus/Views/Events/TextEvent.swift
Normal file
72
damus/Views/Events/TextEvent.swift
Normal file
@@ -0,0 +1,72 @@
|
||||
//
|
||||
// TextEvent.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-03.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct TextEvent: View {
|
||||
let damus: DamusState
|
||||
let event: NostrEvent
|
||||
let pubkey: String
|
||||
let has_action_bar: Bool
|
||||
let booster_pubkey: String?
|
||||
|
||||
var body: some View {
|
||||
HStack(alignment: .top) {
|
||||
let profile = damus.profiles.lookup(id: pubkey)
|
||||
|
||||
VStack {
|
||||
let pmodel = ProfileModel(pubkey: pubkey, damus: damus)
|
||||
let pv = ProfileView(damus_state: damus, profile: pmodel, followers: FollowersModel(damus_state: damus, target: pubkey))
|
||||
|
||||
NavigationLink(destination: pv) {
|
||||
ProfilePicView(pubkey: pubkey, size: PFP_SIZE, highlight: .none, profiles: damus.profiles)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
VStack(alignment: .leading) {
|
||||
HStack(alignment: .center) {
|
||||
EventProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true, size: .normal)
|
||||
|
||||
Text("\(format_relative_time(event.created_at))")
|
||||
.foregroundColor(.gray)
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
EventBody(damus_state: damus, event: event, size: .normal)
|
||||
|
||||
if let mention = first_eref_mention(ev: event, privkey: damus.keypair.privkey) {
|
||||
BuilderEventView(damus: damus, event_id: mention.ref.id)
|
||||
}
|
||||
|
||||
if has_action_bar {
|
||||
Rectangle().frame(height: 2).opacity(0)
|
||||
|
||||
let bar = make_actionbar_model(ev: event, damus: damus)
|
||||
|
||||
EventActionBar(damus_state: damus, event: event, bar: bar)
|
||||
.padding([.top], 4)
|
||||
}
|
||||
}
|
||||
.padding([.leading], 2)
|
||||
}
|
||||
.contentShape(Rectangle())
|
||||
.background(event_validity_color(event.validity))
|
||||
.id(event.id)
|
||||
.frame(maxWidth: .infinity, minHeight: PFP_SIZE)
|
||||
.padding([.bottom], 2)
|
||||
.event_context_menu(event, keypair: damus.keypair, target_pubkey: pubkey)
|
||||
}
|
||||
}
|
||||
|
||||
struct TextEvent_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
TextEvent(damus: test_damus_state(), event: test_event, pubkey: "pk", has_action_bar: true, booster_pubkey: nil)
|
||||
}
|
||||
}
|
||||
33
damus/Views/Events/ZapEvent.swift
Normal file
33
damus/Views/Events/ZapEvent.swift
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// ZapEvent.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-03.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct ZapEvent: View {
|
||||
let damus: DamusState
|
||||
let zap: Zap
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
Text("⚡️ \(format_msats(zap.invoice.amount))", comment: "Text indicating the zap amount. i.e. number of satoshis that were tipped to a user")
|
||||
.font(.headline)
|
||||
.padding([.top], 2)
|
||||
|
||||
TextEvent(damus: damus, event: zap.request.ev, pubkey: zap.request.ev.pubkey, has_action_bar: false, booster_pubkey: nil)
|
||||
.padding([.top], 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
struct ZapEvent_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ZapEvent()
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
@@ -12,13 +12,14 @@ struct FollowButtonView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
|
||||
let target: FollowTarget
|
||||
let follows_you: Bool
|
||||
@State var follow_state: FollowState
|
||||
|
||||
var body: some View {
|
||||
Button {
|
||||
follow_state = perform_follow_btn_action(follow_state, target: target)
|
||||
} label: {
|
||||
Text(follow_btn_txt(follow_state))
|
||||
Text(follow_btn_txt(follow_state, follows_you: follows_you))
|
||||
.frame(width: 105, height: 30)
|
||||
//.padding(.vertical, 10)
|
||||
.font(.caption.weight(.bold))
|
||||
@@ -70,16 +71,19 @@ struct FollowButtonPreviews: View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
Text("Unfollows", comment: "Text to indicate that the button next to it is in a state that will unfollow a profile when tapped.")
|
||||
FollowButtonView(target: target, follow_state: .unfollows)
|
||||
FollowButtonView(target: target, follows_you: false, follow_state: .unfollows)
|
||||
|
||||
Text("Following", comment: "Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.")
|
||||
FollowButtonView(target: target, follow_state: .following)
|
||||
FollowButtonView(target: target, follows_you: false, follow_state: .following)
|
||||
|
||||
Text("Follows", comment: "Text to indicate that button next to it is in a state that will follow a profile when tapped.")
|
||||
FollowButtonView(target: target, follows_you: false, follow_state: .follows)
|
||||
|
||||
Text("Follows", comment: "Text to indicate that button next to it is in a state that will follow a profile when tapped.")
|
||||
FollowButtonView(target: target, follow_state: .follows)
|
||||
FollowButtonView(target: target, follows_you: true, follow_state: .follows)
|
||||
|
||||
Text("Unfollowing", comment: "Text to indicate that the button next to it is in a state that indicates that it is in the process of unfollowing a profile.")
|
||||
FollowButtonView(target: target, follow_state: .unfollowing)
|
||||
FollowButtonView(target: target, follows_you: false, follow_state: .unfollowing)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ struct FollowUserView: View {
|
||||
HStack {
|
||||
UserView(damus_state: damus_state, pubkey: target.pubkey)
|
||||
|
||||
FollowButtonView(target: target, follow_state: damus_state.contacts.follow_state(target.pubkey))
|
||||
FollowButtonView(target: target, follows_you: false, follow_state: damus_state.contacts.follow_state(target.pubkey))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -275,6 +275,7 @@ struct KeyInput: View {
|
||||
.autocapitalization(.none)
|
||||
.foregroundColor(.white)
|
||||
.font(.body.monospaced())
|
||||
.textContentType(.password)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
enum Timeline: String, CustomStringConvertible {
|
||||
enum Timeline: String, CustomStringConvertible, Hashable {
|
||||
case home
|
||||
case notifications
|
||||
case search
|
||||
|
||||
@@ -17,6 +17,7 @@ let POST_PLACEHOLDER = NSLocalizedString("Type your post here...", comment: "Tex
|
||||
struct PostView: View {
|
||||
@State var post: String = ""
|
||||
@FocusState var focus: Bool
|
||||
@State var showPrivateKeyWarning: Bool = false
|
||||
|
||||
let replying_to: NostrEvent?
|
||||
let references: [ReferencedId]
|
||||
@@ -65,7 +66,11 @@ struct PostView: View {
|
||||
|
||||
if !is_post_empty {
|
||||
Button(NSLocalizedString("Post", comment: "Button to post a note.")) {
|
||||
self.send_post()
|
||||
showPrivateKeyWarning = contentContainsPrivateKey(self.post)
|
||||
|
||||
if !showPrivateKeyWarning {
|
||||
self.send_post()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,6 +104,14 @@ struct PostView: View {
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
.alert(NSLocalizedString("Note contains \"nsec1\" private key. Are you sure?", comment: "Alert user that they might be attempting to paste a private key and ask them to confirm."), isPresented: $showPrivateKeyWarning, actions: {
|
||||
Button(NSLocalizedString("No", comment: "Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key."), role: .cancel) {
|
||||
showPrivateKeyWarning = false
|
||||
}
|
||||
Button(NSLocalizedString("Yes, Post with Private Key", comment: "Button to proceed with posting a note even though it looks like they might be posting a private key."), role: .destructive) {
|
||||
self.send_post()
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,8 +57,10 @@ struct UserSearch_Previews: PreviewProvider {
|
||||
}
|
||||
|
||||
|
||||
func search_users(profiles: Profiles, tags: [[String]], search: String) -> [SearchedUser] {
|
||||
func search_users(profiles: Profiles, tags: [[String]], search _search: String) -> [SearchedUser] {
|
||||
var seen_user = Set<String>()
|
||||
let search = _search.lowercased()
|
||||
|
||||
return tags.reduce(into: Array<SearchedUser>()) { arr, tag in
|
||||
guard tag.count >= 2 && tag[0] == "p" else {
|
||||
return
|
||||
@@ -77,7 +79,7 @@ func search_users(profiles: Profiles, tags: [[String]], search: String) -> [Sear
|
||||
|
||||
let profile = profiles.lookup(id: pubkey)
|
||||
|
||||
guard ((petname?.hasPrefix(search) ?? false) || (profile?.name?.hasPrefix(search) ?? false)) else {
|
||||
guard ((petname?.lowercased().hasPrefix(search) ?? false) || (profile?.name?.lowercased().hasPrefix(search) ?? false)) else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
34
damus/Views/Profile/FollowsYou.swift
Normal file
34
damus/Views/Profile/FollowsYou.swift
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// FollowsYou.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-07.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct FollowsYou: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
|
||||
var fill_color: Color {
|
||||
colorScheme == .light ? Color("DamusLightGrey") : Color("DamusDarkGrey")
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Text("Follows you", comment: "Text to indicate that a user is following your profile.")
|
||||
.padding([.leading, .trailing], 6.0)
|
||||
.padding([.top, .bottom], 2.0)
|
||||
.foregroundColor(.gray)
|
||||
.background {
|
||||
RoundedRectangle(cornerRadius: 5.0)
|
||||
.foregroundColor(fill_color)
|
||||
}
|
||||
.font(.footnote)
|
||||
}
|
||||
}
|
||||
|
||||
struct FollowsYou_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
FollowsYou()
|
||||
}
|
||||
}
|
||||
61
damus/Views/Profile/ProfileNameView.swift
Normal file
61
damus/Views/Profile/ProfileNameView.swift
Normal file
@@ -0,0 +1,61 @@
|
||||
//
|
||||
// ProfileNameView.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-07.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct ProfileNameView: View {
|
||||
let pubkey: String
|
||||
let profile: Profile?
|
||||
let follows_you: Bool
|
||||
let damus: DamusState
|
||||
|
||||
var spacing: CGFloat { 10.0 }
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if let real_name = profile?.display_name {
|
||||
VStack(alignment: .leading) {
|
||||
Text(real_name)
|
||||
.font(.title3.weight(.bold))
|
||||
HStack(alignment: .center, spacing: spacing) {
|
||||
ProfileName(pubkey: pubkey, profile: profile, prefix: "@", damus: damus, show_friend_confirmed: true)
|
||||
.font(.callout)
|
||||
.foregroundColor(.gray)
|
||||
|
||||
if follows_you {
|
||||
FollowsYou()
|
||||
}
|
||||
}
|
||||
KeyView(pubkey: pubkey)
|
||||
.pubkey_context_menu(bech32_pubkey: pubkey)
|
||||
}
|
||||
} else {
|
||||
VStack(alignment: .leading) {
|
||||
HStack(alignment: .center, spacing: spacing) {
|
||||
ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true)
|
||||
.font(.title3.weight(.bold))
|
||||
if follows_you {
|
||||
FollowsYou()
|
||||
}
|
||||
}
|
||||
KeyView(pubkey: pubkey)
|
||||
.pubkey_context_menu(bech32_pubkey: pubkey)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ProfileNameView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
VStack {
|
||||
ProfileNameView(pubkey: test_event.pubkey, profile: nil, follows_you: true, damus: test_damus_state())
|
||||
|
||||
ProfileNameView(pubkey: test_event.pubkey, profile: nil, follows_you: false, damus: test_damus_state())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ enum FollowState {
|
||||
case unfollows
|
||||
}
|
||||
|
||||
func follow_btn_txt(_ fs: FollowState) -> String {
|
||||
func follow_btn_txt(_ fs: FollowState, follows_you: Bool) -> String {
|
||||
switch fs {
|
||||
case .follows:
|
||||
return NSLocalizedString("Unfollow", comment: "Button to unfollow a user.")
|
||||
@@ -28,7 +28,11 @@ func follow_btn_txt(_ fs: FollowState) -> String {
|
||||
case .unfollowing:
|
||||
return NSLocalizedString("Unfollowing...", comment: "Label to indicate that the user is in the process of unfollowing another user.")
|
||||
case .unfollows:
|
||||
return NSLocalizedString("Follow", comment: "Button to follow a user.")
|
||||
if follows_you {
|
||||
return NSLocalizedString("Follow Back", comment: "Button to follow a user back.")
|
||||
} else {
|
||||
return NSLocalizedString("Follow", comment: "Button to follow a user.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,35 +49,6 @@ func follow_btn_enabled_state(_ fs: FollowState) -> Bool {
|
||||
}
|
||||
}
|
||||
|
||||
struct ProfileNameView: View {
|
||||
let pubkey: String
|
||||
let profile: Profile?
|
||||
let damus: DamusState
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if let real_name = profile?.display_name {
|
||||
VStack(alignment: .leading) {
|
||||
Text(real_name)
|
||||
.font(.title3.weight(.bold))
|
||||
ProfileName(pubkey: pubkey, profile: profile, prefix: "@", damus: damus, show_friend_confirmed: true)
|
||||
.font(.callout)
|
||||
.foregroundColor(.gray)
|
||||
KeyView(pubkey: pubkey)
|
||||
.pubkey_context_menu(bech32_pubkey: pubkey)
|
||||
}
|
||||
} else {
|
||||
VStack(alignment: .leading) {
|
||||
ProfileName(pubkey: pubkey, profile: profile, damus: damus, show_friend_confirmed: true)
|
||||
.font(.title3.weight(.bold))
|
||||
KeyView(pubkey: pubkey)
|
||||
.pubkey_context_menu(bech32_pubkey: pubkey)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct EditButton: View {
|
||||
let damus_state: DamusState
|
||||
|
||||
@@ -92,6 +67,7 @@ struct EditButton: View {
|
||||
.stroke(borderColor(), lineWidth: 1)
|
||||
}
|
||||
.minimumScaleFactor(0.5)
|
||||
.lineLimit(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -238,6 +214,61 @@ struct ProfileView: View {
|
||||
return 0
|
||||
}
|
||||
|
||||
func ActionSection(profile_data: Profile?) -> some View {
|
||||
return Group {
|
||||
ActionSheetButton
|
||||
|
||||
if let profile = profile_data {
|
||||
if let lnurl = profile.lnurl, lnurl != "" {
|
||||
LNButton(lnurl: lnurl, profile: profile)
|
||||
}
|
||||
}
|
||||
|
||||
DMButton
|
||||
|
||||
if profile.pubkey != damus_state.pubkey {
|
||||
FollowButtonView(
|
||||
target: profile.get_follow_target(),
|
||||
follows_you: profile.follows(pubkey: damus_state.pubkey),
|
||||
follow_state: damus_state.contacts.follow_state(profile.pubkey)
|
||||
)
|
||||
} else if damus_state.keypair.privkey != nil {
|
||||
NavigationLink(destination: EditMetadataView(damus_state: damus_state)) {
|
||||
EditButton(damus_state: damus_state)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func NameSection(profile_data: Profile?) -> some View {
|
||||
return Group {
|
||||
HStack(alignment: .center) {
|
||||
ProfilePicView(pubkey: profile.pubkey, size: pfp_size, highlight: .custom(imageBorderColor(), 4.0), profiles: damus_state.profiles)
|
||||
.onTapGesture {
|
||||
is_zoomed.toggle()
|
||||
}
|
||||
.fullScreenCover(isPresented: $is_zoomed) {
|
||||
ProfileZoomView(pubkey: profile.pubkey, profiles: damus_state.profiles) }
|
||||
.offset(y: -(pfp_size/2.0)) // Increase if set a frame
|
||||
|
||||
Spacer()
|
||||
|
||||
ActionSection(profile_data: profile_data)
|
||||
.offset(y: -15.0) // Increase if set a frame
|
||||
}
|
||||
|
||||
let follows_you = profile.follows(pubkey: damus_state.pubkey)
|
||||
ProfileNameView(pubkey: profile.pubkey, profile: profile_data, follows_you: follows_you, damus: damus_state)
|
||||
//.padding(.bottom)
|
||||
.padding(.top,-(pfp_size/2.0))
|
||||
}
|
||||
}
|
||||
|
||||
var pfp_size: CGFloat {
|
||||
return 90.0
|
||||
}
|
||||
|
||||
var TopSection: some View {
|
||||
ZStack(alignment: .top) {
|
||||
GeometryReader { geometry in
|
||||
@@ -250,55 +281,14 @@ struct ProfileView: View {
|
||||
}.frame(height: BANNER_HEIGHT)
|
||||
|
||||
VStack(alignment: .leading, spacing: 8.0) {
|
||||
let data = damus_state.profiles.lookup(id: profile.pubkey)
|
||||
let pfp_size: CGFloat = 90.0
|
||||
let profile_data = damus_state.profiles.lookup(id: profile.pubkey)
|
||||
|
||||
HStack(alignment: .center) {
|
||||
ProfilePicView(pubkey: profile.pubkey, size: pfp_size, highlight: .custom(imageBorderColor(), 4.0), profiles: damus_state.profiles)
|
||||
.onTapGesture {
|
||||
is_zoomed.toggle()
|
||||
}
|
||||
.fullScreenCover(isPresented: $is_zoomed) {
|
||||
ProfileZoomView(pubkey: profile.pubkey, profiles: damus_state.profiles) }
|
||||
.offset(y: -(pfp_size/2.0)) // Increase if set a frame
|
||||
|
||||
Spacer()
|
||||
|
||||
Group {
|
||||
ActionSheetButton
|
||||
|
||||
if let profile = data {
|
||||
if let lnurl = profile.lnurl, lnurl != "" {
|
||||
LNButton(lnurl: lnurl, profile: profile)
|
||||
}
|
||||
}
|
||||
|
||||
DMButton
|
||||
|
||||
if profile.pubkey != damus_state.pubkey {
|
||||
FollowButtonView(
|
||||
target: profile.get_follow_target(),
|
||||
follow_state: damus_state.contacts.follow_state(profile.pubkey)
|
||||
)
|
||||
} else if damus_state.keypair.privkey != nil {
|
||||
NavigationLink(destination: EditMetadataView(damus_state: damus_state)) {
|
||||
EditButton(damus_state: damus_state)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.offset(y: -15.0) // Increase if set a frame
|
||||
|
||||
}
|
||||
|
||||
ProfileNameView(pubkey: profile.pubkey, profile: data, damus: damus_state)
|
||||
//.padding(.bottom)
|
||||
.padding(.top,-(pfp_size/2.0))
|
||||
NameSection(profile_data: profile_data)
|
||||
|
||||
Text(ProfileView.markdown.process(data?.about ?? ""))
|
||||
Text(ProfileView.markdown.process(profile_data?.about ?? ""))
|
||||
.font(.subheadline).textSelection(.enabled)
|
||||
|
||||
if let url = data?.website_url {
|
||||
if let url = profile_data?.website_url {
|
||||
WebsiteLink(url: url)
|
||||
}
|
||||
|
||||
@@ -332,10 +322,19 @@ struct ProfileView: View {
|
||||
}
|
||||
|
||||
if let relays = profile.relays {
|
||||
NavigationLink(destination: UserRelaysView(state: damus_state, pubkey: profile.pubkey, relays: Array(relays.keys).sorted())) {
|
||||
Text("\(Text("\(relays.keys.count)", comment: "Number of relay servers a user is connected.").font(.subheadline.weight(.medium))) \(Text(String(format: NSLocalizedString("relays_count", comment: "Part of a larger sentence to describe how many relay servers a user is connected."), relays.keys.count)).font(.subheadline).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.")
|
||||
// Only open relay config view if the user is logged in with private key and they are looking at their own profile.
|
||||
let relay_text = Text("\(Text("\(relays.keys.count)", comment: "Number of relay servers a user is connected.").font(.subheadline.weight(.medium))) \(Text(String(format: NSLocalizedString("relays_count", comment: "Part of a larger sentence to describe how many relay servers a user is connected."), relays.keys.count)).font(.subheadline).foregroundColor(.gray))", comment: "Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'.")
|
||||
if profile.pubkey == damus_state.pubkey && damus_state.is_privkey_user {
|
||||
NavigationLink(destination: RelayConfigView(state: damus_state)) {
|
||||
relay_text
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
} else {
|
||||
NavigationLink(destination: UserRelaysView(state: damus_state, pubkey: profile.pubkey, relays: Array(relays.keys).sorted())) {
|
||||
relay_text
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
}
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,19 +23,44 @@ struct QRCodeView: View {
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ZStack(alignment: .topLeading) {
|
||||
DamusGradient()
|
||||
Button {
|
||||
presentationMode.wrappedValue.dismiss()
|
||||
} label: {
|
||||
Image(systemName: "xmark")
|
||||
.foregroundColor(.white)
|
||||
.font(.subheadline)
|
||||
.padding(.leading, 20)
|
||||
ZStack(alignment: .center) {
|
||||
|
||||
ZStack(alignment: .topLeading) {
|
||||
DamusGradient()
|
||||
Button {
|
||||
presentationMode.wrappedValue.dismiss()
|
||||
} label: {
|
||||
Image(systemName: "xmark")
|
||||
.foregroundColor(.white)
|
||||
.font(.subheadline)
|
||||
.padding(.leading, 20)
|
||||
}
|
||||
.zIndex(1)
|
||||
}
|
||||
.zIndex(1)
|
||||
|
||||
VStack(alignment: .center) {
|
||||
let profile = damus_state.profiles.lookup(id: damus_state.pubkey)
|
||||
|
||||
if (damus_state.profiles.lookup(id: damus_state.pubkey)?.picture) != nil {
|
||||
ProfilePicView(pubkey: damus_state.pubkey, size: 90.0, highlight: .custom(Color("DamusWhite"), 4.0), profiles: damus_state.profiles)
|
||||
.padding(.top, 50)
|
||||
} else {
|
||||
Image(systemName: "person.fill")
|
||||
.font(.system(size: 60))
|
||||
.foregroundColor(Color("DamusWhite"))
|
||||
.padding(.top, 50)
|
||||
}
|
||||
|
||||
if let display_name = profile?.display_name {
|
||||
Text(display_name)
|
||||
.foregroundColor(Color("DamusWhite"))
|
||||
.font(.system(size: 24, weight: .heavy))
|
||||
}
|
||||
if let name = profile?.name {
|
||||
Text("@" + name)
|
||||
.foregroundColor(Color("DamusWhite"))
|
||||
.font(.body)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
@@ -46,15 +71,24 @@ struct QRCodeView: View {
|
||||
.scaledToFit()
|
||||
.frame(width: 200, height: 200)
|
||||
.padding()
|
||||
|
||||
Text(key)
|
||||
.font(.headline)
|
||||
.foregroundColor(Color(.white))
|
||||
.padding()
|
||||
.cornerRadius(10)
|
||||
.overlay(RoundedRectangle(cornerRadius: 10)
|
||||
.stroke(Color("DamusWhite"), lineWidth: 1))
|
||||
.shadow(radius: 10)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
|
||||
Text("Follow me on nostr", comment: "Text on QR code view to prompt viewer looking at screen to follow the user.")
|
||||
.foregroundColor(Color("DamusWhite"))
|
||||
.font(.system(size: 24, weight: .heavy))
|
||||
.padding(.top)
|
||||
|
||||
Text("Scan the code", comment: "Text on QR code view to prompt viewer to scan the QR code on screen with their device camera.")
|
||||
.foregroundColor(Color("DamusWhite"))
|
||||
.font(.system(size: 18, weight: .ultraLight))
|
||||
|
||||
Spacer()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
44
damus/Views/RelayFilterView.swift
Normal file
44
damus/Views/RelayFilterView.swift
Normal file
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// RelayFilterView.swift
|
||||
// damus
|
||||
//
|
||||
// Created by Ben Weeks on 1/8/23.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayFilterView: View {
|
||||
let state: DamusState
|
||||
let timeline: Timeline
|
||||
//@State var relays: [RelayDescriptor]
|
||||
//@EnvironmentObject var user_settings: UserSettingsStore
|
||||
//@State var relays: [RelayDescriptor]
|
||||
|
||||
init(state: DamusState, timeline: Timeline) {
|
||||
self.state = state
|
||||
self.timeline = timeline
|
||||
|
||||
//_relays = State(initialValue: state.pool.descriptors)
|
||||
}
|
||||
|
||||
var relays: [RelayDescriptor] {
|
||||
return state.pool.descriptors
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Text("To filter your \(timeline.rawValue) feed, please choose applicable relays from the list below:")
|
||||
.padding()
|
||||
.padding(.top, 20)
|
||||
.padding(.bottom, 0)
|
||||
|
||||
List(Array(relays), id: \.url) { relay in
|
||||
RelayToggle(state: state, timeline: timeline, relay_id: relay.url.absoluteString)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayFilterView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RelayFilterView(state: test_damus_state(), timeline: .search)
|
||||
}
|
||||
}
|
||||
33
damus/Views/Relays/Detail/RelayPaidDetail.swift
Normal file
33
damus/Views/Relays/Detail/RelayPaidDetail.swift
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// RelayPaidDetail.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayPaidDetail: View {
|
||||
let payments_url: String?
|
||||
|
||||
@Environment(\.openURL) var openURL
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
RelayType(is_paid: true)
|
||||
if let url = payments_url.flatMap({ URL(string: $0) }) {
|
||||
Button(action: {
|
||||
openURL(url)
|
||||
}, label: {
|
||||
Text("\(url)")
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayPaidDetail_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RelayPaidDetail(payments_url: "https://jb55.com")
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ struct RecommendedRelayView: View {
|
||||
guard let ev_after_add = add_relay(ev: ev_before_add, privkey: privkey, current_relays: damus.pool.descriptors, relay: relay, info: .rw) else {
|
||||
return
|
||||
}
|
||||
process_contact_event(pool: damus.pool, contacts: damus.contacts, pubkey: damus.pubkey, ev: ev_after_add)
|
||||
process_contact_event(state: damus, ev: ev_after_add)
|
||||
damus.pool.send(.event(ev_after_add))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ struct RelayConfigView: View {
|
||||
@State var show_add_relay: Bool = false
|
||||
@State var relays: [RelayDescriptor]
|
||||
|
||||
@Environment(\.dismiss) var dismiss
|
||||
|
||||
init(state: DamusState) {
|
||||
self.state = state
|
||||
_relays = State(initialValue: state.pool.descriptors)
|
||||
@@ -33,6 +35,9 @@ struct RelayConfigView: View {
|
||||
.onReceive(handle_notify(.relays_changed)) { _ in
|
||||
self.relays = state.pool.descriptors
|
||||
}
|
||||
.onReceive(handle_notify(.switched_timeline)) { _ in
|
||||
dismiss()
|
||||
}
|
||||
.sheet(isPresented: $show_add_relay) {
|
||||
AddRelayView(show_add_relay: $show_add_relay, relay: $new_relay) { m_relay in
|
||||
guard var relay = m_relay else {
|
||||
@@ -67,7 +72,7 @@ struct RelayConfigView: View {
|
||||
return
|
||||
}
|
||||
|
||||
process_contact_event(pool: state.pool, contacts: state.contacts, pubkey: state.pubkey, ev: ev)
|
||||
process_contact_event(state: state, ev: ev)
|
||||
|
||||
state.pool.send(.event(new_ev))
|
||||
}
|
||||
|
||||
96
damus/Views/Relays/RelayDetailView.swift
Normal file
96
damus/Views/Relays/RelayDetailView.swift
Normal file
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// RelayDetailView.swift
|
||||
// damus
|
||||
//
|
||||
// Created by Joel Klabo on 2/1/23.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayDetailView: View {
|
||||
let state: DamusState
|
||||
let relay: String
|
||||
let nip11: RelayMetadata
|
||||
|
||||
@State private var errorString: String?
|
||||
|
||||
@Environment(\.dismiss) var dismiss
|
||||
|
||||
func FieldText(_ str: String?) -> some View {
|
||||
Text(str ?? "No data available")
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
Form {
|
||||
if let pubkey = nip11.pubkey {
|
||||
Section(NSLocalizedString("Admin", comment: "Label to display relay contact user.")) {
|
||||
UserView(damus_state: state, pubkey: pubkey)
|
||||
}
|
||||
}
|
||||
Section(NSLocalizedString("Relay", comment: "Label to display relay address.")) {
|
||||
HStack {
|
||||
Text(relay)
|
||||
Spacer()
|
||||
RelayStatus(pool: state.pool, relay: relay)
|
||||
}
|
||||
}
|
||||
if nip11.is_paid {
|
||||
Section(content: {
|
||||
RelayPaidDetail(payments_url: nip11.payments_url)
|
||||
}, header: {
|
||||
Text("Paid Relay")
|
||||
}, footer: {
|
||||
Text("This is a paid relay, you must pay for posts to be accepted.")
|
||||
})
|
||||
}
|
||||
|
||||
Section(NSLocalizedString("Description", comment: "Label to display relay description.")) {
|
||||
FieldText(nip11.description)
|
||||
}
|
||||
Section(NSLocalizedString("Contact", comment: "Label to display relay contact information.")) {
|
||||
FieldText(nip11.contact)
|
||||
}
|
||||
Section(NSLocalizedString("Software", comment: "Label to display relay software.")) {
|
||||
FieldText(nip11.software)
|
||||
}
|
||||
Section(NSLocalizedString("Version", comment: "Label to display relay software version.")) {
|
||||
FieldText(nip11.version)
|
||||
}
|
||||
if let nips = nip11.supported_nips, nips.count > 0 {
|
||||
Section(NSLocalizedString("Supported NIPs", comment: "Label to display relay's supported NIPs.")) {
|
||||
Text(nipsList(nips: nips))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.onReceive(handle_notify(.switched_timeline)) { notif in
|
||||
dismiss()
|
||||
}
|
||||
.navigationTitle(nip11.name ?? "")
|
||||
}
|
||||
|
||||
private func nipsList(nips: [Int]) -> AttributedString {
|
||||
var attrString = AttributedString()
|
||||
let lastNipIndex = nips.count - 1
|
||||
for (index, nip) in nips.enumerated() {
|
||||
if let link = NIPURLBuilder.url(forNIP: nip) {
|
||||
let nipString = NIPURLBuilder.formatNipNumber(nip: nip)
|
||||
var nipAttrString = AttributedString(stringLiteral: nipString)
|
||||
nipAttrString.link = link
|
||||
attrString = attrString + nipAttrString
|
||||
if index < lastNipIndex {
|
||||
attrString = attrString + AttributedString(stringLiteral: ", ")
|
||||
}
|
||||
}
|
||||
}
|
||||
return attrString
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayDetailView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let metadata = RelayMetadata(name: "name", description: "desc", pubkey: "pubkey", contact: "contact", supported_nips: [1,2,3], software: "software", version: "version", limitation: Limitations.empty, payments_url: "https://jb55.com")
|
||||
RelayDetailView(state: test_damus_state(), relay: "relay", nip11: metadata)
|
||||
}
|
||||
}
|
||||
50
damus/Views/Relays/RelayStatus.swift
Normal file
50
damus/Views/Relays/RelayStatus.swift
Normal file
@@ -0,0 +1,50 @@
|
||||
//
|
||||
// RelayStatus.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayStatus: View {
|
||||
let pool: RelayPool
|
||||
let relay: String
|
||||
|
||||
let timer = Timer.publish(every: 2, on: .main, in: .common).autoconnect()
|
||||
|
||||
@State var conn_color: Color = .gray
|
||||
|
||||
func update_connection_color() {
|
||||
for relay in pool.relays {
|
||||
if relay.id == self.relay {
|
||||
let c = relay.connection
|
||||
if c.isConnected {
|
||||
conn_color = .green
|
||||
} else if c.isConnecting || c.isReconnecting {
|
||||
conn_color = .yellow
|
||||
} else {
|
||||
conn_color = .red
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Circle()
|
||||
.frame(width: 8.0, height: 8.0)
|
||||
.foregroundColor(conn_color)
|
||||
.onReceive(timer) { _ in
|
||||
update_connection_color()
|
||||
}
|
||||
.onAppear() {
|
||||
update_connection_color()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayStatus_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RelayStatus(pool: test_damus_state().pool, relay: "relay")
|
||||
}
|
||||
}
|
||||
42
damus/Views/Relays/RelayToggle.swift
Normal file
42
damus/Views/Relays/RelayToggle.swift
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// RelayToggle.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayToggle: View {
|
||||
let state: DamusState
|
||||
let timeline: Timeline
|
||||
let relay_id: String
|
||||
|
||||
func toggle_binding(relay_id: String) -> Binding<Bool> {
|
||||
return Binding(get: {
|
||||
!state.relay_filters.is_filtered(timeline: timeline, relay_id: relay_id)
|
||||
}, set: { on in
|
||||
if !on {
|
||||
state.relay_filters.insert(timeline: timeline, relay_id: relay_id)
|
||||
} else {
|
||||
state.relay_filters.remove(timeline: timeline, relay_id: relay_id)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
RelayStatus(pool: state.pool, relay: relay_id)
|
||||
RelayType(is_paid: state.relay_metadata.lookup(relay_id: relay_id)?.is_paid ?? false)
|
||||
Toggle(relay_id, isOn: toggle_binding(relay_id: relay_id))
|
||||
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayToggle_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RelayToggle(state: test_damus_state(), timeline: .search, relay_id: "wss://jb55.com")
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
27
damus/Views/Relays/RelayType.swift
Normal file
27
damus/Views/Relays/RelayType.swift
Normal file
@@ -0,0 +1,27 @@
|
||||
//
|
||||
// RelayType.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct RelayType: View {
|
||||
let is_paid: Bool
|
||||
|
||||
var body: some View {
|
||||
|
||||
Image(systemName: is_paid ? "dollarsign.circle.fill" : "globe.americas.fill")
|
||||
.foregroundColor(is_paid ? Color("DamusGreen") : .gray)
|
||||
}
|
||||
}
|
||||
|
||||
struct RelayType_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
VStack {
|
||||
RelayType(is_paid: false)
|
||||
RelayType(is_paid: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,37 +11,22 @@ struct RelayView: View {
|
||||
let state: DamusState
|
||||
let relay: String
|
||||
|
||||
let timer = Timer.publish(every: 2, on: .main, in: .common).autoconnect()
|
||||
@State var conn_color: Color = .gray
|
||||
|
||||
func update_connection_color() {
|
||||
for relay in state.pool.relays {
|
||||
if relay.id == self.relay {
|
||||
let c = relay.connection
|
||||
if c.isConnected {
|
||||
conn_color = .green
|
||||
} else if c.isConnecting || c.isReconnecting {
|
||||
conn_color = .yellow
|
||||
var body: some View {
|
||||
Group {
|
||||
HStack {
|
||||
RelayStatus(pool: state.pool, relay: relay)
|
||||
RelayType(is_paid: state.relay_metadata.lookup(relay_id: relay)?.is_paid ?? false)
|
||||
if let meta = state.relay_metadata.lookup(relay_id: relay) {
|
||||
NavigationLink {
|
||||
RelayDetailView(state: state, relay: relay, nip11: meta)
|
||||
} label: {
|
||||
Text(relay)
|
||||
}
|
||||
} else {
|
||||
conn_color = .red
|
||||
Text(relay)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
Circle()
|
||||
.frame(width: 8.0, height: 8.0)
|
||||
.foregroundColor(conn_color)
|
||||
Text(relay)
|
||||
}
|
||||
.onReceive(timer) { _ in
|
||||
update_connection_color()
|
||||
}
|
||||
.onAppear() {
|
||||
update_connection_color()
|
||||
}
|
||||
.swipeActions {
|
||||
if let privkey = state.keypair.privkey {
|
||||
RemoveAction(privkey: privkey)
|
||||
@@ -75,7 +60,7 @@ struct RelayView: View {
|
||||
return
|
||||
}
|
||||
|
||||
process_contact_event(pool: state.pool, contacts: state.contacts, pubkey: state.pubkey, ev: new_ev)
|
||||
process_contact_event(state: state, ev: new_ev)
|
||||
state.pool.send(.event(new_ev))
|
||||
} label: {
|
||||
Label(NSLocalizedString("Delete", comment: "Button to delete a relay server that the user connects to."), systemImage: "trash")
|
||||
@@ -86,6 +71,6 @@ struct RelayView: View {
|
||||
|
||||
struct RelayView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RelayView(state: test_damus_state(), relay: "wss://relay.damus.io", conn_color: .red)
|
||||
RelayView(state: test_damus_state(), relay: "wss://relay.damus.io")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@ struct SaveKeysView: View {
|
||||
@State var priv_copied: Bool = false
|
||||
@State var loading: Bool = false
|
||||
@State var error: String? = nil
|
||||
|
||||
@FocusState var pubkey_focused: Bool
|
||||
@FocusState var privkey_focused: Bool
|
||||
|
||||
var body: some View {
|
||||
ZStack(alignment: .top) {
|
||||
@@ -39,7 +42,7 @@ struct SaveKeysView: View {
|
||||
.foregroundColor(.white)
|
||||
.padding(.bottom, 10)
|
||||
|
||||
SaveKeyView(text: account.pubkey_bech32, is_copied: $pub_copied)
|
||||
SaveKeyView(text: account.pubkey_bech32, textContentType: .username, is_copied: $pub_copied, focus: $pubkey_focused)
|
||||
.padding(.bottom, 10)
|
||||
|
||||
if pub_copied {
|
||||
@@ -52,7 +55,7 @@ struct SaveKeysView: View {
|
||||
.foregroundColor(.white)
|
||||
.padding(.bottom, 10)
|
||||
|
||||
SaveKeyView(text: account.privkey_bech32, is_copied: $priv_copied)
|
||||
SaveKeyView(text: account.privkey_bech32, textContentType: .newPassword, is_copied: $priv_copied, focus: $privkey_focused)
|
||||
.padding(.bottom, 10)
|
||||
}
|
||||
|
||||
@@ -77,6 +80,13 @@ struct SaveKeysView: View {
|
||||
}
|
||||
.navigationBarBackButtonHidden(true)
|
||||
.navigationBarItems(leading: BackNav())
|
||||
.onAppear {
|
||||
// Hack to force keyboard to show up for a short moment and then hiding it to register password autofill flow.
|
||||
pubkey_focused = true
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||
pubkey_focused = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func complete_account_creation(_ account: CreateAccountModel) {
|
||||
@@ -138,7 +148,9 @@ struct SaveKeysView: View {
|
||||
|
||||
struct SaveKeyView: View {
|
||||
let text: String
|
||||
let textContentType: UITextContentType
|
||||
@Binding var is_copied: Bool
|
||||
var focus: FocusState<Bool>.Binding
|
||||
|
||||
func copy_text() {
|
||||
UIPasteboard.general.string = text
|
||||
@@ -166,8 +178,8 @@ struct SaveKeyView: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Text(text)
|
||||
|
||||
TextField("", text: .constant(text))
|
||||
.padding(5)
|
||||
.background {
|
||||
RoundedRectangle(cornerRadius: 4.0).opacity(0.2)
|
||||
@@ -177,7 +189,14 @@ struct SaveKeyView: View {
|
||||
.foregroundColor(.white)
|
||||
.onTapGesture {
|
||||
copy_text()
|
||||
// Hack to force keyboard to hide. Showing keyboard on text field is necessary to register password autofill flow but the text itself should not be modified.
|
||||
DispatchQueue.main.async {
|
||||
end_editing()
|
||||
}
|
||||
}
|
||||
.textContentType(textContentType)
|
||||
.deleteDisabled(true)
|
||||
.focused(focus)
|
||||
|
||||
spacerBlock(width: 0, height: 0) /// set a 'width' > 0 here to vary key Text's aspect ratio
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ struct SearchResultsView: View {
|
||||
}
|
||||
}
|
||||
case .hashtag(let ht):
|
||||
let search_model = SearchModel(pool: damus_state.pool, search: .filter_hashtag([ht]))
|
||||
let search_model = SearchModel(contacts: damus_state.contacts, pool: damus_state.pool, search: .filter_hashtag([ht]))
|
||||
let dst = SearchView(appstate: damus_state, search: search_model)
|
||||
NavigationLink(destination: dst) {
|
||||
Text("Search hashtag: #\(ht)", comment: "Navigation link to search hashtag.")
|
||||
|
||||
@@ -25,6 +25,9 @@ struct SearchView: View {
|
||||
.onDisappear() {
|
||||
search.unsubscribe()
|
||||
}
|
||||
.onReceive(handle_notify(.new_mutes)) { notif in
|
||||
search.filter_muted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +46,7 @@ struct SearchView_Previews: PreviewProvider {
|
||||
let filter = NostrFilter.filter_hashtag(["bitcoin"])
|
||||
let pool = test_state.pool
|
||||
|
||||
let model = SearchModel(pool: pool, search: filter)
|
||||
let model = SearchModel(contacts: test_state.contacts, pool: pool, search: filter)
|
||||
|
||||
SearchView(appstate: test_state, search: model)
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ struct SideMenuView: View {
|
||||
@Environment(\.colorScheme) var colorScheme
|
||||
|
||||
var sideBarWidth = min(UIScreen.main.bounds.size.width * 0.65, 400.0)
|
||||
let verticalSpacing: CGFloat = 20
|
||||
|
||||
func fillColor() -> Color {
|
||||
colorScheme == .light ? Color("DamusWhite") : Color("DamusBlack")
|
||||
@@ -33,104 +34,86 @@ struct SideMenuView: View {
|
||||
}
|
||||
.background(Color("DamusDarkGrey").opacity(0.6))
|
||||
.opacity(isSidebarVisible ? 1 : 0)
|
||||
.animation(.easeInOut.delay(0.2), value: isSidebarVisible)
|
||||
.animation(.default, value: isSidebarVisible)
|
||||
.onTapGesture {
|
||||
isSidebarVisible.toggle()
|
||||
}
|
||||
content
|
||||
}
|
||||
.edgesIgnoringSafeArea(.all)
|
||||
|
||||
}
|
||||
|
||||
var content: some View {
|
||||
HStack(alignment: .top) {
|
||||
ZStack(alignment: .top) {
|
||||
fillColor()
|
||||
|
||||
VStack(alignment: .leading, spacing: 20) {
|
||||
let profile = damus_state.profiles.lookup(id: damus_state.pubkey)
|
||||
let followers = FollowersModel(damus_state: damus_state, target: damus_state.pubkey)
|
||||
let profile_model = ProfileModel(pubkey: damus_state.pubkey, damus: damus_state)
|
||||
.ignoresSafeArea()
|
||||
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
|
||||
NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) {
|
||||
if let picture = damus_state.profiles.lookup(id: damus_state.pubkey)?.picture {
|
||||
ProfilePicView(pubkey: damus_state.pubkey, size: 60, highlight: .none, profiles: damus_state.profiles, picture: picture)
|
||||
} else {
|
||||
Image(systemName: "person.fill")
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
let profile = damus_state.profiles.lookup(id: damus_state.pubkey)
|
||||
let followers = FollowersModel(damus_state: damus_state, target: damus_state.pubkey)
|
||||
let profile_model = ProfileModel(pubkey: damus_state.pubkey, damus: damus_state)
|
||||
|
||||
NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) {
|
||||
|
||||
HStack {
|
||||
ProfilePicView(pubkey: damus_state.pubkey, size: 60, highlight: .none, profiles: damus_state.profiles)
|
||||
|
||||
VStack(alignment: .leading) {
|
||||
if let display_name = profile?.display_name {
|
||||
Text(display_name)
|
||||
.foregroundColor(textColor())
|
||||
.font(.title)
|
||||
.lineLimit(1)
|
||||
}
|
||||
if let name = profile?.name {
|
||||
Text("@" + name)
|
||||
.foregroundColor(Color("DamusMediumGrey"))
|
||||
.font(.body)
|
||||
.lineLimit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
.padding(.bottom, verticalSpacing)
|
||||
}
|
||||
VStack(alignment: .leading) {
|
||||
if let display_name = profile?.display_name {
|
||||
Text(display_name)
|
||||
.foregroundColor(textColor())
|
||||
.font(.title)
|
||||
}
|
||||
if let name = profile?.name {
|
||||
Text("@" + name)
|
||||
.foregroundColor(Color("DamusMediumGrey"))
|
||||
.font(.body)
|
||||
|
||||
Divider()
|
||||
|
||||
ScrollView {
|
||||
VStack(spacing: verticalSpacing) {
|
||||
NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) {
|
||||
navLabel(title: NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), systemImage: "person")
|
||||
}
|
||||
|
||||
/*
|
||||
NavigationLink(destination: EmptyView()) {
|
||||
navLabel(title: NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."), systemImage: "bolt")
|
||||
}
|
||||
*/
|
||||
|
||||
NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) {
|
||||
navLabel(title: NSLocalizedString("Blocked", comment: "Sidebar menu label for Profile view."), systemImage: "exclamationmark.octagon")
|
||||
}
|
||||
|
||||
NavigationLink(destination: RelayConfigView(state: damus_state)) {
|
||||
navLabel(title: NSLocalizedString("Relays", comment: "Sidebar menu label for Relays view."), systemImage: "network")
|
||||
}
|
||||
|
||||
NavigationLink(destination: ConfigView(state: damus_state)) {
|
||||
navLabel(title: NSLocalizedString("Settings", comment: "Sidebar menu label for accessing the app settings"), systemImage: "gear")
|
||||
}
|
||||
}
|
||||
.padding([.top, .bottom], verticalSpacing)
|
||||
}
|
||||
}
|
||||
.simultaneousGesture(TapGesture().onEnded {
|
||||
isSidebarVisible = false
|
||||
})
|
||||
|
||||
Divider()
|
||||
.padding(.trailing,40)
|
||||
|
||||
NavigationLink(destination: ProfileView(damus_state: damus_state, profile: profile_model, followers: followers)) {
|
||||
Label(NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), systemImage: "person")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
.simultaneousGesture(TapGesture().onEnded {
|
||||
isSidebarVisible = false
|
||||
})
|
||||
|
||||
/*
|
||||
NavigationLink(destination: EmptyView()) {
|
||||
Label(NSLocalizedString("Relays", comment: "Sidebar menu label for Relay servers view"), systemImage: "xserve")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
.simultaneousGesture(TapGesture().onEnded {
|
||||
isSidebarVisible.toggle()
|
||||
})
|
||||
*/
|
||||
|
||||
/*
|
||||
NavigationLink(destination: EmptyView()) {
|
||||
Label(NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."), systemImage: "bolt")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
.simultaneousGesture(TapGesture().onEnded {
|
||||
isSidebarVisible.toggle()
|
||||
})
|
||||
*/
|
||||
|
||||
NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) {
|
||||
Label(NSLocalizedString("Blocked", comment: "Sidebar menu label for Profile view."), systemImage: "exclamationmark.octagon")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
|
||||
NavigationLink(destination: RelayConfigView(state: damus_state)) {
|
||||
Label(NSLocalizedString("Relays", comment: "Sidebar menu label for Relays view."), systemImage: "network")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
|
||||
NavigationLink(destination: ConfigView(state: damus_state)) {
|
||||
Label(NSLocalizedString("Settings", comment: "Sidebar menu label for accessing the app settings"), systemImage: "gear")
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
}
|
||||
.simultaneousGesture(TapGesture().onEnded {
|
||||
isSidebarVisible = false
|
||||
})
|
||||
|
||||
Spacer()
|
||||
|
||||
HStack(alignment: .center) {
|
||||
HStack() {
|
||||
Button(action: {
|
||||
//ConfigView(state: damus_state)
|
||||
if damus_state.keypair.privkey == nil {
|
||||
@@ -142,6 +125,7 @@ struct SideMenuView: View {
|
||||
Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), systemImage: "pip.exit")
|
||||
.font(.title3)
|
||||
.foregroundColor(textColor())
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
})
|
||||
|
||||
Spacer()
|
||||
@@ -152,22 +136,18 @@ struct SideMenuView: View {
|
||||
Label(NSLocalizedString("", comment: "Sidebar menu label for accessing QRCode view"), systemImage: "qrcode")
|
||||
.font(.title)
|
||||
.foregroundColor(textColor())
|
||||
.padding(.trailing, 20)
|
||||
}).fullScreenCover(isPresented: $showQRCode) {
|
||||
QRCodeView(damus_state: damus_state)
|
||||
}
|
||||
}
|
||||
.padding(.top, verticalSpacing)
|
||||
}
|
||||
.padding(.top, 60)
|
||||
.padding(.bottom, 40)
|
||||
.padding(.leading, 40)
|
||||
.padding(.top, -15)
|
||||
.padding([.leading, .trailing, .bottom], 30)
|
||||
}
|
||||
.frame(width: sideBarWidth)
|
||||
.offset(x: isSidebarVisible ? 0 : -sideBarWidth)
|
||||
.animation(.default, value: isSidebarVisible)
|
||||
.onTapGesture {
|
||||
isSidebarVisible.toggle()
|
||||
}
|
||||
.alert("Logout", isPresented: $confirm_logout) {
|
||||
Button(NSLocalizedString("Cancel", comment: "Cancel out of logging out the user."), role: .cancel) {
|
||||
confirm_logout = false
|
||||
@@ -182,6 +162,15 @@ struct SideMenuView: View {
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ViewBuilder
|
||||
func navLabel(title: String, systemImage: String) -> some View {
|
||||
Label(title, systemImage: systemImage)
|
||||
.font(.title2)
|
||||
.foregroundColor(textColor())
|
||||
.frame(maxWidth: .infinity, alignment: .leading)
|
||||
}
|
||||
}
|
||||
|
||||
struct Previews_SideMenuView_Previews: PreviewProvider {
|
||||
|
||||
@@ -47,6 +47,7 @@ struct BuildThreadV2View: View {
|
||||
@State var thread: ThreadV2? = nil
|
||||
|
||||
@State var current_events_uuid: String = ""
|
||||
@State var extra_events_uuid: String = ""
|
||||
@State var childs_events_uuid: String = ""
|
||||
@State var parents_events_uuids: [String] = []
|
||||
|
||||
@@ -197,13 +198,15 @@ struct BuildThreadV2View: View {
|
||||
self.unsubscribe_all()
|
||||
print("ThreadV2View: Reload!")
|
||||
|
||||
var extra = NostrFilter.filter_kinds([9735, 6, 7])
|
||||
extra.referenced_ids = [ self.event_id ]
|
||||
|
||||
// Get the current event
|
||||
current_events_uuid = subscribe(filters: [
|
||||
NostrFilter(
|
||||
ids: [self.event_id],
|
||||
limit: 1
|
||||
)
|
||||
NostrFilter(ids: [self.event_id], limit: 1)
|
||||
])
|
||||
|
||||
extra_events_uuid = subscribe(filters: [extra])
|
||||
print("subscribing to threadV2 \(event_id) with sub_id \(current_events_uuid)")
|
||||
}
|
||||
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
//
|
||||
// ThreadView.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2022-04-19.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
|
||||
struct ThreadView: View {
|
||||
@StateObject var thread: ThreadModel
|
||||
let damus: DamusState
|
||||
@State var is_chatroom: Bool
|
||||
@State var metadata: ChatroomMetadata? = nil
|
||||
@State var seen_first: Bool = false
|
||||
|
||||
@Environment(\.dismiss) var dismiss
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
if is_chatroom {
|
||||
ChatroomView(damus: damus)
|
||||
.navigationBarTitle(metadata?.name ?? NSLocalizedString("Chat", comment: "Navigation bar title for Chatroom view."))
|
||||
.environmentObject(thread)
|
||||
} else {
|
||||
EventDetailView(damus: damus, thread: thread)
|
||||
.navigationBarTitle(metadata?.name ?? NSLocalizedString("Thread", comment: "Navigation bar title for threaded event detail view."))
|
||||
.environmentObject(thread)
|
||||
}
|
||||
|
||||
/*
|
||||
NavigationLink(destination: edv, isActive: $is_chatroom) {
|
||||
EmptyView()
|
||||
}
|
||||
*/
|
||||
}
|
||||
.onReceive(handle_notify(.switched_timeline)) { n in
|
||||
dismiss()
|
||||
}
|
||||
.onReceive(handle_notify(.toggle_thread_view)) { _ in
|
||||
is_chatroom = !is_chatroom
|
||||
//print("is_chatroom: \(is_chatroom)")
|
||||
}
|
||||
.onReceive(handle_notify(.chatroom_meta)) { n in
|
||||
let meta = n.object as! ChatroomMetadata
|
||||
self.metadata = meta
|
||||
}
|
||||
.onChange(of: thread.events) { val in
|
||||
if seen_first {
|
||||
return
|
||||
}
|
||||
if let ev = thread.events.first {
|
||||
guard ev.is_root_event() else {
|
||||
return
|
||||
}
|
||||
seen_first = true
|
||||
is_chatroom = should_show_chatroom(ev)
|
||||
}
|
||||
}
|
||||
.onAppear() {
|
||||
thread.subscribe()
|
||||
}
|
||||
.onDisappear() {
|
||||
thread.unsubscribe()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
struct ThreadView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ThreadView()
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func should_show_chatroom(_ ev: NostrEvent) -> Bool {
|
||||
if ev.known_kind == .chat || ev.known_kind == .channel_create {
|
||||
return true
|
||||
}
|
||||
|
||||
return has_hashtag(ev.tags, hashtag: "chat")
|
||||
}
|
||||
|
||||
func tag_is_hashtag(_ tag: [String]) -> Bool {
|
||||
// "hashtag" is deprecated, will remove in the future
|
||||
return tag.count >= 2 && (tag[0] == "hashtag" || tag[0] == "t")
|
||||
}
|
||||
|
||||
func has_hashtag(_ tags: [[String]], hashtag: String) -> Bool {
|
||||
for tag in tags {
|
||||
if tag_is_hashtag(tag) && tag[1] == hashtag {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
42
damus/Views/Zaps/ZapsView.swift
Normal file
42
damus/Views/Zaps/ZapsView.swift
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// ZapsView.swift
|
||||
// damus
|
||||
//
|
||||
// Created by William Casarin on 2023-02-10.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct ZapsView: View {
|
||||
let state: DamusState
|
||||
@StateObject var model: ZapsModel
|
||||
|
||||
init(state: DamusState, target: ZapTarget) {
|
||||
self.state = state
|
||||
self._model = StateObject(wrappedValue: ZapsModel(state: state, target: target))
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
ScrollView {
|
||||
LazyVStack {
|
||||
ForEach(model.zaps, id: \.event.id) { zap in
|
||||
ZapEvent(damus: state, zap: zap)
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
}
|
||||
.navigationBarTitle(NSLocalizedString("Zaps", comment: "Navigation bar title for the Zaps view."))
|
||||
.onAppear {
|
||||
model.subscribe()
|
||||
}
|
||||
.onDisappear {
|
||||
model.unsubscribe()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ZapsView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ZapsView(state: test_damus_state(), target: .profile("pk"))
|
||||
}
|
||||
}
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -36,8 +35,8 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. بسهولة مطلقة، أرسل و استقبل برقيات البتكوين ⚡️عملة الانترنت العالمية.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "النبذة التعريفية";
|
||||
|
||||
@@ -75,9 +77,9 @@ Number of profiles a user is following. */
|
||||
"Add Relay" = "اضافة موصّل";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "كم";
|
||||
"Any" = "أي شيء";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "مفتاح API (اختياري)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
@@ -212,6 +214,13 @@ Number of profiles a user is following. */
|
||||
Section title for deleting the user */
|
||||
"Delete" = "حذف";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "حذف الحساب";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "حذف الحساب";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "اغلاق";
|
||||
|
||||
@@ -274,7 +283,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "اخفاء";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "اخفاء مفتاح API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -304,9 +314,6 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "هيا بنا!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "ترجمة LibreTranslate";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "عنوان البرق أو LNURL";
|
||||
|
||||
@@ -337,15 +344,21 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "تحقق NIP-05";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "لا";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "لم نعثر على قائمة حظر. هل تريد انشاء قائمة جديدة؟ سيتم استبدال أي قوائم سابقة ان وجدت";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "لا شيء";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "لا اختيار";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "يحتوي المنشور على مفتاح خاص \"nsec1\". هل أنت متأكد؟";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "لا جديد في هذه اللحظة. يرجى المعاودة لاحقا!";
|
||||
|
||||
@@ -418,7 +431,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "رفض";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "موصّل";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
@@ -500,13 +514,14 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Send a message to start the conversation..." = "أرسل رسالة لبدء المحادثة...";
|
||||
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "سيرفر";
|
||||
"Server" = "خادم";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "الاعدادات";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "مشاركة";
|
||||
|
||||
@@ -514,14 +529,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "عرض";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "عرض مفتاح API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
"Show wallet selector" = "هل تريد اختيار المحفظة عند كل عملية دفع؟";
|
||||
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "تسجيل الخروج";
|
||||
"Sign out" = "خروج";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
@@ -552,7 +568,13 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "ترجم المنشور";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "مُترجَم من (languageName!)";
|
||||
"Translated from (lang)" = "مُترجَم من (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "الترجمة من (lang)...";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "اكتب DELETE لتأكيد الحذف";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "اكتب المنشور هنا...";
|
||||
@@ -612,6 +634,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "نعم، استبدل";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "نعم، انشر المفتاح الخاص";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "أنت";
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>%d other notes</string>
|
||||
<string>%d منشورات اضافية</string>
|
||||
<key>many</key>
|
||||
<string>%d other notes</string>
|
||||
<string>%d منشورات اضافية</string>
|
||||
<key>one</key>
|
||||
<string>%dمنشور اضافي</string>
|
||||
<string>%d منشور اضافي</string>
|
||||
<key>other</key>
|
||||
<string>%dمنشورات اضافية</string>
|
||||
<string>%d منشورات اضافية</string>
|
||||
<key>two</key>
|
||||
<string>%d other notes</string>
|
||||
<string>%d منشوران</string>
|
||||
<key>zero</key>
|
||||
<string>%d other notes</string>
|
||||
<string>%d منشورات أخرى</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>··· %#@NOTES@ ···</string>
|
||||
@@ -35,17 +35,17 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Followers</string>
|
||||
<string>المتابعون</string>
|
||||
<key>many</key>
|
||||
<string>Followers</string>
|
||||
<string>المتابعون</string>
|
||||
<key>one</key>
|
||||
<string>متابع</string>
|
||||
<key>other</key>
|
||||
<string>المتابعون</string>
|
||||
<key>two</key>
|
||||
<string>Followers</string>
|
||||
<string>متابعان</string>
|
||||
<key>zero</key>
|
||||
<string>Followers</string>
|
||||
<string>متابع</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@FOLLOWERS@</string>
|
||||
@@ -61,17 +61,17 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Reactions</string>
|
||||
<string>تفاعلات</string>
|
||||
<key>many</key>
|
||||
<string>Reactions</string>
|
||||
<string>تفاعل</string>
|
||||
<key>one</key>
|
||||
<string>تفاعل</string>
|
||||
<key>other</key>
|
||||
<string>تفاعل</string>
|
||||
<key>two</key>
|
||||
<string>Reactions</string>
|
||||
<string>تفاعل</string>
|
||||
<key>zero</key>
|
||||
<string>Reactions</string>
|
||||
<string>تفاعل</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>relays_count</key>
|
||||
@@ -85,17 +85,17 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Relays</string>
|
||||
<string>موصّلات</string>
|
||||
<key>many</key>
|
||||
<string>Relays</string>
|
||||
<string>موصّلات</string>
|
||||
<key>one</key>
|
||||
<string> موصّل</string>
|
||||
<string> موصّل</string>
|
||||
<key>other</key>
|
||||
<string>موصّلات</string>
|
||||
<key>two</key>
|
||||
<string>Relays</string>
|
||||
<string>موصّلان</string>
|
||||
<key>zero</key>
|
||||
<string>Relays</string>
|
||||
<string>موصّل</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_one_and_others</key>
|
||||
@@ -109,15 +109,15 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخرون</string>
|
||||
<key>many</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخرون</string>
|
||||
<key>one</key>
|
||||
<string>& %dآخر</string>
|
||||
<string>& %d آخر</string>
|
||||
<key>other</key>
|
||||
<string>& %dآخرين</string>
|
||||
<string>& %d آخرون</string>
|
||||
<key>two</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخران</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
@@ -133,15 +133,15 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخرون</string>
|
||||
<key>many</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخرون</string>
|
||||
<key>one</key>
|
||||
<string>& %dآخر</string>
|
||||
<string>& %d آخر</string>
|
||||
<key>other</key>
|
||||
<string>& %dآخرين</string>
|
||||
<string>& %d آخرون</string>
|
||||
<key>two</key>
|
||||
<string> & %d others</string>
|
||||
<string> & %d آخران</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
@@ -157,17 +157,17 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Reposts</string>
|
||||
<string>اعادات نشر</string>
|
||||
<key>many</key>
|
||||
<string>Reposts</string>
|
||||
<string>اعادات نشر</string>
|
||||
<key>one</key>
|
||||
<string>اعادة نشر</string>
|
||||
<key>other</key>
|
||||
<string>اعادات نشر</string>
|
||||
<key>two</key>
|
||||
<string>Reposts</string>
|
||||
<string>اعادات نشر</string>
|
||||
<key>zero</key>
|
||||
<string>Reposts</string>
|
||||
<string>اعادات نشر</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>sats_count</key>
|
||||
@@ -181,41 +181,41 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>@</string>
|
||||
<key>few</key>
|
||||
<string>%2$@ sats</string>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
<key>many</key>
|
||||
<string>%2$@ sats</string>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
<key>one</key>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
<key>other</key>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
<key>two</key>
|
||||
<string>%2$@ sats</string>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
<key>zero</key>
|
||||
<string>%2$@ sats</string>
|
||||
<string>%2$@ ساتوشي</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
<key>many</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
<key>one</key>
|
||||
<string>اكرامية</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>اكراميات</string>
|
||||
<string>Zaps</string>
|
||||
<key>two</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
<key>zero</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
<string>applinks:damus.io</string>
|
||||
<string>webcredentials:damus.io</string>
|
||||
</array>
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
import SwiftUI
|
||||
|
||||
|
||||
@main
|
||||
struct damusApp: App {
|
||||
var body: some Scene {
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Zum Speichern von Bildern braucht Damus Zugriff auf deine Fotos";
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Lokale Authentifizierung für den Zugriff auf den privaten Schlüssel";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Zum Speichern von Bildern braucht Damus Zugriff auf deine Fotos.";
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"'%@' is an invalid NIP-05 identifier. It should look like an email." = "%@' ist kein gülter NIP-05 identifier. Dieser sollte wie eine email aussehen. ";
|
||||
|
||||
/* Navigation bar title for view that shows who is following a user. */
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profile.displayName(profile: profile, pubkey: whos)) Gefolgte";
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "Follower von (Profile.displayName(profile: profile, pubkey: whos))";
|
||||
|
||||
/* Navigation bar title for view that shows who a user is following. */
|
||||
"(who) following" = "(who) folgt";
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -31,13 +30,13 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "%@. Du brauchst für ein Konto keine Telefonnummer, E-Mail-Adresse oder Namen. Fang ganz reibungslos einfach an.";
|
||||
|
||||
/* Explanation of what is done to keep private data encrypted. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Ende-zu-Ende verschlüsselter privater Nachrichtenaustausch. Halte Big Tech aus deinen PNs heraus";
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Ende-zu-Ende-verschlüsselter, privater Nachrichtenaustausch. Halte Big Tech aus deinen PNs heraus.";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Belohne Beiträge deiner Freunde und sammle Sats mit Bitcoin⚡️, der eigenen Währung des Internets.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Über";
|
||||
|
||||
@@ -74,14 +76,20 @@ Number of profiles a user is following. */
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Relay hinzufügen";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Admin";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Beliebig";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "API Schlüssel (optional)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "API-Schlüssel (benötigt)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Bist du sicher dass Du den Beitrag teilen möchtest?";
|
||||
"Are you sure you want to repost this?" = "Bist du sicher, dass Du den Beitrag teilen möchtest?";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "Bannerbild";
|
||||
@@ -118,6 +126,9 @@ Number of profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Boosts";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
@@ -145,6 +156,9 @@ Number of profiles a user is following. */
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Zwischenspeicher löschen";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Kontakt";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Kopiert";
|
||||
|
||||
@@ -203,6 +217,9 @@ Number of profiles a user is following. */
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (Proprietär, bessere Genauigkeit)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Voreingestellte Wallet";
|
||||
|
||||
@@ -212,6 +229,16 @@ Number of profiles a user is following. */
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Löschen";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Konto löschen";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Gelöschtes Konto";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Beschreibung";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Schließen";
|
||||
|
||||
@@ -249,8 +276,14 @@ Number of profiles a user is following. */
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Folgen";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Ebenfalls folgen";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Folge mir auf Nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Gefolgte:r";
|
||||
"Followers" = "Follower";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.
|
||||
Part of a larger sentence to describe how many profiles a user is following. */
|
||||
@@ -262,6 +295,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Folgt";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Folgt dir";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "kostenlos";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "API-Schlüssel erhalten";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Allgemein";
|
||||
|
||||
@@ -274,7 +316,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Verstecken";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "API Schlüssel verstecken";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -302,10 +345,10 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Left Handed" = "Linkshändig";
|
||||
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Los gehts!";
|
||||
"Let's go!" = "Los geht’s!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "LibreTranslate Übersetzungen";
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (Open Source)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Lightning-Adresse oder LNURL";
|
||||
@@ -313,9 +356,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Lightning-Rechnung";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "Like";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Lokale Authentifizierung für den Zugriff auf den privaten Schlüssel";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "System-Standard";
|
||||
|
||||
@@ -337,19 +386,25 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "NIP-05-Verifizierung";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Nein";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Es wurde keine Blockier-Liste gefunden, soll eine neue erzeugt werden? Dies überschreibt eventuelle frühere Blockier-Listen.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "keine";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Kein";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Hier gibts nichts zu sehen. Schau später wieder vorbei!";
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "Notiz enthält einen privaten \"nsec1\"-Schlüssel. Bist du sicher?";
|
||||
|
||||
/* Navigation title for notifications. */
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Hier gibt es nichts zu sehen. Schau später wieder vorbei!";
|
||||
|
||||
/* Toolbar label for Notifications view. */
|
||||
"Notifications" = "Benachrichtigungen";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
@@ -373,6 +428,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Paket";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Teilen";
|
||||
|
||||
@@ -391,6 +449,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Privater Schlüssel";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Profil";
|
||||
|
||||
@@ -418,11 +479,11 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Ablehnen";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relay";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
/* Sidebar menu label for Relays view. */
|
||||
"Relays" = "Relays";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
@@ -431,8 +492,11 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Alle entfernen";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Antworten";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Antwort an dich selbst";
|
||||
"Reply to self" = "Antwort an sich selbst";
|
||||
|
||||
/* Label to indicate that the user is replying to 2 users. */
|
||||
"Replying to %@ & %@" = "%1$@ & %2$@ antworten";
|
||||
@@ -481,6 +545,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Bild sichern";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Code scannen";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Hashtag suchen: #%@";
|
||||
|
||||
@@ -502,11 +569,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Server";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Dienst";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Einstellungen";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Teilen";
|
||||
|
||||
@@ -514,7 +585,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Anzeigen";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "API Schlüssel anzeigen";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -523,9 +595,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Abmelden";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Software";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "Unterstützte NIPs";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Danke!";
|
||||
|
||||
@@ -536,7 +614,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective." = "Dies ist ein öffentlicher Schlüssel, Du wirst keine Beiträge teilen oder oder auf irgendeine Weise interagieren können. Dies wird genutzt um andere Kontos aus deren Perspektive zu sehen.";
|
||||
|
||||
/* Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. */
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Dies ist ein nostr-Schlüsse im veralteten Format. Wir sind nicht sicher ob es ein öffentlicher Schlüssel oder ein privater Schlüssel ist. Bitte betätige die untenstehende Schaltfläche wenn es ein öffentlicher Schlüssel ist.";
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Dies ist ein Nostr-Schlüssel im veralteten Format. Wir sind nicht sicher ob es ein öffentlicher Schlüssel oder ein privater Schlüssel ist. Bitte betätige die untenstehende Schaltfläche wenn es ein öffentlicher Schlüssel ist.";
|
||||
|
||||
/* Label to describe that a public key is the user's account ID and what they can do with it. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "Dies ist deine Konto-ID, die du an deine Freunde weitergeben kannst, damit sie dir folgen können. Zum Kopieren anklicken.";
|
||||
@@ -552,7 +630,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Notiz übersetzen";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Übersetzt aus (languageName!)";
|
||||
"Translated from (lang)" = "Übersetzt aus (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Übersetzung aus (lang)...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Übersetzungen";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Gib DELETE ein, um zu löschen";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Schreibe deinen Beitrag hier...";
|
||||
@@ -585,6 +672,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Benutzername";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Version";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Wallet";
|
||||
|
||||
@@ -612,6 +702,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Ja, überschreiben";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Ja, teile mit privatem Schlüssel";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "Du";
|
||||
|
||||
@@ -621,6 +714,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Die Meldung wird an Relays versendet, mit denen du verbunden bist";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Gefolgte:r</string>
|
||||
<string>Follower</string>
|
||||
<key>other</key>
|
||||
<string>Gefolgte</string>
|
||||
<string>Follower</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@FOLLOWERS@</string>
|
||||
@@ -134,20 +134,20 @@
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Trinkgeld</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Trinkgelder</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
12
damus/el-GR.lproj/InfoPlist.strings
Normal file
12
damus/el-GR.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,12 @@
|
||||
/* Bundle display name */
|
||||
"CFBundleDisplayName" = "Damus";
|
||||
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Τοπικά δικαιώματα για πρόσβαση στο ιδιωτικό κλειδί";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Δίνοντας στο Damus πρόσβαση στις φωτογραφίες σας επιτρέπετε την αποθήκευση εικόνων.";
|
||||
|
||||
726
damus/el-GR.lproj/Localizable.strings
Normal file
726
damus/el-GR.lproj/Localizable.strings
Normal file
@@ -0,0 +1,726 @@
|
||||
/* Blank space to separate profile picture from profile editor form. */
|
||||
" " = "61b6edf1108e6f396680a33b02486a70_tr";
|
||||
|
||||
/* Description of how the nip05 identifier would be used for verification. */
|
||||
"'%@' at '%@' will be used for verification" = "'%@' at '%@' θα χρησιμοποιηθεί για επαλήθευση";
|
||||
|
||||
/* Description of why the nip05 identifier is invalid. */
|
||||
"'%@' is an invalid NIP-05 identifier. It should look like an email." = "'%@' είναι ένα λανθασμένο NIP-05 αναγνωριστικό. Θα πρέπει να έχει την μορφή email.";
|
||||
|
||||
/* Navigation bar title for view that shows who is following a user. */
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profile.displayName(profile: profile, pubkey: whos))'s Ακόλουθοι";
|
||||
|
||||
/* Navigation bar title for view that shows who a user is following. */
|
||||
"(who) following" = "(ποίους) ακολουθεί";
|
||||
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"%@ has been blocked" = "%@ έχει μπλοκαριστεί";
|
||||
|
||||
/* Explanation of what is done to keep personally identifiable information private. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "%@. Η δημιουργία λογαριασμού δεν απαιτεί τηλεφωνικό αριθμό, email ή όνομα. Ξεκινήστε αμέσως χωρίς προστιβές.";
|
||||
|
||||
/* Explanation of what is done to keep private data encrypted. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. End-to-End κρυπτογραφημένα προσωπικά μηνύματα. Κρατήστε τις μεγάλες εταιρείες τεχνολογίας μακριά από τα προσωπικά σας μηνύματα.";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Δώστε φιλοδώρημα στις δημοσιεύσεις των φίλων σας και μαζέψτε Bitcoin sats⚡️, το νόμισμα του ίντερνετ.";
|
||||
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
"%lld/%lld" = "%lld/%lld";
|
||||
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Σχετικά";
|
||||
|
||||
/* Label for About Me section of user profile form. */
|
||||
"About Me" = "Σχετικά με εμένα";
|
||||
|
||||
/* Placeholder text for About Me description. */
|
||||
"Absolute Boss" = "Απόλυτο αφεντικό";
|
||||
|
||||
/* Button to accept the end user license agreement before being allowed into the app. */
|
||||
"Accept" = "Αποδοχή";
|
||||
|
||||
/* Label to indicate the public ID of the account. */
|
||||
"Account ID" = "ID Λογαρισμού";
|
||||
|
||||
/* Title for confirmation dialog to either share, report, or block a profile. */
|
||||
"Actions" = "Ενέργειες";
|
||||
|
||||
/* Button to add recommended relay server.
|
||||
Button to confirm adding user inputted relay. */
|
||||
"Add" = "Προσθήκη";
|
||||
|
||||
/* Button label to re-add all original participants as profiles to reply to in a note */
|
||||
"Add all" = "Προσθήκη όλων";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Προσθήκη διακομιστή Relay";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Διαχειριστής";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Ποσό";
|
||||
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Κλειδί API (προαιρετικό)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "Κλειδί API (απαιτείται)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Είστε βέβαιοι ότι θέλετε να το αναδημοσιεύσετε;";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "Φωτογραφία εξωφύλλου";
|
||||
|
||||
/* Reminder to user that they should save their account information. */
|
||||
"Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus." = "Πριν ξεκινήσουμε, θα χρειαστεί να αποθηκεύσετε τις πληροφορίες του λογαριασμού σας, διαφορετικά θα χάσετε την πρόσβαση σας αν ποτέ απεγκαταστήσετε το Damus.";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Bitcoin Beach. */
|
||||
"Bitcoin Beach" = "Bitcoin Beach";
|
||||
|
||||
/* Label for Bitcoin Lightning Tips section of user profile form. */
|
||||
"Bitcoin Lightning Tips" = "Bitcoin Lightning Tips";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blixt Wallet */
|
||||
"Blixt Wallet" = "Blixt Wallet";
|
||||
|
||||
/* Alert button to block a user.
|
||||
Button to block a profile.
|
||||
Context menu option for blocking users. */
|
||||
"Block" = "Μπλοκάρισμα";
|
||||
|
||||
/* Alert message prompt to ask if a user should be blocked. */
|
||||
"Block %@?" = "Μπλοκάρισμα %@;";
|
||||
|
||||
/* Title of alert for blocking a user. */
|
||||
"Block User" = "Μπλοκάρισμα χρήστη";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Blocked" = "Μπλοκαρισμένοι";
|
||||
|
||||
/* Navigation title of view to see list of blocked users. */
|
||||
"Blocked Users" = "Μπλοκαρισμένοι χρήστες";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Boosts";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
/* Context menu option for broadcasting the user's note to all of the user's connected relay servers. */
|
||||
"Broadcast" = "Αναμετάδοση";
|
||||
|
||||
/* Alert button to cancel out of alert for blocking a user.
|
||||
Button to cancel out of alert that creates a new mutelist.
|
||||
Button to cancel out of posting a note.
|
||||
Button to cancel out of reposting a post.
|
||||
Button to cancel out of view adding user inputted relay.
|
||||
Cancel deleting the user.
|
||||
Cancel out of logging out the user. */
|
||||
"Cancel" = "Άκυρο";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Cash App. */
|
||||
"Cash App" = "Cash App";
|
||||
|
||||
/* Navigation bar title for Chatroom view. */
|
||||
"Chat" = "Συνομιλίες";
|
||||
|
||||
/* Button for clearing cached data. */
|
||||
"Clear" = "Καθαρισμός";
|
||||
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Καθαρισμός προσωρινής μνήμης";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Επικοινωνία";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Αντιγράφηκε";
|
||||
|
||||
/* Button to copy a relay server address. */
|
||||
"Copy" = "Αντιγραφή";
|
||||
|
||||
/* Context menu option for copying the ID of the account that created the note. */
|
||||
"Copy Account ID" = "Αντιγραφή ID λογαριασμού";
|
||||
|
||||
/* Context menu option to copy an image into clipboard.
|
||||
Context menu option to copy an image to clipboard. */
|
||||
"Copy Image" = "Αντιγραφή εικόνας";
|
||||
|
||||
/* Context menu option to copy the URL of an image into clipboard. */
|
||||
"Copy Image URL" = "Αντιγραφή URL εικόνας";
|
||||
|
||||
/* Title of section for copying a Lightning invoice identifier. */
|
||||
"Copy invoice" = "Αντιγραφή ποσού";
|
||||
|
||||
/* Context menu option for copying a user's Lightning URL. */
|
||||
"Copy LNURL" = "Αντιγραφή LNURL";
|
||||
|
||||
/* Context menu option for copying the ID of the note. */
|
||||
"Copy Note ID" = "Αντιγραφή ID σημείωσης";
|
||||
|
||||
/* Context menu option for copying the JSON text from the note. */
|
||||
"Copy Note JSON" = "Αντιγραφή JSON σημείωσης";
|
||||
|
||||
/* Button to copy report ID. */
|
||||
"Copy Report ID" = "Αντιγραφή ID αναφοράς";
|
||||
|
||||
/* Context menu option for copying the text from an note. */
|
||||
"Copy Text" = "Αντιγραφή κειμένου";
|
||||
|
||||
/* Context menu option for copying the ID of the user who created the note. */
|
||||
"Copy User Pubkey" = "Αντιγραφή δημόσιου κλειδιού χρήστη";
|
||||
|
||||
/* Alert message to indicate that the blocked user could not be found. */
|
||||
"Could not find user to block..." = "Ο χρήστης για μπλοκάρισμα δεν βρέθηκε...";
|
||||
|
||||
/* Button to create account. */
|
||||
"Create" = "Δημιουργία";
|
||||
|
||||
/* Button to create an account. */
|
||||
"Create Account" = "Δημιουργία λογαριασμού";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "Δημιουργία νέας λίστας αποκλεισμού";
|
||||
|
||||
/* Example description about Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"Creator(s) of Bitcoin. Absolute legend." = "Δημιουργός(οί) του Bitcoin. Απόλυτος θρύλος.";
|
||||
|
||||
/* Dropdown option for selecting a custom translation server. */
|
||||
"Custom" = "Προσαρμογή";
|
||||
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (Υπηρεσία, Υψηλότερη Ακρίβεια)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Προεπιλεγμένο πορτοφόλι";
|
||||
|
||||
/* Button for deleting the users account.
|
||||
Button to delete a relay server that the user connects to.
|
||||
Button to remove a user from their blocklist.
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Διαγραφή";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Διαγραφή λογαριασμού";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Διεγραμμένος λογαριασμός";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Περιγραφή";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Απόρριψη";
|
||||
|
||||
/* Label to prompt display name entry. */
|
||||
"Display Name" = "Εμφανιζόμενο όνομα";
|
||||
|
||||
/* Navigation title for DMs view, where DM is the English abbreviation for Direct Message.
|
||||
Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. */
|
||||
"DMs" = "Προσωπικά Μηνύματα";
|
||||
|
||||
/* Button to dismiss wallet selection view for paying Lightning invoice. */
|
||||
"Done" = "Ολοκλήρωση";
|
||||
|
||||
/* Heading indicating that this application allows users to earn money. */
|
||||
"Earn Money" = "Βγάλτε χρήματα";
|
||||
|
||||
/* Button to edit user's profile. */
|
||||
"Edit" = "Επεξεργασία";
|
||||
|
||||
/* Text indicating that the view is used for editing which participants are replied to in a note. */
|
||||
"Edit participants" = "Επεξεργασία συμμετεχόντων";
|
||||
|
||||
/* Heading indicating that this application keeps private messaging end-to-end encrypted. */
|
||||
"Encrypted" = "Κρυπτογραφημένα";
|
||||
|
||||
/* Prompt for user to enter an account key to login. */
|
||||
"Enter your account key to login:" = "Εισάγετε το κλειδί του λογαριασμού σας για είσοδο:";
|
||||
|
||||
/* Error message indicating why saving keys failed. */
|
||||
"Error: %@" = "Σφάλμα: %@";
|
||||
|
||||
/* Label indicating that the below text is the EULA, an acronym for End User License Agreement. */
|
||||
"EULA" = "EULA";
|
||||
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Ακολουθήστε";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Ακολουθήστε";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Ακολουθήστε με στο nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Ακόλουθοι";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.
|
||||
Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Following" = "Ακολουθεί";
|
||||
|
||||
/* Label to indicate that the user is in the process of following another user. */
|
||||
"Following..." = "Ακολουθεί...";
|
||||
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Ακολουθήστε";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Σας ακολουθούν";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Δωρεάν";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "Λάβετε κλειδί API";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Κεντρική";
|
||||
|
||||
/* Navigation link to go to post referenced by hex code. */
|
||||
"Goto post %@" = "Πήγαινε στη δημοσίευση %@";
|
||||
|
||||
/* Navigation link to go to profile. */
|
||||
"Goto profile %@" = "Πήγαινε στο προφίλ %@";
|
||||
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Απόκρυψη";
|
||||
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Απόκρυψη κλειδιού API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
"Home" = "Αρχική";
|
||||
|
||||
/* Placeholder example text for profile picture URL. */
|
||||
"https://example.com/pic.jpg" = "https://example.com/pic.jpg";
|
||||
|
||||
/* Placeholder example text for website URL for user profile. */
|
||||
"https://jb55.com" = "https://jb55.com";
|
||||
|
||||
/* Button for user to report that the account or content has illegal content. */
|
||||
"Illegal content" = "Παράνομο περιεχόμενο";
|
||||
|
||||
/* Error message indicating that an invalid account key was entered for login. */
|
||||
"Invalid key" = "Λανθασμένο κλειδί";
|
||||
|
||||
/* Button for user to report that the account or content has spam. */
|
||||
"It's spam" = "Είναι ανεπιθύμητο";
|
||||
|
||||
/* Placeholder example text for identifier used for NIP-05 verification. */
|
||||
"jb55@jb55.com" = "jb55@jb55.com";
|
||||
|
||||
/* Moves the post button to the left side of the screen */
|
||||
"Left Handed" = "Για αριστερόχειρες";
|
||||
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Φύγαμε!";
|
||||
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (Ανοιχτού κώδικα)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Διεύθυνση Lightning ή LNURL";
|
||||
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Lightning ποσό";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "Μου αρέσει";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Τοπικά δικαιώματα για πρόσβαση στο ιδιωτικό κλειδί";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "Προεπιλογή";
|
||||
|
||||
/* Button to log into account.
|
||||
Button to log into an account. */
|
||||
"Login" = "Σύνδεση";
|
||||
|
||||
/* Alert for logging out the user.
|
||||
Button for logging out the user.
|
||||
Button to close the alert that informs that the current account has been deleted. */
|
||||
"Logout" = "Αποσύνδεση";
|
||||
|
||||
/* Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out. */
|
||||
"Make sure your nsec account key is saved before you logout or you will lose access to this account" = "Βεβαιωθείτε ότι έχετε αποθηκεύσει το ιδιωτικό κλειδί nsec του λογαριασμού σας πριν αποσυνδεθείτε, διαφορετικά θα χάσετε την πρόσβαση στο λογαριασμό σας";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Muun. */
|
||||
"Muun" = "Muun";
|
||||
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "Πιστοποιητικό NIP-05";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Όχι";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Δεν βρέθηκε λίστα αποκλεισμού, να δημιουργηθεί μια νέα; Αυτό θα αντικαταστήσει κάθε προηγούμενη λίστα αποκλεισμού.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "κανένα";
|
||||
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Κανένας";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "Το σχόλιο περιέχει \"nsec1\" ιδωτικό κλειδί. Είστε σίγουροι;";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Δεν βρέθηκε κάτι. Δοκιμάστε αργότερα!";
|
||||
|
||||
/* Navigation title for notifications. */
|
||||
"Notifications" = "Ειδοποιήσεις";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
"now" = "τώρα";
|
||||
|
||||
/* Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key. */
|
||||
"nsec1..." = "nsec1...";
|
||||
|
||||
/* Button for user to report that the account or content has nudity or explicit content. */
|
||||
"Nudity or explicit content" = "Γυμνό ή ακατάλληλο περιεχόμενο";
|
||||
|
||||
/* Label indicating that a form input is optional. */
|
||||
"optional" = "προαιρετικό";
|
||||
|
||||
/* Button to pay a Lightning invoice. */
|
||||
"Pay" = "Πληρωμή";
|
||||
|
||||
/* Navigation bar title for view to pay Lightning invoice. */
|
||||
"Pay the Lightning invoice" = "Πληρωμή Lightning ποσού";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Συνδρομή";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Δημοσίευση";
|
||||
|
||||
/* Text to indicate that what is being shown is a post from a user who has been blocked. */
|
||||
"Post from a user you've blocked" = "Δημοσίευση μπλοκαρισμένου χρήστη";
|
||||
|
||||
/* Label for filter for seeing only posts (instead of posts and replies). */
|
||||
"Posts" = "Δημοσιεύσεις";
|
||||
|
||||
/* Label for filter for seeing posts and replies (instead of only posts). */
|
||||
"Posts & Replies" = "Δημοσιεύσεις & Απαντήσεις";
|
||||
|
||||
/* Heading indicating that this application keeps personally identifiable information private. A sentence describing what is done to keep data private comes after this heading. */
|
||||
"Private" = "Προσωπικά δεδομένα";
|
||||
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Ιδιωτικό κλειδί";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Προφίλ";
|
||||
|
||||
/* Label for Profile Picture section of user profile form. */
|
||||
"Profile Picture" = "Εικόνα προφίλ";
|
||||
|
||||
/* Section title for the user's public account ID. */
|
||||
"Public Account ID" = "Δημόσιο ID λογαριασμού";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public key" = "Δημόσιο κλειδί";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public Key" = "Δημόσιο κλειδί";
|
||||
|
||||
/* Prompt to ask user if the key they entered is a public key. */
|
||||
"Public Key?" = "Δημόσιο κλειδί;";
|
||||
|
||||
/* Navigation bar title for Reactions view. */
|
||||
"Reactions" = "Αντιδράσεις";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Προτεινόμενοι διακομιστές Relays";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Απόρριψη";
|
||||
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Διακομιστής Relay";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
"Relays" = "Διακομιστές Relays";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "Οι διακομιστές Relays έχουν ειδοποιηθεί και οι εφαρμογές θα μπορούν να φιλτράρουν το περιεχόμενο. Ευχαριστούμε!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Αφαίρεση όλων";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Απάντηση";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Απάντηση στον εαυτό μου";
|
||||
|
||||
/* Label to indicate that the user is replying to 2 users. */
|
||||
"Replying to %@ & %@" = "Απάντηση σε %1$@ & %2$@";
|
||||
|
||||
/* Indicating that the user is replying to the following listed people. */
|
||||
"Replying to:" = "Απάντηση σε:";
|
||||
|
||||
/* Button to report a profile.
|
||||
Context menu option for reporting content. */
|
||||
"Report" = "Αναφορά";
|
||||
|
||||
/* Label indicating that the text underneath is the identifier of the report that was sent to relay servers. */
|
||||
"Report ID:" = "ID Αναφοράς:";
|
||||
|
||||
/* Message indicating that a report was successfully sent to relay servers. */
|
||||
"Report sent!" = "Η αναφορά εστάλει!";
|
||||
|
||||
/* Button to confirm reposting a post.
|
||||
Title of alert for confirming to repost a post. */
|
||||
"Repost" = "Αναδημοσίευση";
|
||||
|
||||
/* Text indicating that the post was reposted (i.e. re-shared). */
|
||||
"Reposted" = "Αναδημοσιεύθηκε";
|
||||
|
||||
/* Navigation bar title for Reposts view. */
|
||||
"Reposts" = "Αναδημοσιεύσεις";
|
||||
|
||||
/* Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. */
|
||||
"Requests" = "Αιτήματα";
|
||||
|
||||
/* Button to retry completing account creation after an error occurred. */
|
||||
"Retry" = "Δοκιμάστε ξανά";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, River */
|
||||
"River" = "River";
|
||||
|
||||
/* Example username of Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"satoshi" = "satoshi";
|
||||
|
||||
/* Name of Bitcoin creator(s). */
|
||||
"Satoshi Nakamoto" = "Satoshi Nakamoto";
|
||||
|
||||
/* Button for saving profile. */
|
||||
"Save" = "Αποθήκευση";
|
||||
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Αποθήκευση εικόνας";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Σκανάρισμα κωδικού";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Αναζήτηση ετικέτας: #%@";
|
||||
|
||||
/* Placeholder text to prompt entry of search query. */
|
||||
"Search..." = "Αναζήτηση...";
|
||||
|
||||
/* Section title for user's secret account login key. */
|
||||
"Secret Account Login Key" = "Μυστικό ιδιωτικό κλειδί λογαριασμού";
|
||||
|
||||
/* Title of section for selecting a Lightning wallet to pay a Lightning invoice. */
|
||||
"Select a Lightning wallet" = "Επιλέξτε ένα Lightning πορτοφόλι";
|
||||
|
||||
/* Prompt selection of user's default wallet */
|
||||
"Select default wallet" = "Προεπιλεγμένο πορτοφόλι";
|
||||
|
||||
/* Text prompt for user to send a message to the other user. */
|
||||
"Send a message to start the conversation..." = "Στείλτε ένα μήνυμα για να ξεκινήσετε την συνομιλία...";
|
||||
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Διακομιστής";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Υπηρεσία";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Ρυθμίσεις";
|
||||
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Κοινοποίηση";
|
||||
|
||||
/* Button to show a post from a user who has been blocked.
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Προβολή";
|
||||
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Προβολή κλειδιού API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
"Show wallet selector" = "Προβολή επιλογής πορτοφολιού";
|
||||
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Αποσύνδεση";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Λογισμικό";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "Υποστηριζόμενα NIPs";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Ευχαριστούμε!";
|
||||
|
||||
/* Button for user to report that the account is impersonating someone. */
|
||||
"They are impersonating someone" = "Προσποιείται κάποιον άλλο";
|
||||
|
||||
/* Warning that the inputted account key is a public key and the result of what happens because of it. */
|
||||
"This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective." = "Αυτό είναι ένα δημόσιο κλειδί, δεν θα έχετε την δυνατότητα να κάνετε δημοσιεύσεις ή να αλληλεπιδράσετε με κάποιο τρόπο. Αυτό το κλειδί είναι μόνο για προβολή / εύρεση λογαριασμών.";
|
||||
|
||||
/* Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. */
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Αυτό είναι ένα παλαιού τύπου κλειδί nostr. Δεν αναγνωρίζουμε αν είναι δημόσιο ή ιδιωτικό κλειδί. Παρακαλούμε πατήστε το παρακάτων κουμπί αν είναι ένα δημόσιο κλειδί.";
|
||||
|
||||
/* Label to describe that a public key is the user's account ID and what they can do with it. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "Αυτό είναι το ID του λογαριασμού σας, μπορείτε να το δώσετε στους φίλους σας ώστε να σας ακολουθήσουν. Κάντε κλικ για αντιγραφή.";
|
||||
|
||||
/* Label to describe that a private key is the user's secret account key and what they should do with it. */
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Αυτό είναι το κρυφό ιδιωτικό σας κλειδί. Το χρειάζεστε για να έχετε προσβαση στο λογαριασμό σας. Μη το δώσετε ποτέ σε κανέναν! Αποθηκεύστε το σε ένα ασφαλές μέρος!";
|
||||
|
||||
/* Navigation bar title for note thread.
|
||||
Navigation bar title for threaded event detail view. */
|
||||
"Thread" = "Νήμα";
|
||||
|
||||
/* Button to translate note from different language. */
|
||||
"Translate Note" = "Μεταφρασμένο σχόλιο";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (lang)" = "Μεταφράστηκε από (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Μεταφράζετε από (lang)...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Μεταφράσεις";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Πληκρολογίστε DELETE για διαγραφή";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Πληκρολογίστε την δημοσίευσή σας εδώ...";
|
||||
|
||||
/* Non-breaking space character to fill in blank space next to event action button icons. */
|
||||
"u{00A0}" = "u{00A0}";
|
||||
|
||||
/* Button to unfollow a user. */
|
||||
"Unfollow" = "Διακοπή";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of unfollowing a profile. */
|
||||
"Unfollowing" = "Παύση ακολούθησης";
|
||||
|
||||
/* Label to indicate that the user is in the process of unfollowing another user. */
|
||||
"Unfollowing..." = "Παύση ακολούθησης...";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that will unfollow a profile when tapped. */
|
||||
"Unfollows" = "Διακοπή ακολούθησης";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
"URL" = "URL";
|
||||
|
||||
/* Alert message to indicate the user has been blocked */
|
||||
"User blocked" = "Ο χρήστης αποκλείστηκε";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"User has been blocked" = "Ο χρήστης έχει αποκλειστεί";
|
||||
|
||||
/* Label for Username section of user profile form.
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Όνομα χρήστη";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Έκδοση";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Πορτοφόλι";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Wallet of Satoshi. */
|
||||
"Wallet of Satoshi" = "Wallet of Satoshi";
|
||||
|
||||
/* Section title for selection of wallet. */
|
||||
"Wallet Selector" = "Επιλογή πορτοφολιού";
|
||||
|
||||
/* Label for Website section of user profile form. */
|
||||
"Website" = "Ιστοσελίδα";
|
||||
|
||||
/* Welcoming message to the reader. The variable is 'you', the reader. */
|
||||
"Welcome to the social network %@ control." = "Καλώς ήρθες στο κοινωνικό δίκτυο %@ που ελέγχεις.";
|
||||
|
||||
/* Text to welcome user. */
|
||||
"Welcome, %@!" = "Καλώς ήρθες, %@!";
|
||||
|
||||
/* Header text to prompt user what issue they want to report. */
|
||||
"What do you want to report?" = "Τι θα ήθελες να αναφέρεις;";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://some.relay.com";
|
||||
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Ναι, αντικατάσταση";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Ναί, δημοσίευση περιλαμβανομένου του ιδιωτικού κλειδιού";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "εσείς";
|
||||
|
||||
/* Label for Your Name section of user profile form. */
|
||||
"Your Name" = "Το όνομά σας";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Η αναφορά σας θα αποσταλεί στους διακομιστές relays που είστε συνδεδεμένοι";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zeus LN. */
|
||||
"Zeus LN" = "Zeus LN";
|
||||
|
||||
154
damus/el-GR.lproj/Localizable.stringsdict
Normal file
154
damus/el-GR.lproj/Localizable.stringsdict
Normal file
@@ -0,0 +1,154 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>collapsed_event_view_other_notes</key>
|
||||
<dict>
|
||||
<key>NOTES</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>%d άλλη σημείωση</string>
|
||||
<key>other</key>
|
||||
<string>%d άλλες σημειώσεις</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>··· %#@NOTES@ ···</string>
|
||||
</dict>
|
||||
<key>followers_count</key>
|
||||
<dict>
|
||||
<key>FOLLOWERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Ακόλουθος</string>
|
||||
<key>other</key>
|
||||
<string>Ακόλουθοι</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@FOLLOWERS@</string>
|
||||
</dict>
|
||||
<key>reactions_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REACTIONS@</string>
|
||||
<key>REACTIONS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Αντίδραση</string>
|
||||
<key>other</key>
|
||||
<string>Αντιδράσεις</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>relays_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@RELAYS@</string>
|
||||
<key>RELAYS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Διακομιστής Relay</string>
|
||||
<key>other</key>
|
||||
<string>Διακομιστές Relays</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_one_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Απάντηση προς %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string> & %d άλλον</string>
|
||||
<key>other</key>
|
||||
<string> & %d άλλους</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_two_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Απάντηση προς %@, %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string> & %d άλλον</string>
|
||||
<key>other</key>
|
||||
<string> & %d άλλους</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>reposts_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REPOSTS@</string>
|
||||
<key>REPOSTS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Αναδημοσίευση</string>
|
||||
<key>other</key>
|
||||
<string>Αναδημοσιεύσεις</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>sats_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%1$#@SATS@</string>
|
||||
<key>SATS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>@</string>
|
||||
<key>one</key>
|
||||
<string>%2$@ sat</string>
|
||||
<key>other</key>
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -134,20 +134,20 @@
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Tip</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Autenticación local para acceder a la clave privada";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Si le concedes acceso a Damus a tus fotos, podrás guardar imágenes.";
|
||||
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -36,8 +35,8 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Deja propinas en las publicaciones de tus amigos y acumula sats con Bitcoin⚡️, la moneda nativa de internet.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Información";
|
||||
|
||||
@@ -74,12 +76,18 @@ Number of profiles a user is following. */
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Agregar relé";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Administrador";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Cualquiera";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Clave de API (opcional)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "Clave de API (obligatorio)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "¿Seguro quieres volver a publicar esto?";
|
||||
|
||||
@@ -118,6 +126,9 @@ Number of profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Boosts";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
@@ -145,6 +156,9 @@ Number of profiles a user is following. */
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Borrar caché";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Contacto";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Copiada";
|
||||
|
||||
@@ -203,6 +217,9 @@ Number of profiles a user is following. */
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (Propietario, Mayor precisión)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Billetera predeterminada";
|
||||
|
||||
@@ -212,6 +229,16 @@ Number of profiles a user is following. */
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Borrar";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Eliminar cuenta";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Cuenta eliminada";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Descripción";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Descartar";
|
||||
|
||||
@@ -249,6 +276,12 @@ Number of profiles a user is following. */
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Seguir";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Seguir";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Sigueme en nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Seguidores";
|
||||
|
||||
@@ -262,6 +295,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Sigue";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Te sigue";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Gratuito";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "Obtener clave de API";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Global";
|
||||
|
||||
@@ -274,7 +316,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Ocultar";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Ocultar clave de API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -304,8 +347,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "¡Vamos!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "Traducciones de LibreTranslate";
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (Código abierto)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Dirección de Lightning o LNURL";
|
||||
@@ -313,9 +356,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Factura de Lightning";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "Me gusta";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Autenticación local para acceder a la clave privada";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "Predeterminada del sistema";
|
||||
|
||||
@@ -337,19 +386,25 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "Verificación NIP-05";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "No";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "No se encontró una lista de bloqueo. ¿Crear una nueva? Esto sobrescribirá las listas de bloqueo anteriores.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "ninguno";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Ninguno";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "La nota incluye una clave privada \"nsec1\". ¿Estas seguro?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Nada para ver aquí. ¡Vuelve a consultar luego!";
|
||||
|
||||
/* Navigation title for notifications. */
|
||||
/* Toolbar label for Notifications view. */
|
||||
"Notifications" = "Notificaciones";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
@@ -373,6 +428,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Plan";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Publicar";
|
||||
|
||||
@@ -391,6 +449,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Clave privada";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Perfil";
|
||||
|
||||
@@ -418,11 +479,11 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Rechazar";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relé";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
/* Sidebar menu label for Relays view. */
|
||||
"Relays" = "Relés";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
@@ -431,6 +492,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Eliminar todo";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Responder";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Respuesta a sí mismo";
|
||||
|
||||
@@ -481,6 +545,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Guardar imagen";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Escanea el código";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Buscar hashtag: #%@";
|
||||
|
||||
@@ -502,11 +569,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Servidor";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Servicio";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Configuración";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Compartir";
|
||||
|
||||
@@ -514,7 +585,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Mostrar";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Mostrar clave de API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -523,9 +595,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Cerrar sesión";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Software";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "NIPs soportados";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "¡Gracias!";
|
||||
|
||||
@@ -552,7 +630,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Traducir nota";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Traducida del (languageName!)";
|
||||
"Translated from (lang)" = "Traducida del (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Traduciendo del (lang)...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Traducciones";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Escriba \"DELETE\" para eliminar";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Escribe tu publicación aquí...";
|
||||
@@ -585,6 +672,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Nombre de usuario";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Versión";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Billetera";
|
||||
|
||||
@@ -612,6 +702,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Sí, sobrescribir";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Sí, publicar con clave privada";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "tú";
|
||||
|
||||
@@ -621,6 +714,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "El reporte se enviará a los relés con los que tengas conexión";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
|
||||
@@ -134,20 +134,20 @@
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Propina</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Propinas</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Donner accès à Damus à vos photos vous permet d'enregistrer des images";
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Authentification pour accès à la clé privée";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Accorder à Damus l'accès à vos photos vous permet d'enregistrer des images.";
|
||||
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -31,13 +30,13 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "%@. La création d'un compte ne nécessite pas de numéro de téléphone, d'e-mail ou de nom. Commencez tout de suite sans aucune friction.";
|
||||
|
||||
/* Explanation of what is done to keep private data encrypted. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Messagerie privée cryptée de bout en bout. Gardez Big Tech hors de vos DMs";
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Messagerie privée cryptée de bout en bout. Gardez les Big Tech hors de vos DMs";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Donnez un pourboire aux publications de vos amis et empilez les sats avec Bitcoin⚡️, la monnaie native d'Internet.";
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Donnez un pourboire aux publications de vos amis et accumulez les sats avec Bitcoin⚡️, la monnaie native d'Internet.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,20 +45,23 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "À propos de";
|
||||
|
||||
/* Label for About Me section of user profile form. */
|
||||
"About Me" = "À Propos de Moi";
|
||||
"About Me" = "À propos de moi";
|
||||
|
||||
/* Placeholder text for About Me description. */
|
||||
"Absolute Boss" = "Patron Absolu";
|
||||
"Absolute Boss" = "Patron absolu";
|
||||
|
||||
/* Button to accept the end user license agreement before being allowed into the app. */
|
||||
"Accept" = "Accepter";
|
||||
|
||||
/* Label to indicate the public ID of the account. */
|
||||
"Account ID" = "Identifiant de Compte";
|
||||
"Account ID" = "Identifiant de compte";
|
||||
|
||||
/* Title for confirmation dialog to either share, report, or block a profile. */
|
||||
"Actions" = "Actions";
|
||||
@@ -72,19 +74,25 @@ Number of profiles a user is following. */
|
||||
"Add all" = "Tout ajouter";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Ajouter un Relais";
|
||||
"Add Relay" = "Ajouter un relais";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Admin";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Montant au choix";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Clé d'API (optionnelle)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "Clé d'API (requise)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Êtes-vous sûr de vouloir republier ceci ?";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "Image Bannière";
|
||||
"Banner Image" = "Image de la bannière";
|
||||
|
||||
/* Reminder to user that they should save their account information. */
|
||||
"Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus." = "Avant de commencer, vous devrez enregistrer les informations de votre compte, sinon vous ne pourrez plus vous connecter à l'avenir si vous désinstallez Damus.";
|
||||
@@ -118,6 +126,9 @@ Number of profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Promouvoir";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
@@ -143,7 +154,10 @@ Number of profiles a user is following. */
|
||||
"Clear" = "Vider";
|
||||
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Vider le Cache";
|
||||
"Clear Cache" = "Vider le cache";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Contact";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Copié";
|
||||
@@ -152,32 +166,32 @@ Number of profiles a user is following. */
|
||||
"Copy" = "Copier";
|
||||
|
||||
/* Context menu option for copying the ID of the account that created the note. */
|
||||
"Copy Account ID" = "Copier l'Identifiant de Compte";
|
||||
"Copy Account ID" = "Copier l'identifiant de compte";
|
||||
|
||||
/* Context menu option to copy an image into clipboard.
|
||||
Context menu option to copy an image to clipboard. */
|
||||
"Copy Image" = "Copier l'Image";
|
||||
"Copy Image" = "Copier l'image";
|
||||
|
||||
/* Context menu option to copy the URL of an image into clipboard. */
|
||||
"Copy Image URL" = "Copier l'URL de l'Image";
|
||||
"Copy Image URL" = "Copier l'URL de l'image";
|
||||
|
||||
/* Title of section for copying a Lightning invoice identifier. */
|
||||
"Copy invoice" = "Copier la Facture";
|
||||
"Copy invoice" = "Copier la facture";
|
||||
|
||||
/* Context menu option for copying a user's Lightning URL. */
|
||||
"Copy LNURL" = "Copier le LNURL";
|
||||
|
||||
/* Context menu option for copying the ID of the note. */
|
||||
"Copy Note ID" = "Copier l'Identifiant de la Note";
|
||||
"Copy Note ID" = "Copier l'identifiant de la note";
|
||||
|
||||
/* Context menu option for copying the JSON text from the note. */
|
||||
"Copy Note JSON" = "Copier le JSON de la Note";
|
||||
"Copy Note JSON" = "Copier le JSON de la note";
|
||||
|
||||
/* Button to copy report ID. */
|
||||
"Copy Report ID" = "Copier l'ID du signalement";
|
||||
|
||||
/* Context menu option for copying the text from an note. */
|
||||
"Copy Text" = "Copier le Texte";
|
||||
"Copy Text" = "Copier le texte";
|
||||
|
||||
/* Context menu option for copying the ID of the user who created the note. */
|
||||
"Copy User Pubkey" = "Copier la clé publique";
|
||||
@@ -189,7 +203,7 @@ Number of profiles a user is following. */
|
||||
"Create" = "Créer";
|
||||
|
||||
/* Button to create an account. */
|
||||
"Create Account" = "Créer un Compte";
|
||||
"Create Account" = "Créer un compte";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "Créer une nouvelle liste muette";
|
||||
@@ -203,6 +217,9 @@ Number of profiles a user is following. */
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (Propriétaire, haute précision)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Portefeuille par défaut";
|
||||
|
||||
@@ -212,21 +229,31 @@ Number of profiles a user is following. */
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Effacer";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Supprimer votre compte";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Compte supprimé";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Description";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Rejeter";
|
||||
|
||||
/* Label to prompt display name entry. */
|
||||
"Display Name" = "Afficher Nom";
|
||||
"Display Name" = "Afficher le nom";
|
||||
|
||||
/* Navigation title for DMs view, where DM is the English abbreviation for Direct Message.
|
||||
Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. */
|
||||
"DMs" = "Messages privés";
|
||||
|
||||
/* Button to dismiss wallet selection view for paying Lightning invoice. */
|
||||
"Done" = "Fini";
|
||||
"Done" = "Terminé";
|
||||
|
||||
/* Heading indicating that this application allows users to earn money. */
|
||||
"Earn Money" = "Gagnes de l'argent";
|
||||
"Earn Money" = "Gagne de l'argent";
|
||||
|
||||
/* Button to edit user's profile. */
|
||||
"Edit" = "Modifier";
|
||||
@@ -249,6 +276,12 @@ Number of profiles a user is following. */
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "S'abonner";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Suivre en retour";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Me suivre sur nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Abonnés";
|
||||
|
||||
@@ -260,7 +293,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Following..." = "Abonnements...";
|
||||
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Suit";
|
||||
"Follows" = "S'abonner";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Vous suit";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Gratuit";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "Obtenir une clé d'API";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Global";
|
||||
@@ -274,7 +316,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Cacher";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Cacher la clé d'API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -287,7 +330,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"https://jb55.com" = "https://jb55.com";
|
||||
|
||||
/* Button for user to report that the account or content has illegal content. */
|
||||
"Illegal content" = "Contenu Illégal";
|
||||
"Illegal content" = "Contenu illégal";
|
||||
|
||||
/* Error message indicating that an invalid account key was entered for login. */
|
||||
"Invalid key" = "Clé non valide";
|
||||
@@ -304,8 +347,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Allons-y!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "Traductions LibreTranslate";
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (Logiciel Libre)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Adresse Lightning ou LNURL";
|
||||
@@ -313,9 +356,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Facture Lightning";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "J'aime";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Authentification locale pour l'accès à la clé privée";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "Valeur locale par défaut";
|
||||
|
||||
@@ -337,15 +386,21 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "Vérification NIP-05";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Non";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Aucune liste de blocage trouvée, voulez-vous en créer une nouvelle? Cela va écraser votre liste de blocage existante.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "aucun";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Aucun";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "La note contient une clé privée \"nsec1\". Êtes-vous certain?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Rien à voir ici. Revenez plus tard!";
|
||||
|
||||
@@ -373,6 +428,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Plan";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Publication";
|
||||
|
||||
@@ -391,6 +449,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Clé Privée";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Profil";
|
||||
|
||||
@@ -401,24 +462,25 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Public Account ID" = "Identifiant publique de compte";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public key" = "Clé Publique";
|
||||
"Public key" = "Clé publique";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public Key" = "Clé Publique";
|
||||
"Public Key" = "Clé publique";
|
||||
|
||||
/* Prompt to ask user if the key they entered is a public key. */
|
||||
"Public Key?" = "Clé Publique?";
|
||||
"Public Key?" = "Clé publique?";
|
||||
|
||||
/* Navigation bar title for Reactions view. */
|
||||
"Reactions" = "Réactions";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Relais Recommandés";
|
||||
"Recommended Relays" = "Relais recommandés";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Refuser";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relais";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
@@ -431,6 +493,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Tout supprimer";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Répondre";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Réponse à soi-même";
|
||||
|
||||
@@ -479,7 +544,10 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Save" = "Enregistrer";
|
||||
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Enregistrer Image";
|
||||
"Save Image" = "Enregistrer l'image";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Scanner le code";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Rechercher hashtag: #%@";
|
||||
@@ -502,11 +570,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Serveur";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Service";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Paramètres";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Partager";
|
||||
|
||||
@@ -514,7 +586,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Afficher";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Montrer la clé d'API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -523,9 +596,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Se déconnecter";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Logiciel";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "NIPs supportés";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Merci!";
|
||||
|
||||
@@ -542,7 +621,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "Ceci est votre identifiant de compte, vous pouvez le donner à vos amis afin qu'ils puissent vous suivre. Cliquez pour copier.";
|
||||
|
||||
/* Label to describe that a private key is the user's secret account key and what they should do with it. */
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Il s'agit de votre clé de compte secrète. Vous en aurez besoin pour accéder à votre compte. Ne le partagez avec personne ! Enregistrez-le dans un gestionnaire de mots de passe et gardez-le en sécurité!";
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Il s'agit de votre clé de compte secrète. Vous en aurez besoin pour accéder à votre compte. Ne le partagez avec personne ! Enregistrez-la dans un gestionnaire de mots de passe et gardez-la en sécurité!";
|
||||
|
||||
/* Navigation bar title for note thread.
|
||||
Navigation bar title for threaded event detail view. */
|
||||
@@ -552,7 +631,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Traduire la note";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Traduit de (languageName!)";
|
||||
"Translated from (lang)" = "Traduit de (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Traduction de (lang)...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Traductions";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Appuyez sur SUPPRIMER pour supprimer";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Tapez votre message ici...";
|
||||
@@ -564,13 +652,13 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Unfollow" = "Se désabonner";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of unfollowing a profile. */
|
||||
"Unfollowing" = "Ne plus suivre";
|
||||
"Unfollowing" = "Désabonnement";
|
||||
|
||||
/* Label to indicate that the user is in the process of unfollowing another user. */
|
||||
"Unfollowing..." = "Ne plus suivre...";
|
||||
"Unfollowing..." = "Désabonnement...";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that will unfollow a profile when tapped. */
|
||||
"Unfollows" = "Se désabonne de";
|
||||
"Unfollows" = "Se désabonner";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
"URL" = "URL";
|
||||
@@ -585,6 +673,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Nom d'utilisateur";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Version";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Portefeuille";
|
||||
|
||||
@@ -595,10 +686,10 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Wallet Selector" = "Sélecteur de portefeuille";
|
||||
|
||||
/* Label for Website section of user profile form. */
|
||||
"Website" = "Site Internet";
|
||||
"Website" = "Site internet";
|
||||
|
||||
/* Welcoming message to the reader. The variable is 'you', the reader. */
|
||||
"Welcome to the social network %@ control." = "Bienvenue sur le réseau social %@ contrôle.";
|
||||
"Welcome to the social network %@ control." = "Bienvenue dans le réseau social sur lequel %@ avez le contrôle.";
|
||||
|
||||
/* Text to welcome user. */
|
||||
"Welcome, %@!" = "Bienvenue, %@!";
|
||||
@@ -612,15 +703,21 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Oui, écraser";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Oui, publier avec clé privée";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "vous";
|
||||
|
||||
/* Label for Your Name section of user profile form. */
|
||||
"Your Name" = "Votre Nom";
|
||||
"Your Name" = "Votre nom";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Votre signalement sera envoyé aux relais auxquels vous êtes connectés";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
|
||||
@@ -134,20 +134,20 @@
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Pourboire</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Pourboires</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -36,8 +35,8 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Paga i tuoi amici e accumula sats con Bitcoin⚡️, la moneta di internet.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Informazioni";
|
||||
|
||||
@@ -72,12 +74,12 @@ Number of profiles a user is following. */
|
||||
"Add all" = "Aggiungi tutto";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Aggiungi relè";
|
||||
"Add Relay" = "Aggiungi Relay";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Qualsiasi";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "API Key (facoltativo)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
@@ -107,7 +109,7 @@ Number of profiles a user is following. */
|
||||
"Block %@?" = "Vuoi bloccare %@?";
|
||||
|
||||
/* Title of alert for blocking a user. */
|
||||
"Block User" = "Bloccare Utente";
|
||||
"Block User" = "Blocca Utente";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Blocked" = "Bloccato";
|
||||
@@ -274,7 +276,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Nascondi";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Nascondi la chiave dell' API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -304,9 +307,6 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Andiamo!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "Traduzioni LibreTranslate";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Indirizzo Lightning o LNURL";
|
||||
|
||||
@@ -338,12 +338,12 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"NIP-05 Verification" = "Verifica NIP-05";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Nessuna lista degli utenti bloccati trovata, vuoi creane una nuova?Creandone una nuova, sovrascriverai eventuali liste di utenti bloccati in precedenza";
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Nessuna lista degli utenti bloccati trovata, vuoi creane una nuova? Creandone una nuova, sovrascriverai eventuali liste di utenti bloccati in precedenza";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "Nessun risultato";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Nessuno";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
@@ -413,20 +413,21 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Reactions" = "Reazioni";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Relè consigliati";
|
||||
"Recommended Relays" = "Relays consigliati";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Rifiuta";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relè";
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relay";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
"Relays" = "Relè";
|
||||
"Relays" = "Relays";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "I relè sono stati notificati e i clients potranno sfruttare questa informazione per filtrare i contenuti. Grazie!";
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "I relays sono stati notificati e i clients potranno sfruttare questa informazione per filtrare i contenuti. Grazie!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Rimuovi tutto";
|
||||
@@ -506,7 +507,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Impostazioni";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Condividi";
|
||||
|
||||
@@ -514,7 +516,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Mostra";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Mostra la chiave dell'API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -552,7 +555,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Nota sulla traduzione";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Tradotto da (languageName!)";
|
||||
"Translated from (lang)" = "Tradotto da (lang)";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Scrivi il tuo post qui...";
|
||||
@@ -604,7 +607,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Welcome, %@!" = "Benvenuto, %@!";
|
||||
|
||||
/* Header text to prompt user what issue they want to report. */
|
||||
"What do you want to report?" = "Che cosa vuoi reportare?";
|
||||
"What do you want to report?" = "Che cosa vuoi segnalare?";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://qualche.relay.com";
|
||||
|
||||
@@ -134,20 +134,20 @@
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Mancia</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Mance</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
12
damus/ja.lproj/InfoPlist.strings
Normal file
12
damus/ja.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,12 @@
|
||||
/* Bundle display name */
|
||||
"CFBundleDisplayName" = "Damus";
|
||||
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "秘密鍵にアクセスするためのローカル認証";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Damusが画像を保存するためにあなたの写真にアクセスすることを許可する";
|
||||
|
||||
725
damus/ja.lproj/Localizable.strings
Normal file
725
damus/ja.lproj/Localizable.strings
Normal file
@@ -0,0 +1,725 @@
|
||||
/* Blank space to separate profile picture from profile editor form. */
|
||||
" " = "61b6edf1108e6f396680a33b02486a70_tr";
|
||||
|
||||
/* Description of how the nip05 identifier would be used for verification. */
|
||||
"'%@' at '%@' will be used for verification" = "'%@' at '%@' は認証に使用されています";
|
||||
|
||||
/* Description of why the nip05 identifier is invalid. */
|
||||
"'%@' is an invalid NIP-05 identifier. It should look like an email." = "'%@' は無効なNIP-05識別子です。emailのような見た目であるべきです。";
|
||||
|
||||
/* Navigation bar title for view that shows who is following a user. */
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profile.displayName(profile: profile, pubkey: whos))のフォロワー";
|
||||
|
||||
/* Navigation bar title for view that shows who a user is following. */
|
||||
"(who) following" = "(who) がフォロー中";
|
||||
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"%@ has been blocked" = "%@ はブロックされています";
|
||||
|
||||
/* Explanation of what is done to keep personally identifiable information private. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "%@. アカウントの作成には、電話番号もメールアドレスも名前も必要ありません。すぐに始められます。";
|
||||
|
||||
/* Explanation of what is done to keep private data encrypted. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. End-to-Endで暗号化されたプライベートなメッセージ。 あなたのDMに巨大IT企業を近づけません。";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. 友達の投稿にチップを送ろう。インターネットのネイティブ通貨:ビットコイン⚡️で。";
|
||||
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
"%lld/%lld" = "%lld/%lld";
|
||||
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "自己紹介";
|
||||
|
||||
/* Label for About Me section of user profile form. */
|
||||
"About Me" = "自己紹介";
|
||||
|
||||
/* Placeholder text for About Me description. */
|
||||
"Absolute Boss" = "絶対的なボス";
|
||||
|
||||
/* Button to accept the end user license agreement before being allowed into the app. */
|
||||
"Accept" = "許可";
|
||||
|
||||
/* Label to indicate the public ID of the account. */
|
||||
"Account ID" = "アカウントID";
|
||||
|
||||
/* Title for confirmation dialog to either share, report, or block a profile. */
|
||||
"Actions" = "アクション";
|
||||
|
||||
/* Button to add recommended relay server.
|
||||
Button to confirm adding user inputted relay. */
|
||||
"Add" = "追加";
|
||||
|
||||
/* Button label to re-add all original participants as profiles to reply to in a note */
|
||||
"Add all" = "全て追加";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Relayを追加";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "管理者";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Any";
|
||||
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "APIキー (任意)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "APIキー (必須)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "本当にリポストしますか?";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "バナー画像";
|
||||
|
||||
/* Reminder to user that they should save their account information. */
|
||||
"Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus." = "始める前に、あなたのアカウント情報を保存しておく必要があります。もし保存しなかった場合、Damusをアンインストールすると今後ログインできなくなります。";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Bitcoin Beach. */
|
||||
"Bitcoin Beach" = "Bitcoin Beach";
|
||||
|
||||
/* Label for Bitcoin Lightning Tips section of user profile form. */
|
||||
"Bitcoin Lightning Tips" = "Bitcoin Lightning チップ";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blixt Wallet */
|
||||
"Blixt Wallet" = "Blixt Wallet";
|
||||
|
||||
/* Alert button to block a user.
|
||||
Button to block a profile.
|
||||
Context menu option for blocking users. */
|
||||
"Block" = "ブロック";
|
||||
|
||||
/* Alert message prompt to ask if a user should be blocked. */
|
||||
"Block %@?" = "%@をブロックしますか?";
|
||||
|
||||
/* Title of alert for blocking a user. */
|
||||
"Block User" = "ユーザーをブロック";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Blocked" = "ブロック中";
|
||||
|
||||
/* Navigation title of view to see list of blocked users. */
|
||||
"Blocked Users" = "ブロックしたユーザー";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "ブースト";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
/* Context menu option for broadcasting the user's note to all of the user's connected relay servers. */
|
||||
"Broadcast" = "ブロードキャスト";
|
||||
|
||||
/* Alert button to cancel out of alert for blocking a user.
|
||||
Button to cancel out of alert that creates a new mutelist.
|
||||
Button to cancel out of posting a note.
|
||||
Button to cancel out of reposting a post.
|
||||
Button to cancel out of view adding user inputted relay.
|
||||
Cancel deleting the user.
|
||||
Cancel out of logging out the user. */
|
||||
"Cancel" = "キャンセル";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Cash App. */
|
||||
"Cash App" = "Cash App";
|
||||
|
||||
/* Navigation bar title for Chatroom view. */
|
||||
"Chat" = "チャット";
|
||||
|
||||
/* Button for clearing cached data. */
|
||||
"Clear" = "削除";
|
||||
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "キャッシュを削除";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "連絡先";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "コピー完了";
|
||||
|
||||
/* Button to copy a relay server address. */
|
||||
"Copy" = "コピー";
|
||||
|
||||
/* Context menu option for copying the ID of the account that created the note. */
|
||||
"Copy Account ID" = "アカウントIDをコピー";
|
||||
|
||||
/* Context menu option to copy an image into clipboard.
|
||||
Context menu option to copy an image to clipboard. */
|
||||
"Copy Image" = "画像をコピー";
|
||||
|
||||
/* Context menu option to copy the URL of an image into clipboard. */
|
||||
"Copy Image URL" = "画像URLをコピー";
|
||||
|
||||
/* Title of section for copying a Lightning invoice identifier. */
|
||||
"Copy invoice" = "インボイスをコピー";
|
||||
|
||||
/* Context menu option for copying a user's Lightning URL. */
|
||||
"Copy LNURL" = "LNURLをコピー";
|
||||
|
||||
/* Context menu option for copying the ID of the note. */
|
||||
"Copy Note ID" = "Note IDをコピー";
|
||||
|
||||
/* Context menu option for copying the JSON text from the note. */
|
||||
"Copy Note JSON" = "Note JSONをコピー";
|
||||
|
||||
/* Button to copy report ID. */
|
||||
"Copy Report ID" = "通報IDをコピー";
|
||||
|
||||
/* Context menu option for copying the text from an note. */
|
||||
"Copy Text" = "テキストをコピー";
|
||||
|
||||
/* Context menu option for copying the ID of the user who created the note. */
|
||||
"Copy User Pubkey" = "ユーザーの公開鍵をコピー";
|
||||
|
||||
/* Alert message to indicate that the blocked user could not be found. */
|
||||
"Could not find user to block..." = "ブロック対象のユーザーが見つかりませんでした...";
|
||||
|
||||
/* Button to create account. */
|
||||
"Create" = "作成";
|
||||
|
||||
/* Button to create an account. */
|
||||
"Create Account" = "アカウントを作成";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "新しいミュートリストを作成する";
|
||||
|
||||
/* Example description about Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"Creator(s) of Bitcoin. Absolute legend." = "ビットコインの発明者(達)。紛れもないレジェンド。";
|
||||
|
||||
/* Dropdown option for selecting a custom translation server. */
|
||||
"Custom" = "カスタム";
|
||||
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (プロプライエタリ, より高精度)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "デフォルトウォレット";
|
||||
|
||||
/* Button for deleting the users account.
|
||||
Button to delete a relay server that the user connects to.
|
||||
Button to remove a user from their blocklist.
|
||||
Section title for deleting the user */
|
||||
"Delete" = "削除";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "アカウントを削除";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "削除されたアカウント";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "詳細";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "却下";
|
||||
|
||||
/* Label to prompt display name entry. */
|
||||
"Display Name" = "表示名";
|
||||
|
||||
/* Navigation title for DMs view, where DM is the English abbreviation for Direct Message.
|
||||
Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. */
|
||||
"DMs" = "メッセージ";
|
||||
|
||||
/* Button to dismiss wallet selection view for paying Lightning invoice. */
|
||||
"Done" = "完了";
|
||||
|
||||
/* Heading indicating that this application allows users to earn money. */
|
||||
"Earn Money" = "Earn Money";
|
||||
|
||||
/* Button to edit user's profile. */
|
||||
"Edit" = "編集";
|
||||
|
||||
/* Text indicating that the view is used for editing which participants are replied to in a note. */
|
||||
"Edit participants" = "参加者を編集";
|
||||
|
||||
/* Heading indicating that this application keeps private messaging end-to-end encrypted. */
|
||||
"Encrypted" = "暗号化されています";
|
||||
|
||||
/* Prompt for user to enter an account key to login. */
|
||||
"Enter your account key to login:" = "ログイン用のアカウントキーを入力してください:";
|
||||
|
||||
/* Error message indicating why saving keys failed. */
|
||||
"Error: %@" = "エラー: %@";
|
||||
|
||||
/* Label indicating that the below text is the EULA, an acronym for End User License Agreement. */
|
||||
"EULA" = "EULA";
|
||||
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "フォローする";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "フォローバックする";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "nostrでフォローしてね";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "フォロワー";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.
|
||||
Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Following" = "フォロー中";
|
||||
|
||||
/* Label to indicate that the user is in the process of following another user. */
|
||||
"Following..." = "フォローしています...";
|
||||
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "フォロー";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "フォローされています";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Free";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "APIキーを取得";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "グローバル";
|
||||
|
||||
/* Navigation link to go to post referenced by hex code. */
|
||||
"Goto post %@" = "投稿へ %@";
|
||||
|
||||
/* Navigation link to go to profile. */
|
||||
"Goto profile %@" = "プロフィールへ %@";
|
||||
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "非表示";
|
||||
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "APIキーを非表示にする";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
"Home" = "ホーム";
|
||||
|
||||
/* Placeholder example text for profile picture URL. */
|
||||
"https://example.com/pic.jpg" = "https://example.com/pic.jpg";
|
||||
|
||||
/* Placeholder example text for website URL for user profile. */
|
||||
"https://jb55.com" = "https://jb55.com";
|
||||
|
||||
/* Button for user to report that the account or content has illegal content. */
|
||||
"Illegal content" = "違法なコンテンツ";
|
||||
|
||||
/* Error message indicating that an invalid account key was entered for login. */
|
||||
"Invalid key" = "無効なキー";
|
||||
|
||||
/* Button for user to report that the account or content has spam. */
|
||||
"It's spam" = "これはスパムです";
|
||||
|
||||
/* Placeholder example text for identifier used for NIP-05 verification. */
|
||||
"jb55@jb55.com" = "jb55@jb55.com";
|
||||
|
||||
/* Moves the post button to the left side of the screen */
|
||||
"Left Handed" = "左利きモード";
|
||||
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Let's go!";
|
||||
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (オープンソース)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Lightning Address または LNURL";
|
||||
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Lightning Invoice";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "いいね";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "秘密鍵にアクセスするためのローカル認証";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "ローカルのデフォルト";
|
||||
|
||||
/* Button to log into account.
|
||||
Button to log into an account. */
|
||||
"Login" = "ログイン";
|
||||
|
||||
/* Alert for logging out the user.
|
||||
Button for logging out the user.
|
||||
Button to close the alert that informs that the current account has been deleted. */
|
||||
"Logout" = "ログアウト";
|
||||
|
||||
/* Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out. */
|
||||
"Make sure your nsec account key is saved before you logout or you will lose access to this account" = "ログアウト前にあなたのnsec秘密鍵を保存していることを確認してください。保存していない場合、アカウントへのアクセスを失うことになります。";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Muun. */
|
||||
"Muun" = "Muun";
|
||||
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "NIP-05検証";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "中断する";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "ブロックリストが見つかりませんでした。新しく作成しますか?これは以前のブロックリストを上書きします。";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "該当なし";
|
||||
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "利用しない";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "投稿に \"nsec1\" 秘密鍵が含まれています。本当に続けますか?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "まだ何もないようです。また後で見に来てね!";
|
||||
|
||||
/* Toolbar label for Notifications view. */
|
||||
"Notifications" = "通知";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
"now" = "たった今";
|
||||
|
||||
/* Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key. */
|
||||
"nsec1..." = "nsec1...";
|
||||
|
||||
/* Button for user to report that the account or content has nudity or explicit content. */
|
||||
"Nudity or explicit content" = "ヌードまたは露骨なコンテンツ";
|
||||
|
||||
/* Label indicating that a form input is optional. */
|
||||
"optional" = "任意";
|
||||
|
||||
/* Button to pay a Lightning invoice. */
|
||||
"Pay" = "支払う";
|
||||
|
||||
/* Navigation bar title for view to pay Lightning invoice. */
|
||||
"Pay the Lightning invoice" = "Lightning invoiceを支払う";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "プラン";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "投稿する";
|
||||
|
||||
/* Text to indicate that what is being shown is a post from a user who has been blocked. */
|
||||
"Post from a user you've blocked" = "あなたがブロックしたユーザーの投稿";
|
||||
|
||||
/* Label for filter for seeing only posts (instead of posts and replies). */
|
||||
"Posts" = "投稿";
|
||||
|
||||
/* Label for filter for seeing posts and replies (instead of only posts). */
|
||||
"Posts & Replies" = "投稿とリプライ";
|
||||
|
||||
/* Heading indicating that this application keeps personally identifiable information private. A sentence describing what is done to keep data private comes after this heading. */
|
||||
"Private" = "プライベート";
|
||||
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "秘密鍵";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "プロフィール";
|
||||
|
||||
/* Label for Profile Picture section of user profile form. */
|
||||
"Profile Picture" = "プロフィール画像";
|
||||
|
||||
/* Section title for the user's public account ID. */
|
||||
"Public Account ID" = "パブリックアカウントID";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public key" = "公開鍵";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public Key" = "公開鍵";
|
||||
|
||||
/* Prompt to ask user if the key they entered is a public key. */
|
||||
"Public Key?" = "公開鍵ですか?";
|
||||
|
||||
/* Navigation bar title for Reactions view. */
|
||||
"Reactions" = "リアクション";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "推奨のリレーサーバー";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "却下";
|
||||
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "リレー";
|
||||
|
||||
/* Sidebar menu label for Relays view. */
|
||||
"Relays" = "リレー";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "リレーに通報が通知され、クライアントはこの情報を使ってコンテンツをフィルタリングすることができるようになります。ありがとうございます!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "全て削除";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "リプライ";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "自分にリプライ";
|
||||
|
||||
/* Label to indicate that the user is replying to 2 users. */
|
||||
"Replying to %@ & %@" = "%1$@ と %2$@ にリプライ";
|
||||
|
||||
/* Indicating that the user is replying to the following listed people. */
|
||||
"Replying to:" = "リプライ先:";
|
||||
|
||||
/* Button to report a profile.
|
||||
Context menu option for reporting content. */
|
||||
"Report" = "通報";
|
||||
|
||||
/* Label indicating that the text underneath is the identifier of the report that was sent to relay servers. */
|
||||
"Report ID:" = "通報ID:";
|
||||
|
||||
/* Message indicating that a report was successfully sent to relay servers. */
|
||||
"Report sent!" = "通報が送信されました!";
|
||||
|
||||
/* Button to confirm reposting a post.
|
||||
Title of alert for confirming to repost a post. */
|
||||
"Repost" = "リポスト";
|
||||
|
||||
/* Text indicating that the post was reposted (i.e. re-shared). */
|
||||
"Reposted" = "リポストされました";
|
||||
|
||||
/* Navigation bar title for Reposts view. */
|
||||
"Reposts" = "リポスト";
|
||||
|
||||
/* Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. */
|
||||
"Requests" = "リクエスト";
|
||||
|
||||
/* Button to retry completing account creation after an error occurred. */
|
||||
"Retry" = "リトライ";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, River */
|
||||
"River" = "River";
|
||||
|
||||
/* Example username of Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"satoshi" = "サトシ";
|
||||
|
||||
/* Name of Bitcoin creator(s). */
|
||||
"Satoshi Nakamoto" = "サトシ・ナカモト";
|
||||
|
||||
/* Button for saving profile. */
|
||||
"Save" = "保存";
|
||||
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "画像を保存する";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "QRコードをスキャン";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "ハッシュタグを検索: #%@";
|
||||
|
||||
/* Placeholder text to prompt entry of search query. */
|
||||
"Search..." = "検索する...";
|
||||
|
||||
/* Section title for user's secret account login key. */
|
||||
"Secret Account Login Key" = "ログイン用秘密鍵";
|
||||
|
||||
/* Title of section for selecting a Lightning wallet to pay a Lightning invoice. */
|
||||
"Select a Lightning wallet" = "Lightningウォレットを選択";
|
||||
|
||||
/* Prompt selection of user's default wallet */
|
||||
"Select default wallet" = "デフォルトのウォレットを選択";
|
||||
|
||||
/* Text prompt for user to send a message to the other user. */
|
||||
"Send a message to start the conversation..." = "会話を開始するにはメッセージを送信してください...";
|
||||
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "サーバー";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "サービス";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "設定";
|
||||
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "共有";
|
||||
|
||||
/* Button to show a post from a user who has been blocked.
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "表示";
|
||||
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "APIキーを表示";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
"Show wallet selector" = "ウォレット選択を表示";
|
||||
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "サインアウト";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "ソフトウェア";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "対応しているNIP";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "ありがとう!";
|
||||
|
||||
/* Button for user to report that the account is impersonating someone. */
|
||||
"They are impersonating someone" = "誰かになりすましています";
|
||||
|
||||
/* Warning that the inputted account key is a public key and the result of what happens because of it. */
|
||||
"This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective." = "これは公開鍵で、投稿などの操作は一切できません。入力された公開鍵の視点で投稿を見るために使用します。";
|
||||
|
||||
/* Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. */
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "これは古い形式のnostrキーです。公開鍵または秘密鍵かどうかの判別が出来ません。公開鍵の場合は下のボタンをトグルしてください。";
|
||||
|
||||
/* Label to describe that a public key is the user's account ID and what they can do with it. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "これはあなたのアカウントIDで、これを友達に共有すれば、友達はあなたをフォローできます。クリックしてコピー。";
|
||||
|
||||
/* Label to describe that a private key is the user's secret account key and what they should do with it. */
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "これがあなたの秘密鍵です。アカウントにアクセスするにはこれが必要になります。誰にも共有しないでください!パスワードマネージャーに保存して、安全に管理してください!";
|
||||
|
||||
/* Navigation bar title for note thread.
|
||||
Navigation bar title for threaded event detail view. */
|
||||
"Thread" = "スレッド";
|
||||
|
||||
/* Button to translate note from different language. */
|
||||
"Translate Note" = "翻訳する";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (lang)" = "(lang) からの翻訳";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "(lang) から翻訳しています...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "翻訳サービス";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "削除するには DELETE と入力してください";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "投稿をここに入力...";
|
||||
|
||||
/* Non-breaking space character to fill in blank space next to event action button icons. */
|
||||
"u{00A0}" = "u{00A0}";
|
||||
|
||||
/* Button to unfollow a user. */
|
||||
"Unfollow" = "フォロー解除";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of unfollowing a profile. */
|
||||
"Unfollowing" = "フォロー解除中";
|
||||
|
||||
/* Label to indicate that the user is in the process of unfollowing another user. */
|
||||
"Unfollowing..." = "フォローを解除しています...";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that will unfollow a profile when tapped. */
|
||||
"Unfollows" = "フォロー解除";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
"URL" = "URL";
|
||||
|
||||
/* Alert message to indicate the user has been blocked */
|
||||
"User blocked" = "ユーザーをブロックしました";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"User has been blocked" = "ユーザーはブロックされています";
|
||||
|
||||
/* Label for Username section of user profile form.
|
||||
Label to prompt username entry. */
|
||||
"Username" = "ユーザー名";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "バージョン";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "ウォレット";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Wallet of Satoshi. */
|
||||
"Wallet of Satoshi" = "Wallet of Satoshi";
|
||||
|
||||
/* Section title for selection of wallet. */
|
||||
"Wallet Selector" = "ウォレットを選択";
|
||||
|
||||
/* Label for Website section of user profile form. */
|
||||
"Website" = "ウェブサイト";
|
||||
|
||||
/* Welcoming message to the reader. The variable is 'you', the reader. */
|
||||
"Welcome to the social network %@ control." = "あなたがコントロールするSNSへようこそ。";
|
||||
|
||||
/* Text to welcome user. */
|
||||
"Welcome, %@!" = "ようこそ, %@!";
|
||||
|
||||
/* Header text to prompt user what issue they want to report. */
|
||||
"What do you want to report?" = "通報したい項目は何ですか?";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://some.relay.com";
|
||||
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "はい、上書きします";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "はい、秘密鍵を投稿します";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "あなた";
|
||||
|
||||
/* Label for Your Name section of user profile form. */
|
||||
"Your Name" = "あなたの名前";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "あなたの通報は接続しているリレーに送信されました";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zeus LN. */
|
||||
"Zeus LN" = "Zeus LN";
|
||||
|
||||
136
damus/ja.lproj/Localizable.stringsdict
Normal file
136
damus/ja.lproj/Localizable.stringsdict
Normal file
@@ -0,0 +1,136 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>collapsed_event_view_other_notes</key>
|
||||
<dict>
|
||||
<key>NOTES</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>%d その他のNote</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>··· %#@NOTES@ ···</string>
|
||||
</dict>
|
||||
<key>followers_count</key>
|
||||
<dict>
|
||||
<key>FOLLOWERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>フォロワー</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@FOLLOWERS@</string>
|
||||
</dict>
|
||||
<key>reactions_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REACTIONS@</string>
|
||||
<key>REACTIONS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>リアクション</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>relays_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@RELAYS@</string>
|
||||
<key>RELAYS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>リレー</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_one_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%@%#@OTHERS@ にリプライ</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string> & %d その他</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_two_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%@, %@%#@OTHERS@ にリプライ</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string> & %d その他</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>reposts_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REPOSTS@</string>
|
||||
<key>REPOSTS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>リポスト</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>sats_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%1$#@SATS@</string>
|
||||
<key>SATS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>@</string>
|
||||
<key>other</key>
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>other</key>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -5,5 +5,5 @@
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Piešķir Damus piekļuvi saviem fotoattēliem, lai varat saglabāt attēlus.";
|
||||
"NSPhotoLibraryAddUsageDescription" = "Atļauj Damus piekļuvi saviem fotoattēliem, lai varat saglabāt attēlus.";
|
||||
|
||||
|
||||
@@ -5,25 +5,27 @@
|
||||
"'%@' at '%@' will be used for verification" = "'%@' pie '%@' tiks izmantota priekš verifikācijas.";
|
||||
|
||||
/* Description of why the nip05 identifier is invalid. */
|
||||
"'%@' is an invalid nip05 identifier. It should look like an email." = "'%@' ir nederīgs nip05 identifikators. Tam vajadzētu būt kā e-pasta adresei.";
|
||||
"'%@' is an invalid NIP-05 identifier. It should look like an email." = "'%@' ir nederīgs NIP-05 identifikators. Tam vajadzētu izskatīties pēc e-pasta.";
|
||||
|
||||
/* Navigation bar title for view that shows who is following a user. */
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profils.ParādāmaisVārds(profils: profils, kopAtslēga: kurš))'am Sekotāji";
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profile.displayName(profile: profile, pubkey: whos))'am Sekotāji";
|
||||
|
||||
/* Navigation bar title for view that shows who a user is following. */
|
||||
"(who) following" = "(kurš) seko";
|
||||
"(who) following" = "(who) seko";
|
||||
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many reposts. In source English, the first variable is the number of reposts, and the second variable is 'Repost' or 'Reposts'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"%@ has been blocked" = "ir bloķēts";
|
||||
|
||||
/* Explanation of what is done to keep personally identifiable information private. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "Lai izveidotu kontu, nav nepieciešams tālruņa numurs, e-pasts vai vārds. Sāciet uzreiz bez aizkaves.";
|
||||
|
||||
@@ -31,10 +33,10 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Pilnīga šifrēta privātā ziņojumapmaiņa. Esi privātajā iesūtnē bez lielo tekfirmu klātbūtnes.";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Sponsorē draugu ziņas un krājiet Satiņus ar BitMonētu⚡️, interneta digitālo valūtu.";
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Sponsorē draugu ziņas un krājiet Satus ar BitMonētu⚡️, interneta digitālo valūtu.";
|
||||
|
||||
/* Number of reposts.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -43,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Par";
|
||||
|
||||
@@ -52,9 +57,15 @@ Number of profiles a user is following. */
|
||||
/* Placeholder text for About Me description. */
|
||||
"Absolute Boss" = "Pilnīgs Priekšnieks";
|
||||
|
||||
/* Button to accept the end user license agreement before being allowed into the app. */
|
||||
"Accept" = "Pieņemt";
|
||||
|
||||
/* Label to indicate the public ID of the account. */
|
||||
"Account ID" = "Konta ID";
|
||||
|
||||
/* Title for confirmation dialog to either share, report, or block a profile. */
|
||||
"Actions" = "Darbības";
|
||||
|
||||
/* Button to add recommended relay server.
|
||||
Button to confirm adding user inputted relay. */
|
||||
"Add" = "Pievieno";
|
||||
@@ -68,8 +79,11 @@ Number of profiles a user is following. */
|
||||
/* Any amount of sats */
|
||||
"Any" = "Jebkurš";
|
||||
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "API Atslēga (pēc izvēles)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Vai tiešām vēlies šo ziņu pārpublicēt?";
|
||||
"Are you sure you want to repost this?" = "Vai tiešām vēlies pārpublicēt šo?";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "Karoga Attēls";
|
||||
@@ -81,11 +95,28 @@ Number of profiles a user is following. */
|
||||
"Bitcoin Beach" = "Bitmonētas Pludmale";
|
||||
|
||||
/* Label for Bitcoin Lightning Tips section of user profile form. */
|
||||
"Bitcoin Lightning Tips" = "Bitmonētas Zibens Naudiņa";
|
||||
"Bitcoin Lightning Tips" = "Bitmonētas Zibens Sponsorējumi";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blixt Wallet */
|
||||
"Blixt Wallet" = "Blixt Maciņš";
|
||||
|
||||
/* Alert button to block a user.
|
||||
Button to block a profile.
|
||||
Context menu option for blocking users. */
|
||||
"Block" = "Bloķējums";
|
||||
|
||||
/* Alert message prompt to ask if a user should be blocked. */
|
||||
"Block %@?" = "Vai bloķēt %@?";
|
||||
|
||||
/* Title of alert for blocking a user. */
|
||||
"Block User" = "Bloķēt Lietotāju";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Blocked" = "Bloķēts";
|
||||
|
||||
/* Navigation title of view to see list of blocked users. */
|
||||
"Blocked Users" = "Bloķētie Lietotāji";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Maciņš";
|
||||
|
||||
@@ -95,9 +126,12 @@ Number of profiles a user is following. */
|
||||
/* Context menu option for broadcasting the user's note to all of the user's connected relay servers. */
|
||||
"Broadcast" = "Pārraidīt";
|
||||
|
||||
/* Button to cancel out of posting a note.
|
||||
/* Alert button to cancel out of alert for blocking a user.
|
||||
Button to cancel out of alert that creates a new mutelist.
|
||||
Button to cancel out of posting a note.
|
||||
Button to cancel out of reposting a post.
|
||||
Button to cancel out of view adding user inputted relay.
|
||||
Cancel deleting the user.
|
||||
Cancel out of logging out the user. */
|
||||
"Cancel" = "Atcelt";
|
||||
|
||||
@@ -141,11 +175,17 @@ Number of profiles a user is following. */
|
||||
/* Context menu option for copying the JSON text from the note. */
|
||||
"Copy Note JSON" = "Nokopēt Ziņas JSON";
|
||||
|
||||
/* Button to copy report ID. */
|
||||
"Copy Report ID" = "Kopēt Atskaites ID";
|
||||
|
||||
/* Context menu option for copying the text from an note. */
|
||||
"Copy Text" = "Nokopēt Tekstu";
|
||||
|
||||
/* Context menu option for copying the ID of the user who created the note. */
|
||||
"Copy User ID" = "Nokopēt Lietotāja ID";
|
||||
"Copy User Pubkey" = "Kopēt Lietotāja PubAtslēgu";
|
||||
|
||||
/* Alert message to indicate that the blocked user could not be found. */
|
||||
"Could not find user to block..." = "Nevar atrast lietotāju, ko nobloķēt...";
|
||||
|
||||
/* Button to create account. */
|
||||
"Create" = "Izveidot";
|
||||
@@ -153,27 +193,40 @@ Number of profiles a user is following. */
|
||||
/* Button to create an account. */
|
||||
"Create Account" = "Izveidot Kontu";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "Izveidot jaunu klusinājumSarakstu";
|
||||
|
||||
/* Example description about Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"Creator(s) of Bitcoin. Absolute legend." = "Bitmonētas Radītājs(i). Pilnīgas Leģendas.";
|
||||
|
||||
/* Dropdown option for selecting a custom translation server. */
|
||||
"Custom" = "Pielāgots";
|
||||
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Noklusējuma Maciņš";
|
||||
|
||||
/* Button to delete a relay server that the user connects to. */
|
||||
/* Button for deleting the users account.
|
||||
Button to delete a relay server that the user connects to.
|
||||
Button to remove a user from their blocklist.
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Izdzēst";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Izdzēst Kontu";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Izdzēstais Konts";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Atmest";
|
||||
|
||||
/* Label to prompt display name entry. */
|
||||
"Display Name" = "Parādāmais Vārds";
|
||||
|
||||
/* DM selector for seeing either DMs or message requests, which are messages that have not been responded to yet. DM is the English abbreviation for Direct Message. */
|
||||
"DM Type" = "Privātās Iesūtnes Tips";
|
||||
|
||||
/* Navigation title for DMs view, where DM is the English abbreviation for Direct Message.
|
||||
Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. */
|
||||
"DMs" = "Privātās Ziņas";
|
||||
@@ -199,8 +252,8 @@ Number of profiles a user is following. */
|
||||
/* Error message indicating why saving keys failed. */
|
||||
"Error: %@" = "Kļūda: %@";
|
||||
|
||||
/* Filter state for seeing either only posts, or posts & replies. */
|
||||
"Filter State" = "Filtrēt Štatu";
|
||||
/* Label indicating that the below text is the EULA, an acronym for End User License Agreement. */
|
||||
"EULA" = "EULA";
|
||||
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Sekot";
|
||||
@@ -219,7 +272,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Follows" = "Seko";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Globāls";
|
||||
"Global" = "Globāli";
|
||||
|
||||
/* Navigation link to go to post referenced by hex code. */
|
||||
"Goto post %@" = "Ej uz ierakstu %@";
|
||||
@@ -227,18 +280,31 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Navigation link to go to profile. */
|
||||
"Goto profile %@" = "Ej uz profilu %@";
|
||||
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Slēpt";
|
||||
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Slēpt API Atslēgu";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
"Home" = "Sākums";
|
||||
|
||||
/* Placeholder example text for profile picture URL. */
|
||||
"https://example.com/pic.jpg" = "https://paraugs.lv/att.jpg";
|
||||
"https://example.com/pic.jpg" = "https://paraugs.com/att.jpg";
|
||||
|
||||
/* Placeholder example text for website URL for user profile. */
|
||||
"https://jb55.com" = "https://jb55.com";
|
||||
|
||||
/* Button for user to report that the account or content has illegal content. */
|
||||
"Illegal content" = "Pretlikumīgs saturs";
|
||||
|
||||
/* Error message indicating that an invalid account key was entered for login. */
|
||||
"Invalid key" = "Nepareiza atslēga";
|
||||
|
||||
/* Button for user to report that the account or content has spam. */
|
||||
"It's spam" = "Tā ir mēstule";
|
||||
|
||||
/* Placeholder example text for identifier used for NIP-05 verification. */
|
||||
"jb55@jb55.com" = "jb55@jb55.com";
|
||||
|
||||
@@ -266,7 +332,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
|
||||
/* Alert for logging out the user.
|
||||
Button for logging out the user.
|
||||
Button to logout the user. */
|
||||
Button to close the alert that informs that the current account has been deleted. */
|
||||
"Logout" = "Iziet";
|
||||
|
||||
/* Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out. */
|
||||
@@ -278,9 +344,21 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "NIP-05 Verifikācija";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Nē";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Nav atrasts bloķējuma saraksts, izveidot jaunu? Tiks pārrakstīti visi iepriekšējie bloķējuma saraksti.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "neviens";
|
||||
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Neviens";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "Ziņojums satur \"nsec1\" privāto atslēgu. Vai esi pārliecināts?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Nav ko redzēt te. Ienāc šeit vēlāk.";
|
||||
|
||||
@@ -293,6 +371,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key. */
|
||||
"nsec1..." = "nsec1...";
|
||||
|
||||
/* Button for user to report that the account or content has nudity or explicit content. */
|
||||
"Nudity or explicit content" = "Kailums vai nepārprotams saturs";
|
||||
|
||||
/* Label indicating that a form input is optional. */
|
||||
"optional" = "pēc izvēles";
|
||||
|
||||
@@ -308,6 +389,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to post a note. */
|
||||
"Post" = "Publicēt";
|
||||
|
||||
/* Text to indicate that what is being shown is a post from a user who has been blocked. */
|
||||
"Post from a user you've blocked" = "Ziņa no lietotāja, kuru esat bloķējis";
|
||||
|
||||
/* Label for filter for seeing only posts (instead of posts and replies). */
|
||||
"Posts" = "Ieraksti";
|
||||
|
||||
@@ -344,12 +428,20 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Ieteicamie Releji";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Noraidīt";
|
||||
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relejs";
|
||||
|
||||
/* Sidebar menu label for Relay servers view */
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
"Relays" = "Releji";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "Releji ir informēti un klienti varēs izmantot šo informāciju, lai filtrētu saturu. Paldies Tev!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Noņemt visu";
|
||||
|
||||
@@ -362,6 +454,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Indicating that the user is replying to the following listed people. */
|
||||
"Replying to:" = "Atbildot";
|
||||
|
||||
/* Button to report a profile.
|
||||
Context menu option for reporting content. */
|
||||
"Report" = "Noziņot";
|
||||
|
||||
/* Label indicating that the text underneath is the identifier of the report that was sent to relay servers. */
|
||||
"Report ID:" = "Ziņojuma ID";
|
||||
|
||||
/* Message indicating that a report was successfully sent to relay servers. */
|
||||
"Report sent!" = "Ziņojums nosūtīts!";
|
||||
|
||||
/* Button to confirm reposting a post.
|
||||
Title of alert for confirming to repost a post. */
|
||||
"Repost" = "Pārpublicēt";
|
||||
@@ -369,12 +471,12 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text indicating that the post was reposted (i.e. re-shared). */
|
||||
"Reposted" = "Pārpublicēts";
|
||||
|
||||
/* Navigation bar title for Reposts view. */
|
||||
"Reposts" = "Pārpublicējumi";
|
||||
|
||||
/* Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. */
|
||||
"Requests" = "Pieprasījumi";
|
||||
|
||||
/* Section title for resetting the user */
|
||||
"Reset" = "Atiestatīt";
|
||||
|
||||
/* Button to retry completing account creation after an error occurred. */
|
||||
"Retry" = "Mēģiniet vēlreiz";
|
||||
|
||||
@@ -394,7 +496,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Save Image" = "Saglabāt Attēlu";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Meklēt Režģbirku #%@";
|
||||
"Search hashtag: #%@" = "Meklēt atsauci #%@";
|
||||
|
||||
/* Placeholder text to prompt entry of search query. */
|
||||
"Search..." = "Meklēt...";
|
||||
@@ -411,16 +513,26 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text prompt for user to send a message to the other user. */
|
||||
"Send a message to start the conversation..." = "Sūti ziņu, lai sāktu sarunu...";
|
||||
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Serveris";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Uzstādījumi";
|
||||
|
||||
/* Button to share an image. */
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Dalīties";
|
||||
|
||||
/* Toggle to show or hide user's secret account login key. */
|
||||
/* Button to show a post from a user who has been blocked.
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Parādīt";
|
||||
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Parādīt API Atslēgu";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
"Show wallet selector" = "Parādīt maciņu atlasītāju";
|
||||
|
||||
@@ -430,22 +542,40 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Paldies!";
|
||||
|
||||
/* Button for user to report that the account is impersonating someone. */
|
||||
"They are impersonating someone" = "Viņi uzdodas par kādu citu";
|
||||
|
||||
/* Warning that the inputted account key is a public key and the result of what happens because of it. */
|
||||
"This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective." = "Šī ir publiskā atslēga, jūs nevarēsit rakstīt ziņas vai kādā citā veidā darboties. To izmanto, lai tikai skatītu kontus no to skatpunkta.";
|
||||
|
||||
/* Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. */
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Šī ir vecā parauga nostr atslēga. Mēs neesam pārliecināti, vai tā ir kopAtslēga vai slepenā atslēga. Lūdzu, pārslēdziet ar tālāk esošo pogu, ja šī ir publiskā atslēga.";
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Šī ir vecā parauga nostr atslēga. Mēs neesam pārliecināti, vai tā ir pubAtslēga vai slepenā atslēga. Lūdzu, pārslēdziet ar tālāk esošo pogu, ja šī ir publiskā atslēga.";
|
||||
|
||||
/* Label to describe that a public key is the user's account ID and what they can do with it. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "Šis ir jūsu konta ID. Varat to iedot draugiem, lai viņi varētu jums sekot. Noklikšķiniet, lai nokopētu.";
|
||||
|
||||
/* Label to describe that a private key is the user's secret account key and what they should do with it. */
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Šī ir jūsu konta slepenā atslēga. Tā ir nepieciešama, lai piekļūtu savam kontam. Nedalies ar to nevienam! Saglabājiet to paroļu pārvaldniekā un glabājiet to drošībā!";
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Šī ir jūsu konta slepenā atslēga. Tā ir nepieciešama, lai piekļūtu savam kontam. Ar nevienu nedalies to! Saglabājiet to paroļu pārvaldniekā un glabājiet to drošībā!";
|
||||
|
||||
/* Navigation bar title for note thread.
|
||||
Navigation bar title for threaded event detail view. */
|
||||
"Thread" = "Plūsma";
|
||||
|
||||
/* Button to translate note from different language. */
|
||||
"Translate Note" = "Iztulkot Ziņu";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (lang)" = "Tulkot no (val)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Tiek tulkots no (val)...";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Ieraksti IZDZĒST, lai izdzēstu";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Rakstiet savu ziņu šeit...";
|
||||
|
||||
@@ -464,6 +594,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text to indicate that the button next to it is in a state that will unfollow a profile when tapped. */
|
||||
"Unfollows" = "Atsekos";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
"URL" = "Saite";
|
||||
|
||||
/* Alert message to indicate the user has been blocked */
|
||||
"User blocked" = "Lietotājs bloķēts";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"User has been blocked" = "Lietotājs ir nobloķēts";
|
||||
|
||||
/* Label for Username section of user profile form.
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Lietotājvārds";
|
||||
@@ -471,8 +610,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Maciņš";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Wallet Of Satoshi. */
|
||||
"Wallet Of Satoshi" = "Wallet Of Satoshi";
|
||||
/* Dropdown option label for Lightning wallet, Wallet of Satoshi. */
|
||||
"Wallet of Satoshi" = "Wallet of Satoshi";
|
||||
|
||||
/* Section title for selection of wallet. */
|
||||
"Wallet Selector" = "Maciņu Atlasītājs";
|
||||
@@ -486,8 +625,17 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text to welcome user. */
|
||||
"Welcome, %@!" = "Laipni lūgts, %@!";
|
||||
|
||||
/* Header text to prompt user what issue they want to report. */
|
||||
"What do you want to report?" = "Ko Tu vēlies noziņot?";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://cits.relejs.lv";
|
||||
"wss://some.relay.com" = "wss://cits.relejs.com";
|
||||
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Jā, Pārrakstīt";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Jā, Publicēt ar Privāto Atslēgu";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "jūs";
|
||||
@@ -495,6 +643,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for Your Name section of user profile form. */
|
||||
"Your Name" = "Tavs Vārds";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Tavs ziņojums tiks nosūtīts uz relejiem, are kuriem esi savienots";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>%d cita piezīme</string>
|
||||
<string>%d cita ziņa</string>
|
||||
<key>other</key>
|
||||
<string>%d citas piezīmes</string>
|
||||
<string>%d citas ziņas</string>
|
||||
<key>zero</key>
|
||||
<string>%d other notes</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>··· %#@PIEZĪMES@ ···</string>
|
||||
<string>··· Ziņas ···</string>
|
||||
</dict>
|
||||
<key>followers_count</key>
|
||||
<dict>
|
||||
@@ -36,12 +36,12 @@
|
||||
<string>Followers</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@SEKOTĀJI@</string>
|
||||
<string>Sekotāji</string>
|
||||
</dict>
|
||||
<key>reactions_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REAKCIJAS@</string>
|
||||
<string>Reakcijas</string>
|
||||
<key>REACTIONS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -59,7 +59,7 @@
|
||||
<key>relays_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@RELEJI@</string>
|
||||
<string>Releji</string>
|
||||
<key>RELAYS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -77,7 +77,7 @@
|
||||
<key>replying_to_one_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Atbildot %@%#@CITIEM@</string>
|
||||
<string>Atbildot %@% #Citam</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -95,7 +95,7 @@
|
||||
<key>replying_to_two_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Atbildot %@, %@%#@CITIEM@</string>
|
||||
<string>Atbildot %@, %@%#Citiem</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -113,7 +113,7 @@
|
||||
<key>reposts_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@PĀRPUBLICĒJUMI@</string>
|
||||
<string>Pārpublicējumi</string>
|
||||
<key>REPOSTS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -131,7 +131,7 @@
|
||||
<key>sats_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%1$#@SATIŅI@</string>
|
||||
<string>%1$#@Sats@</string>
|
||||
<key>SATS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -139,29 +139,29 @@
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>@</string>
|
||||
<key>one</key>
|
||||
<string>%2$@ satiņš</string>
|
||||
<string>%2$@ sati</string>
|
||||
<key>other</key>
|
||||
<string>%2$@ satiņi</string>
|
||||
<string>%2$@ sati</string>
|
||||
<key>zero</key>
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@SPONSORĒJUMI@</string>
|
||||
<key>TIPS</key>
|
||||
<string>Zapi</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Sponsorējums</string>
|
||||
<string>Zaps</string>
|
||||
<key>other</key>
|
||||
<string>Sponsorējumi</string>
|
||||
<string>Zapi</string>
|
||||
<key>zero</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
12
damus/nl.lproj/InfoPlist.strings
Normal file
12
damus/nl.lproj/InfoPlist.strings
Normal file
@@ -0,0 +1,12 @@
|
||||
/* Bundle display name */
|
||||
"CFBundleDisplayName" = "Damus";
|
||||
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Lokale verificatie om toegang te krijgen tot privésleutel";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Geef Damus toegang tot je foto's om afbeeldingen op te kunnen slaan.";
|
||||
|
||||
726
damus/nl.lproj/Localizable.strings
Normal file
726
damus/nl.lproj/Localizable.strings
Normal file
@@ -0,0 +1,726 @@
|
||||
/* Blank space to separate profile picture from profile editor form. */
|
||||
" " = "61b6edf1108e6f396680a33b02486a70_tr";
|
||||
|
||||
/* Description of how the nip05 identifier would be used for verification. */
|
||||
"'%@' at '%@' will be used for verification" = "‘%@’ op ‘%@’ wordt gebruikt ter verificatie";
|
||||
|
||||
/* Description of why the nip05 identifier is invalid. */
|
||||
"'%@' is an invalid NIP-05 identifier. It should look like an email." = "‘%@’ is een ongeldige NIP-05-identificatie. Het moet op e-mailadres lijken.";
|
||||
|
||||
/* Navigation bar title for view that shows who is following a user. */
|
||||
"(Profile.displayName(profile: profile, pubkey: whos))'s Followers" = "(Profile.displayName(profile: profile, pubkey: whos))s volgers";
|
||||
|
||||
/* Navigation bar title for view that shows who a user is following. */
|
||||
"(who) following" = "(who) volgt";
|
||||
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"%@ has been blocked" = "%@ is geblokkeerd";
|
||||
|
||||
/* Explanation of what is done to keep personally identifiable information private. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Creating an account doesn't require a phone number, email or name. Get started right away with zero friction." = "%@. Bij het aanmaken van een account is geen telefoonnummer, e-mailadres of naam vereist. Je kunt dus snel aan de slag.";
|
||||
|
||||
/* Explanation of what is done to keep private data encrypted. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. End-to-End encrypted private messaging. Keep Big Tech out of your DMs" = "%@. Eind-tot-eind versleutelde privéberichten: grote techbedrijven kijken niet mee.";
|
||||
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Geef je vrienden een fooi met Bitcoin⚡️, dé internetvaluta.";
|
||||
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
"%lld/%lld" = "%lld/%lld";
|
||||
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Over";
|
||||
|
||||
/* Label for About Me section of user profile form. */
|
||||
"About Me" = "Over mijzelf";
|
||||
|
||||
/* Placeholder text for About Me description. */
|
||||
"Absolute Boss" = "De beste van de klas";
|
||||
|
||||
/* Button to accept the end user license agreement before being allowed into the app. */
|
||||
"Accept" = "Accepteer";
|
||||
|
||||
/* Label to indicate the public ID of the account. */
|
||||
"Account ID" = "Account-id";
|
||||
|
||||
/* Title for confirmation dialog to either share, report, or block a profile. */
|
||||
"Actions" = "Acties";
|
||||
|
||||
/* Button to add recommended relay server.
|
||||
Button to confirm adding user inputted relay. */
|
||||
"Add" = "Voeg toe";
|
||||
|
||||
/* Button label to re-add all original participants as profiles to reply to in a note */
|
||||
"Add all" = "Voeg iedereen toe";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Voeg relay toe";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Beheerder";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Elk";
|
||||
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Api-sleutel (optioneel)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "Api-sleutel (vereist)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Weet je zeker dat je dit wilt herplaatsen?";
|
||||
|
||||
/* Label for Banner Image section of user profile form. */
|
||||
"Banner Image" = "Profielomslag";
|
||||
|
||||
/* Reminder to user that they should save their account information. */
|
||||
"Before we get started, you'll need to save your account info, otherwise you won't be able to login in the future if you ever uninstall Damus." = "Voordat je aan de slag kant, moet je je accountinformatie opslaan, anders kun je niet inloggen, zelfs niet als je Damus verwijdert.";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Bitcoin Beach. */
|
||||
"Bitcoin Beach" = "Bitcoin Beach";
|
||||
|
||||
/* Label for Bitcoin Lightning Tips section of user profile form. */
|
||||
"Bitcoin Lightning Tips" = "Bitcoin Lightning-tips";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blixt Wallet */
|
||||
"Blixt Wallet" = "Blixt-portefeuille";
|
||||
|
||||
/* Alert button to block a user.
|
||||
Button to block a profile.
|
||||
Context menu option for blocking users. */
|
||||
"Block" = "Blokkeer";
|
||||
|
||||
/* Alert message prompt to ask if a user should be blocked. */
|
||||
"Block %@?" = "Wil je %@ blokkeren?";
|
||||
|
||||
/* Title of alert for blocking a user. */
|
||||
"Block User" = "Blokkeer gebruiker";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Blocked" = "Geblokkeerd";
|
||||
|
||||
/* Navigation title of view to see list of blocked users. */
|
||||
"Blocked Users" = "Geblokkeerde gebruikers";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue-portefeuille";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Aantal boosts";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
/* Context menu option for broadcasting the user's note to all of the user's connected relay servers. */
|
||||
"Broadcast" = "Uitzenden";
|
||||
|
||||
/* Alert button to cancel out of alert for blocking a user.
|
||||
Button to cancel out of alert that creates a new mutelist.
|
||||
Button to cancel out of posting a note.
|
||||
Button to cancel out of reposting a post.
|
||||
Button to cancel out of view adding user inputted relay.
|
||||
Cancel deleting the user.
|
||||
Cancel out of logging out the user. */
|
||||
"Cancel" = "Annuleer";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Cash App. */
|
||||
"Cash App" = "Cash-app";
|
||||
|
||||
/* Navigation bar title for Chatroom view. */
|
||||
"Chat" = "Chat";
|
||||
|
||||
/* Button for clearing cached data. */
|
||||
"Clear" = "Wis";
|
||||
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Wis cache";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Contact";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Gekopieerd";
|
||||
|
||||
/* Button to copy a relay server address. */
|
||||
"Copy" = "Kopieer";
|
||||
|
||||
/* Context menu option for copying the ID of the account that created the note. */
|
||||
"Copy Account ID" = "Kopieer account-id";
|
||||
|
||||
/* Context menu option to copy an image into clipboard.
|
||||
Context menu option to copy an image to clipboard. */
|
||||
"Copy Image" = "Kopieer afbeelding";
|
||||
|
||||
/* Context menu option to copy the URL of an image into clipboard. */
|
||||
"Copy Image URL" = "Kopieer afbeeldingslink";
|
||||
|
||||
/* Title of section for copying a Lightning invoice identifier. */
|
||||
"Copy invoice" = "Kopieer factuur";
|
||||
|
||||
/* Context menu option for copying a user's Lightning URL. */
|
||||
"Copy LNURL" = "Kopieer LNURL";
|
||||
|
||||
/* Context menu option for copying the ID of the note. */
|
||||
"Copy Note ID" = "Kopieer notitie-id";
|
||||
|
||||
/* Context menu option for copying the JSON text from the note. */
|
||||
"Copy Note JSON" = "Kopieer notitie-json";
|
||||
|
||||
/* Button to copy report ID. */
|
||||
"Copy Report ID" = "Kopieer meldings-id";
|
||||
|
||||
/* Context menu option for copying the text from an note. */
|
||||
"Copy Text" = "Kopieer tekst";
|
||||
|
||||
/* Context menu option for copying the ID of the user who created the note. */
|
||||
"Copy User Pubkey" = "Kopieer gebruikerssleutel";
|
||||
|
||||
/* Alert message to indicate that the blocked user could not be found. */
|
||||
"Could not find user to block..." = "Er is geen gebruiker gevonden…";
|
||||
|
||||
/* Button to create account. */
|
||||
"Create" = "Registreer";
|
||||
|
||||
/* Button to create an account. */
|
||||
"Create Account" = "Maak account aan";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "Maak nieuwe demplijst aan";
|
||||
|
||||
/* Example description about Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"Creator(s) of Bitcoin. Absolute legend." = "Maker(s) van Bitcoin. Een ware legende.";
|
||||
|
||||
/* Dropdown option for selecting a custom translation server. */
|
||||
"Custom" = "Aangepast";
|
||||
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (commercieel, maar hogere juistheid)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Damus-portefeuille";
|
||||
|
||||
/* Button for deleting the users account.
|
||||
Button to delete a relay server that the user connects to.
|
||||
Button to remove a user from their blocklist.
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Verwijder";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Verwijder account";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Verwijderd account";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Beschrijving";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Negeer";
|
||||
|
||||
/* Label to prompt display name entry. */
|
||||
"Display Name" = "Weergavenaam";
|
||||
|
||||
/* Navigation title for DMs view, where DM is the English abbreviation for Direct Message.
|
||||
Navigation title for view of DMs, where DM is an English abbreviation for Direct Message. */
|
||||
"DMs" = "DM's";
|
||||
|
||||
/* Button to dismiss wallet selection view for paying Lightning invoice. */
|
||||
"Done" = "Klaar";
|
||||
|
||||
/* Heading indicating that this application allows users to earn money. */
|
||||
"Earn Money" = "Verdien geld";
|
||||
|
||||
/* Button to edit user's profile. */
|
||||
"Edit" = "Bewerk";
|
||||
|
||||
/* Text indicating that the view is used for editing which participants are replied to in a note. */
|
||||
"Edit participants" = "Bewerk deelnemers";
|
||||
|
||||
/* Heading indicating that this application keeps private messaging end-to-end encrypted. */
|
||||
"Encrypted" = "Versleuteld";
|
||||
|
||||
/* Prompt for user to enter an account key to login. */
|
||||
"Enter your account key to login:" = "Voer je accountsleutel in om in te loggen:";
|
||||
|
||||
/* Error message indicating why saving keys failed. */
|
||||
"Error: %@" = "Foutmelding: %@";
|
||||
|
||||
/* Label indicating that the below text is the EULA, an acronym for End User License Agreement. */
|
||||
"EULA" = "EULA";
|
||||
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Volg";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Volg terug";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Volg me op nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Volgers";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.
|
||||
Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Following" = "Volgend";
|
||||
|
||||
/* Label to indicate that the user is in the process of following another user. */
|
||||
"Following..." = "Volgend…";
|
||||
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Volgt";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Volgt je";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Gratis";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "Verkrijg api-sleutel";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Algemeen";
|
||||
|
||||
/* Navigation link to go to post referenced by hex code. */
|
||||
"Goto post %@" = "Ga naar bericht %@";
|
||||
|
||||
/* Navigation link to go to profile. */
|
||||
"Goto profile %@" = "Ga naar profiel %@";
|
||||
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Verberg";
|
||||
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Verberg api-sleutel";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
"Home" = "Startpagina";
|
||||
|
||||
/* Placeholder example text for profile picture URL. */
|
||||
"https://example.com/pic.jpg" = "https://voorbeeld.nl/foto.jpg";
|
||||
|
||||
/* Placeholder example text for website URL for user profile. */
|
||||
"https://jb55.com" = "https://jb55.com";
|
||||
|
||||
/* Button for user to report that the account or content has illegal content. */
|
||||
"Illegal content" = "Illegale inhoud";
|
||||
|
||||
/* Error message indicating that an invalid account key was entered for login. */
|
||||
"Invalid key" = "Ongeldige sleutel";
|
||||
|
||||
/* Button for user to report that the account or content has spam. */
|
||||
"It's spam" = "Spam";
|
||||
|
||||
/* Placeholder example text for identifier used for NIP-05 verification. */
|
||||
"jb55@jb55.com" = "jb55@jb55.com";
|
||||
|
||||
/* Moves the post button to the left side of the screen */
|
||||
"Left Handed" = "Linkshandig";
|
||||
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Aan de slag!";
|
||||
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibreTranslate (opensource)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Lightningadres of LNURL";
|
||||
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Lightningfactuur";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "Vind ik leuk";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Lokale verificatie om toegang te krijgen tot privésleutel";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "Lokaal standaard";
|
||||
|
||||
/* Button to log into account.
|
||||
Button to log into an account. */
|
||||
"Login" = "Log in";
|
||||
|
||||
/* Alert for logging out the user.
|
||||
Button for logging out the user.
|
||||
Button to close the alert that informs that the current account has been deleted. */
|
||||
"Logout" = "Log uit";
|
||||
|
||||
/* Reminder message in alert to get customer to verify that their private security account key is saved saved before logging out. */
|
||||
"Make sure your nsec account key is saved before you logout or you will lose access to this account" = "Zorg er voor dat je nsec-accountsleutel is opgeslagen voordat je uitlogt, anders verlies je toegang tot dit account";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Muun. */
|
||||
"Muun" = "Muun";
|
||||
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "NIP-05-verificatie";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Nee";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Er is geen blokkadelijst. Wil je een lijst aanmaken? Hierdoor worden vorige lijsten overschreven.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "geen";
|
||||
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Geen";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "De notitie bevat een ‘nsec1’-privésleutel. Weet je het zeker?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Er is hier nog niks te zien. Kijk later nog eens!";
|
||||
|
||||
/* Navigation title for notifications. */
|
||||
"Notifications" = "Meldingen";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
"now" = "zojuist";
|
||||
|
||||
/* Prompt for user to enter in an account key to login. This text shows the characters the key could start with if it was a private key. */
|
||||
"nsec1..." = "nsec1…";
|
||||
|
||||
/* Button for user to report that the account or content has nudity or explicit content. */
|
||||
"Nudity or explicit content" = "Naaktheid of expliciete inhoud";
|
||||
|
||||
/* Label indicating that a form input is optional. */
|
||||
"optional" = "optioneel";
|
||||
|
||||
/* Button to pay a Lightning invoice. */
|
||||
"Pay" = "Betaal";
|
||||
|
||||
/* Navigation bar title for view to pay Lightning invoice. */
|
||||
"Pay the Lightning invoice" = "Betaal de Lightningfactuur";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Pakket";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Bericht";
|
||||
|
||||
/* Text to indicate that what is being shown is a post from a user who has been blocked. */
|
||||
"Post from a user you've blocked" = "Bericht van een geblokkeerde gebruiker";
|
||||
|
||||
/* Label for filter for seeing only posts (instead of posts and replies). */
|
||||
"Posts" = "Berichten";
|
||||
|
||||
/* Label for filter for seeing posts and replies (instead of only posts). */
|
||||
"Posts & Replies" = "Berichten en antwoorden";
|
||||
|
||||
/* Heading indicating that this application keeps personally identifiable information private. A sentence describing what is done to keep data private comes after this heading. */
|
||||
"Private" = "Privé";
|
||||
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Privésleutel";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Pro";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Profiel";
|
||||
|
||||
/* Label for Profile Picture section of user profile form. */
|
||||
"Profile Picture" = "Profielfoto";
|
||||
|
||||
/* Section title for the user's public account ID. */
|
||||
"Public Account ID" = "Openbare account-id";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public key" = "Openbare sleutel";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public Key" = "Openbare sleutel";
|
||||
|
||||
/* Prompt to ask user if the key they entered is a public key. */
|
||||
"Public Key?" = "Openbare sleutel?";
|
||||
|
||||
/* Navigation bar title for Reactions view. */
|
||||
"Reactions" = "Reacties";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Aanbevolen relays";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Wijs af";
|
||||
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relay";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
"Relays" = "Relays";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "De relays zijn op de hoogte gebracht en clients kunnen deze informatie gebruiken om inhoud te filteren. Dank!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Verwijder allen";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Beantwoord";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Antwoord aan mijzelf";
|
||||
|
||||
/* Label to indicate that the user is replying to 2 users. */
|
||||
"Replying to %@ & %@" = "Antwoord aan %1$@ en %2$@";
|
||||
|
||||
/* Indicating that the user is replying to the following listed people. */
|
||||
"Replying to:" = "Antwoord aan:";
|
||||
|
||||
/* Button to report a profile.
|
||||
Context menu option for reporting content. */
|
||||
"Report" = "Meld";
|
||||
|
||||
/* Label indicating that the text underneath is the identifier of the report that was sent to relay servers. */
|
||||
"Report ID:" = "Meldings-id:";
|
||||
|
||||
/* Message indicating that a report was successfully sent to relay servers. */
|
||||
"Report sent!" = "De melding is gemaakt!";
|
||||
|
||||
/* Button to confirm reposting a post.
|
||||
Title of alert for confirming to repost a post. */
|
||||
"Repost" = "Herplaats";
|
||||
|
||||
/* Text indicating that the post was reposted (i.e. re-shared). */
|
||||
"Reposted" = "Herplaatst";
|
||||
|
||||
/* Navigation bar title for Reposts view. */
|
||||
"Reposts" = "Herplaatsingen";
|
||||
|
||||
/* Picker option for DM selector for seeing only message requests (DMs that someone else sent the user which has not been responded to yet). DM is the English abbreviation for Direct Message. */
|
||||
"Requests" = "Verzoeken";
|
||||
|
||||
/* Button to retry completing account creation after an error occurred. */
|
||||
"Retry" = "Probeer opnieuw";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, River */
|
||||
"River" = "River";
|
||||
|
||||
/* Example username of Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"satoshi" = "satoshi";
|
||||
|
||||
/* Name of Bitcoin creator(s). */
|
||||
"Satoshi Nakamoto" = "Satoshi Nakamoto";
|
||||
|
||||
/* Button for saving profile. */
|
||||
"Save" = "Bewaar";
|
||||
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Bewaar afbeelding";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Scan de code";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Zoek naar hashtag: #%@";
|
||||
|
||||
/* Placeholder text to prompt entry of search query. */
|
||||
"Search..." = "Zoek…";
|
||||
|
||||
/* Section title for user's secret account login key. */
|
||||
"Secret Account Login Key" = "Geheime inlogsleutel";
|
||||
|
||||
/* Title of section for selecting a Lightning wallet to pay a Lightning invoice. */
|
||||
"Select a Lightning wallet" = "Kies een Lightningportefeuille";
|
||||
|
||||
/* Prompt selection of user's default wallet */
|
||||
"Select default wallet" = "Kies de standaardportefeuille";
|
||||
|
||||
/* Text prompt for user to send a message to the other user. */
|
||||
"Send a message to start the conversation..." = "Begin het gesprek door een bericht te versturen…";
|
||||
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Server";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Dienst";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Instellingen";
|
||||
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Deel";
|
||||
|
||||
/* Button to show a post from a user who has been blocked.
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Toon";
|
||||
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Toon api-sleutel";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
"Show wallet selector" = "Toon portefeuillekeuze";
|
||||
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Log uit";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Software";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "Ondersteunde NIPs";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Bedankt!";
|
||||
|
||||
/* Button for user to report that the account is impersonating someone. */
|
||||
"They are impersonating someone" = "Dit account doet zich voor als iemand anders";
|
||||
|
||||
/* Warning that the inputted account key is a public key and the result of what happens because of it. */
|
||||
"This is a public key, you will not be able to make posts or interact in any way. This is used for viewing accounts from their perspective." = "Dit is een openbare sleutel waarmee geen berichten of antwoorden kunnen worden geplaatst. Deze wordt alléén gebruikt om accounts te tonen.";
|
||||
|
||||
/* Warning that the inputted account key for login is an old-style and asking user to verify if it is a public key. */
|
||||
"This is an old-style nostr key. We're not sure if it's a pubkey or private key. Please toggle the button below if this a public key." = "Dit is een oude nostr-sleutel waarvan we niet weten of het een pubkey or privésleutel is. Druk op onderstaande knop als het een privésleutel betreft.";
|
||||
|
||||
/* Label to describe that a public key is the user's account ID and what they can do with it. */
|
||||
"This is your account ID, you can give this to your friends so that they can follow you. Click to copy." = "Dit je account-id. Je kunt deze delen met je vrienden zodat ze je kunnen volgen. Druk om te kopiëren.";
|
||||
|
||||
/* Label to describe that a private key is the user's secret account key and what they should do with it. */
|
||||
"This is your secret account key. You need this to access your account. Don't share this with anyone! Save it in a password manager and keep it safe!" = "Dit is je geheime accountsleutel. Deze heb je nodig om in te loggen op je account - deel de sleutel dus met niemand! Bewaar hem eventueel in een wachtwoordbeheerder.";
|
||||
|
||||
/* Navigation bar title for note thread.
|
||||
Navigation bar title for threaded event detail view. */
|
||||
"Thread" = "Details";
|
||||
|
||||
/* Button to translate note from different language. */
|
||||
"Translate Note" = "Vertaal notitie";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (lang)" = "Vertaald uit het (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Bezig met vertalen uit (lang)…";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Vertalingen";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Typ DELETE om te verwijderen";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Typ een bericht…";
|
||||
|
||||
/* Non-breaking space character to fill in blank space next to event action button icons. */
|
||||
"u{00A0}" = "u{00A0}";
|
||||
|
||||
/* Button to unfollow a user. */
|
||||
"Unfollow" = "Ontvolg";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of unfollowing a profile. */
|
||||
"Unfollowing" = "Bezig met ontvolgen…";
|
||||
|
||||
/* Label to indicate that the user is in the process of unfollowing another user. */
|
||||
"Unfollowing..." = "Bezig met ontvolgen…";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that will unfollow a profile when tapped. */
|
||||
"Unfollows" = "Ontvolgt";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
"URL" = "Url";
|
||||
|
||||
/* Alert message to indicate the user has been blocked */
|
||||
"User blocked" = "Geblokkeerd";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"User has been blocked" = "De gebruiker is geblokkeerd";
|
||||
|
||||
/* Label for Username section of user profile form.
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Gebruikersnaam";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Versie";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Portefeuille";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Wallet of Satoshi. */
|
||||
"Wallet of Satoshi" = "Portefeuille of Satoshi";
|
||||
|
||||
/* Section title for selection of wallet. */
|
||||
"Wallet Selector" = "Portefeuillekeuze";
|
||||
|
||||
/* Label for Website section of user profile form. */
|
||||
"Website" = "Website";
|
||||
|
||||
/* Welcoming message to the reader. The variable is 'you', the reader. */
|
||||
"Welcome to the social network %@ control." = "Welkom op het sociale netwerk waar %@ de baas bent.";
|
||||
|
||||
/* Text to welcome user. */
|
||||
"Welcome, %@!" = "Welkom, %@!";
|
||||
|
||||
/* Header text to prompt user what issue they want to report. */
|
||||
"What do you want to report?" = "Waar wil je melding van maken?";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://een.relay.nl";
|
||||
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Ja, overschrijven";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Ja, plaats met privésleutel";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "jíj";
|
||||
|
||||
/* Label for Your Name section of user profile form. */
|
||||
"Your Name" = "Mijn naam";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Je melding wordt verstuurd aan de relays waarmee je verbonden bent";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zeus LN. */
|
||||
"Zeus LN" = "Zeus LN";
|
||||
|
||||
154
damus/nl.lproj/Localizable.stringsdict
Normal file
154
damus/nl.lproj/Localizable.stringsdict
Normal file
@@ -0,0 +1,154 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>collapsed_event_view_other_notes</key>
|
||||
<dict>
|
||||
<key>NOTES</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>%d andere notitie</string>
|
||||
<key>other</key>
|
||||
<string>%d andere notities</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>··· %#@NOTES@ ···</string>
|
||||
</dict>
|
||||
<key>followers_count</key>
|
||||
<dict>
|
||||
<key>FOLLOWERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Volger</string>
|
||||
<key>other</key>
|
||||
<string>Volgers</string>
|
||||
</dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@FOLLOWERS@</string>
|
||||
</dict>
|
||||
<key>reactions_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REACTIONS@</string>
|
||||
<key>REACTIONS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Reactie</string>
|
||||
<key>other</key>
|
||||
<string>Reacties</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>relays_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@RELAYS@</string>
|
||||
<key>RELAYS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Relay</string>
|
||||
<key>other</key>
|
||||
<string>Relays</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_one_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Antwoord aan %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>en %d andere gebruiker</string>
|
||||
<key>other</key>
|
||||
<string>en %d andere gebruikers</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_two_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Antwoord aan %@ en %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>en %d andere gebruiker</string>
|
||||
<key>other</key>
|
||||
<string>en %d andere gebruikers</string>
|
||||
<key>zero</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>reposts_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@REPOSTS@</string>
|
||||
<key>REPOSTS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Herplaatsing</string>
|
||||
<key>other</key>
|
||||
<string>Herplaatsingen</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>sats_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%1$#@SATS@</string>
|
||||
<key>SATS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>@</string>
|
||||
<key>one</key>
|
||||
<string>%2$@ sat</string>
|
||||
<key>other</key>
|
||||
<string>%2$@ sats</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>one</key>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Zaps</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -4,6 +4,9 @@
|
||||
/* Bundle name */
|
||||
"CFBundleName" = "damus";
|
||||
|
||||
/* Privacy - Face ID Usage Description */
|
||||
"NSFaceIDUsageDescription" = "Lokalne uwierzytelnienie dostępu do klucza prywatnego";
|
||||
|
||||
/* Privacy - Photo Library Additions Usage Description */
|
||||
"NSPhotoLibraryAddUsageDescription" = "Nadanie Damusowi uprawnień by miał dostęp do Twoich zdjęć umożliwia zapisywanie obrazów.";
|
||||
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -36,8 +35,8 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Dawaj napiwki w reakcji na odpowiedzi znajomych i ciułaj satsy z Bitcoin⚡️, natywną walutą internetu.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "O programie";
|
||||
|
||||
@@ -72,14 +74,20 @@ Number of profiles a user is following. */
|
||||
"Add all" = "Dodaj wszystkie";
|
||||
|
||||
/* Label for section for adding a relay server. */
|
||||
"Add Relay" = "Dodaj serwer";
|
||||
"Add Relay" = "Dodaj przekaźnik";
|
||||
|
||||
/* Label to display relay contact user. */
|
||||
"Admin" = "Admin";
|
||||
|
||||
/* Any amount of sats */
|
||||
"Any" = "Dowolny";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Klucz API (opcjonalny)";
|
||||
|
||||
/* Prompt for required entry of API Key to use translation server. */
|
||||
"API Key (required)" = "Klucz API (wymagany)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
"Are you sure you want to repost this?" = "Na pewno chcesz podać dalej?";
|
||||
|
||||
@@ -118,6 +126,9 @@ Number of profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Blue Wallet. */
|
||||
"Blue Wallet" = "Blue Wallet";
|
||||
|
||||
/* Accessibility label for boosts button */
|
||||
"Boosts" = "Podbij";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Breez. */
|
||||
"Breez" = "Breez";
|
||||
|
||||
@@ -143,7 +154,10 @@ Number of profiles a user is following. */
|
||||
"Clear" = "Wyczyść";
|
||||
|
||||
/* Section title for clearing cached data. */
|
||||
"Clear Cache" = "Wyczyść pamięć podręczną";
|
||||
"Clear Cache" = "Pamięć podręczna";
|
||||
|
||||
/* Label to display relay contact information. */
|
||||
"Contact" = "Kontakt";
|
||||
|
||||
/* Label indicating that a user's key was copied. */
|
||||
"Copied" = "Skopiowano";
|
||||
@@ -192,7 +206,7 @@ Number of profiles a user is following. */
|
||||
"Create Account" = "Utwórz konto";
|
||||
|
||||
/* Title of alert prompting the user to create a new mutelist. */
|
||||
"Create new mutelist" = "Stwórz nową listę wyciszeń";
|
||||
"Create new mutelist" = "Tworzenie nowej listy zablokowanych";
|
||||
|
||||
/* Example description about Bitcoin creator(s), Satoshi Nakamoto. */
|
||||
"Creator(s) of Bitcoin. Absolute legend." = "Twórca/y Bitcoina. Absolutna legenda.";
|
||||
@@ -203,6 +217,9 @@ Number of profiles a user is following. */
|
||||
/* Name of the app, shown on the first screen when user is not logged in. */
|
||||
"Damus" = "Damus";
|
||||
|
||||
/* Dropdown option for selecting DeepL as the translation service. */
|
||||
"DeepL (Proprietary, Higher Accuracy)" = "DeepL (Własnościowy, wysoka dokładność)";
|
||||
|
||||
/* Button to pay a Lightning invoice with the user's default Lightning wallet. */
|
||||
"Default Wallet" = "Portfel domyślny";
|
||||
|
||||
@@ -212,6 +229,16 @@ Number of profiles a user is following. */
|
||||
Section title for deleting the user */
|
||||
"Delete" = "Usuń";
|
||||
|
||||
/* Alert for deleting the users account.
|
||||
Button to delete the user's account. */
|
||||
"Delete Account" = "Skasuj konto";
|
||||
|
||||
/* Alert message to indicate this is a deleted account */
|
||||
"Deleted Account" = "Konto skasowane";
|
||||
|
||||
/* Label to display relay description. */
|
||||
"Description" = "Opis";
|
||||
|
||||
/* Button to dismiss a text field alert. */
|
||||
"Dismiss" = "Odzruć";
|
||||
|
||||
@@ -249,12 +276,18 @@ Number of profiles a user is following. */
|
||||
/* Button to follow a user. */
|
||||
"Follow" = "Obserwuj";
|
||||
|
||||
/* Button to follow a user back. */
|
||||
"Follow Back" = "Obserwuj";
|
||||
|
||||
/* Text on QR code view to prompt viewer looking at screen to follow the user. */
|
||||
"Follow me on nostr" = "Obserwuj mnie na nostr";
|
||||
|
||||
/* Label describing followers of a user. */
|
||||
"Followers" = "Obserwujący";
|
||||
|
||||
/* Text to indicate that the button next to it is in a state that indicates that it is in the process of following a profile.
|
||||
Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Following" = "Obserwowani";
|
||||
"Following" = "Obserwuje";
|
||||
|
||||
/* Label to indicate that the user is in the process of following another user. */
|
||||
"Following..." = "Obserwowani...";
|
||||
@@ -262,11 +295,20 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Text to indicate that button next to it is in a state that will follow a profile when tapped. */
|
||||
"Follows" = "Obserwuje";
|
||||
|
||||
/* Text to indicate that a user is following your profile. */
|
||||
"Follows you" = "Obserwuje Cię";
|
||||
|
||||
/* Dropdown option for selecting Free plan for DeepL translation service. */
|
||||
"Free" = "Darmowy";
|
||||
|
||||
/* Button to navigate to DeepL website to get a translation API key. */
|
||||
"Get API Key" = "Pobierz klucz API";
|
||||
|
||||
/* Navigation bar title for Global view where posts from all connected relay servers appear. */
|
||||
"Global" = "Globalny";
|
||||
|
||||
/* Navigation link to go to post referenced by hex code. */
|
||||
"Goto post %@" = "Idź do wpisu %@";
|
||||
"Goto post %@" = "Idź do postu %@";
|
||||
|
||||
/* Navigation link to go to profile. */
|
||||
"Goto profile %@" = "Idź do profilu %@";
|
||||
@@ -274,7 +316,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Ukryj";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Ukryj klucz API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -304,8 +347,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Jedziemy!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "Tłumaczenia LibreTranslate";
|
||||
/* Dropdown option for selecting LibreTranslate as the translation service. */
|
||||
"LibreTranslate (Open Source)" = "LibraTranslate (Otwarte Źródła)";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Address Lightning lub LNURL";
|
||||
@@ -313,9 +356,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Indicates that the view is for paying a Lightning invoice. */
|
||||
"Lightning Invoice" = "Faktura Lightning";
|
||||
|
||||
/* Accessibility Label for Like button */
|
||||
"Like" = "Polub";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, LNLink. */
|
||||
"LNLink" = "LNLink";
|
||||
|
||||
/* Face ID usage description shown when trying to access private key */
|
||||
"Local authentication to access private key" = "Lokalne uwierzytelnienie dostępu do klucza prywatnego";
|
||||
|
||||
/* Dropdown option label for system default for Lightning wallet. */
|
||||
"Local default" = "Domyślny systemowy";
|
||||
|
||||
@@ -337,19 +386,25 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Label for NIP-05 Verification section of user profile form. */
|
||||
"NIP-05 Verification" = "Weryfikacja NIP-05";
|
||||
|
||||
/* Button to cancel out of posting a note after being alerted that it looks like they might be posting a private key. */
|
||||
"No" = "Nie";
|
||||
|
||||
/* Alert message prompt that asks if the user wants to create a new block list, overwriting previous block lists. */
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Nie znaleziony listy zablokowanych, stworzyć nową? To nadpisze poprzednie listy.";
|
||||
"No block list found, create a new one? This will overwrite any previous block lists." = "Nie znaleziono listy zablokowanych, stworzyć nową? Nadpisać poprzednie listy.";
|
||||
|
||||
/* No search results. */
|
||||
"none" = "brak wyników";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Żaden";
|
||||
|
||||
/* Alert user that they might be attempting to paste a private key and ask them to confirm. */
|
||||
"Note contains \"nsec1\" private key. Are you sure?" = "Treść zawiera klucz prywatny \"nsec1\". Jesteś pewien?";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
"Nothing to see here. Check back later!" = "Nic tu nie ma. Sprawdź później!";
|
||||
|
||||
/* Navigation title for notifications. */
|
||||
/* Toolbar label for Notifications view. */
|
||||
"Notifications" = "Powiadomienia";
|
||||
|
||||
/* String indicating that a given timestamp just occurred */
|
||||
@@ -373,17 +428,20 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Dropdown option label for Lightning wallet, Phoenix. */
|
||||
"Phoenix" = "Phoenix";
|
||||
|
||||
/* Prompt selection of DeepL subscription plan to perform machine translations on notes */
|
||||
"Plan" = "Plan";
|
||||
|
||||
/* Button to post a note. */
|
||||
"Post" = "Wpis";
|
||||
"Post" = "Napisz post";
|
||||
|
||||
/* Text to indicate that what is being shown is a post from a user who has been blocked. */
|
||||
"Post from a user you've blocked" = "Wpis od użytkownika, którego zablokowałeś";
|
||||
"Post from a user you've blocked" = "Post od użytkownika, którego zablokowałeś";
|
||||
|
||||
/* Label for filter for seeing only posts (instead of posts and replies). */
|
||||
"Posts" = "Wpisy";
|
||||
"Posts" = "Posty";
|
||||
|
||||
/* Label for filter for seeing posts and replies (instead of only posts). */
|
||||
"Posts & Replies" = "Wpisy i odpowiedzi";
|
||||
"Posts & Replies" = "Posty i odpowiedzi";
|
||||
|
||||
/* Heading indicating that this application keeps personally identifiable information private. A sentence describing what is done to keep data private comes after this heading. */
|
||||
"Private" = "Prywatność";
|
||||
@@ -391,6 +449,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Title of the secure field that holds the user's private key. */
|
||||
"Private Key" = "Klucz prywatny";
|
||||
|
||||
/* Dropdown option for selecting Pro plan for DeepL translation service. */
|
||||
"Pro" = "Profesjonalny";
|
||||
|
||||
/* Sidebar menu label for Profile view. */
|
||||
"Profile" = "Profil";
|
||||
|
||||
@@ -398,7 +459,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Profile Picture" = "Zdjęcie profilowe";
|
||||
|
||||
/* Section title for the user's public account ID. */
|
||||
"Public Account ID" = "ID publicznego konta";
|
||||
"Public Account ID" = "Publiczny ID konta";
|
||||
|
||||
/* Label indicating that the text is a user's public account key. */
|
||||
"Public key" = "Klucz publiczny";
|
||||
@@ -413,24 +474,27 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Reactions" = "Reakcje";
|
||||
|
||||
/* Section title for recommend relay servers that could be added as part of configuration */
|
||||
"Recommended Relays" = "Serwery rekomendowane";
|
||||
"Recommended Relays" = "Polecane przekaźniki";
|
||||
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Odrzuć";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Serwer";
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Przekaźnik";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
Sidebar menu label for Relays view. */
|
||||
"Relays" = "Serwery";
|
||||
/* Sidebar menu label for Relays view. */
|
||||
"Relays" = "Przekaźniki";
|
||||
|
||||
/* Description of what was done as a result of sending a report to relay servers. */
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "Serwery zostały powiadomione a klienci będą mogli użyć tej informacji do filtrowania treści. Dziękuję!";
|
||||
"Relays have been notified and clients will be able to use this information to filter content. Thank you!" = "Przekaźniki zostały powiadomione a klienci będą mogli użyć tej informacji do filtrowania treści. Dziękuję!";
|
||||
|
||||
/* Button label to remove all participants from a note reply. */
|
||||
"Remove all" = "Usuń wszystkie";
|
||||
|
||||
/* Accessibility label for reply button */
|
||||
"Reply" = "Odpowiedz";
|
||||
|
||||
/* Label to indicate that the user is replying to themself. */
|
||||
"Reply to self" = "Odpowiedz sobie";
|
||||
|
||||
@@ -481,11 +545,14 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Context menu option to save an image. */
|
||||
"Save Image" = "Zapisz obraz";
|
||||
|
||||
/* Text on QR code view to prompt viewer to scan the QR code on screen with their device camera. */
|
||||
"Scan the code" = "Skanuj kod";
|
||||
|
||||
/* Navigation link to search hashtag. */
|
||||
"Search hashtag: #%@" = "Szukaj hasztag: #%@";
|
||||
|
||||
/* Placeholder text to prompt entry of search query. */
|
||||
"Search..." = "Szukanie...";
|
||||
"Search..." = "Szukaj..";
|
||||
|
||||
/* Section title for user's secret account login key. */
|
||||
"Secret Account Login Key" = "Tajny klucz logowania do konta";
|
||||
@@ -502,11 +569,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Prompt selection of LibreTranslate server to perform machine translations on notes */
|
||||
"Server" = "Serwer";
|
||||
|
||||
/* Prompt selection of translation service provider. */
|
||||
"Service" = "Usługa";
|
||||
|
||||
/* Navigation title for Settings view.
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Ustawienia";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Udostępnij";
|
||||
|
||||
@@ -514,7 +585,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Pokaż";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Pokaż klucz API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -523,9 +595,15 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Sidebar menu label to sign out of the account. */
|
||||
"Sign out" = "Wyloguj się";
|
||||
|
||||
/* Label to display relay software. */
|
||||
"Software" = "Oprogramowanie";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Strike. */
|
||||
"Strike" = "Strike";
|
||||
|
||||
/* Label to display relay's supported NIPs. */
|
||||
"Supported NIPs" = "Wspierane NIP";
|
||||
|
||||
/* Button to close out of alert that informs that the action to block a user was successful. */
|
||||
"Thanks!" = "Dzięki!";
|
||||
|
||||
@@ -552,7 +630,16 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Tłumacz wpis";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Tłumaczenie z (languageName!)";
|
||||
"Translated from (lang)" = "Tłumaczenie z (lang)";
|
||||
|
||||
/* Button to indicate that the note is in the process of being translated from a different language. */
|
||||
"Translating from (lang)..." = "Tłumaczę z (lang)...";
|
||||
|
||||
/* Section title for selecting the translation service. */
|
||||
"Translations" = "Tłumaczenia";
|
||||
|
||||
/* Text field prompt asking user to type the word DELETE to confirm that they want to proceed with deleting their account. The all caps lock DELETE word should not be translated. Everything else should. */
|
||||
"Type DELETE to delete" = "Napisz DELETE aby skasować";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Napisz swój post tutaj...";
|
||||
@@ -576,7 +663,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"URL" = "URL";
|
||||
|
||||
/* Alert message to indicate the user has been blocked */
|
||||
"User blocked" = "Użytkownik zablokowany";
|
||||
"User blocked" = "Blokowanie użytkownika";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
"User has been blocked" = "Użytkownik został zablokowany";
|
||||
@@ -585,6 +672,9 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Label to prompt username entry. */
|
||||
"Username" = "Nazwa użytkownika";
|
||||
|
||||
/* Label to display relay software version. */
|
||||
"Version" = "Wersja";
|
||||
|
||||
/* Sidebar menu label for Wallet view. */
|
||||
"Wallet" = "Portfel";
|
||||
|
||||
@@ -607,11 +697,14 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"What do you want to report?" = "Co chcesz zgłosić?";
|
||||
|
||||
/* Placeholder example for relay server address. */
|
||||
"wss://some.relay.com" = "wss://jakis.relay.com";
|
||||
"wss://some.relay.com" = "wss://jakis.przekaznik.com";
|
||||
|
||||
/* Text of button that confirms to overwrite the existing mutelist. */
|
||||
"Yes, Overwrite" = "Tak, nadpisz";
|
||||
|
||||
/* Button to proceed with posting a note even though it looks like they might be posting a private key. */
|
||||
"Yes, Post with Private Key" = "Tak, wyślij pomimo to";
|
||||
|
||||
/* You, in this context, is the person who controls their own social network. You is used in the context of a larger sentence that welcomes the reader to the social network that they control themself. */
|
||||
"you" = "Ty";
|
||||
|
||||
@@ -619,7 +712,10 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Your Name" = "Twoje Imię";
|
||||
|
||||
/* Footer text to inform user what will happen when the report is submitted. */
|
||||
"Your report will be sent to the relays you are connected to" = "Twoje zgłoszenie zostanie wysłane na serwery, do których jesteś podłączony";
|
||||
"Your report will be sent to the relays you are connected to" = "Twoje zgłoszenie zostanie wysłane do przekaźników, do których jesteś podłączony";
|
||||
|
||||
/* Accessibility label for zap button */
|
||||
"Zap" = "Zap";
|
||||
|
||||
/* Dropdown option label for Lightning wallet, Zebedee. */
|
||||
"Zebedee" = "Zebedee";
|
||||
|
||||
@@ -77,15 +77,15 @@
|
||||
<key>many</key>
|
||||
<string>Relays</string>
|
||||
<key>one</key>
|
||||
<string>Serwer</string>
|
||||
<string>Przekaźnik</string>
|
||||
<key>other</key>
|
||||
<string>Serwery</string>
|
||||
<string>Przekaźników</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>replying_to_one_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Odpowiadanie %@%#@OTHERS@</string>
|
||||
<string>W odpowiedzi do %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -107,7 +107,7 @@
|
||||
<key>replying_to_two_and_others</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>Odpowiadanie %@, %@%#@OTHERS@</string>
|
||||
<string>W odpowiedzi do %@, %@%#@OTHERS@</string>
|
||||
<key>OTHERS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
@@ -166,24 +166,24 @@
|
||||
<string>%2$@ satów</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>tips_count</key>
|
||||
<key>zaps_count</key>
|
||||
<dict>
|
||||
<key>NSStringLocalizedFormatKey</key>
|
||||
<string>%#@TIPS@</string>
|
||||
<key>TIPS</key>
|
||||
<string>%#@ZAPS@</string>
|
||||
<key>ZAPS</key>
|
||||
<dict>
|
||||
<key>NSStringFormatSpecTypeKey</key>
|
||||
<string>NSStringPluralRuleType</string>
|
||||
<key>NSStringFormatValueTypeKey</key>
|
||||
<string>d</string>
|
||||
<key>few</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
<key>many</key>
|
||||
<string>Tips</string>
|
||||
<string>Zaps</string>
|
||||
<key>one</key>
|
||||
<string>Napiwek</string>
|
||||
<string>Zap</string>
|
||||
<key>other</key>
|
||||
<string>Napiwki</string>
|
||||
<string>Zapów</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
/* Prefix character to username. */
|
||||
"@" = "@";
|
||||
|
||||
/* Amount of time that has passed since reply quote event occurred.
|
||||
Abbreviated version of a nostr public key. */
|
||||
/* Abbreviated version of a nostr public key. */
|
||||
"%@" = "%@";
|
||||
|
||||
/* Sentence composed of 2 variables to describe how many tip payments there are on a post. In source English, the first variable is the number of tip payments, and the second variable is 'Tip' or 'Tips'.
|
||||
Sentence composed of 2 variables to describe how many profiles a user is following. In source English, the first variable is the number of profiles being followed, and the second variable is 'Following'. */
|
||||
/* Sentence composed of 2 variables to describe how many zap payments there are on a post. In source English, the first variable is the number of zap payments, and the second variable is 'Zap' or 'Zaps'.
|
||||
Sentence composed of 2 variables to describe how many relay servers a user is connected. In source English, the first variable is the number of relay servers, and the second variable is 'Relay' or 'Relays'. */
|
||||
"%@ %@" = "%@ %@";
|
||||
|
||||
/* Alert message that informs a user was blocked. */
|
||||
@@ -36,8 +35,8 @@ Sentence composed of 2 variables to describe how many profiles a user is followi
|
||||
/* Explanation of what can be done by users to earn money. There is a heading that precedes this explanation which is a variable to this string. */
|
||||
"%@. Tip your friend's posts and stack sats with Bitcoin⚡️, the native currency of the internet." = "%@. Dê uma gorjeta aos seus amigos e acumule sats com Bitcoin⚡️, a moeda nativa da Internet.";
|
||||
|
||||
/* Number of tip payments on a post.
|
||||
Number of profiles a user is following. */
|
||||
/* Number of zap payments on a post.
|
||||
Number of relay servers a user is connected. */
|
||||
"%lld" = "%lld";
|
||||
|
||||
/* Fraction of how many of the user's relay servers that are operational. */
|
||||
@@ -46,6 +45,9 @@ Number of profiles a user is following. */
|
||||
/* Placeholder for event mention. */
|
||||
"< e >" = "< e >";
|
||||
|
||||
/* Text indicating the zap amount. i.e. number of satoshis that were tipped to a user */
|
||||
"⚡️ %@" = "⚡️ %@";
|
||||
|
||||
/* Label to prompt for about text entry for user to describe about themself. */
|
||||
"About" = "Acerca de";
|
||||
|
||||
@@ -77,7 +79,7 @@ Number of profiles a user is following. */
|
||||
/* Any amount of sats */
|
||||
"Any" = "Qualquer";
|
||||
|
||||
/* Example URL to LibreTranslate server */
|
||||
/* Prompt for optional entry of API Key to use translation server. */
|
||||
"API Key (optional)" = "Chave API (opcional)";
|
||||
|
||||
/* Alert message to ask if user wants to repost a post. */
|
||||
@@ -274,7 +276,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to hide a post from a user who has been blocked. */
|
||||
"Hide" = "Ocultar";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to hide the DeepL translation API key.
|
||||
Button to hide the LibreTranslate server API key. */
|
||||
"Hide API Key" = "Ocultar Chave API";
|
||||
|
||||
/* Navigation bar title for Home view where posts and replies appear from those who the user is following. */
|
||||
@@ -304,9 +307,6 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to complete account creation and start using the app. */
|
||||
"Let's go!" = "Vamos!";
|
||||
|
||||
/* Section title for selecting the server that hosts the LibreTranslate machine translation API. */
|
||||
"LibreTranslate Translations" = "Traduções LibreTranslate";
|
||||
|
||||
/* Placeholder text for entry of Lightning Address or LNURL. */
|
||||
"Lightning Address or LNURL" = "Endereço Lightning ou LNURL";
|
||||
|
||||
@@ -343,7 +343,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* No search results. */
|
||||
"none" = "nada";
|
||||
|
||||
/* Dropdown option for selecting no translation server. */
|
||||
/* Dropdown option for selecting no translation service. */
|
||||
"None" = "Nenhum";
|
||||
|
||||
/* Indicates that there are no notes in the timeline to view. */
|
||||
@@ -418,7 +418,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
/* Button to reject the end user license agreement, which disallows the user from being let into the app. */
|
||||
"Reject" = "Rejeitar";
|
||||
|
||||
/* Text field for relay server. Used for testing purposes. */
|
||||
/* Label to display relay address.
|
||||
Text field for relay server. Used for testing purposes. */
|
||||
"Relay" = "Relay";
|
||||
|
||||
/* Sidebar menu label for Relay servers view
|
||||
@@ -506,7 +507,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Sidebar menu label for accessing the app settings */
|
||||
"Settings" = "Configurações";
|
||||
|
||||
/* Button to share an image.
|
||||
/* Button to share a post
|
||||
Button to share an image.
|
||||
Button to share the link to a profile. */
|
||||
"Share" = "Partilhar";
|
||||
|
||||
@@ -514,7 +516,8 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
Toggle to show or hide user's secret account login key. */
|
||||
"Show" = "Ver";
|
||||
|
||||
/* Button to hide the LibreTranslate server API key. */
|
||||
/* Button to show the DeepL translation API key.
|
||||
Button to show the LibreTranslate server API key. */
|
||||
"Show API Key" = "Mostrar Chave API";
|
||||
|
||||
/* Toggle to show or hide selection of wallet. */
|
||||
@@ -552,7 +555,7 @@ Part of a larger sentence to describe how many profiles a user is following. */
|
||||
"Translate Note" = "Traduzir Note";
|
||||
|
||||
/* Button to indicate that the note has been translated from a different language. */
|
||||
"Translated from (languageName!)" = "Traduzido de (languageName!)";
|
||||
"Translated from (lang)" = "Traduzido de (lang)";
|
||||
|
||||
/* Text box prompt to ask user to type their post. */
|
||||
"Type your post here..." = "Escreva aqui o seu post...";
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user