diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 000000000..d39e145c1
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+Amethyst
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index fb7f4a8a4..b589d56e9 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index ed76bea38..d7cb58b81 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -5,6 +5,9 @@
+
+
+
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 000000000..0fc311313
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 360e6d41e..6c63d20e1 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
index 223a8cfe7..bc8fcdbc5 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
@@ -88,7 +88,7 @@ class Relay(
"NOTICE" -> listeners.forEach {
//Log.w("Relay", "Relay onNotice $url, $channel")
// "channel" being the second string in the string array ...
- it.onError(this@Relay, channel, Error("Relay sent notice: $channel"))
+ it.onError(this@Relay, channel, Error("Relay sent notice: " + channel))
}
"OK" -> listeners.forEach {
//Log.w("Relay", "Relay onOK $url, $channel")
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
index 3b2b81287..4601c725b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
@@ -21,6 +21,7 @@ import com.vitorpamplona.amethyst.service.relays.Client
import com.vitorpamplona.amethyst.ui.screen.AccountScreen
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.theme.AmethystTheme
+import java.util.Locale
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -61,6 +62,8 @@ class MainActivity : ComponentActivity() {
}
Client.lenient = true
+
+ Locale.setDefault(Locale.ENGLISH)
}
override fun onResume() {
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
index a32f2ed48..400d728d7 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageSaver.kt
@@ -10,6 +10,7 @@ import android.provider.MediaStore
import androidx.annotation.RequiresApi
import androidx.core.net.toUri
import java.io.File
+import com.vitorpamplona.amethyst.R
import okhttp3.*
import okio.BufferedSource
import okio.IOException
@@ -49,7 +50,7 @@ object ImageSaver {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val contentType = response.header("Content-Type")
checkNotNull(contentType) {
- "Can't find out the content type"
+ context.getString(R.string.can_t_find_out_the_content_type)
}
saveContentQ(
@@ -57,6 +58,7 @@ object ImageSaver {
contentType = contentType,
contentSource = response.body.source(),
contentResolver = context.contentResolver,
+ context = context
)
} else {
saveContentDefault(
@@ -80,6 +82,7 @@ object ImageSaver {
contentType: String,
contentSource: BufferedSource,
contentResolver: ContentResolver,
+ context: Context
) {
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, displayName)
@@ -93,13 +96,13 @@ object ImageSaver {
val uri =
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
checkNotNull(uri) {
- "Can't insert the new content"
+ context.getString(R.string.can_t_insert_the_new_content)
}
try {
val outputStream = contentResolver.openOutputStream(uri)
checkNotNull(outputStream) {
- "Can't open the content output stream"
+ context.getString(R.string.can_t_open_the_content_output_stream)
}
outputStream.use {
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt
index fac1d4353..c426c3a71 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/ImageUploader.kt
@@ -1,6 +1,7 @@
package com.vitorpamplona.amethyst.ui.actions
import android.content.ContentResolver
+import android.content.Context
import android.net.Uri
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import java.io.IOException
@@ -8,6 +9,7 @@ import java.util.UUID
import okhttp3.Call
import okhttp3.Callback
import okhttp3.MediaType
+import com.vitorpamplona.amethyst.R
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
@@ -23,6 +25,7 @@ object ImageUploader {
contentResolver: ContentResolver,
onSuccess: (String) -> Unit,
onError: (Throwable) -> Unit,
+ context : Context
) {
val contentType = contentResolver.getType(uri)
@@ -40,7 +43,7 @@ object ImageUploader {
override fun writeTo(sink: BufferedSink) {
val imageInputStream = contentResolver.openInputStream(uri)
checkNotNull(imageInputStream) {
- "Can't open the image input stream"
+ context.getString(R.string.can_t_open_the_image_input_stream)
}
imageInputStream.source().use(sink::writeAll)
@@ -63,7 +66,7 @@ object ImageUploader {
val tree = jacksonObjectMapper().readTree(body.string())
val url = tree?.get("data")?.get("link")?.asText()
checkNotNull(url) {
- "There must be an uploaded image URL in the response"
+ context.getString(R.string.there_must_be_an_uploaded_image_url_in_the_response)
}
onSuccess(url)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewChannelView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewChannelView.kt
index c4758533c..73d514810 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewChannelView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewChannelView.kt
@@ -17,12 +17,15 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.Channel
@@ -67,13 +70,13 @@ fun NewChannelView(onClose: () -> Unit, account: Account, channel: Channel? = nu
Spacer(modifier = Modifier.height(15.dp))
OutlinedTextField(
- label = { Text(text = "Channel Name") },
+ label = { Text(text = stringResource(R.string.channel_name)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.channelName.value,
onValueChange = { postViewModel.channelName.value = it },
placeholder = {
Text(
- text = "My Awesome Group",
+ text = stringResource(R.string.my_awesome_group),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -86,7 +89,7 @@ fun NewChannelView(onClose: () -> Unit, account: Account, channel: Channel? = nu
Spacer(modifier = Modifier.height(15.dp))
OutlinedTextField(
- label = { Text(text = "Picture Url") },
+ label = { Text(text = stringResource(R.string.picture_url)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.channelPicture.value,
onValueChange = { postViewModel.channelPicture.value = it },
@@ -101,13 +104,13 @@ fun NewChannelView(onClose: () -> Unit, account: Account, channel: Channel? = nu
Spacer(modifier = Modifier.height(15.dp))
OutlinedTextField(
- label = { Text(text = "Description") },
+ label = { Text(text = stringResource(R.string.description)) },
modifier = Modifier.fillMaxWidth().height(100.dp),
value = postViewModel.channelDescription.value,
onValueChange = { postViewModel.channelDescription.value = it },
placeholder = {
Text(
- text = "About us.. ",
+ text = stringResource(R.string.about_us),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt
index 30ed23d18..2d76b76a9 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt
@@ -25,6 +25,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.dp
@@ -136,7 +137,7 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n
},
placeholder = {
Text(
- text = "What's on your mind?",
+ text = stringResource(R.string.what_s_on_your_mind),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -221,7 +222,7 @@ fun CloseButton(onCancel: () -> Unit) {
backgroundColor = Color.Gray
)
) {
- Text(text = "Cancel", color = Color.White)
+ Text(text = stringResource(R.string.cancel), color = Color.White)
}
}
@@ -240,7 +241,7 @@ fun PostButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier =
backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray
)
) {
- Text(text = "Post", color = Color.White)
+ Text(text = stringResource(R.string.post), color = Color.White)
}
}
@@ -259,7 +260,7 @@ fun SaveButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier =
backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray
)
) {
- Text(text = "Save", color = Color.White)
+ Text(text = stringResource(R.string.save), color = Color.White)
}
}
@@ -278,7 +279,7 @@ fun CreateButton(onPost: () -> Unit = {}, isActive: Boolean, modifier: Modifier
backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray
)
) {
- Text(text = "Create", color = Color.White)
+ Text(text = stringResource(R.string.create), color = Color.White)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt
index 22755bcb2..37a9114a4 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt
@@ -14,6 +14,7 @@ import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.model.parseDirtyWordForKey
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.components.isValidURL
import com.vitorpamplona.amethyst.ui.components.noProtocolUrlValidator
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -133,9 +134,10 @@ class NewPostViewModel: ViewModel() {
onError = {
isUploadingImage = false
viewModelScope.launch {
- imageUploadingError.emit("Failed to upload the image")
+ imageUploadingError.emit(context.getString(R.string.failed_to_upload_the_image))
}
- }
+ },
+ context = context
)
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt
index 9492fd262..79626ab90 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt
@@ -41,6 +41,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -141,7 +142,7 @@ fun ServerConfigHeader() {
Column(Modifier.weight(1f)) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text(
- text = "Relay Address",
+ text = stringResource(R.string.relay_address),
modifier = Modifier.weight(1f),
maxLines = 1,
overflow = TextOverflow.Ellipsis
@@ -154,7 +155,7 @@ fun ServerConfigHeader() {
Spacer(modifier = Modifier.size(25.dp))
Text(
- text = "Posts",
+ text = stringResource(R.string.posts),
maxLines = 1,
fontSize = 14.sp,
modifier = Modifier.weight(1f),
@@ -164,7 +165,7 @@ fun ServerConfigHeader() {
Spacer(modifier = Modifier.size(10.dp))
Text(
- text = "Posts",
+ text = stringResource(id = R.string.posts),
maxLines = 1,
fontSize = 14.sp,
modifier = Modifier.weight(1f),
@@ -174,7 +175,7 @@ fun ServerConfigHeader() {
Spacer(modifier = Modifier.size(10.dp))
Text(
- text = "Errors",
+ text = stringResource(R.string.errors),
maxLines = 1,
fontSize = 14.sp,
modifier = Modifier.weight(1f),
@@ -227,7 +228,9 @@ fun ServerConfig(
Icon(
imageVector = Icons.Default.Cancel,
null,
- modifier = Modifier.padding(end = 5.dp).size(15.dp),
+ modifier = Modifier
+ .padding(end = 5.dp)
+ .size(15.dp),
tint = Color.Red
)
}
@@ -252,8 +255,10 @@ fun ServerConfig(
) {
Icon(
painterResource(R.drawable.ic_home),
- "Home Feed",
- modifier = Modifier.padding(end = 5.dp).size(15.dp),
+ stringResource(R.string.home_feed),
+ modifier = Modifier
+ .padding(end = 5.dp)
+ .size(15.dp),
tint = if (item.feedTypes.contains(FeedType.FOLLOWS)) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -265,8 +270,10 @@ fun ServerConfig(
) {
Icon(
painterResource(R.drawable.ic_dm),
- "Private Message Feed",
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ stringResource(R.string.private_message_feed),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.feedTypes.contains(FeedType.PRIVATE_DMS)) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -278,8 +285,10 @@ fun ServerConfig(
) {
Icon(
imageVector = Icons.Default.Groups,
- "Public Chat Feed",
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ stringResource(R.string.public_chat_feed),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.feedTypes.contains(FeedType.PUBLIC_CHATS)) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -291,8 +300,10 @@ fun ServerConfig(
) {
Icon(
imageVector = Icons.Default.Public,
- "Global Feed",
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ stringResource(R.string.global_feed),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.feedTypes.contains(FeedType.GLOBAL)) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -310,7 +321,9 @@ fun ServerConfig(
Icon(
imageVector = Icons.Default.Download,
null,
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.read) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -332,7 +345,9 @@ fun ServerConfig(
Icon(
imageVector = Icons.Default.Upload,
null,
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.write) Color.Green else MaterialTheme.colors.onSurface.copy(
alpha = 0.32f
)
@@ -350,7 +365,9 @@ fun ServerConfig(
Icon(
imageVector = Icons.Default.SyncProblem,
null,
- modifier = Modifier.padding(horizontal = 5.dp).size(15.dp),
+ modifier = Modifier
+ .padding(horizontal = 5.dp)
+ .size(15.dp),
tint = if (item.errorCount > 0) Color.Yellow else Color.Green
)
@@ -396,7 +413,7 @@ fun EditableServerConfig(relayToAdd: String, onNewRelay: (RelaySetupInfo) -> Uni
Row(verticalAlignment = Alignment.CenterVertically) {
OutlinedTextField(
- label = { Text(text = "Add a Relay") },
+ label = { Text(text = stringResource(R.string.add_a_relay)) },
modifier = Modifier.weight(1f),
value = url,
onValueChange = { url = it },
@@ -449,7 +466,7 @@ fun EditableServerConfig(relayToAdd: String, onNewRelay: (RelaySetupInfo) -> Uni
backgroundColor = if (url.isNotBlank()) MaterialTheme.colors.primary else MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
) {
- Text(text = "Add", color = Color.White)
+ Text(text = stringResource(id = R.string.add), color = Color.White)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataView.kt
index 24211ba36..b0f032bcc 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataView.kt
@@ -17,11 +17,13 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Account
@OptIn(ExperimentalComposeUiApi::class)
@@ -69,13 +71,13 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Row(modifier = Modifier.fillMaxWidth(1f), verticalAlignment = Alignment.CenterVertically) {
OutlinedTextField(
- label = { Text(text = "Display Name") },
+ label = { Text(text = stringResource(R.string.display_name)) },
modifier = Modifier.weight(1f),
value = postViewModel.displayName.value,
onValueChange = { postViewModel.displayName.value = it },
placeholder = {
Text(
- text = "My display name",
+ text = stringResource(R.string.my_display_name),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -88,13 +90,13 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Text("@", Modifier.padding(5.dp))
OutlinedTextField(
- label = { Text(text = "Username") },
+ label = { Text(text = stringResource(R.string.username)) },
modifier = Modifier.weight(1f),
value = postViewModel.userName.value,
onValueChange = { postViewModel.userName.value = it },
placeholder = {
Text(
- text = "My username",
+ text = stringResource(R.string.my_username),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -105,7 +107,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "About me") },
+ label = { Text(text = stringResource(R.string.about_me)) },
modifier = Modifier
.fillMaxWidth()
.height(100.dp),
@@ -113,7 +115,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
onValueChange = { postViewModel.about.value = it },
placeholder = {
Text(
- text = "About me",
+ text = stringResource(id = R.string.about_me),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -126,7 +128,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "Avatar URL") },
+ label = { Text(text = stringResource(R.string.avatar_url)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.picture.value,
onValueChange = { postViewModel.picture.value = it },
@@ -142,7 +144,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "Banner URL") },
+ label = { Text(text = stringResource(R.string.banner_url)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.banner.value,
onValueChange = { postViewModel.banner.value = it },
@@ -158,7 +160,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "Website URL") },
+ label = { Text(text = stringResource(R.string.website_url)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.website.value,
onValueChange = { postViewModel.website.value = it },
@@ -174,7 +176,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "NIP-05") },
+ label = { Text(text = stringResource(R.string.nip_05)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.nip05.value,
onValueChange = { postViewModel.nip05.value = it },
@@ -189,7 +191,7 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "LN Address") },
+ label = { Text(text = stringResource(R.string.ln_address)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.lnAddress.value,
onValueChange = { postViewModel.lnAddress.value = it },
@@ -205,13 +207,13 @@ fun NewUserMetadataView(onClose: () -> Unit, account: Account) {
Spacer(modifier = Modifier.height(10.dp))
OutlinedTextField(
- label = { Text(text = "LN URL (outdated)") },
+ label = { Text(text = stringResource(R.string.ln_url_outdated)) },
modifier = Modifier.fillMaxWidth(),
value = postViewModel.lnURL.value,
onValueChange = { postViewModel.lnURL.value = it },
placeholder = {
Text(
- text = "LNURL...",
+ text = stringResource(R.string.lnurl),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt
index 7f03f20b3..9e7bc7c3f 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/SaveToGallery.kt
@@ -11,10 +11,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
+import com.vitorpamplona.amethyst.R
import kotlinx.coroutines.launch
/**
@@ -29,6 +31,7 @@ fun SaveToGallery(url: String) {
val localContext = LocalContext.current
val scope = rememberCoroutineScope()
+
fun saveImage() {
ImageSaver.saveImage(
context = localContext,
@@ -37,7 +40,7 @@ fun SaveToGallery(url: String) {
scope.launch {
Toast.makeText(
localContext,
- "Image saved to the gallery",
+ localContext.getString(R.string.image_saved_to_the_gallery),
Toast.LENGTH_SHORT
)
.show()
@@ -47,7 +50,7 @@ fun SaveToGallery(url: String) {
scope.launch {
Toast.makeText(
localContext,
- "Failed to save the image",
+ localContext.getString(R.string.failed_to_save_the_image),
Toast.LENGTH_SHORT
)
.show()
@@ -78,6 +81,6 @@ fun SaveToGallery(url: String) {
backgroundColor = Color.Gray
)
) {
- Text(text = "Save", color = Color.White)
+ Text(text = stringResource(id = R.string.save), color = Color.White)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/UploadFromGallery.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/UploadFromGallery.kt
index 2d4237f11..00e52dd37 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/UploadFromGallery.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/UploadFromGallery.kt
@@ -12,10 +12,12 @@ import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
+import com.vitorpamplona.amethyst.R
@OptIn(ExperimentalPermissionsApi::class)
@Composable
@@ -54,9 +56,9 @@ fun UploadFromGallery(
}
) {
if (!isUploading) {
- Text("Upload Image")
+ Text(stringResource(R.string.upload_image))
} else {
- Text("Uploading…")
+ Text(stringResource(R.string.uploading))
}
}
}
@@ -68,9 +70,9 @@ fun UploadFromGallery(
enabled = !isUploading,
) {
if (!isUploading) {
- Text("Upload Image")
+ Text(stringResource(R.string.upload_image))
} else {
- Text("Uploading…")
+ Text(stringResource(R.string.uploading))
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewChannelButton.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewChannelButton.kt
index 597883024..88a506244 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewChannelButton.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewChannelButton.kt
@@ -16,7 +16,9 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.ui.actions.NewChannelView
@@ -38,7 +40,7 @@ fun NewChannelButton(account: Account) {
) {
Icon(
imageVector = Icons.Outlined.Add,
- contentDescription = "New Channel",
+ contentDescription = stringResource(R.string.new_channel),
modifier = Modifier.size(26.dp),
tint = Color.White
)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt
index 793714cfe..c7db09a6e 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ExpandableRichTextViewer.kt
@@ -25,6 +25,8 @@ import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import com.vitorpamplona.amethyst.R
+import androidx.compose.ui.res.stringResource
@Composable
fun ExpandableRichTextViewer(
@@ -67,7 +69,7 @@ fun ExpandableRichTextViewer(
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Show More", color = Color.White)
+ Text(text = stringResource(R.string.show_more), color = Color.White)
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoicePreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoicePreview.kt
index 4278795c5..fe765a63a 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoicePreview.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoicePreview.kt
@@ -22,6 +22,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -68,7 +69,7 @@ fun InvoicePreview(lnInvoice: String) {
)
Text(
- text = "Lightning Invoice",
+ text = stringResource(R.string.lightning_invoice),
fontSize = 20.sp,
fontWeight = FontWeight.W500,
modifier = Modifier.padding(start = 10.dp)
@@ -79,7 +80,9 @@ fun InvoicePreview(lnInvoice: String) {
amount?.let {
Text(
- text = "${NumberFormat.getInstance().format(amount)} sats",
+ text = "${
+ NumberFormat.getInstance().format(amount)
+ } ${stringResource(id = R.string.sats)}",
fontSize = 25.sp,
fontWeight = FontWeight.W500,
modifier = Modifier
@@ -90,7 +93,9 @@ fun InvoicePreview(lnInvoice: String) {
Button(
- modifier = Modifier.fillMaxWidth().padding(vertical = 10.dp),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 10.dp),
onClick = {
runCatching {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("lightning:$lnInvoice"))
@@ -102,7 +107,7 @@ fun InvoicePreview(lnInvoice: String) {
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text(text = "Pay", color = Color.White, fontSize = 20.sp)
+ Text(text = stringResource(R.string.pay), color = Color.White, fontSize = 20.sp)
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt
index 0d7181fbb..e0e430c0a 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/InvoiceRequest.kt
@@ -30,6 +30,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType
@@ -73,7 +74,7 @@ fun InvoiceRequest(lud16: String, toUserPubKeyHex: String, account: Account, onC
)
Text(
- text = "Lightning Tips",
+ text = stringResource(R.string.lightning_tips),
fontSize = 20.sp,
fontWeight = FontWeight.W500,
modifier = Modifier.padding(start = 10.dp)
@@ -86,13 +87,13 @@ fun InvoiceRequest(lud16: String, toUserPubKeyHex: String, account: Account, onC
var amount by remember { mutableStateOf(1000L) }
OutlinedTextField(
- label = { Text(text = "Note to Receiver") },
+ label = { Text(text = stringResource(R.string.note_to_receiver)) },
modifier = Modifier.fillMaxWidth(),
value = message,
onValueChange = { message = it },
placeholder = {
Text(
- text = "Thank you so much!",
+ text = stringResource(R.string.thank_you_so_much),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -103,7 +104,7 @@ fun InvoiceRequest(lud16: String, toUserPubKeyHex: String, account: Account, onC
)
OutlinedTextField(
- label = { Text(text = "Amount in Sats") },
+ label = { Text(text = stringResource(R.string.amount_in_sats)) },
modifier = Modifier.fillMaxWidth(),
value = amount.toString(),
onValueChange = {
@@ -152,7 +153,7 @@ fun InvoiceRequest(lud16: String, toUserPubKeyHex: String, account: Account, onC
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text(text = "Send Sats", color = Color.White, fontSize = 20.sp)
+ Text(text = stringResource(R.string.send_sats), color = Color.White, fontSize = 20.sp)
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt
index 9d8d5ffca..1d871fcfa 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/TranslateableRichTextViewer.kt
@@ -27,6 +27,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextOverflow
@@ -34,6 +35,7 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.core.os.ConfigurationCompat
import androidx.navigation.NavController
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.lang.LanguageTranslatorService
import com.vitorpamplona.amethyst.service.lang.ResultOrError
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
@@ -110,17 +112,17 @@ fun TranslateableRichTextViewer(
val annotatedTranslationString = buildAnnotatedString {
withStyle(clickableTextStyle) {
pushStringAnnotation("langSettings", true.toString())
- append("Auto")
+ append(stringResource(R.string.auto))
}
- append("-translated from ")
+ append("-${stringResource(R.string.translated_from)} ")
withStyle(clickableTextStyle) {
pushStringAnnotation("showOriginal", true.toString())
append(Locale(source).displayName)
}
- append(" to ")
+ append(" ${stringResource(R.string.to)} ")
withStyle(clickableTextStyle) {
pushStringAnnotation("showOriginal", false.toString())
@@ -163,7 +165,7 @@ fun TranslateableRichTextViewer(
Spacer(modifier = Modifier.size(10.dp))
- Text("Never translate from ${Locale(source).displayName}")
+ Text(stringResource(R.string.never_translate_from) + "${Locale(source).displayName}")
}
Divider()
DropdownMenuItem(onClick = {
@@ -181,7 +183,14 @@ fun TranslateableRichTextViewer(
Spacer(modifier = Modifier.size(10.dp))
- Text("Show in ${Locale(source).displayName} first")
+ // TODO : Rashed translate this
+ Text(
+ "${stringResource(R.string.show_in)} ${Locale(source).displayName} ${
+ stringResource(
+ R.string.first
+ )
+ }"
+ )
}
DropdownMenuItem(onClick = {
accountViewModel.prefer(source, target, target)
@@ -198,7 +207,7 @@ fun TranslateableRichTextViewer(
Spacer(modifier = Modifier.size(10.dp))
- Text("Show in ${Locale(target).displayName} first")
+ Text("${stringResource(id = R.string.show_in)} ${Locale(target).displayName} ${R.string.first}")
}
Divider()
@@ -221,7 +230,7 @@ fun TranslateableRichTextViewer(
Spacer(modifier = Modifier.size(10.dp))
- Text("Always translate to ${lang.displayName}")
+ Text("${stringResource(R.string.always_translate_to)}${lang.displayName}")
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt
index 8157171dd..bd993f872 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt
@@ -8,8 +8,10 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
+import androidx.compose.ui.platform.LocalContext
import com.baha.url.preview.IUrlPreviewCallback
import com.baha.url.preview.UrlInfoItem
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.UrlCachedPreviewer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -18,6 +20,7 @@ import kotlinx.coroutines.withContext
@Composable
fun UrlPreview(url: String, urlText: String) {
val default = UrlCachedPreviewer.cache[url]?.let { UrlPreviewState.Loaded(it) } ?: UrlPreviewState.Loading
+ var context = LocalContext.current
var urlPreviewState by remember { mutableStateOf(default) }
@@ -34,8 +37,13 @@ fun UrlPreview(url: String, urlText: String) {
}
override fun onFailed(throwable: Throwable) {
- urlPreviewState =
- UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}")
+ urlPreviewState = UrlPreviewState.Error(
+ context.getString(
+ R.string.error_parsing_preview_for,
+ url,
+ throwable.message
+ )
+ )
}
})
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt
index 714519e51..98ca76a9d 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewCard.kt
@@ -15,10 +15,12 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.baha.url.preview.UrlInfoItem
+import com.vitorpamplona.amethyst.R
@Composable
fun UrlPreviewCard(
@@ -36,7 +38,7 @@ fun UrlPreviewCard(
Column {
AsyncImage(
model = previewInfo.image,
- contentDescription = "Preview Card Image for ${url}",
+ contentDescription = stringResource(R.string.preview_card_image_for, url),
contentScale = ContentScale.FillWidth,
modifier = Modifier.fillMaxWidth()
)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableAsyncImage.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableAsyncImage.kt
index 14eb5fdc2..34cc1a4e1 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableAsyncImage.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/ZoomableAsyncImage.kt
@@ -17,7 +17,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.stringResource
import coil.compose.AsyncImage
+import com.vitorpamplona.amethyst.R
@Composable
fun ZoomableAsyncImage(imageUrl: String) {
@@ -46,14 +48,16 @@ fun ZoomableAsyncImage(imageUrl: String) {
) {
AsyncImage(
model = imageUrl,
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
contentScale = ContentScale.FillWidth,
- modifier = Modifier.fillMaxSize().graphicsLayer(
- scaleX = scale,
- scaleY = scale,
- translationX = offsetX,
- translationY = offsetY
- ),
+ modifier = Modifier
+ .fillMaxSize()
+ .graphicsLayer(
+ scaleX = scale,
+ scaleY = scale,
+ translationX = offsetX,
+ translationY = offsetY
+ ),
)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt
index 14930babb..0b845a657 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt
@@ -36,6 +36,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
@@ -201,7 +202,7 @@ fun MainTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel)
placeholder = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
modifier = Modifier
.width(34.dp)
.height(34.dp)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt
index 124959f60..acdc717d0 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt
@@ -51,6 +51,8 @@ import com.vitorpamplona.amethyst.ui.components.ResizeImage
import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import kotlinx.coroutines.launch
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.platform.LocalContext
@Composable
fun DrawerContent(navController: NavHostController,
@@ -111,7 +113,7 @@ fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffol
if (banner != null && banner.isNotBlank()) {
AsyncImageProxy(
model = ResizeImage(banner, 150.dp),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
contentScale = ContentScale.FillWidth,
modifier = Modifier
.fillMaxWidth()
@@ -120,7 +122,7 @@ fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffol
} else {
Image(
painter = painterResource(R.drawable.profile_banner),
- contentDescription = "Profile Banner",
+ contentDescription = stringResource(R.string.profile_banner),
contentScale = ContentScale.FillWidth,
modifier = Modifier
.fillMaxWidth()
@@ -131,7 +133,7 @@ fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffol
Column(modifier = modifier) {
AsyncImageProxy(
model = ResizeImage(accountUser.profilePicture(), 100.dp),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
placeholder = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(ctx, accountUser.pubkeyHex)),
@@ -187,11 +189,11 @@ fun ProfileContent(baseAccountUser: User, modifier: Modifier = Modifier, scaffol
})) {
Row() {
Text("${accountUserFollows.follows.size}", fontWeight = FontWeight.Bold)
- Text(" Following")
+ Text(stringResource(R.string.following))
}
Row(modifier = Modifier.padding(start = 10.dp)) {
Text("${accountUserFollows.followers.size}", fontWeight = FontWeight.Bold)
- Text(" Followers")
+ Text(stringResource(R.string.followers))
}
}
}
@@ -216,7 +218,7 @@ fun ListContent(
scaffoldState,
"User/${accountUser.pubkeyHex}",
Route.Profile.icon,
- "Profile"
+ stringResource(R.string.profile)
)
Divider(
@@ -231,14 +233,14 @@ fun ListContent(
}
})) {
Text(
- text = "Security Filters",
+ text = stringResource(R.string.security_filters),
fontSize = 18.sp,
fontWeight = W500
)
}
Row(modifier = Modifier.clickable(onClick = { accountViewModel.logOff() })) {
Text(
- text = "Log out",
+ text = stringResource(R.string.log_out),
modifier = Modifier.padding(vertical = 15.dp),
fontSize = 18.sp,
fontWeight = W500
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt
index de6ccd774..44f54722f 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt
@@ -15,9 +15,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.google.accompanist.flowlayout.FlowRow
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
@@ -37,7 +39,7 @@ fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean = false) {
horizontalArrangement = Arrangement.Center
) {
Text(
- text = "Post not found",
+ text = stringResource(R.string.post_not_found),
modifier = Modifier.padding(30.dp),
color = Color.Gray,
)
@@ -67,7 +69,7 @@ fun HiddenNote(reports: Set, loggedIn: User, modifier: Modifier = Modifier
) {
Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(30.dp)) {
Text(
- text = "Post was flagged as inappropriate by",
+ text = stringResource(R.string.post_was_flagged_as_inappropriate_by),
color = Color.Gray,
)
FlowRow(modifier = Modifier.padding(top = 10.dp)) {
@@ -91,7 +93,7 @@ fun HiddenNote(reports: Set, loggedIn: User, modifier: Modifier = Modifier
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Show Anyway", color = Color.White)
+ Text(text = stringResource(R.string.show_anyway), color = Color.White)
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomCompose.kt
index 08b2896d5..204df89fe 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomCompose.kt
@@ -30,6 +30,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDirection
@@ -38,6 +39,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.vitorpamplona.amethyst.NotificationCache
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.RoboHashCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent
@@ -71,9 +73,9 @@ fun ChatroomCompose(baseNote: Note, accountViewModel: AccountViewModel, navContr
val noteEvent = note.event
val description = if (noteEvent is ChannelCreateEvent) {
- "Channel created"
+ stringResource(R.string.channel_created)
} else if (noteEvent is ChannelMetadataEvent) {
- "Channel Information changed to "
+ "${stringResource(R.string.channel_information_changed_to)} "
} else {
noteEvent?.content
}
@@ -97,7 +99,7 @@ fun ChatroomCompose(baseNote: Note, accountViewModel: AccountViewModel, navContr
style = LocalTextStyle.current.copy(textDirection = TextDirection.Content)
)
Text(
- " Public Chat",
+ " ${stringResource(R.string.public_chat)}",
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -158,7 +160,7 @@ fun ChannelName(
placeholder = channelPicturePlaceholder,
fallback = channelPicturePlaceholder,
error = channelPicturePlaceholder,
- contentDescription = "Channel Image",
+ contentDescription = stringResource(R.string.channel_image),
modifier = Modifier
.width(55.dp)
.height(55.dp)
@@ -182,6 +184,8 @@ fun ChannelName(
hasNewMessages: Boolean,
onClick: () -> Unit
) {
+
+ val context = LocalContext.current
Column(modifier = Modifier.clickable(onClick = onClick) ) {
Row(
modifier = Modifier.padding(start = 12.dp, end = 12.dp, top = 10.dp)
@@ -198,7 +202,7 @@ fun ChannelName(
channelLastTime?.let {
Text(
- timeAgo(channelLastTime),
+ timeAgo(channelLastTime, context),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.52f)
)
}
@@ -217,7 +221,7 @@ fun ChannelName(
)
else
Text(
- "Referenced event not found",
+ stringResource(R.string.referenced_event_not_found),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.52f),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt
index ece9f9be7..8b6fb5539 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ChatroomMessageCompose.kt
@@ -45,6 +45,7 @@ import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
@@ -53,6 +54,7 @@ import androidx.navigation.NavController
import coil.compose.AsyncImage
import com.google.accompanist.flowlayout.FlowRow
import com.vitorpamplona.amethyst.NotificationCache
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.RoboHashCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.service.model.ChannelCreateEvent
@@ -193,7 +195,7 @@ fun ChatroomMessageCompose(
placeholder = BitmapPainter(RoboHashCache.get(context, author.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(context, author.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(context, author.pubkeyHex)),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
modifier = Modifier
.width(25.dp)
.height(25.dp)
@@ -238,15 +240,19 @@ fun ChatroomMessageCompose(
Row(verticalAlignment = Alignment.CenterVertically) {
val event = note.event
if (event is ChannelCreateEvent) {
- Text(text = "${note.author?.toBestDisplayName()} created " +
- "${event.channelInfo.name ?: ""} with " +
- "description of '${event.channelInfo.about ?: ""}', " +
- "and picture '${event.channelInfo.picture ?: ""}'")
+ Text(text = note.author?.toBestDisplayName()
+ .toString() + " ${stringResource(R.string.created)} " + (event.channelInfo.name
+ ?: "") +" ${stringResource(R.string.with_description_of)} '" + (event.channelInfo.about
+ ?: "") + "', ${stringResource(R.string.and_picture)} '" + (event.channelInfo.picture
+ ?: "") + "'"
+ )
} else if (event is ChannelMetadataEvent) {
- Text(text = "${note.author?.toBestDisplayName()} changed " +
- "chat name to '${event.channelInfo.name ?: ""}', " +
- "description to '${event.channelInfo.about ?: ""}', " +
- "and picture to '${event.channelInfo.picture ?: ""}'")
+ Text(text = note.author?.toBestDisplayName()
+ .toString() + " ${stringResource(R.string.changed_chat_name_to)} '" + (event.channelInfo.name
+ ?: "") + "$', {stringResource(R.string.description_to)} '" + (event.channelInfo.about
+ ?: "") + "', ${stringResource(R.string.and_picture_to)} '" + (event.channelInfo.picture
+ ?: "") + "'"
+ )
} else {
val eventContent = accountViewModel.decrypt(note)
@@ -266,7 +272,7 @@ fun ChatroomMessageCompose(
)
} else {
TranslateableRichTextViewer(
- "Could Not decrypt the message",
+ stringResource(R.string.could_not_decrypt_the_message),
true,
Modifier,
note.event?.tags,
@@ -289,7 +295,7 @@ fun ChatroomMessageCompose(
) {
Row() {
Text(
- timeAgoShort(note.event?.createdAt),
+ timeAgoShort(note.event?.createdAt, context),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
fontSize = 12.sp
)
@@ -343,7 +349,7 @@ private fun RelayBadges(baseNote: Note) {
placeholder = BitmapPainter(RoboHashCache.get(ctx, url)),
fallback = BitmapPainter(RoboHashCache.get(ctx, url)),
error = BitmapPainter(RoboHashCache.get(ctx, url)),
- contentDescription = "Relay Icon",
+ contentDescription = stringResource(id = R.string.relay_icon),
colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }),
modifier = Modifier
.fillMaxSize(1f)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
index 406c2d549..161149203 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt
@@ -22,6 +22,7 @@ import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
@@ -186,7 +187,7 @@ fun NoteCompose(
placeholder = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
fallback = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
error = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
- contentDescription = "Group Picture",
+ contentDescription = stringResource(R.string.group_picture),
modifier = Modifier
.width(30.dp)
.height(30.dp)
@@ -235,7 +236,7 @@ fun NoteCompose(
}
Text(
- timeAgo(noteEvent.createdAt),
+ timeAgo(noteEvent.createdAt, context = context),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
maxLines = 1
)
@@ -258,7 +259,7 @@ fun NoteCompose(
if (note.author != null && !makeItShort) {
ObserveDisplayNip05Status(note.author!!)
}
-
+
Spacer(modifier = Modifier.height(3.dp))
if (noteEvent is TextNoteEvent && (note.replyTo != null || note.mentions != null)) {
@@ -316,15 +317,15 @@ fun NoteCompose(
)
}
} else if (noteEvent is ReportEvent) {
- val reportType = (noteEvent.reportedPost + noteEvent.reportedAuthor).map {
- when (it.reportType) {
- ReportEvent.ReportType.EXPLICIT -> "Explicit Content"
- ReportEvent.ReportType.NUDITY -> "Nudity"
- ReportEvent.ReportType.PROFANITY -> "Profanity / Hateful speech"
- ReportEvent.ReportType.SPAM -> "Spam"
- ReportEvent.ReportType.IMPERSONATION -> "Impersonation"
- ReportEvent.ReportType.ILLEGAL -> "Illegal Behavior"
- else -> "Unknown"
+ val reportType = noteEvent.reportType.map {
+ when (it) {
+ ReportEvent.ReportType.EXPLICIT -> stringResource(R.string.explicit_content)
+ ReportEvent.ReportType.NUDITY -> stringResource(R.string.nudity)
+ ReportEvent.ReportType.PROFANITY -> stringResource(R.string.profanity_hateful_speech)
+ ReportEvent.ReportType.SPAM -> stringResource(R.string.spam)
+ ReportEvent.ReportType.IMPERSONATION -> stringResource(R.string.impersonation)
+ ReportEvent.ReportType.ILLEGAL -> stringResource(R.string.illegal_behavior)
+ else -> stringResource(R.string.unknown)
}
}.toSet().joinToString(", ")
@@ -395,7 +396,7 @@ private fun RelayBadges(baseNote: Note) {
placeholder = BitmapPainter(RoboHashCache.get(ctx, url)),
fallback = BitmapPainter(RoboHashCache.get(ctx, url)),
error = BitmapPainter(RoboHashCache.get(ctx, url)),
- contentDescription = "Relay Icon",
+ contentDescription = stringResource(R.string.relay_icon),
colorFilter = ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }),
modifier = Modifier
.fillMaxSize(1f)
@@ -464,7 +465,7 @@ fun NoteAuthorPicture(
if (author == null) {
Image(
painter = BitmapPainter(RoboHashCache.get(ctx, "ohnothisauthorisnotfound")),
- contentDescription = "Unknown Author",
+ contentDescription = stringResource(R.string.unknown_author),
modifier = pictureModifier
.fillMaxSize(1f)
.clip(shape = CircleShape)
@@ -509,7 +510,7 @@ fun UserPicture(
AsyncImageProxy(
model = ResizeImage(user.profilePicture(), size),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
placeholder = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
@@ -548,7 +549,7 @@ fun UserPicture(
Icon(
painter = painterResource(R.drawable.ic_verified),
- "Following",
+ stringResource(id = R.string.following),
modifier = Modifier.fillMaxSize(),
tint = Following
)
@@ -568,17 +569,17 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit,
onDismissRequest = onDismiss
) {
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(accountViewModel.decrypt(note) ?: "")); onDismiss() }) {
- Text("Copy Text")
+ Text(stringResource(R.string.copy_text))
}
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(note.author?.pubkeyNpub() ?: "")); onDismiss() }) {
- Text("Copy User PubKey")
+ Text(stringResource(R.string.copy_user_pubkey))
}
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(note.idNote())); onDismiss() }) {
- Text("Copy Note ID")
+ Text(stringResource(R.string.copy_note_id))
}
Divider()
DropdownMenuItem(onClick = { accountViewModel.broadcast(note); onDismiss() }) {
- Text("Broadcast")
+ Text(stringResource(R.string.broadcast))
}
if (note.author == accountViewModel.accountLiveData.value?.account?.userProfile()) {
Divider()
@@ -596,7 +597,7 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit,
)
}; onDismiss()
}) {
- Text("Block & Hide Author")
+ Text(stringResource(R.string.block_hide_user))
}
Divider()
DropdownMenuItem(onClick = {
@@ -604,7 +605,7 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit,
note.author?.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Spam / Scam")
+ Text(stringResource(R.string.report_spam_scam))
}
DropdownMenuItem(onClick = {
accountViewModel.report(note, ReportEvent.ReportType.PROFANITY);
@@ -618,21 +619,21 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit,
note.author?.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Impersonation")
+ Text(stringResource(R.string.report_impersonation))
}
DropdownMenuItem(onClick = {
accountViewModel.report(note, ReportEvent.ReportType.NUDITY);
note.author?.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Nudity")
+ Text(stringResource(R.string.report_nudity_porn))
}
DropdownMenuItem(onClick = {
accountViewModel.report(note, ReportEvent.ReportType.ILLEGAL);
note.author?.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Illegal Behaviour")
+ Text(stringResource(R.string.report_illegal_behaviour))
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt
index 78202757d..70e23fe5d 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt
@@ -47,6 +47,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType
@@ -141,7 +142,7 @@ fun ReplyReaction(
scope.launch {
Toast.makeText(
context,
- "Login with a Private key to be able to reply",
+ context.getString(R.string.login_with_a_private_key_to_be_able_to_reply),
Toast.LENGTH_SHORT
).show()
}
@@ -193,7 +194,7 @@ private fun BoostReaction(
scope.launch {
Toast.makeText(
context,
- "Login with a Private key to be able to boost posts",
+ context.getString(R.string.login_with_a_private_key_to_be_able_to_boost_posts),
Toast.LENGTH_SHORT
).show()
}
@@ -264,7 +265,7 @@ fun LikeReaction(
scope.launch {
Toast.makeText(
context,
- "Login with a Private key to like Posts",
+ context.getString(R.string.login_with_a_private_key_to_like_posts),
Toast.LENGTH_SHORT
).show()
}
@@ -329,7 +330,7 @@ fun ZapReaction(
Toast
.makeText(
context,
- "No Zap Amount Setup. Long Press to change",
+ context.getString(R.string.no_zap_amount_setup_long_press_to_change),
Toast.LENGTH_SHORT
)
.show()
@@ -339,7 +340,7 @@ fun ZapReaction(
Toast
.makeText(
context,
- "Login with a Private key to be able to send Zaps",
+ context.getString(R.string.login_with_a_private_key_to_be_able_to_send_zaps),
Toast.LENGTH_SHORT
)
.show()
@@ -386,14 +387,14 @@ fun ZapReaction(
if (zappedNote?.isZappedBy(account.userProfile()) == true) {
Icon(
imageVector = Icons.Default.Bolt,
- contentDescription = "Zaps",
+ contentDescription = stringResource(R.string.zaps),
modifier = Modifier.size(20.dp),
tint = BitcoinOrange
)
} else {
Icon(
imageVector = Icons.Outlined.Bolt,
- contentDescription = "Zaps",
+ contentDescription = stringResource(id = R.string.zaps),
modifier = Modifier.size(20.dp),
tint = grayTint
)
@@ -433,7 +434,7 @@ private fun ViewCountReaction(baseNote: Note, textModifier: Modifier = Modifier)
.diskCachePolicy(CachePolicy.DISABLED)
.memoryCachePolicy(CachePolicy.ENABLED)
.build(),
- contentDescription = "View count",
+ contentDescription = stringResource(R.string.view_count),
modifier = Modifier.height(24.dp),
colorFilter = ColorFilter.tint(grayTint)
)
@@ -461,7 +462,7 @@ private fun BoostTypeChoicePopup(baseNote: Note, accountViewModel: AccountViewMo
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text("Boost", color = Color.White, textAlign = TextAlign.Center)
+ Text(stringResource(R.string.boost), color = Color.White, textAlign = TextAlign.Center)
}
Button(
@@ -473,7 +474,7 @@ private fun BoostTypeChoicePopup(baseNote: Note, accountViewModel: AccountViewMo
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text("Quote", color = Color.White, textAlign = TextAlign.Center)
+ Text(stringResource(R.string.quote), color = Color.White, textAlign = TextAlign.Center)
}
}
}
@@ -640,7 +641,7 @@ fun UpdateZapAmountDialog(onClose: () -> Unit, account: Account) {
Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
OutlinedTextField(
- label = { Text(text = "New Amount in Sats") },
+ label = { Text(text = stringResource(R.string.new_amount_in_sats)) },
value = postViewModel.nextAmount,
onValueChange = {
postViewModel.nextAmount = it
@@ -656,7 +657,9 @@ fun UpdateZapAmountDialog(onClose: () -> Unit, account: Account) {
)
},
singleLine = true,
- modifier = Modifier.padding(end = 10.dp).weight(1f)
+ modifier = Modifier
+ .padding(end = 10.dp)
+ .weight(1f)
)
Button(
@@ -667,7 +670,7 @@ fun UpdateZapAmountDialog(onClose: () -> Unit, account: Account) {
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text(text = "Add", color = Color.White)
+ Text(text = stringResource(R.string.add), color = Color.White)
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/RelayCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/RelayCompose.kt
index 38b84afbf..05bee3dcf 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/RelayCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/RelayCompose.kt
@@ -17,10 +17,13 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.RelayInfo
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import java.time.Instant
@@ -38,6 +41,8 @@ fun RelayCompose(
val accountState by accountViewModel.accountLiveData.observeAsState()
val account = accountState?.account ?: return
+ val context = LocalContext.current
+
Column() {
Row(
modifier = Modifier
@@ -58,13 +63,13 @@ fun RelayCompose(
)
Text(
- timeAgo(relay.lastEvent),
+ timeAgo(relay.lastEvent, context = context),
maxLines = 1
)
}
Text(
- "${relay.counter} posts received",
+ "${relay.counter} ${stringResource(R.string.posts_received)}",
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
maxLines = 1,
overflow = TextOverflow.Ellipsis
@@ -99,7 +104,7 @@ fun AddRelayButton(onClick: () -> Unit) {
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Add", color = Color.White)
+ Text(text = stringResource(id = R.string.add), color = Color.White)
}
}
@@ -115,7 +120,7 @@ fun RemoveRelayButton(onClick: () -> Unit) {
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Remove", color = Color.White)
+ Text(text = stringResource(R.string.remove), color = Color.White)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt
index e43f25412..5d64ec1ee 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt
@@ -7,6 +7,9 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.stringResource
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@@ -15,6 +18,7 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.google.accompanist.flowlayout.FlowRow
import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Channel
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
@@ -37,7 +41,7 @@ fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Ac
val repliesToDisplay = if (expanded) mentions else mentions.take(2)
Text(
- "replying to ",
+ stringResource(R.string.replying_to),
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -62,7 +66,7 @@ fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Ac
)
} else if (idx < repliesToDisplay.size - 1) {
Text(
- " and ",
+ " ${stringResource(R.string.and)} ",
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -76,7 +80,7 @@ fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Ac
)
} else if (idx < repliesToDisplay.size) {
Text(
- " and ",
+ " ${stringResource(R.string.and)} ",
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -88,7 +92,7 @@ fun ReplyInformation(replyTo: List?, dupMentions: List?, account: Ac
)
Text(
- " others",
+ " ${stringResource(R.string.others)}",
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -128,7 +132,7 @@ fun ReplyInformationChannel(replyTo: List?,
FlowRow() {
Text(
- "in channel ",
+ stringResource(R.string.in_channel),
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -142,7 +146,7 @@ fun ReplyInformationChannel(replyTo: List?,
if (mentions != null && mentions.isNotEmpty()) {
if (replyTo != null && replyTo.isNotEmpty()) {
Text(
- "replying to ",
+ stringResource(id = R.string.replying_to),
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
@@ -168,7 +172,7 @@ fun ReplyInformationChannel(replyTo: List?,
)
} else if (idx < mentionSet.size - 1) {
Text(
- " and ",
+ " ${stringResource(id = R.string.add)} ",
fontSize = 13.sp,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt
index 15fd6e134..17e23b7ed 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt
@@ -1,10 +1,12 @@
package com.vitorpamplona.amethyst.ui.note
+import android.content.Context
import android.text.format.DateUtils
+import com.vitorpamplona.amethyst.R
-fun timeAgo(mills: Long?): String {
+fun timeAgo(mills: Long?, context : Context): String {
if (mills == null) return " "
- if (mills == 0L) return " • never"
+ if (mills == 0L) return " • ${context.getString(R.string.never)}"
var humanReadable = DateUtils.getRelativeTimeSpanString(
mills * 1000,
@@ -13,16 +15,16 @@ fun timeAgo(mills: Long?): String {
DateUtils.FORMAT_ABBREV_ALL
).toString()
if (humanReadable.startsWith("In") || humanReadable.startsWith("0")) {
- humanReadable = "now";
+ humanReadable = context.getString(R.string.now);
}
return " • " + humanReadable
- .replace(" hr. ago", "h")
- .replace(" min. ago", "m")
- .replace(" days ago", "d")
+ .replace(" hr. ago", context.getString(R.string.h))
+ .replace(" min. ago", context.getString(R.string.m))
+ .replace(" days ago", context.getString(R.string.d))
}
-fun timeAgoShort(mills: Long?): String {
+fun timeAgoShort(mills: Long?, context: Context): String {
if (mills == null) return " "
var humanReadable = DateUtils.getRelativeTimeSpanString(
@@ -32,13 +34,13 @@ fun timeAgoShort(mills: Long?): String {
DateUtils.FORMAT_ABBREV_ALL
).toString()
if (humanReadable.startsWith("In") || humanReadable.startsWith("0")) {
- humanReadable = "now";
+ humanReadable = context.getString(R.string.now);
}
return humanReadable
}
-fun timeAgoLong(mills: Long?): String {
+fun timeAgoLong(mills: Long?, context: Context): String {
if (mills == null) return " "
var humanReadable = DateUtils.getRelativeTimeSpanString(
@@ -48,7 +50,7 @@ fun timeAgoLong(mills: Long?): String {
DateUtils.FORMAT_SHOW_TIME
).toString()
if (humanReadable.startsWith("In") || humanReadable.startsWith("0")) {
- humanReadable = "now";
+ humanReadable = context.getString(R.string.now);
}
return humanReadable
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt
index 50461f7e8..fc6773590 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapNoteCompose.kt
@@ -15,11 +15,14 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
+import com.vitorpamplona.amethyst.LocalPreferences
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.service.model.LnZapEvent
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
@@ -94,7 +97,7 @@ fun ZapNoteCompose(baseNote: Pair, accountViewModel: AccountViewMode
verticalArrangement = Arrangement.Center
) {
Text(
- showAmount(amount) + " sats",
+ "${showAmount(amount)} ${stringResource(R.string.sats)}",
color = BitcoinOrange,
fontSize = 20.sp,
fontWeight = FontWeight.W500,
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt
index 7cad35716..1fd50f2c7 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ZapSetCompose.kt
@@ -24,10 +24,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.google.accompanist.flowlayout.FlowRow
import com.vitorpamplona.amethyst.NotificationCache
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent
import com.vitorpamplona.amethyst.ui.screen.ZapSetCard
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
@@ -94,9 +96,11 @@ fun ZapSetCompose(zapSetCard: ZapSetCard, modifier: Modifier = Modifier, isInner
.padding(0.dp)) {
Icon(
imageVector = Icons.Default.Bolt,
- contentDescription = "Zaps",
+ contentDescription = stringResource(id = R.string.zaps),
tint = BitcoinOrange,
- modifier = Modifier.size(25.dp).align(Alignment.TopEnd)
+ modifier = Modifier
+ .size(25.dp)
+ .align(Alignment.TopEnd)
)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt
index 7e191b8b0..8e4976619 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/qrcode/ShowQRDialog.kt
@@ -28,11 +28,15 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
+import coil.compose.AsyncImage
+import coil.compose.rememberAsyncImagePainter
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.RoboHashCache
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.ui.actions.CloseButton
@@ -83,7 +87,7 @@ fun ShowQRDialog(user: User, onScan: (String) -> Unit, onClose: () -> Unit) {
placeholder = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(ctx, user.pubkeyHex)),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(R.string.profile_image),
modifier = Modifier
.width(100.dp)
.height(100.dp)
@@ -129,7 +133,7 @@ fun ShowQRDialog(user: User, onScan: (String) -> Unit, onClose: () -> Unit) {
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text(text = "Scan QR")
+ Text(text = stringResource(R.string.scan_qr))
}
}
@@ -137,7 +141,7 @@ fun ShowQRDialog(user: User, onScan: (String) -> Unit, onClose: () -> Unit) {
Row(horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth()) {
Text(
- "Point to the QR Code",
+ stringResource(R.string.point_to_the_qr_code),
modifier = Modifier.padding(top = 7.dp),
fontWeight = FontWeight.Bold,
fontSize = 25.sp
@@ -167,7 +171,7 @@ fun ShowQRDialog(user: User, onScan: (String) -> Unit, onClose: () -> Unit) {
backgroundColor = MaterialTheme.colors.primary
)
) {
- Text(text = "Show QR")
+ Text(text = stringResource(R.string.show_qr))
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt
index 06a8dbcbd..2e554cee8 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt
@@ -22,10 +22,12 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.note.NoteCompose
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
@@ -122,7 +124,7 @@ fun LoadingFeed() {
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
- Text("Loading feed")
+ Text(stringResource(R.string.loading_feed))
}
}
@@ -135,12 +137,12 @@ fun FeedError(errorMessage: String, onRefresh: () -> Unit) {
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
- Text("Error loading replies: $errorMessage")
+ Text("${stringResource(R.string.error_loading_replies)} $errorMessage")
Button(
modifier = Modifier.align(Alignment.CenterHorizontally),
onClick = onRefresh
) {
- Text(text = "Try again")
+ Text(text = stringResource(R.string.try_again))
}
}
}
@@ -154,9 +156,9 @@ fun FeedEmpty(onRefresh: () -> Unit) {
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
- Text("Feed is empty.")
+ Text(stringResource(R.string.feed_is_empty))
OutlinedButton(onClick = onRefresh) {
- Text(text = "Refresh")
+ Text(text = stringResource(R.string.refresh))
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt
index 2f46795a7..62cfc7ed4 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/ThreadFeedView.kt
@@ -50,6 +50,7 @@ import com.vitorpamplona.amethyst.ui.note.ReactionsRow
import com.vitorpamplona.amethyst.ui.note.timeAgo
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import kotlinx.coroutines.delay
+import androidx.compose.ui.platform.LocalContext
@Composable
fun ThreadFeedView(noteId: String, viewModel: FeedViewModel, accountViewModel: AccountViewModel, navController: NavController) {
@@ -192,6 +193,8 @@ fun NoteMaster(baseNote: Note,
var showHiddenNote by remember { mutableStateOf(false) }
+ val context = LocalContext.current
+
var moreActionsExpanded by remember { mutableStateOf(false) }
val noteEvent = note?.event
@@ -232,7 +235,7 @@ fun NoteMaster(baseNote: Note,
NoteUsernameDisplay(baseNote, Modifier.weight(1f))
Text(
- timeAgo(noteEvent.createdAt),
+ timeAgo(noteEvent.createdAt, context = context),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
maxLines = 1
)
@@ -286,4 +289,4 @@ fun NoteMaster(baseNote: Note,
}
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
index 16965d5b9..66e702358 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
@@ -8,6 +8,7 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.map
import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.AccountState
import com.vitorpamplona.amethyst.model.Note
@@ -51,7 +52,7 @@ class AccountViewModel(private val account: Account): ViewModel() {
val lud16 = note.author?.info?.lud16?.trim() ?: note.author?.info?.lud06?.trim()
if (lud16.isNullOrBlank()) {
- onError("User does not have a lightning address setup to receive sats")
+ onError(context.getString(R.string.user_does_not_have_a_lightning_address_setup_to_receive_sats))
return
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt
index 8e2fdfb9a..d756c98ec 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChannelScreen.kt
@@ -47,6 +47,7 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
@@ -59,6 +60,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.RoboHashCache
import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.Channel
@@ -183,7 +185,7 @@ fun ChannelScreen(channelId: String?, accountViewModel: AccountViewModel, accoun
modifier = Modifier.weight(1f, true),
placeholder = {
Text(
- text = "reply here.. ",
+ text = stringResource(R.string.reply_here),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -226,7 +228,7 @@ fun ChannelHeader(baseChannel: Channel, account: Account, accountStateViewModel:
placeholder = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
fallback = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
error = BitmapPainter(RoboHashCache.get(context, channel.idHex)),
- contentDescription = "Profile Image",
+ contentDescription = context.getString(R.string.profile_image),
modifier = Modifier
.width(35.dp)
.height(35.dp)
@@ -302,7 +304,7 @@ private fun NoteCopyButton(
Icon(
tint = Color.White,
imageVector = Icons.Default.Share,
- contentDescription = "Copies the Note ID to the clipboard for sharing"
+ contentDescription = stringResource(R.string.copies_the_note_id_to_the_clipboard_for_sharing)
)
DropdownMenu(
@@ -310,7 +312,7 @@ private fun NoteCopyButton(
onDismissRequest = { popupExpanded = false }
) {
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(note.idNote())); popupExpanded = false }) {
- Text("Copy Channel ID (Note) to the Clipboard")
+ Text(stringResource(R.string.copy_channel_id_note_to_the_clipboard))
}
}
}
@@ -339,7 +341,7 @@ private fun EditButton(account: Account, channel: Channel) {
Icon(
tint = Color.White,
imageVector = Icons.Default.EditNote,
- contentDescription = "Edits the Channel Metadata"
+ contentDescription = stringResource(R.string.edits_the_channel_metadata)
)
}
}
@@ -359,7 +361,7 @@ private fun JoinButton(account: Account, channel: Channel, navController: NavCon
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Join", color = Color.White)
+ Text(text = stringResource(R.string.join), color = Color.White)
}
}
@@ -378,6 +380,6 @@ private fun LeaveButton(account: Account, channel: Channel, navController: NavCo
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Leave", color = Color.White)
+ Text(text = stringResource(R.string.leave), color = Color.White)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt
index e6e9bceaf..4572dabd9 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomListScreen.kt
@@ -16,6 +16,7 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
@@ -32,6 +33,7 @@ import com.vitorpamplona.amethyst.ui.screen.ChatroomListFeedView
import com.vitorpamplona.amethyst.ui.screen.NostrChatroomListKnownFeedViewModel
import com.vitorpamplona.amethyst.ui.screen.NostrChatroomListNewFeedViewModel
import kotlinx.coroutines.launch
+import com.vitorpamplona.amethyst.R
@OptIn(ExperimentalPagerApi::class)
@Composable
@@ -57,7 +59,7 @@ fun ChatroomListScreen(accountViewModel: AccountViewModel, navController: NavCon
selected = pagerState.currentPage == 0,
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(0) } },
text = {
- Text(text = "Known")
+ Text(text = stringResource(R.string.known))
}
)
@@ -65,7 +67,7 @@ fun ChatroomListScreen(accountViewModel: AccountViewModel, navController: NavCon
selected = pagerState.currentPage == 1,
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(1) } },
text = {
- Text(text = "New Requests")
+ Text(text = stringResource(R.string.new_requests))
}
)
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt
index e98b0a2f5..4fc443540 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ChatroomScreen.kt
@@ -39,6 +39,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextDirection
@@ -47,6 +48,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.RoboHashCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
@@ -169,7 +171,7 @@ fun ChatroomScreen(userId: String?, accountViewModel: AccountViewModel, navContr
shape = RoundedCornerShape(25.dp),
placeholder = {
Text(
- text = "reply here.. ",
+ text = stringResource(id = R.string.reply_here),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -216,7 +218,7 @@ fun ChatroomHeader(baseUser: User, accountViewModel: AccountViewModel, navContro
placeholder = BitmapPainter(RoboHashCache.get(ctx, author.pubkeyHex)),
fallback = BitmapPainter(RoboHashCache.get(ctx, author.pubkeyHex)),
error = BitmapPainter(RoboHashCache.get(ctx, author.pubkeyHex)),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
modifier = Modifier
.width(35.dp)
.height(35.dp)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/FiltersScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/FiltersScreen.kt
index f290c01ed..bc35e3740 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/FiltersScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/FiltersScreen.kt
@@ -13,6 +13,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
@@ -20,6 +21,7 @@ import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.pagerTabIndicatorOffset
import com.google.accompanist.pager.rememberPagerState
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.ui.dal.HiddenAccountsFeedFilter
import com.vitorpamplona.amethyst.ui.screen.NostrHiddenAccountsFeedViewModel
import com.vitorpamplona.amethyst.ui.screen.UserFeedView
@@ -55,7 +57,7 @@ fun FiltersScreen(accountViewModel: AccountViewModel, navController: NavControll
selected = pagerState.currentPage == 0,
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(0) } },
text = {
- Text(text = "Blocked Users")
+ Text(text = stringResource(R.string.blocked_users))
}
)
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt
index 10c4a6b4e..ba0586e0b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt
@@ -16,6 +16,7 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
@@ -25,6 +26,7 @@ import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.pagerTabIndicatorOffset
import com.google.accompanist.pager.rememberPagerState
+import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.service.NostrHomeDataSource
import com.vitorpamplona.amethyst.ui.dal.HomeConversationsFeedFilter
import com.vitorpamplona.amethyst.ui.dal.HomeNewThreadFeedFilter
@@ -74,7 +76,7 @@ fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController)
selected = pagerState.currentPage == 0,
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(0) } },
text = {
- Text(text = "New Threads")
+ Text(text = stringResource(R.string.new_threads))
}
)
@@ -82,7 +84,7 @@ fun HomeScreen(accountViewModel: AccountViewModel, navController: NavController)
selected = pagerState.currentPage == 1,
onClick = { coroutineScope.launch { pagerState.animateScrollToPage(1) } },
text = {
- Text(text = "Conversations")
+ Text(text = stringResource(R.string.conversations))
}
)
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt
index 31e4720bf..179d99abf 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt
@@ -31,6 +31,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
@@ -179,34 +180,34 @@ fun ProfileScreen(userId: String?, accountViewModel: AccountViewModel, navContro
) {
val tabs = listOf<@Composable() (() -> Unit)?>(
{
- Text(text = "Notes")
+ Text(text = stringResource(R.string.notes))
},
{
- Text(text = "Replies")
+ Text(text = stringResource(R.string.replies))
},
{
val userState by baseUser.live().follows.observeAsState()
val userFollows = userState?.user?.follows?.size ?: "--"
- Text(text = "$userFollows Follows")
+ Text(text = "$userFollows ${stringResource(R.string.follows)}")
},
{
val userState by baseUser.live().follows.observeAsState()
- val userFollows = userState?.user?.followers?.size ?: "--"
+ val userFollowers = userState?.user?.followers?.size ?: "--"
- Text(text = "$userFollows Followers")
+ Text(text = "$userFollowers ${stringResource(id = R.string.followers)}")
},
{
val userState by baseUser.live().zaps.observeAsState()
val userZaps = userState?.user?.zappedAmount()
- Text(text = "${showAmount(userZaps)} Zaps")
+ Text(text = "${showAmount(userZaps)} ${stringResource(id = R.string.zaps)}")
},
{
val userState by baseUser.live().reports.observeAsState()
val userReports = userState?.user?.reports?.values?.flatten()?.count()
- Text(text = "${userReports} Reports")
+ Text(text = "${userReports.toString()} ${stringResource(R.string.reports)}")
},
{
val userState by baseUser.live().relays.observeAsState()
@@ -215,7 +216,7 @@ fun ProfileScreen(userId: String?, accountViewModel: AccountViewModel, navContro
val userStateRelayInfo by baseUser.live().relayInfo.observeAsState()
val userRelays = userStateRelayInfo?.user?.relays?.size ?: "--"
- Text(text = "$userRelaysBeingUsed / $userRelays Relays")
+ Text(text = "$userRelaysBeingUsed / $userRelays ${stringResource(R.string.relays)}")
}
)
@@ -288,7 +289,7 @@ private fun ProfileHeader(
Icon(
tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
imageVector = Icons.Default.MoreVert,
- contentDescription = "More Options",
+ contentDescription = stringResource(R.string.more_options),
)
UserProfileDropDownMenu(baseUser, popupExpanded, { popupExpanded = false }, accountViewModel)
@@ -386,7 +387,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account) {
Icon(
tint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
imageVector = Icons.Default.Link,
- contentDescription = "Website",
+ contentDescription = stringResource(R.string.website),
modifier = Modifier.size(16.dp)
)
@@ -408,7 +409,7 @@ private fun DrawAdditionalInfo(baseUser: User, account: Account) {
Icon(
tint = BitcoinOrange,
imageVector = Icons.Default.Bolt,
- contentDescription = "Lightning Address",
+ contentDescription = stringResource(R.string.lightning_address),
modifier = Modifier.size(16.dp)
)
@@ -450,7 +451,7 @@ private fun DrawBanner(baseUser: User) {
if (banner != null && banner.isNotBlank()) {
AsyncImageProxy(
model = ResizeImage(banner, 125.dp),
- contentDescription = "Profile Image",
+ contentDescription = stringResource(id = R.string.profile_image),
contentScale = ContentScale.FillWidth,
modifier = Modifier
.fillMaxWidth()
@@ -459,7 +460,7 @@ private fun DrawBanner(baseUser: User) {
} else {
Image(
painter = painterResource(R.drawable.profile_banner),
- contentDescription = "Profile Banner",
+ contentDescription = stringResource(id = R.string.profile_banner),
contentScale = ContentScale.FillWidth,
modifier = Modifier
.fillMaxWidth()
@@ -638,7 +639,7 @@ private fun NSecCopyButton(
Icon(
tint = Color.White,
imageVector = Icons.Default.Key,
- contentDescription = "Copies the Nsec ID (your password) to the clipboard for backup"
+ contentDescription = stringResource(R.string.copies_the_nsec_id_your_password_to_the_clipboard_for_backup)
)
DropdownMenu(
@@ -646,7 +647,7 @@ private fun NSecCopyButton(
onDismissRequest = { popupExpanded = false }
) {
DropdownMenuItem(onClick = { account.loggedIn.privKey?.let { clipboardManager.setText(AnnotatedString(it.toNsec())) }; popupExpanded = false }) {
- Text("Copy Private Key to the Clipboard")
+ Text(stringResource(R.string.copy_private_key_to_the_clipboard))
}
}
}
@@ -673,7 +674,7 @@ private fun NPubCopyButton(
Icon(
tint = Color.White,
imageVector = Icons.Default.Share,
- contentDescription = "Copies the public key to the clipboard for sharing"
+ contentDescription = stringResource(R.string.copies_the_public_key_to_the_clipboard_for_sharing)
)
DropdownMenu(
@@ -681,7 +682,7 @@ private fun NPubCopyButton(
onDismissRequest = { popupExpanded = false }
) {
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(user.pubkeyNpub())); popupExpanded = false }) {
- Text("Copy Public Key (NPub) to the Clipboard")
+ Text(stringResource(R.string.copy_public_key_npub_to_the_clipboard))
}
}
}
@@ -702,7 +703,7 @@ private fun MessageButton(user: User, navController: NavController) {
) {
Icon(
painter = painterResource(R.drawable.ic_dm),
- "Send a Direct Message",
+ stringResource(R.string.send_a_direct_message),
modifier = Modifier.size(20.dp),
tint = Color.White
)
@@ -732,7 +733,7 @@ private fun EditButton(account: Account) {
Icon(
tint = Color.White,
imageVector = Icons.Default.EditNote,
- contentDescription = "Edits the User's Metadata"
+ contentDescription = stringResource(R.string.edits_the_user_s_metadata)
)
}
}
@@ -749,7 +750,7 @@ fun UnfollowButton(onClick: () -> Unit) {
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Unfollow", color = Color.White)
+ Text(text = stringResource(R.string.unfollow), color = Color.White)
}
}
@@ -765,7 +766,7 @@ fun FollowButton(onClick: () -> Unit) {
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Follow", color = Color.White, textAlign = TextAlign.Center)
+ Text(text = stringResource(R.string.follow), color = Color.White, textAlign = TextAlign.Center)
}
}
@@ -781,7 +782,7 @@ fun ShowUserButton(onClick: () -> Unit) {
),
contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp)
) {
- Text(text = "Unblock", color = Color.White)
+ Text(text = stringResource(R.string.unblock), color = Color.White)
}
}
@@ -799,7 +800,7 @@ fun UserProfileDropDownMenu(user: User, popupExpanded: Boolean, onDismiss: () ->
onDismissRequest = onDismiss
) {
DropdownMenuItem(onClick = { clipboardManager.setText(AnnotatedString(user.pubkeyNpub())); onDismiss() }) {
- Text("Copy User ID")
+ Text(stringResource(R.string.copy_user_id))
}
if ( account.userProfile() != user) {
@@ -813,11 +814,11 @@ fun UserProfileDropDownMenu(user: User, popupExpanded: Boolean, onDismiss: () ->
)
}; onDismiss()
}) {
- Text("Unblock User")
+ Text(stringResource(R.string.unblock_user))
}
} else {
DropdownMenuItem(onClick = { user.let { accountViewModel.hide(it, context) }; onDismiss() }) {
- Text("Block & Hide User")
+ Text(stringResource(id = R.string.block_hide_user))
}
}
Divider()
@@ -826,35 +827,35 @@ fun UserProfileDropDownMenu(user: User, popupExpanded: Boolean, onDismiss: () ->
user.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Spam / Scam")
+ Text(stringResource(id = R.string.report_spam_scam))
}
DropdownMenuItem(onClick = {
accountViewModel.report(user, ReportEvent.ReportType.PROFANITY);
user.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Hateful speech")
+ Text(stringResource(R.string.report_hateful_speech))
}
DropdownMenuItem(onClick = {
accountViewModel.report(user, ReportEvent.ReportType.IMPERSONATION);
user.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Impersonation")
+ Text(stringResource(id = R.string.report_impersonation))
}
DropdownMenuItem(onClick = {
accountViewModel.report(user, ReportEvent.ReportType.NUDITY);
user.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Nudity / Porn")
+ Text(stringResource(R.string.report_nudity_porn))
}
DropdownMenuItem(onClick = {
accountViewModel.report(user, ReportEvent.ReportType.ILLEGAL);
user.let { accountViewModel.hide(it, context) }
onDismiss()
}) {
- Text("Report Illegal Behaviour")
+ Text(stringResource(id = R.string.report_illegal_behaviour))
}
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt
index 443d78fe1..b90293bf6 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt
@@ -40,6 +40,7 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.style.TextOverflow
@@ -202,7 +203,7 @@ private fun SearchBar(accountViewModel: AccountViewModel, navController: NavCont
.defaultMinSize(minHeight = 20.dp),
placeholder = {
Text(
- text = "npub, hex, username ",
+ text = stringResource(R.string.npub_hex_username),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -220,7 +221,7 @@ private fun SearchBar(accountViewModel: AccountViewModel, navController: NavCont
) {
Icon(
imageVector = Icons.Default.Clear,
- contentDescription = "Clear"
+ contentDescription = stringResource(R.string.clear)
)
}
}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt
index 25e80f3c7..f72ece25b 100644
--- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt
@@ -38,8 +38,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
@@ -60,6 +62,7 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
val acceptedTerms = remember { mutableStateOf(false) }
var termsAcceptanceIsRequired by remember { mutableStateOf("") }
val uri = LocalUriHandler.current
+ val context = LocalContext.current
Column(
modifier = Modifier
@@ -81,7 +84,7 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
Image(
painterResource(id = R.drawable.amethyst),
- contentDescription = "App Logo",
+ contentDescription = stringResource(R.string.app_logo),
modifier = Modifier.size(200.dp),
contentScale = ContentScale.Inside
)
@@ -102,7 +105,7 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
),
placeholder = {
Text(
- text = "nsec / npub / hex private key",
+ text = stringResource(R.string.nsec_npub_hex_private_key),
color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
)
},
@@ -110,7 +113,8 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
IconButton(onClick = { showPassword = !showPassword }) {
Icon(
imageVector = if (showPassword) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility,
- contentDescription = if (showPassword) "Show Password" else "Hide Password"
+ contentDescription = if (showPassword) stringResource(R.string.show_password) else stringResource(
+ R.string.hide_password)
)
}
},
@@ -120,7 +124,7 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
try {
accountViewModel.login(key.value.text)
} catch (e: Exception) {
- errorMessage = "Invalid key"
+ errorMessage = context.getString(R.string.invalid_key)
}
}
)
@@ -141,10 +145,10 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
onCheckedChange = { acceptedTerms.value = it }
)
- Text(text = "I accept the ")
+ Text(text = stringResource(R.string.i_accept_the))
ClickableText(
- text = AnnotatedString("terms of use"),
+ text = AnnotatedString(stringResource(R.string.terms_of_use)),
onClick = { runCatching { uri.openUri("https://github.com/vitorpamplona/amethyst/blob/main/PRIVACY.md") } },
style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary),
)
@@ -164,18 +168,18 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
Button(
onClick = {
if (!acceptedTerms.value) {
- termsAcceptanceIsRequired = "Acceptance of terms is required"
+ termsAcceptanceIsRequired = context.getString(R.string.acceptance_of_terms_is_required)
}
if (key.value.text.isBlank()) {
- errorMessage = "Key is required"
+ errorMessage = context.getString(R.string.key_is_required)
}
if (acceptedTerms.value && key.value.text.isNotBlank()) {
try {
accountViewModel.login(key.value.text)
} catch (e: Exception) {
- errorMessage = "Invalid key"
+ errorMessage = context.getString(R.string.invalid_key)
}
}
},
@@ -188,14 +192,14 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
backgroundColor = if (acceptedTerms.value) MaterialTheme.colors.primary else Color.Gray
)
) {
- Text(text = "Login")
+ Text(text = stringResource(R.string.login))
}
}
}
// The last child is glued to the bottom.
ClickableText(
- text = AnnotatedString("Generate a new key"),
+ text = AnnotatedString(stringResource(R.string.generate_a_new_key)),
modifier = Modifier
.padding(20.dp)
.fillMaxWidth(),
@@ -203,7 +207,7 @@ fun LoginPage(accountViewModel: AccountStateViewModel) {
if (acceptedTerms.value) {
accountViewModel.newKey()
} else {
- termsAcceptanceIsRequired = "Acceptance of terms is required"
+ termsAcceptanceIsRequired = context.getString(R.string.acceptance_of_terms_is_required)
}
},
style = TextStyle(
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
new file mode 100644
index 000000000..415d73e56
--- /dev/null
+++ b/app/src/main/res/values-ar/strings.xml
@@ -0,0 +1,178 @@
+
+
+ Amethyst
+ Amethyst Debug
+ أشر إلى رمز QR
+ أظهر QR
+ صورة الملف الشخصي
+ مسح QR
+ عرض على أي حال
+ تم وضع علامة على المنشور على أنه غير لائق بواسطة
+ المنشور غير موجود
+ صورة القناة
+ لم يتم العثور على الحدث المشار إليه
+ لا يمكن فك تشفير الرسالة
+ صورة المجموعة
+ محتوى فاضح
+ رسائل عشوائية
+ التمثيل
+ تصرف غير قانوني
+ غير معروف
+ Relay Icon
+ كاتب غير معروف
+ نسخ النص
+ نسخ المفتاح العام
+ نسخ معرف
+ بث
+ حظر و إخفاء المستخدم
+ الابلاغ عن البريد العشوائي / الاحتيال
+ الإبلاغ عن التمثيل
+ الإبلاغ عن المحتوى الصريح / الفاضح
+ الإبلاغ عن سلوك غير قانوني
+ قم بتسجيل الدخول باستخدام مفتاح خاص لتتمكن من الرد
+ قم بتسجيل الدخول باستخدام مفتاح خاص لتتمكن من تعزيز المشاركات
+ تسجيل الدخول باستخدام مفتاح خاص لإبداء الإعجاب بالمنشورات
+ لا يوجد إعداد لمبلغ Zap. اضغط لفترة طويلة للتغيير
+ قم بتسجيل الدخول باستخدام مفتاح خاص لتتمكن من إرسال Zaps
+ Zaps
+ مشاهدة العد
+ تعزيز
+ إقتباس
+ مبلغ جديد في Sats
+ إضافة
+ الرد على
+ " و "
+ "في القناة "
+ لافتة الملف الشخصي
+ المتابعون
+ متابِعاً
+ الملف الشخصي
+ مرشحات الأمان
+ تسجيل الخروج
+ إظهار المزيد
+ Lightning فاتورة
+ اإدفع
+ Lightning تبرع
+ ملاحظة للمستقبل
+ شكرا جزيلا!
+ المبلغ في Sats
+ إرسال Sats
+ "لا تترجم ابداً من "
+ خطأ في تحليل المعاينة لـ %1$s : %2$s
+ معاينة صورة البطاقة لـ %1$s
+ قناة جديدة
+ لا يمكن معرفة نوع المحتوى
+ لا يمكن إدراج المحتوى الجديد
+ لا يمكن فتح دفق إخراج المحتوى
+ لا يمكن فتح دفق إدخال الصورة
+ يجب أن يكون هناك عنوان URL للصورة التي تم تحميلها في الاستجابة
+ اسم القناة
+ مجموعتي الرائعة
+ رابط الصورة
+ الوصف
+ معلومات عن القناة..
+ ما الذي يدور في ذهنك؟
+ نشر
+ حفظ
+ إنشاء
+ إلغاء
+ فشل تحميل الصورة
+ Relay عنوان
+ المنشورات
+ الأخطاء
+ المنشورات الرئيسية
+ الرسائل الخاصة
+ الرسائل العامة
+ الموجز العام
+ أضف Relay
+ إسم العرض
+ إسم العرض الخاص بي
+ اسم المستخدم
+ اسم المستخدم الخاص بي
+ ْعَنِّي
+ رابط الصورة الزمزية
+ رابط الشعار
+ رابط الموقع
+ LN عنوان
+ LN رابط (قديم)
+ تم حفظ الصورة في المعرض
+ فشل حفظ الصورة
+ تحميل الصورة
+ جاري التحميل…
+ لا يمتلك المستخدم إعداد عنوان lighting لاستقبال sats
+ "الرد هنا.. "
+ نسخ معرف الملاحظة إلى الحافظة للمشاركة
+ انسخ معرف القناة (ملاحظة) إلى الحافظة
+ تعديل البيانات الوصفية للقناة
+ إنضمام
+ معروف
+ طلبات جديدة
+ المستخدمين المحظورين
+ المنشورات
+ المحادثات
+ الملاحظات
+ الردود
+ المتابَعون
+ التقارير
+ المزيد من الخيارات
+ Relays
+ الموقع
+ Lightning عنوان
+ نسخ معرف Nsec (كلمة المرور الخاصة بك) إلى الحافظة للنسخ الاحتياطي
+ نسخ المفتاح الخاص إلى الحافظة
+ نسخ المفتاح العام إلى الحافظة للمشاركة
+ انسخ المفتاح العام (NPub) إلى الحافظة
+ إرسال رسالة مباشرة
+ القيام بتحرير metadata للمستخدم
+ متابعة
+ رفع الحظر
+ نسخ معرف المستخدم
+ إلغاء حظر عن مستخدم
+ npub, hex, username
+ نظف
+ شعار التطبيق
+ nsec / npub / hex private key
+ إظهار كلمة السر
+ اخفاء كلمة السر
+ مفتاح غير صحيح
+ "اقبل شروط الاستخدام "
+ شروط الاستخدام
+ يجب قبول شروط الإستخدام
+ المفتاح مطلوب
+ تسجيل دخول
+ إنشاء مفتاح جديد
+ بإنتظار التحديثات
+ خطأ في تحميل الردود:
+ المحاولة مرة اخرى
+ لا توجد ملاحظات.
+ تحديث
+ انشئ
+ مع وصف
+ و صورة
+ تم تغيير اسم الدردشة إلى
+ الوصف الى
+ و الصورة الى
+ مغادرة
+ الغاء المتابعة
+ تم انشاء القناة
+ تم تغيير معلومات القناة إلى
+ الدردشة العامة
+ تم استلام المشاركات
+ ازالة
+ تلقائي
+ مترجم من
+ الى
+ تظهر في
+ اولا
+ ترجمة إلى
+ ابداً
+ الان
+ س
+ د
+ يوم
+ عُري
+ الألفاظ النابية / خطاب كراهية
+ أبلغ عن كلام يحض على الكراهية
+ الإبلاغ عن عُري / إباحي
+ others
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 562719f05..012ed8bf1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,4 +1,180 @@
- Amethyst
- Amethyst Debug
+ Amethyst
+ Amethyst Debug
+ Point to the QR Code
+ Show QR
+ Profile Image
+ Scan QR
+ Show Anyway
+ Post was flagged as inappropriate by
+ post not found
+ Channel Image
+ Referenced event not found
+ Could Not decrypt the message
+ Group Picture
+ Explicit Content
+ Spam
+ Impersonation
+ Illegal Behavior
+ Unknown
+ Relay Icon
+ Unknown Author
+ Copy Text
+ Copy User PubKey
+ Copy Note ID
+ Broadcast
+
+ Report Spam / Scam
+ Report Impersonation
+ Report Explicit Content
+ Report Illegal Behaviour
+ Login with a Private key to be able to reply
+ Login with a Private key to be able to boost posts
+ Login with a Private key to like Posts
+ No Zap Amount Setup. Long Press to change
+ Login with a Private key to be able to send Zaps
+ Zaps
+ View count
+ Boost
+ Quote
+ New Amount in Sats
+ Add
+ "replying to "
+ " and "
+ "in channel "
+ Profile Banner
+ "Following"
+ "Followers"
+ Profile
+ Security Filters
+ Log out
+ Show More
+ Lightning Invoice
+ Pay
+ Lightning Tips
+ Note to Receiver
+ Thank you so much!
+ Amount in Sats
+ Send Sats
+ "Never translate from "
+ "Error parsing preview for %1$s : %2$s"
+ "Preview Card Image for %1$s"
+ New Channel
+ Can\'t find out the content type
+ Can\'t insert the new content
+ Can\'t open the content output stream
+ Can\'t open the image input stream
+ There must be an uploaded image URL in the response
+ Channel Name
+ My Awesome Group
+ Picture Url
+ Description
+ "About us.. "
+ What\'s on your mind?
+ Post
+ Save
+ Create
+ Cancel
+ Failed to upload the image
+ Relay Address
+ Posts
+ Errors
+ Home Feed
+ Private Message Feed
+ Public Chat Feed
+ Global Feed
+ Add a Relay
+ Display Name
+ My display name
+ Username
+ My username
+ About me
+ Avatar URL
+ Banner URL
+ Website URL
+ LN Address
+ LN URL (outdated)
+ Image saved to the gallery
+ Failed to save the image
+ Upload Image
+ Uploading…
+ User does not have a lightning address setup to receive sats
+ "reply here.. "
+ Copies the Note ID to the clipboard for sharing
+ Copy Channel ID (Note) to the Clipboard
+ Edits the Channel Metadata
+ Join
+ Known
+ New Requests
+ Blocked Users
+ New Threads
+ Conversations
+ Notes
+ Replies
+ "Follows"
+ "Reports"
+ More Options
+ " Relays"
+ Website
+ Lightning Address
+ Copies the Nsec ID (your password) to the clipboard for backup
+ Copy Private Key to the Clipboard
+ Copies the public key to the clipboard for sharing
+ Copy Public Key (NPub) to the Clipboard
+ Send a Direct Message
+ Edits the User\'s Metadata
+ Follow
+ Unblock
+ Copy User ID
+ Unblock User
+ "npub, hex, username "
+ Clear
+ App Logo
+ nsec / npub / hex private key
+ Show Password
+ Hide Password
+ Invalid key
+ "I accept the "
+ terms of use
+ Acceptance of terms is required
+ Key is required
+ Login
+ Generate a new key
+ Loading feed
+ "Error loading replies: "
+ Try again
+ Feed is empty.
+ Refresh
+ created
+ with description of
+ and picture
+ changed chat name to
+ description to
+ and picture to
+ Leave
+ Unfollow
+ Channel created
+ "Channel Information changed to"
+ Public Chat
+ posts received
+ Remove
+ sats
+ Auto
+ translated from
+ to
+ Show in
+ first
+ Always translate to
+ NIP-05
+ LNURL...
+ never
+ now
+ h
+ m
+ d
+ Nudity
+ Profanity / Hateful speech
+ Report Hateful speech
+ Report Nudity / Porn
+ others
\ No newline at end of file