Commit 01f2a14d authored by Leonardo Aramaki's avatar Leonardo Aramaki

Add support for (un)muted states

parent 4b1f14a7
...@@ -38,6 +38,7 @@ import chat.rocket.android.util.extension.compressImageAndGetByteArray ...@@ -38,6 +38,7 @@ import chat.rocket.android.util.extension.compressImageAndGetByteArray
import chat.rocket.android.util.extension.getByteArray import chat.rocket.android.util.extension.getByteArray
import chat.rocket.android.util.extension.launchUI import chat.rocket.android.util.extension.launchUI
import chat.rocket.android.util.extensions.avatarUrl import chat.rocket.android.util.extensions.avatarUrl
import chat.rocket.android.util.extensions.exhaustive
import chat.rocket.android.util.retryIO import chat.rocket.android.util.retryIO
import chat.rocket.common.RocketChatException import chat.rocket.common.RocketChatException
import chat.rocket.common.model.RoomType import chat.rocket.common.model.RoomType
...@@ -137,9 +138,12 @@ class ChatRoomPresenter @Inject constructor( ...@@ -137,9 +138,12 @@ class ChatRoomPresenter @Inject constructor(
} finally { } finally {
// User has at least an 'owner' or 'moderator' role. // User has at least an 'owner' or 'moderator' role.
val userCanMod = isOwnerOrMod() val userCanMod = isOwnerOrMod()
val chatRoom = dbManager.getRoom(roomId)
val muted = chatRoom?.chatRoom?.muted ?: emptyList()
// Can post anyway if has the 'post-readonly' permission on server. // Can post anyway if has the 'post-readonly' permission on server.
val userCanPost = userCanMod || permissions.canPostToReadOnlyChannels() val userCanPost = userCanMod || permissions.canPostToReadOnlyChannels() ||
chatIsBroadcast = dbManager.getRoom(roomId)?.chatRoom?.run { !muted.contains(currentLoggedUsername)
chatIsBroadcast = chatRoom?.chatRoom?.run {
broadcast broadcast
} ?: false } ?: false
view.onRoomUpdated(userCanPost, chatIsBroadcast, userCanMod) view.onRoomUpdated(userCanPost, chatIsBroadcast, userCanMod)
......
...@@ -763,9 +763,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -763,9 +763,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
private fun setupMessageComposer(canPost: Boolean) { private fun setupMessageComposer(canPost: Boolean) {
if (isReadOnly && !canPost) { if (!canPost) {
text_room_is_read_only.isVisible = true text_room_is_read_only.isVisible = true
input_container.isVisible = false input_container.isVisible = false
text_room_is_read_only.setText(
if (isReadOnly) {
R.string.msg_this_room_is_read_only
} else {
// Not a read-only channel but user has been muted.
R.string.msg_muted_on_this_channel
}
)
} else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) { } else if (!isSubscribed && roomTypeOf(chatRoomType) !is RoomType.DirectMessage) {
input_container.isVisible = false input_container.isVisible = false
button_join_chat.isVisible = true button_join_chat.isVisible = true
......
...@@ -14,5 +14,6 @@ data class RoomUiModel( ...@@ -14,5 +14,6 @@ data class RoomUiModel(
val alert: Boolean = false, val alert: Boolean = false,
val lastMessage: CharSequence? = null, val lastMessage: CharSequence? = null,
val status: UserStatus? = null, val status: UserStatus? = null,
val username: String? = null val username: String? = null,
) val muted: List<String> = emptyList()
\ No newline at end of file )
...@@ -56,7 +56,8 @@ class ChatRoomsPresenter @Inject constructor( ...@@ -56,7 +56,8 @@ class ChatRoomsPresenter @Inject constructor(
type = type.toString(), type = type.toString(),
name = username ?: name.toString(), name = username ?: name.toString(),
fullname = name.toString(), fullname = name.toString(),
open = open open = open,
muted = muted
) )
loadChatRoom(entity, false) loadChatRoom(entity, false)
} }
......
...@@ -27,7 +27,7 @@ import kotlinx.coroutines.experimental.launch ...@@ -27,7 +27,7 @@ import kotlinx.coroutines.experimental.launch
import kotlinx.coroutines.experimental.newSingleThreadContext import kotlinx.coroutines.experimental.newSingleThreadContext
import kotlinx.coroutines.experimental.withContext import kotlinx.coroutines.experimental.withContext
import timber.log.Timber import timber.log.Timber
import java.security.InvalidParameterException import java.lang.IllegalArgumentException
import kotlin.coroutines.experimental.coroutineContext import kotlin.coroutines.experimental.coroutineContext
...@@ -171,6 +171,6 @@ fun Query.asSortingOrder(): ChatRoomsRepository.Order { ...@@ -171,6 +171,6 @@ fun Query.asSortingOrder(): ChatRoomsRepository.Order {
ChatRoomsRepository.Order.ACTIVITY ChatRoomsRepository.Order.ACTIVITY
} }
} }
else -> throw InvalidParameterException("Should be ByName or ByActivity") else -> throw IllegalArgumentException("Should be ByName or ByActivity")
} }
} }
...@@ -41,13 +41,12 @@ import timber.log.Timber ...@@ -41,13 +41,12 @@ import timber.log.Timber
import java.util.HashSet import java.util.HashSet
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
class DatabaseManager(val context: Application, class DatabaseManager(val context: Application, val serverUrl: String) {
val serverUrl: String) {
private val database: RCDatabase = androidx.room.Room.databaseBuilder(context, private val database: RCDatabase = androidx.room.Room.databaseBuilder(context,
RCDatabase::class.java, serverUrl.databaseName()) RCDatabase::class.java, serverUrl.databaseName())
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.build() .build()
private val dbContext = newSingleThreadContext("$serverUrl-db-context") private val dbContext = newSingleThreadContext("$serverUrl-db-context")
private val dbManagerContext = newSingleThreadContext("$serverUrl-db-manager-context") private val dbManagerContext = newSingleThreadContext("$serverUrl-db-manager-context")
...@@ -124,11 +123,11 @@ class DatabaseManager(val context: Application, ...@@ -124,11 +123,11 @@ class DatabaseManager(val context: Application,
val toInsert = ArrayList<ChatRoomEntity>(batch.size / 2) val toInsert = ArrayList<ChatRoomEntity>(batch.size / 2)
val toUpdate = ArrayList<ChatRoomEntity>(batch.size) val toUpdate = ArrayList<ChatRoomEntity>(batch.size)
batch.forEach { batch.forEach {
when(it.type) { when (it.type) {
is Type.Removed -> toRemove.add(removeChatRoom(it.data)) is Type.Removed -> toRemove.add(removeChatRoom(it.data))
is Type.Inserted -> insertChatRoom(it.data)?.let { toInsert.add(it) } is Type.Inserted -> insertChatRoom(it.data)?.let { toInsert.add(it) }
is Type.Updated -> { is Type.Updated -> {
when(it.data) { when (it.data) {
is Subscription -> updateSubs[(it.data as Subscription).roomId] = it.data as Subscription is Subscription -> updateSubs[(it.data as Subscription).roomId] = it.data as Subscription
is Room -> updateRooms[(it.data as Room).id] = it.data as Room is Room -> updateRooms[(it.data as Room).id] = it.data as Room
} }
...@@ -154,10 +153,10 @@ class DatabaseManager(val context: Application, ...@@ -154,10 +153,10 @@ class DatabaseManager(val context: Application,
launch(dbManagerContext) { launch(dbManagerContext) {
val user = userDao().getUser(myself.id) val user = userDao().getUser(myself.id)
val entity = user?.copy( val entity = user?.copy(
name = myself.name ?: user.name, name = myself.name ?: user.name,
username = myself.username ?: user.username, username = myself.username ?: user.username,
utcOffset = myself.utcOffset ?: user.utcOffset, utcOffset = myself.utcOffset ?: user.utcOffset,
status = myself.status?.toString() ?: user.status status = myself.status?.toString() ?: user.status
) ?: myself.asUser().toEntity() ) ?: myself.asUser().toEntity()
Timber.d("UPDATING SELF: $entity") Timber.d("UPDATING SELF: $entity")
...@@ -187,7 +186,7 @@ class DatabaseManager(val context: Application, ...@@ -187,7 +186,7 @@ class DatabaseManager(val context: Application,
private suspend fun createMessageEntities(message: Message): Pair<MessageEntity, List<BaseMessageEntity>> { private suspend fun createMessageEntities(message: Message): Pair<MessageEntity, List<BaseMessageEntity>> {
val messageEntity = message.toEntity() val messageEntity = message.toEntity()
val list = mutableListOf<BaseMessageEntity>() val list = mutableListOf<BaseMessageEntity>()
createAttachments(message)?.let { list.addAll(it) } createAttachments(message)?.let { list.addAll(it) }
createFavoriteRelations(message)?.let { list.addAll(it) } createFavoriteRelations(message)?.let { list.addAll(it) }
createMentionRelations(message)?.let { list.addAll(it) } createMentionRelations(message)?.let { list.addAll(it) }
createChannelRelations(message)?.let { list.addAll(it) } createChannelRelations(message)?.let { list.addAll(it) }
...@@ -225,7 +224,7 @@ class DatabaseManager(val context: Application, ...@@ -225,7 +224,7 @@ class DatabaseManager(val context: Application,
val list = mutableListOf<UrlEntity>() val list = mutableListOf<UrlEntity>()
message.urls!!.forEach { url -> message.urls!!.forEach { url ->
list.add(UrlEntity(message.id, url.url, url.parsedUrl?.host, url.meta?.title, list.add(UrlEntity(message.id, url.url, url.parsedUrl?.host, url.meta?.title,
url.meta?.description, url.meta?.imageUrl)) url.meta?.description, url.meta?.imageUrl))
} }
return list return list
...@@ -329,7 +328,7 @@ class DatabaseManager(val context: Application, ...@@ -329,7 +328,7 @@ class DatabaseManager(val context: Application,
} }
private fun removeChatRoom(data: BaseRoom): String { private fun removeChatRoom(data: BaseRoom): String {
return when(data) { return when (data) {
is Subscription -> data.roomId is Subscription -> data.roomId
else -> data.id else -> data.id
} }
...@@ -344,14 +343,15 @@ class DatabaseManager(val context: Application, ...@@ -344,14 +343,15 @@ class DatabaseManager(val context: Application,
insertUserIfMissing(user) insertUserIfMissing(user)
chatRoom.copy( chatRoom.copy(
name = name ?: chatRoom.name, name = name ?: chatRoom.name,
fullname = fullName ?: chatRoom.fullname, fullname = fullName ?: chatRoom.fullname,
ownerId = user?.id ?: chatRoom.ownerId, ownerId = user?.id ?: chatRoom.ownerId,
readonly = readonly, readonly = readonly,
updatedAt = updatedAt ?: chatRoom.updatedAt, updatedAt = updatedAt ?: chatRoom.updatedAt,
lastMessageText = mapLastMessageText(lastMessage), lastMessageText = mapLastMessageText(lastMessage),
lastMessageUserId = lastMessage?.sender?.id, lastMessageUserId = lastMessage?.sender?.id,
lastMessageTimestamp = lastMessage?.timestamp lastMessageTimestamp = lastMessage?.timestamp,
muted = muted
) )
} }
} }
...@@ -386,30 +386,32 @@ class DatabaseManager(val context: Application, ...@@ -386,30 +386,32 @@ class DatabaseManager(val context: Application,
val chatRoom = current.chatRoom val chatRoom = current.chatRoom
chatRoom.copy( chatRoom.copy(
id = roomId, id = roomId,
subscriptionId = id, subscriptionId = id,
type = type.toString(), type = type.toString(),
name = name ?: throw NullPointerException(), // this should be filtered on the SDK name = name
fullname = fullName ?: chatRoom.fullname, ?: throw NullPointerException(), // this should be filtered on the SDK
userId = userId ?: chatRoom.userId, fullname = fullName ?: chatRoom.fullname,
readonly = readonly ?: chatRoom.readonly, userId = userId ?: chatRoom.userId,
isDefault = isDefault, readonly = readonly ?: chatRoom.readonly,
favorite = isFavorite, isDefault = isDefault,
open = open, favorite = isFavorite,
alert = alert, open = open,
unread = unread, alert = alert,
userMentions = userMentions ?: chatRoom.userMentions, unread = unread,
groupMentions = groupMentions ?: chatRoom.groupMentions, userMentions = userMentions ?: chatRoom.userMentions,
updatedAt = updatedAt ?: chatRoom.updatedAt, groupMentions = groupMentions ?: chatRoom.groupMentions,
timestamp = timestamp ?: chatRoom.timestamp, updatedAt = updatedAt ?: chatRoom.updatedAt,
lastSeen = lastSeen ?: chatRoom.lastSeen timestamp = timestamp ?: chatRoom.timestamp,
lastSeen = lastSeen ?: chatRoom.lastSeen,
muted = chatRoom.muted
) )
} }
} }
} }
private suspend fun insertChatRoom(data: BaseRoom): ChatRoomEntity? { private suspend fun insertChatRoom(data: BaseRoom): ChatRoomEntity? {
return when(data) { return when (data) {
is Room -> insertRoom(data) is Room -> insertRoom(data)
is Subscription -> insertSubscription(data) is Subscription -> insertSubscription(data)
else -> null else -> null
...@@ -451,7 +453,8 @@ class DatabaseManager(val context: Application, ...@@ -451,7 +453,8 @@ class DatabaseManager(val context: Application,
id = room.id, id = room.id,
subscriptionId = subscription.id, subscriptionId = subscription.id,
type = room.type.toString(), type = room.type.toString(),
name = room.name ?: subscription.name ?: throw NullPointerException(), // this should be filtered on the SDK name = room.name ?: subscription.name
?: throw NullPointerException(), // this should be filtered on the SDK
fullname = subscription.fullName ?: room.fullName, fullname = subscription.fullName ?: room.fullName,
userId = userId, userId = userId,
ownerId = room.user?.id, ownerId = room.user?.id,
...@@ -506,7 +509,8 @@ class DatabaseManager(val context: Application, ...@@ -506,7 +509,8 @@ class DatabaseManager(val context: Application,
lastMessageText = mapLastMessageText(lastMessage), lastMessageText = mapLastMessageText(lastMessage),
lastMessageUserId = lastMessage?.sender?.id, lastMessageUserId = lastMessage?.sender?.id,
lastMessageTimestamp = lastMessage?.timestamp, lastMessageTimestamp = lastMessage?.timestamp,
broadcast = broadcast broadcast = broadcast,
muted = room.muted
) )
} }
} }
...@@ -579,6 +583,7 @@ sealed class Operation { ...@@ -579,6 +583,7 @@ sealed class Operation {
val toUpdate: List<ChatRoomEntity>, val toUpdate: List<ChatRoomEntity>,
val toRemove: List<String> val toRemove: List<String>
) : Operation() ) : Operation()
data class InsertRooms(val chatRooms: List<ChatRoomEntity>) : Operation() data class InsertRooms(val chatRooms: List<ChatRoomEntity>) : Operation()
data class CleanInsertRooms(val chatRooms: List<ChatRoomEntity>) : Operation() data class CleanInsertRooms(val chatRooms: List<ChatRoomEntity>) : Operation()
...@@ -607,10 +612,10 @@ private fun Myself.asUser(): User { ...@@ -607,10 +612,10 @@ private fun Myself.asUser(): User {
private fun String.databaseName(): String { private fun String.databaseName(): String {
val tmp = this.removePrefix("https://") val tmp = this.removePrefix("https://")
.removePrefix("http://") .removePrefix("http://")
.removeTrailingSlash() .removeTrailingSlash()
.replace("/","-") .replace("/", "-")
.replace(".", "_") .replace(".", "_")
return "$tmp.db" return "$tmp.db"
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package chat.rocket.android.db ...@@ -2,6 +2,7 @@ package chat.rocket.android.db
import androidx.room.Database import androidx.room.Database
import androidx.room.RoomDatabase import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import chat.rocket.android.db.model.AttachmentActionEntity import chat.rocket.android.db.model.AttachmentActionEntity
import chat.rocket.android.db.model.AttachmentEntity import chat.rocket.android.db.model.AttachmentEntity
import chat.rocket.android.db.model.AttachmentFieldEntity import chat.rocket.android.db.model.AttachmentFieldEntity
...@@ -14,6 +15,7 @@ import chat.rocket.android.db.model.MessagesSync ...@@ -14,6 +15,7 @@ import chat.rocket.android.db.model.MessagesSync
import chat.rocket.android.db.model.ReactionEntity import chat.rocket.android.db.model.ReactionEntity
import chat.rocket.android.db.model.UrlEntity import chat.rocket.android.db.model.UrlEntity
import chat.rocket.android.db.model.UserEntity import chat.rocket.android.db.model.UserEntity
import chat.rocket.android.emoji.internal.db.StringListConverter
@Database( @Database(
entities = [ entities = [
...@@ -23,11 +25,12 @@ import chat.rocket.android.db.model.UserEntity ...@@ -23,11 +25,12 @@ import chat.rocket.android.db.model.UserEntity
AttachmentFieldEntity::class, AttachmentActionEntity::class, UrlEntity::class, AttachmentFieldEntity::class, AttachmentActionEntity::class, UrlEntity::class,
ReactionEntity::class, MessagesSync::class ReactionEntity::class, MessagesSync::class
], ],
version = 10, version = 12,
exportSchema = true exportSchema = true
) )
@TypeConverters(StringListConverter::class)
abstract class RCDatabase : RoomDatabase() { abstract class RCDatabase : RoomDatabase() {
abstract fun userDao(): UserDao abstract fun userDao(): UserDao
abstract fun chatRoomDao(): ChatRoomDao abstract fun chatRoomDao(): ChatRoomDao
abstract fun messageDao(): MessageDao abstract fun messageDao(): MessageDao
} }
\ No newline at end of file
...@@ -5,6 +5,8 @@ import androidx.room.Entity ...@@ -5,6 +5,8 @@ import androidx.room.Entity
import androidx.room.ForeignKey import androidx.room.ForeignKey
import androidx.room.Index import androidx.room.Index
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
import androidx.room.TypeConverters
import chat.rocket.android.emoji.internal.db.StringListConverter
@Entity(tableName = "chatrooms", @Entity(tableName = "chatrooms",
indices = [ indices = [
...@@ -20,6 +22,7 @@ import androidx.room.PrimaryKey ...@@ -20,6 +22,7 @@ import androidx.room.PrimaryKey
ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["lastMessageUserId"]) ForeignKey(entity = UserEntity::class, parentColumns = ["id"], childColumns = ["lastMessageUserId"])
] ]
) )
@TypeConverters(StringListConverter::class)
data class ChatRoomEntity( data class ChatRoomEntity(
@PrimaryKey var id: String, @PrimaryKey var id: String,
var subscriptionId: String, var subscriptionId: String,
...@@ -42,7 +45,8 @@ data class ChatRoomEntity( ...@@ -42,7 +45,8 @@ data class ChatRoomEntity(
var lastMessageText: String? = null, var lastMessageText: String? = null,
var lastMessageUserId: String? = null, var lastMessageUserId: String? = null,
var lastMessageTimestamp: Long? = null, var lastMessageTimestamp: Long? = null,
var broadcast: Boolean? = false var broadcast: Boolean? = false,
var muted: List<String>? = null
) )
data class ChatRoom( data class ChatRoom(
...@@ -52,4 +56,4 @@ data class ChatRoom( ...@@ -52,4 +56,4 @@ data class ChatRoom(
var status: String?, var status: String?,
var lastMessageUserName: String?, var lastMessageUserName: String?,
var lastMessageUserFullName: String? var lastMessageUserFullName: String?
) )
\ No newline at end of file
...@@ -144,6 +144,8 @@ ...@@ -144,6 +144,8 @@
<string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation --> <string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation -->
<string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation --> <string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation -->
<string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation --> <string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation -->
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privat</string> <string name="msg_private_channel">Privat</string>
......
...@@ -161,6 +161,8 @@ ...@@ -161,6 +161,8 @@
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copied</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation --> <string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
......
...@@ -156,6 +156,8 @@ ...@@ -156,6 +156,8 @@
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copied</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privé</string> <string name="msg_private_channel">Privé</string>
......
...@@ -167,6 +167,8 @@ ...@@ -167,6 +167,8 @@
<string name="msg_view_less">कम देखें</string> <string name="msg_view_less">कम देखें</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copied</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">एनालिटिक्स ट्रैकिंग</string> <string name="msg_analytics_tracking">एनालिटिक्स ट्रैकिंग</string>
......
...@@ -154,6 +154,8 @@ ...@@ -154,6 +154,8 @@
<string name="msg_view_more">view more</string> <string name="msg_view_more">view more</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">プライベート</string> <string name="msg_private_channel">プライベート</string>
......
...@@ -154,6 +154,7 @@ ...@@ -154,6 +154,7 @@
<string name="msg_view_less">visualizar menos</string> <string name="msg_view_less">visualizar menos</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copiado</string> <string name="msg_permalink_copied">Permalink copiado</string>
<string name="msg_muted_on_this_channel">Você está silenciado neste canal</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privado</string> <string name="msg_private_channel">Privado</string>
...@@ -182,8 +183,8 @@ ...@@ -182,8 +183,8 @@
<string name="message_welcome">Bem-vindo, %s</string> <string name="message_welcome">Bem-vindo, %s</string>
<string name="message_removed">Mensagem removida</string> <string name="message_removed">Mensagem removida</string>
<string name="message_pinned">Pinou uma mensagem:</string> <string name="message_pinned">Pinou uma mensagem:</string>
<string name="message_muted">Usuário %1$s entrou no modo mudo por %2$s</string> <string name="message_muted">Usuário %1$s foi silenciado por %2$s</string>
<string name="message_unmuted">Usuário %1$s saiu do modo mudo por %2$s</string> <string name="message_unmuted">Usuário %1$s saiu do modo silenciado por %2$s</string>
<string name="message_role_add">%1$s foi definido %2$s por %3$s</string> <string name="message_role_add">%1$s foi definido %2$s por %3$s</string>
<string name="message_role_removed">%1$s não é mais %2$s por %3$s</string> <string name="message_role_removed">%1$s não é mais %2$s por %3$s</string>
// TODO:Add proper translation. // TODO:Add proper translation.
......
...@@ -151,6 +151,8 @@ ...@@ -151,6 +151,8 @@
<string name="msg_view_more">больше</string> <string name="msg_view_more">больше</string>
<string name="msg_view_less">меньше</string> <string name="msg_view_less">меньше</string>
<string name="msg_permalink_copied">Ссылка скопирована</string> <string name="msg_permalink_copied">Ссылка скопирована</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Приватный</string> <string name="msg_private_channel">Приватный</string>
......
...@@ -168,6 +168,8 @@ ...@@ -168,6 +168,8 @@
<string name="msg_view_less">Daha az göster</string> <string name="msg_view_less">Daha az göster</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copied</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">İstatistik takibi</string> <string name="msg_analytics_tracking">İstatistik takibi</string>
......
...@@ -153,6 +153,8 @@ ...@@ -153,6 +153,8 @@
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<!-- TODO - Add proper translation --> <!-- TODO - Add proper translation -->
<string name="msg_permalink_copied">Permalink copied</string> <string name="msg_permalink_copied">Permalink copied</string>
<!-- TODO - Add proper translation -->
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Приватний</string> <string name="msg_private_channel">Приватний</string>
......
...@@ -179,6 +179,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -179,6 +179,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string name="msg_delete_description">Are you sure you want to delete this message</string> <string name="msg_delete_description">Are you sure you want to delete this message</string>
<string name="msg_view_more">view more</string> <string name="msg_view_more">view more</string>
<string name="msg_view_less">view less</string> <string name="msg_view_less">view less</string>
<string name="msg_muted_on_this_channel">You are muted on this channel</string>
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <string name="msg_analytics_tracking">Analytics tracking</string>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment