Merge branch 'master' into Share

This commit is contained in:
Smarshall 2023-09-01 18:55:57 +05:30 committed by GitHub
commit 48135f3fab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 1434 additions and 202 deletions

View File

@ -140,7 +140,7 @@ android {
ext {
androidxCameraVersion = "1.2.3"
coilKtVersion = "2.4.0"
daggerVersion = "2.47"
daggerVersion = "2.48"
emojiVersion = "1.3.0"
lifecycleVersion = '2.6.1'
okhttpVersion = "4.11.0"
@ -269,7 +269,7 @@ dependencies {
implementation "androidx.media3:media3-ui:$media3_version"
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.27'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.28'
implementation "io.noties.markwon:core:$markwonVersion"
implementation "io.noties.markwon:ext-strikethrough:$markwonVersion"

View File

@ -0,0 +1,8 @@
package com.nextcloud.talk.adapters.messages
import com.nextcloud.talk.models.json.chat.ChatMessage
interface SystemMessageInterface {
fun expandSystemMessage(chatMessage: ChatMessage)
fun collapseSystemMessages()
}

View File

@ -1,112 +0,0 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.adapters.messages;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.view.View;
import android.view.ViewGroup;
import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.models.json.chat.ChatMessage;
import com.nextcloud.talk.utils.DateUtils;
import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.preferences.AppPreferences;
import com.stfalcon.chatkit.messages.MessageHolders;
import java.util.Map;
import javax.inject.Inject;
import androidx.core.view.ViewCompat;
import autodagger.AutoInjector;
@AutoInjector(NextcloudTalkApplication.class)
public class SystemMessageViewHolder extends MessageHolders.IncomingTextMessageViewHolder<ChatMessage> {
@Inject
AppPreferences appPreferences;
@Inject
Context context;
@Inject
DateUtils dateUtils;
protected ViewGroup background;
public SystemMessageViewHolder(View itemView) {
super(itemView);
NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this);
background = itemView.findViewById(R.id.container);
}
@Override
public void onBind(ChatMessage message) {
super.onBind(message);
Resources resources = itemView.getResources();
int pressedColor;
int mentionColor;
pressedColor = resources.getColor(R.color.bg_message_list_incoming_bubble);
mentionColor = resources.getColor(R.color.textColorMaxContrast);
Drawable bubbleDrawable = DisplayUtils.getMessageSelector(resources.getColor(R.color.transparent),
resources.getColor(R.color.transparent),
pressedColor,
R.drawable.shape_grouped_incoming_message);
ViewCompat.setBackground(background, bubbleDrawable);
Spannable messageString = new SpannableString(message.getText());
if (message.getMessageParameters() != null && message.getMessageParameters().size() > 0) {
for (String key : message.getMessageParameters().keySet()) {
Map<String, String> individualMap = message.getMessageParameters().get(key);
if (individualMap != null && individualMap.containsKey("name")) {
String searchText;
if ("user".equals(individualMap.get("type")) ||
"guest".equals(individualMap.get("type")) ||
"call".equals(individualMap.get("type"))
) {
searchText = "@" + individualMap.get("name");
} else {
searchText = individualMap.get("name");
}
messageString = DisplayUtils.searchAndColor(messageString, searchText, mentionColor);
}
}
}
text.setText(messageString);
if (time != null) {
time.setText(dateUtils.getLocalTimeStringFromTimestamp(message.getTimestamp()));
}
itemView.setTag(R.string.replyable_message_view_tag, message.getReplyable());
}
}

View File

@ -0,0 +1,150 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.adapters.messages
import android.annotation.SuppressLint
import android.content.Context
import android.text.Spannable
import android.text.SpannableString
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import autodagger.AutoInjector
import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
import com.nextcloud.talk.databinding.ItemSystemMessageBinding
import com.nextcloud.talk.models.json.chat.ChatMessage
import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.preferences.AppPreferences
import com.stfalcon.chatkit.messages.MessageHolders
import javax.inject.Inject
@AutoInjector(NextcloudTalkApplication::class)
class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessageViewHolder<ChatMessage>(itemView) {
private val binding: ItemSystemMessageBinding = ItemSystemMessageBinding.bind(itemView)
@JvmField
@Inject
var appPreferences: AppPreferences? = null
@JvmField
@Inject
var context: Context? = null
@JvmField
@Inject
var dateUtils: DateUtils? = null
protected var background: ViewGroup
lateinit var systemMessageInterface: SystemMessageInterface
init {
sharedApplication!!.componentApplication.inject(this)
background = itemView.findViewById(R.id.container)
}
@SuppressLint("SetTextI18n")
override fun onBind(message: ChatMessage) {
super.onBind(message)
val resources = itemView.resources
val pressedColor: Int = resources.getColor(R.color.bg_message_list_incoming_bubble)
val mentionColor: Int = resources.getColor(R.color.textColorMaxContrast)
val bubbleDrawable = DisplayUtils.getMessageSelector(
resources.getColor(R.color.transparent),
resources.getColor(R.color.transparent),
pressedColor,
R.drawable.shape_grouped_incoming_message
)
ViewCompat.setBackground(background, bubbleDrawable)
var messageString: Spannable = SpannableString(message.text)
if (message.messageParameters != null && message.messageParameters!!.size > 0) {
for (key in message.messageParameters!!.keys) {
val individualMap: Map<String?, String?>? = message.messageParameters!![key]
if (individualMap != null && individualMap.containsKey("name")) {
var searchText: String? = if ("user" == individualMap["type"] ||
"guest" == individualMap["type"] ||
"call" == individualMap["type"]
) {
"@" + individualMap["name"]
} else {
individualMap["name"]
}
messageString = DisplayUtils.searchAndColor(messageString, searchText, mentionColor)
}
}
}
binding.systemMessageLayout.visibility = View.VISIBLE
binding.similarMessagesHint.visibility = View.GONE
if (message.expandableParent) {
binding.expandCollapseIcon.visibility = View.VISIBLE
if (!message.isExpanded) {
val similarMessages = String.format(
sharedApplication!!.resources.getString(R.string.see_similar_system_messages),
message.expandableChildrenAmount
)
binding.messageText.text = messageString
binding.similarMessagesHint.visibility = View.VISIBLE
binding.similarMessagesHint.text = similarMessages
binding.expandCollapseIcon.setImageDrawable(
ContextCompat.getDrawable(context!!, R.drawable.baseline_unfold_more_24)
)
binding.systemMessageLayout.setOnClickListener { systemMessageInterface.expandSystemMessage(message) }
binding.messageText.setOnClickListener { systemMessageInterface.expandSystemMessage(message) }
} else {
binding.messageText.text = messageString
binding.similarMessagesHint.visibility = View.GONE
binding.similarMessagesHint.text = ""
binding.expandCollapseIcon.setImageDrawable(
ContextCompat.getDrawable(context!!, R.drawable.baseline_unfold_less_24)
)
binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
}
} else if (message.hiddenByCollapse) {
binding.systemMessageLayout.visibility = View.GONE
} else {
binding.expandCollapseIcon.visibility = View.GONE
binding.messageText.text = messageString
binding.expandCollapseIcon.setImageDrawable(null)
binding.systemMessageLayout.setOnClickListener(null)
}
if (!message.expandableParent && message.lastItemOfExpandableGroup != 0) {
binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
}
binding.messageTime.text = dateUtils!!.getLocalTimeStringFromTimestamp(message.timestamp)
itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
}
fun assignSystemMessageInterface(systemMessageInterface: SystemMessageInterface) {
this.systemMessageInterface = systemMessageInterface
}
}

View File

@ -74,6 +74,9 @@ public class TalkMessagesListAdapter<M extends IMessage> extends MessagesListAda
} else if (holder instanceof PreviewMessageViewHolder) {
((PreviewMessageViewHolder) holder).assignPreviewMessageInterface(chatActivity);
((PreviewMessageViewHolder) holder).assignCommonMessageInterface(chatActivity);
} else if (holder instanceof SystemMessageViewHolder) {
((SystemMessageViewHolder) holder).assignSystemMessageInterface(chatActivity);
}
}
}

View File

@ -40,6 +40,7 @@ import com.nextcloud.talk.models.json.participants.AddParticipantOverall;
import com.nextcloud.talk.models.json.participants.ParticipantsOverall;
import com.nextcloud.talk.models.json.push.PushRegistrationOverall;
import com.nextcloud.talk.models.json.reactions.ReactionsOverall;
import com.nextcloud.talk.models.json.reminder.ReminderOverall;
import com.nextcloud.talk.models.json.search.ContactsByNumberOverall;
import com.nextcloud.talk.models.json.signaling.SignalingOverall;
import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
@ -671,4 +672,18 @@ public interface NcApi {
@Query("text") String text,
@Query("toLanguage") String toLanguage,
@Nullable @Query("fromLanguage") String fromLanguage);
@GET
Observable<ReminderOverall> getReminder(@Header("Authorization") String authorization,
@Url String url);
@DELETE
Observable<GenericOverall> deleteReminder(@Header("Authorization") String authorization,
@Url String url);
@FormUrlEncoded
@POST
Observable<ReminderOverall> setReminder(@Header("Authorization") String authorization,
@Url String url,
@Field("timestamp") int timestamp);
}

View File

@ -95,6 +95,7 @@ import androidx.core.text.bold
import androidx.core.widget.doAfterTextChanged
import androidx.emoji2.text.EmojiCompat
import androidx.emoji2.widget.EmojiTextView
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
@ -136,6 +137,7 @@ import com.nextcloud.talk.adapters.messages.OutcomingTextMessageViewHolder
import com.nextcloud.talk.adapters.messages.OutcomingVoiceMessageViewHolder
import com.nextcloud.talk.adapters.messages.PreviewMessageInterface
import com.nextcloud.talk.adapters.messages.PreviewMessageViewHolder
import com.nextcloud.talk.adapters.messages.SystemMessageInterface
import com.nextcloud.talk.adapters.messages.SystemMessageViewHolder
import com.nextcloud.talk.adapters.messages.TalkMessagesListAdapter
import com.nextcloud.talk.adapters.messages.UnreadNoticeMessageViewHolder
@ -183,6 +185,7 @@ import com.nextcloud.talk.ui.MicInputCloud
import com.nextcloud.talk.ui.StatusDrawable
import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet
import com.nextcloud.talk.ui.dialog.AttachmentDialog
import com.nextcloud.talk.ui.dialog.DateTimePickerFragment
import com.nextcloud.talk.ui.dialog.MessageActionsDialog
import com.nextcloud.talk.ui.dialog.ShowReactionsDialog
import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions
@ -263,7 +266,8 @@ class ChatActivity :
ContentChecker<ChatMessage>,
VoiceMessageInterface,
CommonMessageInterface,
PreviewMessageInterface {
PreviewMessageInterface,
SystemMessageInterface {
var active = false
@ -1908,6 +1912,45 @@ class ChatActivity :
}
}
@SuppressLint("NotifyDataSetChanged")
override fun collapseSystemMessages() {
adapter?.items?.forEach {
if (it.item is ChatMessage) {
val chatMessage = it.item as ChatMessage
if (isChildOfExpandableSystemMessage(chatMessage)) {
chatMessage.hiddenByCollapse = true
}
chatMessage.isExpanded = false
}
}
adapter?.notifyDataSetChanged()
}
private fun isChildOfExpandableSystemMessage(chatMessage: ChatMessage): Boolean {
return isSystemMessage(chatMessage) &&
!chatMessage.expandableParent &&
chatMessage.lastItemOfExpandableGroup != 0
}
@SuppressLint("NotifyDataSetChanged")
override fun expandSystemMessage(chatMessageToExpand: ChatMessage) {
adapter?.items?.forEach {
if (it.item is ChatMessage) {
val belongsToGroupToExpand =
(it.item as ChatMessage).lastItemOfExpandableGroup == chatMessageToExpand.lastItemOfExpandableGroup
if (belongsToGroupToExpand) {
(it.item as ChatMessage).hiddenByCollapse = false
}
}
}
chatMessageToExpand.isExpanded = true
adapter?.notifyDataSetChanged()
}
@SuppressLint("LongLogTag")
private fun downloadFileToCache(message: ChatMessage) {
message.isDownloadingVoiceMessage = true
@ -3106,7 +3149,14 @@ class ChatActivity :
Log.d(TAG, "pullChatMessages - HTTP_CODE_OK.")
val chatOverall = response.body() as ChatOverall?
val chatMessageList = handleSystemMessages(chatOverall?.ocs!!.data!!)
var chatMessageList = chatOverall?.ocs!!.data!!
chatMessageList = handleSystemMessages(chatMessageList)
determinePreviousMessageIds(chatMessageList)
handleExpandableSystemMessages(chatMessageList)
processHeaderChatLastGiven(response, lookIntoFuture)
@ -3121,6 +3171,8 @@ class ChatActivity :
processMessagesFromTheFuture(chatMessageList)
} else {
processMessagesNotFromTheFuture(chatMessageList)
collapseSystemMessages()
}
val newXChatLastCommonRead = response.headers()["X-Chat-Last-Common-Read"]?.let {
@ -3144,6 +3196,8 @@ class ChatActivity :
isFirstMessagesProcessing = false
binding.progressBar.visibility = View.GONE
binding.messagesListView.visibility = View.VISIBLE
collapseSystemMessages()
}
}
@ -3209,6 +3263,7 @@ class ChatActivity :
}
private fun processExpiredMessages() {
@SuppressLint("NotifyDataSetChanged")
fun deleteExpiredMessages() {
val messagesToDelete: ArrayList<ChatMessage> = ArrayList()
val systemTime = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
@ -3269,8 +3324,6 @@ class ChatActivity :
adapter?.addToStart(unreadChatMessage, false)
}
determinePreviousMessageIds(chatMessageList)
addMessagesToAdapter(shouldAddNewMessagesNotice, chatMessageList)
if (shouldAddNewMessagesNotice && adapter != null) {
@ -3278,6 +3331,36 @@ class ChatActivity :
}
}
private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
var countGroupedMessages = 0
for (i in chatMessageList.indices) {
if (chatMessageList.size > i + 1) {
if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
) {
chatMessageList[i].isGrouped = true
countGroupedMessages++
} else {
countGroupedMessages = 0
}
}
val chatMessage = chatMessageList[i]
chatMessage.isOneToOneConversation =
currentConversation?.type == ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
chatMessage.isFormerOneToOneConversation =
(currentConversation?.type == ConversationType.FORMER_ONE_TO_ONE)
chatMessage.activeUser = conversationUser
}
if (adapter != null) {
adapter?.addToEnd(chatMessageList, false)
}
scrollToRequestedMessageIfNeeded()
}
private fun scrollToFirstUnreadMessage() {
adapter?.let {
layoutManager?.scrollToPositionWithOffset(
@ -3307,10 +3390,8 @@ class ChatActivity :
adapter?.let {
chatMessage.isGrouped = (
it.isPreviousSameAuthor(
chatMessage.actorId,
-1
) && it.getSameAuthorLastMessagesCount(chatMessage.actorId) %
it.isPreviousSameAuthor(chatMessage.actorId, -1) &&
it.getSameAuthorLastMessagesCount(chatMessage.actorId) %
GROUPED_MESSAGES_SAME_AUTHOR_THRESHOLD > 0
)
chatMessage.isOneToOneConversation =
@ -3339,37 +3420,6 @@ class ChatActivity :
}
}
private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
var countGroupedMessages = 0
determinePreviousMessageIds(chatMessageList)
for (i in chatMessageList.indices) {
if (chatMessageList.size > i + 1) {
if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
) {
chatMessageList[i].isGrouped = true
countGroupedMessages++
} else {
countGroupedMessages = 0
}
}
val chatMessage = chatMessageList[i]
chatMessage.isOneToOneConversation =
currentConversation?.type == ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
chatMessage.isFormerOneToOneConversation =
(currentConversation?.type == ConversationType.FORMER_ONE_TO_ONE)
chatMessage.activeUser = conversationUser
}
if (adapter != null) {
adapter?.addToEnd(chatMessageList, false)
}
scrollToRequestedMessageIfNeeded()
}
private fun determinePreviousMessageIds(chatMessageList: List<ChatMessage>) {
var previousMessageId = NO_PREVIOUS_MESSAGE_ID
for (i in chatMessageList.indices.reversed()) {
@ -3595,6 +3645,30 @@ class ChatActivity :
return chatMessageMap.values.toList()
}
private fun handleExpandableSystemMessages(chatMessageList: List<ChatMessage>): List<ChatMessage> {
val chatMessageMap = chatMessageList.map { it.id to it }.toMap().toMutableMap()
val chatMessageIterator = chatMessageMap.iterator()
while (chatMessageIterator.hasNext()) {
val currentMessage = chatMessageIterator.next()
val previousMessage = chatMessageMap[currentMessage.value.previousMessageId.toString()]
if (isSystemMessage(currentMessage.value) &&
previousMessage?.systemMessageType == currentMessage.value.systemMessageType
) {
previousMessage?.expandableParent = true
currentMessage.value.expandableParent = false
if (currentMessage.value.lastItemOfExpandableGroup == 0) {
currentMessage.value.lastItemOfExpandableGroup = currentMessage.value.jsonMessageId
}
previousMessage?.lastItemOfExpandableGroup = currentMessage.value.lastItemOfExpandableGroup
previousMessage?.expandableChildrenAmount = currentMessage.value.expandableChildrenAmount + 1
}
}
return chatMessageMap.values.toList()
}
private fun isInfoMessageAboutDeletion(currentMessage: MutableMap.MutableEntry<String, ChatMessage>): Boolean {
return currentMessage.value.parentMessage != null && currentMessage.value.systemMessageType == ChatMessage
.SystemMessageType.MESSAGE_DELETED
@ -3883,6 +3957,16 @@ class ChatActivity :
startActivity(intent)
}
fun remindMeLater(message: ChatMessage?) {
Log.d(TAG, "remindMeLater called")
val newFragment: DialogFragment = DateTimePickerFragment.newInstance(
roomToken,
message!!.id,
chatViewModel
)
newFragment.show(supportFragmentManager, DateTimePickerFragment.TAG)
}
fun markAsUnread(message: IMessage?) {
val chatMessage = message as ChatMessage?
if (chatMessage!!.previousMessageId > NO_PREVIOUS_MESSAGE_ID) {

View File

@ -22,10 +22,14 @@ package com.nextcloud.talk.chat.data
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.json.generic.GenericOverall
import com.nextcloud.talk.models.json.reminder.Reminder
import io.reactivex.Observable
interface ChatRepository {
fun getRoom(user: User, roomToken: String): Observable<ConversationModel>
fun joinRoom(user: User, roomToken: String, roomPassword: String): Observable<ConversationModel>
fun setReminder(user: User, roomToken: String, messageId: String, timeStamp: Int): Observable<Reminder>
fun getReminder(user: User, roomToken: String, messageId: String): Observable<Reminder>
fun deleteReminder(user: User, roomToken: String, messageId: String): Observable<GenericOverall>
}

View File

@ -23,6 +23,8 @@ package com.nextcloud.talk.chat.data
import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.json.generic.GenericOverall
import com.nextcloud.talk.models.json.reminder.Reminder
import com.nextcloud.talk.utils.ApiUtils
import io.reactivex.Observable
@ -54,4 +56,38 @@ class ChatRepositoryImpl(private val ncApi: NcApi) : ChatRepository {
roomPassword
).map { ConversationModel.mapToConversationModel(it.ocs?.data!!) }
}
override fun setReminder(user: User, roomToken: String, messageId: String, timeStamp: Int): Observable<Reminder> {
val credentials: String = ApiUtils.getCredentials(user.username, user.token)
val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
return ncApi.setReminder(
credentials,
ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion),
timeStamp
).map {
it.ocs!!.data
}
}
override fun getReminder(user: User, roomToken: String, messageId: String): Observable<Reminder> {
val credentials: String = ApiUtils.getCredentials(user.username, user.token)
val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
return ncApi.getReminder(
credentials,
ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion)
).map {
it.ocs!!.data
}
}
override fun deleteReminder(user: User, roomToken: String, messageId: String): Observable<GenericOverall> {
val credentials: String = ApiUtils.getCredentials(user.username, user.token)
val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
return ncApi.deleteReminder(
credentials,
ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion)
).map {
it
}
}
}

View File

@ -27,6 +27,8 @@ import androidx.lifecycle.ViewModel
import com.nextcloud.talk.chat.data.ChatRepository
import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.domain.ConversationModel
import com.nextcloud.talk.models.json.generic.GenericOverall
import com.nextcloud.talk.models.json.reminder.Reminder
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@ -40,6 +42,13 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
object GetRoomStartState : ViewState
object GetRoomErrorState : ViewState
object GetReminderStartState : ViewState
open class GetReminderExistState(val reminder: Reminder) : ViewState
private val _getReminderExistState: MutableLiveData<ViewState> = MutableLiveData(GetReminderStartState)
val getReminderExistState: LiveData<ViewState>
get() = _getReminderExistState
open class GetRoomSuccessState(val conversationModel: ConversationModel) : ViewState
private val _getRoomViewState: MutableLiveData<ViewState> = MutableLiveData(GetRoomStartState)
@ -71,6 +80,43 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
?.subscribe(JoinRoomObserver())
}
fun setReminder(user: User, roomToken: String, messageId: String, timestamp: Int) {
repository.setReminder(user, roomToken, messageId, timestamp)
.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(SetReminderObserver())
}
fun getReminder(user: User, roomToken: String, messageId: String) {
repository.getReminder(user, roomToken, messageId)
.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(GetReminderObserver())
}
fun deleteReminder(user: User, roomToken: String, messageId: String) {
repository.deleteReminder(user, roomToken, messageId)
.subscribeOn(Schedulers.io())
?.observeOn(AndroidSchedulers.mainThread())
?.subscribe(object : Observer<GenericOverall> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(genericOverall: GenericOverall) {
_getReminderExistState.value = GetReminderStartState
}
override fun onError(e: Throwable) {
Log.d(TAG, "Error when deleting reminder $e")
}
override fun onComplete() {
// unused atm
}
})
}
inner class GetRoomObserver : Observer<ConversationModel> {
override fun onSubscribe(d: Disposable) {
// unused atm
@ -109,6 +155,43 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
}
}
inner class SetReminderObserver : Observer<Reminder> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(reminder: Reminder) {
Log.d(TAG, "reminder set successfully")
}
override fun onError(e: Throwable) {
Log.e(TAG, "Error when sending reminder, $e")
}
override fun onComplete() {
// unused atm
}
}
inner class GetReminderObserver : Observer<Reminder> {
override fun onSubscribe(d: Disposable) {
// unused atm
}
override fun onNext(reminder: Reminder) {
_getReminderExistState.value = GetReminderExistState(reminder)
}
override fun onError(e: Throwable) {
Log.d(TAG, "Error when getting reminder $e")
_getReminderExistState.value = GetReminderStartState
}
override fun onComplete() {
// unused atm
}
}
companion object {
private val TAG = ChatViewModel::class.simpleName
const val JOIN_ROOM_RETRY_COUNT: Long = 3

View File

@ -175,7 +175,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
} else if (isSpreedNotification()) {
Log.d(TAG, "pushMessage.type: " + pushMessage.type)
when (pushMessage.type) {
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> handleNonCallPushMessage()
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> handleNonCallPushMessage()
TYPE_CALL -> handleCallPushMessage()
else -> Log.e(TAG, "unknown pushMessage.type")
}
@ -407,7 +407,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
) {
var category = ""
when (pushMessage.type) {
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> category = Notification.CATEGORY_MESSAGE
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> category = Notification.CATEGORY_MESSAGE
TYPE_CALL -> category = Notification.CATEGORY_CALL
else -> Log.e(TAG, "unknown pushMessage.type")
}
@ -464,7 +464,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
when (pushMessage.type) {
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> {
TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> {
notificationBuilder.setChannelId(
NotificationUtils.NotificationChannels.NOTIFICATION_CHANNEL_MESSAGES_V4.name
)
@ -489,7 +489,9 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
val systemNotificationId: Int =
activeStatusBarNotification?.id ?: calculateCRC32(System.currentTimeMillis().toString()).toInt()
if (TYPE_CHAT == pushMessage.type && pushMessage.notificationUser != null) {
if ((TYPE_CHAT == pushMessage.type || TYPE_REMINDER == pushMessage.type) &&
pushMessage.notificationUser != null
) {
prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId)
addReplyAction(notificationBuilder, systemNotificationId)
addMarkAsReadAction(notificationBuilder, systemNotificationId)
@ -522,6 +524,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
else -> // assuming one2one
largeIcon = if (TYPE_CHAT == pushMessage.type || TYPE_ROOM == pushMessage.type) {
ContextCompat.getDrawable(context!!, R.drawable.ic_comment)?.toBitmap()!!
} else if (TYPE_REMINDER == pushMessage.type) {
ContextCompat.getDrawable(context!!, R.drawable.ic_timer_black_24dp)?.toBitmap()!!
} else {
ContextCompat.getDrawable(context!!, R.drawable.ic_call_black_24dp)?.toBitmap()!!
}
@ -984,6 +988,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
private const val TYPE_ROOM = "room"
private const val TYPE_CALL = "call"
private const val TYPE_RECORDING = "recording"
private const val TYPE_REMINDER = "reminder"
private const val SPREED_APP = "spreed"
private const val TIMER_START = 1
private const val TIMER_COUNT = 12

View File

@ -135,7 +135,17 @@ data class ChatMessage(
var voiceMessageSeekbarProgress: Int = 0,
var voiceMessageFloatArray: FloatArray? = null
var voiceMessageFloatArray: FloatArray? = null,
var expandableParent: Boolean = false,
var isExpanded: Boolean = false,
var lastItemOfExpandableGroup: Int = 0,
var expandableChildrenAmount: Int = 0,
var hiddenByCollapse: Boolean = false
) : Parcelable, MessageContentType, MessageContentType.Image {

View File

@ -0,0 +1,41 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.models.json.reminder
import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import kotlinx.parcelize.Parcelize
@Parcelize
@JsonObject
data class Reminder(
@JsonField(name = ["userid"])
var userid: String? = null,
@JsonField(name = ["token"])
var token: String? = null,
@JsonField(name = ["messageId"])
var messageId: Int? = null,
@JsonField(name = ["timestamp"])
var timestamp: Int? = null
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null, null, null)
}

View File

@ -0,0 +1,38 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.models.json.reminder
import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import com.nextcloud.talk.models.json.generic.GenericMeta
import kotlinx.parcelize.Parcelize
@Parcelize
@JsonObject
data class ReminderOCS(
@JsonField(name = ["meta"])
var meta: GenericMeta? = null,
@JsonField(name = ["data"])
var data: Reminder? = null
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null, null)
}

View File

@ -0,0 +1,35 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.models.json.reminder
import android.os.Parcelable
import com.bluelinelabs.logansquare.annotation.JsonField
import com.bluelinelabs.logansquare.annotation.JsonObject
import kotlinx.parcelize.Parcelize
@Parcelize
@JsonObject
data class ReminderOverall(
@JsonField(name = ["ocs"])
var ocs: ReminderOCS? = null
) : Parcelable {
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
constructor() : this(null)
}

View File

@ -0,0 +1,309 @@
/*
* Nextcloud Talk application
*
* @author Julius Linus
* Copyright (C) 2023 Julius Linus <julius.linu@nextcloud.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.ui.dialog
import android.app.Dialog
import android.os.Bundle
import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import autodagger.AutoInjector
import com.google.android.material.datepicker.CalendarConstraints
import com.google.android.material.datepicker.DateValidatorPointForward
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.timepicker.MaterialTimePicker
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.viewmodels.ChatViewModel
import com.nextcloud.talk.databinding.DialogDateTimePickerBinding
import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.talk.users.UserManager
import java.util.Calendar
import java.util.TimeZone
import javax.inject.Inject
@Suppress("TooManyFunctions")
@AutoInjector(NextcloudTalkApplication::class)
class DateTimePickerFragment(
token: String,
id: String,
chatViewModel: ChatViewModel
) : DialogFragment() {
lateinit var binding: DialogDateTimePickerBinding
private var dialogView: View? = null
private var viewModel = chatViewModel
private var currentTimeStamp: Long? = null
private var roomToken = token
private var messageId = id
private var laterTodayTimeStamp = 0L
private var tomorrowTimeStamp = 0L
private var weekendTimeStamp = 0L
private var nextWeekTimeStamp = 0L
@Inject
lateinit var userManager: UserManager
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
binding = DialogDateTimePickerBinding.inflate(LayoutInflater.from(context))
dialogView = binding.root
return MaterialAlertDialogBuilder(requireContext()).setView(dialogView).create()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
setUpDefaults()
setUpColors()
setListeners()
getReminder()
viewModel.getReminderExistState.observe(this) { state ->
when (state) {
is ChatViewModel.GetReminderExistState -> {
val timeStamp = state.reminder.timestamp?.toLong()?.times(ONE_SEC)
showDelete(true)
setTimeStamp(getTimeFromTimeStamp(timeStamp!!))
}
else -> {
showDelete(false)
binding.dateTimePickerTimestamp.text = ""
}
}
}
return inflater.inflate(R.layout.dialog_date_time_picker, container, false)
}
private fun setUpDefaults() {
val currTime = getTimeFromCalendar()
val currentWeekInYear = Calendar.getInstance().get(Calendar.WEEK_OF_YEAR)
laterTodayTimeStamp = getTimeFromCalendar(hour = HOUR_SIX_PM, minute = 0)
binding.dateTimePickerLaterTodayTextview.text = getTimeFromTimeStamp(laterTodayTimeStamp)
if (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
tomorrowTimeStamp = getTimeFromCalendar(
hour = HOUR_EIGHT_AM,
minute = 0,
daysToAdd = 1,
weekInYear =
currentWeekInYear + 1
)
binding.dateTimePickerWeekend.visibility = View.GONE // because today is the weekend
} else {
tomorrowTimeStamp = getTimeFromCalendar(hour = HOUR_EIGHT_AM, minute = 0, daysToAdd = 1)
weekendTimeStamp = getTimeFromCalendar(hour = HOUR_EIGHT_AM, day = Calendar.SATURDAY, minute = 0)
}
binding.dateTimePickerTomorrowTextview.text = getTimeFromTimeStamp(tomorrowTimeStamp)
binding.dateTimePickerWeekendTextview.text = getTimeFromTimeStamp(weekendTimeStamp)
nextWeekTimeStamp = getTimeFromCalendar(
hour = HOUR_EIGHT_AM,
day = Calendar.MONDAY,
minute = 0,
weekInYear =
currentWeekInYear + 1
) // this should only pick mondays from next week only
binding.dateTimePickerNextWeekTextview.text = getTimeFromTimeStamp(nextWeekTimeStamp)
// This is to hide the later today option, if it's past 6pm
if (currTime > laterTodayTimeStamp) {
binding.dateTimePickerLaterToday.visibility = View.GONE
}
// This is to hide the tomorrow option, if that's also the weekend
if (binding.dateTimePickerTomorrowTextview.text == binding.dateTimePickerWeekendTextview.text) {
binding.dateTimePickerTomorrow.visibility = View.GONE
}
}
private fun getReminder() {
viewModel.getReminder(userManager.currentUser.blockingGet(), roomToken, messageId)
}
private fun showDelete(value: Boolean) {
if (value) {
binding.buttonDelete.visibility = View.VISIBLE
} else {
binding.buttonDelete.visibility = View.GONE
}
}
private fun setUpColors() {
binding.root.let {
viewThemeUtils.platform.colorViewBackground(it)
}
binding.dateTimePickerCustomIcon.let {
viewThemeUtils.platform.colorImageView(it, ColorRole.PRIMARY)
}
binding.dateTimePickerTimestamp.let {
viewThemeUtils.material.themeSearchBarText(it)
}
binding.run {
listOf(
binding.buttonClose,
binding.buttonSet
)
}.forEach(viewThemeUtils.material::colorMaterialButtonPrimaryBorderless)
}
private fun setListeners() {
binding.dateTimePickerLaterToday.setOnClickListener {
currentTimeStamp = laterTodayTimeStamp / ONE_SEC
setTimeStamp(getTimeFromTimeStamp(laterTodayTimeStamp))
}
binding.dateTimePickerTomorrow.setOnClickListener {
currentTimeStamp = tomorrowTimeStamp / ONE_SEC
setTimeStamp(getTimeFromTimeStamp(tomorrowTimeStamp))
}
binding.dateTimePickerWeekend.setOnClickListener {
currentTimeStamp = weekendTimeStamp / ONE_SEC
setTimeStamp(getTimeFromTimeStamp(weekendTimeStamp))
}
binding.dateTimePickerNextWeek.setOnClickListener {
currentTimeStamp = nextWeekTimeStamp / ONE_SEC
setTimeStamp(getTimeFromTimeStamp(nextWeekTimeStamp))
}
binding.dateTimePickerCustom.setOnClickListener {
val constraintsBuilder = CalendarConstraints.Builder()
.setValidator(DateValidatorPointForward.now())
.build()
val time = System.currentTimeMillis()
val datePicker = MaterialDatePicker.Builder.datePicker()
.setTitleText(R.string.nc_remind)
.setSelection(time + TimeZone.getDefault().getOffset(time))
.setCalendarConstraints(constraintsBuilder).build()
datePicker.addOnPositiveButtonClickListener { selection ->
val localTimeInMillis = selection - TimeZone.getDefault().getOffset(selection)
val calendar = Calendar.getInstance()
calendar.timeInMillis = localTimeInMillis
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_WEEK)
val weekInYear = calendar.get(Calendar.WEEK_OF_YEAR)
setUpTimePicker(year, month, day, weekInYear)
}
datePicker.show(this.parentFragmentManager, TAG)
}
binding.buttonClose.setOnClickListener { dismiss() }
binding.buttonSet.setOnClickListener {
currentTimeStamp?.let { time ->
viewModel.setReminder(userManager.currentUser.blockingGet(), roomToken, messageId, time.toInt())
}
dismiss()
}
binding.buttonDelete.setOnClickListener {
viewModel.deleteReminder(userManager.currentUser.blockingGet(), roomToken, messageId)
}
}
private fun setUpTimePicker(year: Int, month: Int, day: Int, weekInYear: Int) {
val timePicker = MaterialTimePicker
.Builder()
.setTitleText(R.string.nc_remind)
.build()
timePicker.addOnPositiveButtonClickListener {
val timestamp = getTimeFromCalendar(
year,
month,
day,
timePicker.hour,
timePicker.minute,
weekInYear = weekInYear
)
setTimeStamp(getTimeFromTimeStamp(timestamp))
currentTimeStamp = timestamp / ONE_SEC
}
timePicker.show(this.parentFragmentManager, TAG)
}
@Suppress("LongParameterList")
private fun getTimeFromCalendar(
year: Int = Calendar.getInstance().get(Calendar.YEAR),
month: Int = Calendar.getInstance().get(Calendar.MONTH),
day: Int = Calendar.getInstance().get(Calendar.DAY_OF_WEEK),
hour: Int = Calendar.getInstance().get(Calendar.HOUR_OF_DAY),
minute: Int = Calendar.getInstance().get(Calendar.MINUTE),
daysToAdd: Int = 0,
weekInYear: Int = Calendar.getInstance().get(Calendar.WEEK_OF_YEAR)
): Long {
val calendar: Calendar = Calendar.getInstance().apply {
set(Calendar.YEAR, year)
set(Calendar.MONTH, month)
set(Calendar.DAY_OF_WEEK, day)
add(Calendar.DAY_OF_WEEK, daysToAdd)
set(Calendar.WEEK_OF_YEAR, weekInYear)
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
}
return calendar.timeInMillis
}
private fun setTimeStamp(date: String) {
binding.dateTimePickerTimestamp.text = date
}
private fun getTimeFromTimeStamp(time: Long): String {
return DateUtils.formatDateTime(
requireContext(),
time,
DateUtils.FORMAT_SHOW_DATE
) + ", " + DateUtils.formatDateTime(
requireContext(),
time,
DateUtils.FORMAT_SHOW_TIME
)
}
companion object {
val TAG = DateTimePickerFragment::class.simpleName
private const val ONE_SEC = 1000
private const val HOUR_EIGHT_AM = 8
private const val HOUR_SIX_PM = 18
@JvmStatic
fun newInstance(
token: String,
id: String,
chatViewModel: ChatViewModel
) = DateTimePickerFragment(
token,
id,
chatViewModel
)
}
}

View File

@ -109,6 +109,7 @@ class MessageActionsDialog(
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
!(message.isDeletedCommentMessage || message.isDeleted)
)
initMenuRemindMessage(!message.isDeleted && CapabilitiesUtilNew.isRemindSupported(user))
initMenuMarkAsUnread(
message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType()
@ -265,6 +266,17 @@ class MessageActionsDialog(
dialogMessageActionsBinding.menuForwardMessage.visibility = getVisibility(visible)
}
private fun initMenuRemindMessage(visible: Boolean) {
if (visible) {
dialogMessageActionsBinding.menuNotifyMessage.setOnClickListener {
chatActivity.remindMeLater(message)
dismiss()
}
}
dialogMessageActionsBinding.menuNotifyMessage.visibility = getVisibility(visible)
}
private fun initMenuDeleteMessage(visible: Boolean) {
if (visible) {
dialogMessageActionsBinding.menuDeleteMessage.setOnClickListener {

View File

@ -530,4 +530,9 @@ public class ApiUtils {
public static String getUrlForTranslation(String baseUrl) {
return baseUrl + ocsApiVersion + "/translation/translate";
}
public static String getUrlForReminder(User user, String roomToken, String messageId, int version) {
String url = ApiUtils.getUrlForChatMessage(version, user.getBaseUrl(), roomToken, messageId);
return url + "/reminder";
}
}

View File

@ -145,7 +145,7 @@ object CapabilitiesUtilNew {
}
@JvmStatic
fun getAttachmentFolder(user: User): String? {
fun getAttachmentFolder(user: User): String {
if (user.capabilities?.spreedCapability?.config?.containsKey("attachments") == true) {
val map = user.capabilities!!.spreedCapability!!.config!!["attachments"]
if (map?.containsKey("folder") == true) {
@ -241,5 +241,14 @@ object CapabilitiesUtilNew {
}
}
fun isRemindSupported(user: User?): Boolean {
if (user?.capabilities != null) {
val capabilities = user.capabilities
return capabilities?.spreedCapability?.features?.contains("remind-me-later") == true
}
return false
}
const val DEFAULT_CHAT_SIZE = 1000
}

View File

@ -0,0 +1,27 @@
<!--
@author Google LLC
Copyright (C) 2018 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector android:height="24dp"
android:tint="#000000"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="@android:color/white"
android:pathData="M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,20H5V10h14V20zM9,14H7v-2h2V14zM13,14h-2v-2h2V14zM17,14h-2v-2h2V14zM9,18H7v-2h2V18zM13,18h-2v-2h2V18zM17,18h-2v-2h2V18z" />
</vector>

View File

@ -0,0 +1,9 @@
<vector
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportHeight="24"
android:viewportWidth="24"
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z"/>
</vector>

View File

@ -0,0 +1,218 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Nextcloud Talk application
~
~ @author Julius Linus
~ Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="@color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/standard_margin"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/nc_remind"
android:layout_weight="1"
android:textSize="@dimen/md_title_textsize" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/date_time_picker_timestamp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Apr 15th, 8:00 AM"
android:textSize="@dimen/supporting_text_text_size"
android:textStyle="bold" />
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/date_time_picker_later_today"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="@dimen/standard_padding">
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/later_today"
android:textSize="@dimen/headline_text_size" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/date_time_picker_later_today_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/headline_text_size"
android:text="" />
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_picker_tomorrow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="@dimen/standard_padding">
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/tomorrow"
android:textSize="@dimen/headline_text_size" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/date_time_picker_tomorrow_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/headline_text_size"
android:text="" />
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_picker_weekend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="@dimen/standard_padding">
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/this_weekend"
android:textSize="@dimen/headline_text_size" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/date_time_picker_weekend_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/headline_text_size"
android:text="" />
</LinearLayout>
<LinearLayout
android:id="@+id/date_time_picker_next_week"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:padding="@dimen/standard_padding">
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/next_week"
android:textSize="@dimen/headline_text_size" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/date_time_picker_next_week_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/headline_text_size"
android:text="" />
</LinearLayout>
<com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/date_time_picker_custom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="@dimen/standard_padding"
android:background="?android:attr/selectableItemBackground">
<ImageView
android:id="@+id/date_time_picker_custom_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/baseline_calendar_month_24"
android:paddingEnd="@dimen/standard_double_padding"
tools:ignore="RtlSymmetry"
android:contentDescription="@string/calendar" />
<com.google.android.material.textview.MaterialTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/custom"
android:layout_weight="1"
android:textSize="@dimen/headline_text_size" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1">
<com.google.android.material.button.MaterialButton
android:id="@+id/button_delete"
style="@style/Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/min_size_clickable_area"
android:text="@string/nc_delete"
android:textColor="@color/design_default_color_error" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/button_set"
style="@style/Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="@dimen/min_size_clickable_area"
android:text="@string/set" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_close"
style="@style/Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:minHeight="@dimen/min_size_clickable_area"
android:text="@string/close" />
</LinearLayout>
</LinearLayout>

View File

@ -221,6 +221,39 @@
</LinearLayout>
<LinearLayout
android:id="@+id/menu_notify_message"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">
<ImageView
android:id="@+id/menu_icon_notify_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:paddingStart="@dimen/standard_padding"
android:paddingEnd="@dimen/zero"
android:src="@drawable/ic_timer_black_24dp"
app:tint="@color/high_emphasis_menu_icon" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/menu_text_notify_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="@dimen/standard_double_padding"
android:paddingEnd="@dimen/standard_padding"
android:text="@string/nc_remind"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />
</LinearLayout>
<LinearLayout
android:id="@+id/menu_mark_as_unread"
android:layout_width="match_parent"

View File

@ -24,52 +24,88 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginTop="@dimen/standard_eighth_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:layout_marginBottom="@dimen/standard_eighth_margin">
android:layout_height="wrap_content">
<com.google.android.flexbox.FlexboxLayout
android:id="@id/container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:orientation="vertical"
android:padding="@dimen/standard_half_padding"
app:alignContent="stretch"
app:alignItems="stretch"
app:flexWrap="wrap"
app:justifyContent="flex_end">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/systemMessageLayout"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginTop="@dimen/standard_eighth_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:layout_marginBottom="@dimen/standard_eighth_margin">
<androidx.emoji2.widget.EmojiTextView
android:id="@+id/messageText"
<ImageView
android:id="@+id/expandCollapseIcon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_alignParentTop="true"
android:layout_margin="10dp"
android:contentDescription="@null"
android:visibility="gone"
tools:visibility="visible"/>
<com.google.android.flexbox.FlexboxLayout
android:id="@id/container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:gravity="center_horizontal"
android:textAlignment="center"
android:textColor="@color/textColorMaxContrast"
android:textSize="14sp"
app:layout_alignSelf="flex_start"
app:layout_flexGrow="1"
app:layout_wrapBefore="true"
tools:text="System message" />
android:orientation="vertical"
android:padding="@dimen/standard_half_padding"
app:alignContent="stretch"
app:alignItems="stretch"
app:flexWrap="wrap"
app:justifyContent="flex_end">
<androidx.emoji2.widget.EmojiTextView
android:id="@+id/messageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:gravity="center_horizontal"
android:textAlignment="center"
android:textColor="@color/textColorMaxContrast"
android:textSize="14sp"
app:layout_alignSelf="flex_start"
app:layout_flexGrow="1"
app:layout_wrapBefore="true"
tools:text="System message" />
<TextView
android:id="@id/messageTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/standard_half_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:gravity="end"
android:textColor="@color/warm_grey_four"
android:textSize="12sp"
app:layout_alignSelf="center"
app:layout_flexGrow="1"
app:layout_wrapBefore="false"
tools:text="17:30" />
<androidx.emoji2.widget.EmojiTextView
android:id="@+id/similarMessagesHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginStart="@dimen/standard_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:gravity="center_horizontal"
android:textAlignment="center"
android:textColor="@color/grey_600"
android:textStyle="bold"
android:textSize="14sp"
app:layout_alignSelf="center"
app:layout_flexGrow="1"
app:layout_wrapBefore="true"
tools:text="See 5 similar messages" />
</com.google.android.flexbox.FlexboxLayout>
</RelativeLayout>
<TextView
android:id="@id/messageTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/standard_half_margin"
android:layout_marginEnd="@dimen/standard_margin"
android:gravity="end"
android:textColor="@color/warm_grey_four"
android:textSize="12sp"
app:layout_alignSelf="center"
app:layout_flexGrow="1"
app:layout_wrapBefore="false"
tools:text="17:30" />
</com.google.android.flexbox.FlexboxLayout>
</RelativeLayout>

View File

@ -395,6 +395,7 @@
<string name="nc_wrong_link">La liga de la conversación no es válida</string>
<string name="nc_wrong_password">Contraseña equivocada</string>
<string name="nc_yes"></string>
<string name="next_week">Semana siguiente</string>
<string name="no_phone_book_integration_due_to_permissions">No hay integración de número de teléfono debido a permisos faltantes</string>
<string name="oneHour">1 hora</string>
<string name="online">En línea</string>
@ -448,6 +449,7 @@
<string name="send_to_forbidden">No tienes permiso para compartir contenido en este chat</string>
<string name="send_to_three_dots">Enviar a...</string>
<string name="send_without_notification">Enviar sin notificación</string>
<string name="set">Establecer</string>
<string name="set_avatar_from_camera">Establecer avatar desde la cámara</string>
<string name="set_status">Establecer estado</string>
<string name="set_status_message">Establecer mensaje de estado</string>

View File

@ -35,6 +35,7 @@
<string name="filename_progress">%1$s(%2$d)</string>
<string name="fourHours">4 ordu</string>
<string name="invisible">Ikusezina</string>
<string name="later_today">Beranduago gaur</string>
<string name="load_more_results">Kargatu emaitza gehiago </string>
<string name="lock_symbol">Blokeo sinboloa</string>
<string name="lower_hand">Jaitsi eskua</string>
@ -403,6 +404,7 @@
<string name="nc_wrong_link">Elkarrizketa esteka ez da baliozkoa</string>
<string name="nc_wrong_password">Pasahitz okerra</string>
<string name="nc_yes">Bai</string>
<string name="next_week">Hurrengo astea</string>
<string name="no_phone_book_integration_due_to_permissions">Ezin izan da telefono zenbakia integratu, baimen falta dela eta</string>
<string name="oneHour">Ordu 1</string>
<string name="online">Linean</string>
@ -456,6 +458,7 @@
<string name="send_to_forbidden">Ez duzu edukirik partekatzeko baimentik txat honetan</string>
<string name="send_to_three_dots">Bidali honi …</string>
<string name="send_without_notification">Bidali jakinarazpenik gabe</string>
<string name="set">Ezarri</string>
<string name="set_avatar_from_camera">Ezarri avatarra kameraren bidez</string>
<string name="set_status">Ezarri egoera</string>
<string name="set_status_message">Ezarri egoera-mezua</string>

View File

@ -403,6 +403,7 @@
<string name="nc_wrong_link">پیوند مکالمه معتبر نیست</string>
<string name="nc_wrong_password">کلمه عبور اشتباه</string>
<string name="nc_yes">بله</string>
<string name="next_week">هفتهٔ بعد</string>
<string name="no_phone_book_integration_due_to_permissions">No phone number integration due to missing permissions</string>
<string name="oneHour">۱ ساعت</string>
<string name="online">آنلاین</string>
@ -456,6 +457,7 @@
<string name="send_to_forbidden">You are not allowed to share content to this chat</string>
<string name="send_to_three_dots">Send to …</string>
<string name="send_without_notification">Send without notification</string>
<string name="set">تنظیم</string>
<string name="set_avatar_from_camera">Set avatar from camera</string>
<string name="set_status">تنظیم وضعیت</string>
<string name="set_status_message">تنظیم پیام وضعیت</string>

View File

@ -27,6 +27,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 tuntia</string>
<string name="invisible">Näkymätön</string>
<string name="later_today">Myöhemmin tänään</string>
<string name="load_more_results">Lataa lisää tuloksia</string>
<string name="lower_hand">Laske käsi</string>
<string name="menu_item_sort_by_date_newest_first">Uusin ensin</string>
@ -310,6 +311,7 @@
<string name="nc_wrong_link">Keskustelulinkki ei ole kelvollinen</string>
<string name="nc_wrong_password">Väärä salasana</string>
<string name="nc_yes">Kyllä</string>
<string name="next_week">Seuraava viikko</string>
<string name="oneHour">1 tunti</string>
<string name="online">Paikalla</string>
<string name="online_status">Online-tila</string>
@ -344,6 +346,7 @@
<string name="send_to_forbidden">Sinulla ei ole oikeutta jakaa sisältöä tähän keskusteluun</string>
<string name="send_to_three_dots">Lähetä…</string>
<string name="send_without_notification">Lähetä ilman ilmoitusta</string>
<string name="set">Aseta</string>
<string name="set_status">Aseta tilatieto</string>
<string name="set_status_message">Aseta tilaviesti</string>
<string name="share">Jaa</string>

View File

@ -10,12 +10,14 @@
<string name="avatar">Avatar</string>
<string name="away">Absent(e)</string>
<string name="call_more_actions_dialog_headline">Options d\'appel avancées</string>
<string name="call_running_since_one_hour">L\'appel est en cours depuis une heure.</string>
<string name="call_without_notification">Appeler sans notification</string>
<string name="camera_permission_granted">Caméra autorisée. Merci de choisir à nouveau la caméra .</string>
<string name="choose_avatar_from_cloud">Sélectionner l\'avatar depuis le cloud</string>
<string name="clear_status_message">Effacer le message d\'état</string>
<string name="clear_status_message_after">Effacer le message d\'état après</string>
<string name="close">Fermer</string>
<string name="continuous_voice_message_recording">Verrouiller l\'enregistrement pour enregistrer en continu le message vocal</string>
<string name="conversations">Discussions</string>
<string name="danger_zone">Zone de danger</string>
<string name="delete_avatar">Supprimer l\'avatar</string>
@ -63,6 +65,7 @@
<string name="nc_allow_guests">Autoriser les invités</string>
<string name="nc_attendee_pin">Épingler : %1$s</string>
<string name="nc_biometric_unlock">Déverrouiller %1$s</string>
<string name="nc_bluetooth_permission_hint">Pour activer les écouteurs bluetooth, merci de donner la permission \"Appareils à proximité\".</string>
<string name="nc_call_button_content_description_advanced">Options d\'appel avancées</string>
<string name="nc_call_button_content_description_answer_video_call">Répondre par appel vidéo</string>
<string name="nc_call_button_content_description_answer_voice_only">Répondre par appel vocal uniquement</string>
@ -86,6 +89,7 @@
<string name="nc_call_unknown">%s appel</string>
<string name="nc_call_video">%s appel vidéo</string>
<string name="nc_call_voice">%s appel audio</string>
<string name="nc_camera_permission_hint">Pour activer la communication vidéo, merci de donner l\'autorisation \"Appareil photo\".</string>
<string name="nc_camera_permission_permanently_denied">Pour permettre les communications vidéo, veuillez autoriser lutilisation de la caméra dans les paramètres du système.</string>
<string name="nc_cancel">Annuler</string>
<string name="nc_capabilities_failed">Échec de la récupération des capacités, abandon</string>
@ -207,6 +211,7 @@
<string name="nc_message_quote_cancel_reply">Annuler la réponse</string>
<string name="nc_message_read">Message lu</string>
<string name="nc_message_sent">Message envoyé</string>
<string name="nc_microphone_permission_hint">Pour autoriser la communication audio, merci de donner l\'autorisation \"Microphone\".</string>
<string name="nc_microphone_permission_permanently_denied">Pour permettre les communications audio, veuillez autoriser lutilisation du microphone dans les paramètres du système.</string>
<string name="nc_missed_call">Vous avez manqué un appel de %s</string>
<string name="nc_moderator">Modérateur</string>
@ -240,7 +245,11 @@
<string name="nc_participants">Participants</string>
<string name="nc_participants_add">Ajouter des participants</string>
<string name="nc_password">Mot de passe</string>
<string name="nc_permissions_ask">Définir les autorisations</string>
<string name="nc_permissions_denied">Certaines autorisations n\'ont pas été accordées.</string>
<string name="nc_permissions_rationale_dialog_title">Merci de donner les autorisations</string>
<string name="nc_permissions_settings">Ouvrir les paramètres</string>
<string name="nc_permissions_settings_hint">Merci de donner les autorisations dans Paramètres > Autorisations</string>
<string name="nc_phone_book_integration_account_not_found">Compte introuvable</string>
<string name="nc_phone_book_integration_chat_via">Chat via %s</string>
<string name="nc_pip_microphone_mute">Désactiver le micro</string>
@ -394,6 +403,7 @@
<string name="nc_wrong_link">Le lien de conversation n\'est pas valide.</string>
<string name="nc_wrong_password">Mot de passe incorrect</string>
<string name="nc_yes">Oui</string>
<string name="next_week">Semaine suivante</string>
<string name="no_phone_book_integration_due_to_permissions">Pas d\'intégration avec le carnet d\'adresses à cause d\'autorisations manquantes</string>
<string name="oneHour">1 heure</string>
<string name="online">En ligne</string>
@ -447,6 +457,7 @@
<string name="send_to_forbidden">Vous n\'êtes pas autorisé à partager du contenu dans cette conversation</string>
<string name="send_to_three_dots">Envoyer a…</string>
<string name="send_without_notification">Envoyer sans notification</string>
<string name="set">Affecter</string>
<string name="set_avatar_from_camera">Définir l\'avatar depuis la caméra</string>
<string name="set_status">Définir le statut</string>
<string name="set_status_message">Définir le message de statut</string>

View File

@ -19,6 +19,7 @@
<string name="close">Pechar</string>
<string name="continuous_voice_message_recording">Bloquear a gravación para gravar continuamente a mensaxe de voz</string>
<string name="conversations">Conversas</string>
<string name="custom">Personalizado</string>
<string name="danger_zone">Zona de perigo</string>
<string name="delete_avatar">Eliminar avatar</string>
<string name="dnd">Non molestar</string>
@ -35,6 +36,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 horas</string>
<string name="invisible">Invisíbel</string>
<string name="later_today">Hoxe máis tarde</string>
<string name="load_more_results">Cargando máis resultados</string>
<string name="lock_symbol">Símbolo de bloqueo</string>
<string name="lower_hand">Baixar a man</string>
@ -403,6 +405,7 @@
<string name="nc_wrong_link">A ligazón da conversa non é válida</string>
<string name="nc_wrong_password">Contrasinal incorrecto </string>
<string name="nc_yes">Si</string>
<string name="next_week">Semana seguinte</string>
<string name="no_phone_book_integration_due_to_permissions">Non hai integración do número de teléfono por mor da falta de permisos</string>
<string name="oneHour">1 hora</string>
<string name="online">En liña</string>
@ -456,6 +459,7 @@
<string name="send_to_forbidden">Non ten permiso para compartir contido nesta parola</string>
<string name="send_to_three_dots">Enviar a…</string>
<string name="send_without_notification">Enviar sen notificación</string>
<string name="set">Estabelecer</string>
<string name="set_avatar_from_camera">Estabelecer o avatar dende a cámara</string>
<string name="set_status">Estabelecer o estado</string>
<string name="set_status_message">Estabelecer a mensaxe de estado</string>
@ -484,6 +488,7 @@
<string name="thirtyMinutes">30 minutos</string>
<string name="thisWeek">Esta semana</string>
<string name="this_is_a_test_message">Esta é unha mensaxe de proba</string>
<string name="this_weekend">Este fin de semana</string>
<string name="title_attachments">Anexos</string>
<string name="today">Hoxe</string>
<string name="translate">Traducir</string>

View File

@ -11,6 +11,7 @@
<string name="clear_status_message_after">Izbriši poruku statusa nakon</string>
<string name="close">Zatvori</string>
<string name="conversations">Razgovori</string>
<string name="custom">Prilagođeno</string>
<string name="delete_avatar">Izbriši avatar</string>
<string name="dnd">Ne ometaj</string>
<string name="dontClear">Ne briši</string>
@ -328,6 +329,7 @@
<string name="nc_wrong_link">Poveznica za razgovor nije valjana</string>
<string name="nc_wrong_password">Pogrešna zaporka</string>
<string name="nc_yes">Da</string>
<string name="next_week">Sljedeći tjedan</string>
<string name="no_phone_book_integration_due_to_permissions">Integracija broja telefona nije moguća jer nedostaje dopuštenje</string>
<string name="oneHour">1 sat</string>
<string name="online">Na mreži</string>
@ -358,6 +360,7 @@
<string name="selected_list_item">Odabrano</string>
<string name="send_to">Pošalji na</string>
<string name="send_to_three_dots">Pošalji na…</string>
<string name="set">Postavi</string>
<string name="set_status">Postavi status</string>
<string name="set_status_message">Postavi poruku statusa</string>
<string name="share">Dijeli</string>

View File

@ -17,6 +17,7 @@
<string name="clear_status_message_after">Állapotüzenet törlése ennyi idő után:</string>
<string name="close">Bezárás</string>
<string name="conversations">Beszélgetések</string>
<string name="custom">Egyéni</string>
<string name="delete_avatar">Profilkép törlése</string>
<string name="dnd">Ne zavarjanak</string>
<string name="dontClear">Ne törölje</string>
@ -388,6 +389,7 @@
<string name="nc_wrong_link">A beszélgetési hivatkozás nem érvényes</string>
<string name="nc_wrong_password">Hibás jelszó</string>
<string name="nc_yes">Igen</string>
<string name="next_week">Következő hét</string>
<string name="no_phone_book_integration_due_to_permissions">Nincs telefonszám integráció hiányzó engedélyek miatt</string>
<string name="oneHour">1 óra</string>
<string name="online">Elérhető</string>
@ -441,6 +443,7 @@
<string name="send_to_forbidden">Nincs jogosultsága, hogy tartalmat osszon meg ebben a csevegésben</string>
<string name="send_to_three_dots">Küldés…</string>
<string name="send_without_notification">Küldés értesítés nélkül</string>
<string name="set">Beállítás</string>
<string name="set_avatar_from_camera">Profilkép beállítása a kamerával</string>
<string name="set_status">Állapot beállítása</string>
<string name="set_status_message">Állapotüzenet beállítása</string>

View File

@ -10,6 +10,7 @@
<string name="clear_status_message_after">Hreinsa stöðuskilaboð eftir</string>
<string name="close">Loka</string>
<string name="conversations">Samtöl</string>
<string name="custom">Sérsniðið</string>
<string name="dnd">Ónáðið ekki</string>
<string name="dontClear">Ekki hreinsa</string>
<string name="edit">Breyta</string>
@ -233,6 +234,7 @@
<string name="nc_wrong_link">Samskiptatengill er ekki gildur</string>
<string name="nc_wrong_password">Rangt lykilorð</string>
<string name="nc_yes"></string>
<string name="next_week">Næsta viku</string>
<string name="oneHour">1 klukkustund</string>
<string name="online">Á netinu</string>
<string name="online_status">Staða á netinu</string>
@ -248,6 +250,7 @@
<string name="scope_published_title">Útgefið</string>
<string name="secondsAgo">sekúndum síðan</string>
<string name="selected_list_item">Valið</string>
<string name="set">Setja</string>
<string name="set_status">Setja stöðu</string>
<string name="set_status_message">Setja stöðuskilaboð</string>
<string name="share">Deila</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Auricolare cablato</string>
<string name="avatar">Avatar</string>
<string name="away">Assente</string>
<string name="calendar">Calendario</string>
<string name="call_more_actions_dialog_headline">Opzioni avanzate per le chiamate</string>
<string name="call_without_notification">Chiama senza notifica</string>
<string name="camera_permission_granted">Autorizzazione fotocamera concessa. Scegli di nuovo la fotocamera.</string>
@ -17,6 +18,7 @@
<string name="clear_status_message_after">Cancella il messaggio di stato dopo</string>
<string name="close">Chiudi</string>
<string name="conversations">Conversazioni</string>
<string name="custom">Personalizzato</string>
<string name="delete_avatar">Elimina avatar</string>
<string name="dnd">Non disturbare</string>
<string name="dontClear">Non cancellare</string>
@ -349,6 +351,7 @@
<string name="nc_wrong_link">Il collegamento della conversazione non è valido</string>
<string name="nc_wrong_password">Password errata</string>
<string name="nc_yes"></string>
<string name="next_week">Settimana successiva</string>
<string name="no_phone_book_integration_due_to_permissions">Nessuna integrazione del numero di telefono a causa di autorizzazioni mancanti</string>
<string name="oneHour">1 ora</string>
<string name="online">In linea</string>
@ -381,6 +384,7 @@
<string name="selected_list_item">Selezionato</string>
<string name="send_to">Invia a</string>
<string name="send_to_three_dots">Invia a…</string>
<string name="set">Imposta</string>
<string name="set_status">Imposta stato</string>
<string name="set_status_message">Imposta messaggio di stato</string>
<string name="share">Condividi</string>

View File

@ -9,6 +9,7 @@
<string name="clear_status_message_after">מחיקת הודעת מצב לאחר</string>
<string name="close">סגירה</string>
<string name="conversations">דיונים</string>
<string name="custom">מותאם אישית</string>
<string name="dnd">לא להפריע</string>
<string name="dontClear">לא לפנות</string>
<string name="edit">עריכה</string>
@ -246,6 +247,7 @@
<string name="nc_wrong_link">הקישור לדיון אינו תקף</string>
<string name="nc_wrong_password">ססמה שגויה</string>
<string name="nc_yes">כן</string>
<string name="next_week">השבוע הבא</string>
<string name="oneHour">שעה</string>
<string name="online">מקוון</string>
<string name="online_status">מצב מקוון</string>
@ -260,6 +262,7 @@
<string name="scope_published_description">לסנכרן מול שרתים מהימנים וספר הכתובות הגלובלי והציבורי</string>
<string name="secondsAgo">לפני מספר שניות</string>
<string name="selected_list_item">Selected</string>
<string name="set">הגדרה</string>
<string name="set_status">הגדרת מצב</string>
<string name="set_status_message">הגדרת הודעת מצב</string>
<string name="share">שתף</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">有線ヘッドセット</string>
<string name="avatar">アバター</string>
<string name="away">離席中</string>
<string name="calendar">カレンダー</string>
<string name="call_running_since_one_hour">通話が1 時間経過</string>
<string name="call_without_notification">通知なしで通話</string>
<string name="choose_avatar_from_cloud">クラウドからアバターを選択</string>
@ -16,6 +17,7 @@
<string name="clear_status_message_after">ステータスメッセージの有効期限</string>
<string name="close">閉じる</string>
<string name="conversations">会話</string>
<string name="custom">カスタム</string>
<string name="delete_avatar">アバターを削除</string>
<string name="dnd">取り込み中</string>
<string name="dontClear">消去しない</string>
@ -345,6 +347,7 @@
<string name="nc_wrong_link">会話リンクが無効です</string>
<string name="nc_wrong_password">パスワードが間違っています</string>
<string name="nc_yes">はい</string>
<string name="next_week">来週</string>
<string name="no_phone_book_integration_due_to_permissions">利用権限がないため、電話番号統合ができません。</string>
<string name="oneHour">1時間</string>
<string name="online">オンライン</string>
@ -382,6 +385,7 @@
<string name="send_to_forbidden">このチャットにコンテンツを許可する権限がありません</string>
<string name="send_to_three_dots">送信…</string>
<string name="send_without_notification">通知なしで送信</string>
<string name="set">セット</string>
<string name="set_status">ステータスを設定</string>
<string name="set_status_message">メッセージを設定</string>
<string name="share">共有</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">유선 헤드셋</string>
<string name="avatar">아바타</string>
<string name="away">자리비움</string>
<string name="calendar">일정</string>
<string name="call_without_notification">알림 없이 전화하기</string>
<string name="camera_permission_granted">카메라 권한이 부여되었습니다 . 카메라를 다시 선택해주세요.</string>
<string name="choose_avatar_from_cloud">클라우드에서 아바타 선택</string>
@ -16,6 +17,7 @@
<string name="clear_status_message_after">상태 메시지 지우기 예약</string>
<string name="close">닫기</string>
<string name="conversations">대화</string>
<string name="custom">사용자 정의</string>
<string name="delete_avatar">아바타 삭제</string>
<string name="dnd">방해 없음</string>
<string name="dontClear">지우지 않음</string>
@ -367,6 +369,7 @@
<string name="nc_wrong_link">무효한 대화 링크</string>
<string name="nc_wrong_password">잘못된 암호</string>
<string name="nc_yes"></string>
<string name="next_week">다음주</string>
<string name="no_phone_book_integration_due_to_permissions">권한 없음으로 인하여 전화 번호를 통합하지 않습니다.</string>
<string name="oneHour">1시간</string>
<string name="online">접속 중</string>

View File

@ -5,10 +5,12 @@
<string name="audio_output_phone">Telefonas</string>
<string name="avatar">Avataras</string>
<string name="away">Atsitraukęs</string>
<string name="calendar">Kalendorius</string>
<string name="clear_status_message">Išvalyti būsenos žinutę</string>
<string name="clear_status_message_after">Išvalyti būsenos žinutę po</string>
<string name="close">Užverti</string>
<string name="conversations">Pokalbiai</string>
<string name="custom">Tinkinti</string>
<string name="dnd">Netrukdyti</string>
<string name="dontClear">Neišvalyti</string>
<string name="edit">Taisyti</string>
@ -247,6 +249,7 @@
<string name="nc_wrong_link">Pokalbio nuoroda negalioja</string>
<string name="nc_wrong_password">Neteisingas slaptažodis</string>
<string name="nc_yes">Taip</string>
<string name="next_week">Kita savaitė</string>
<string name="oneHour">1 valanda</string>
<string name="online">Prisijungęs</string>
<string name="online_status">Prisijungimo būsena</string>
@ -274,6 +277,7 @@
<string name="scroll_to_bottom">Slinkti į apačią</string>
<string name="secondsAgo">prieš keletą sekundžių</string>
<string name="selected_list_item">Pasirinkta</string>
<string name="set">Nustatyti</string>
<string name="set_status">Nustatyti būseną</string>
<string name="set_status_message">Nustatyti būsenos žinutę</string>
<string name="share">Bendrinti</string>

View File

@ -8,10 +8,12 @@
<string name="audio_output_speaker">Høytaler</string>
<string name="avatar">Avatar</string>
<string name="away">Borte</string>
<string name="calendar">Kalender</string>
<string name="clear_status_message">Fjern statusmelding</string>
<string name="clear_status_message_after">Fjern statusmelding etter</string>
<string name="close">Lukk</string>
<string name="conversations">Samtaler</string>
<string name="custom">Egendefinert</string>
<string name="delete_avatar">Slett data</string>
<string name="dnd">Ikke forstyrr</string>
<string name="dontClear">Ikke fjern</string>
@ -23,6 +25,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 timer</string>
<string name="invisible">Usynlig</string>
<string name="later_today">Senere i dag</string>
<string name="load_more_results">Hent flere resultat</string>
<string name="lower_hand">Senk hånden</string>
<string name="menu_item_sort_by_date_newest_first">Nyeste først</string>
@ -267,6 +270,7 @@
<string name="nc_wrong_link">Samtale lenke er ikke gyldig</string>
<string name="nc_wrong_password">Feil passord</string>
<string name="nc_yes">Ja</string>
<string name="next_week">Neste uke</string>
<string name="oneHour">1 time</string>
<string name="online">Pålogget</string>
<string name="online_status">Online-status</string>
@ -290,6 +294,7 @@
<string name="selected_list_item">Valgt</string>
<string name="send_to">Send til</string>
<string name="send_to_three_dots">Send til...</string>
<string name="set">Sett</string>
<string name="set_status">Velg status</string>
<string name="set_status_message">Velg statusmelding</string>
<string name="share">Del</string>
@ -309,6 +314,7 @@
<string name="take_photo_toggle_torch">Lommelykt av/på</string>
<string name="thirtyMinutes">30 minutter</string>
<string name="thisWeek">Denne uken</string>
<string name="this_weekend">Denne helgen</string>
<string name="title_attachments">Vedlegg</string>
<string name="today">I dag</string>
<string name="translate">Oversette</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Bedrade headset</string>
<string name="avatar">Avatar</string>
<string name="away">Afwezig</string>
<string name="calendar">Agenda</string>
<string name="call_more_actions_dialog_headline">Geavanceerde oproepopties</string>
<string name="call_without_notification">Oproepen zonder melding</string>
<string name="camera_permission_granted">Toegang tot camera verleend. Kies aub. uw camera opnieuw.</string>
@ -17,6 +18,7 @@
<string name="clear_status_message_after">Statusbericht wissen na</string>
<string name="close">Sluit</string>
<string name="conversations">Gesprekken</string>
<string name="custom">Aangepast</string>
<string name="delete_avatar">Verwijder avatar</string>
<string name="dnd">Niet storen</string>
<string name="dontClear">Niet opruimen</string>
@ -357,6 +359,7 @@ Kies er eentje van een provider.</string>
<string name="nc_wrong_link">Gesprekslink is niet geldig</string>
<string name="nc_wrong_password">Onjuist wachtwoord</string>
<string name="nc_yes">Ja</string>
<string name="next_week">Volgende week</string>
<string name="no_phone_book_integration_due_to_permissions">Geen telefoonnummer-integratie wegens ontbrekende machtigingen</string>
<string name="oneHour">1 uur</string>
<string name="online">Online</string>
@ -400,6 +403,7 @@ Kies er eentje van een provider.</string>
<string name="send_to">Versturen naar</string>
<string name="send_to_three_dots">Versturen naar …</string>
<string name="send_without_notification">Versturen zonder melding</string>
<string name="set">Stel in</string>
<string name="set_status">Instellen status</string>
<string name="set_status_message">Statusbericht instellen</string>
<string name="share">Delen</string>
@ -424,6 +428,7 @@ Kies er eentje van een provider.</string>
<string name="thisWeek">Deze week</string>
<string name="title_attachments">Bijlagen</string>
<string name="today">Vandaag</string>
<string name="tomorrow">Morgen</string>
<string name="translation_device_settings">Apparaatinstellingen</string>
<string name="translation_error_message">Kan taal niet detecteren</string>
<string name="translation_from">Van</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Słuchawki przewodowe</string>
<string name="avatar">Awatar</string>
<string name="away">Bezczynny</string>
<string name="calendar">Kalendarz</string>
<string name="call_more_actions_dialog_headline">Zaawansowane opcje połączeń</string>
<string name="call_without_notification">Połącz bez powiadomienia</string>
<string name="camera_permission_granted">Udzielono dostępu do kamery. Proszę ponownie wybrać kamerę.</string>
@ -18,6 +19,7 @@
<string name="close">Zamknij</string>
<string name="continuous_voice_message_recording">Zablokuj nagrywanie w celu ciągłego nagrywania wiadomości głosowej</string>
<string name="conversations">Rozmowy</string>
<string name="custom">Dowolnie</string>
<string name="danger_zone">Strefa niebezpieczeństwa</string>
<string name="delete_avatar">Usuń awatar</string>
<string name="dnd">Nie przeszkadzać</string>
@ -395,6 +397,7 @@
<string name="nc_wrong_link">Link rozmowy jest nieprawidłowy</string>
<string name="nc_wrong_password">Złe hasło</string>
<string name="nc_yes">Tak</string>
<string name="next_week">Następny tydzień</string>
<string name="no_phone_book_integration_due_to_permissions">Brak integracji numeru telefonu z powodu braku uprawnień</string>
<string name="oneHour">1 godzina</string>
<string name="online">Online</string>
@ -448,6 +451,7 @@
<string name="send_to_forbidden">Nie możesz udostępniać treści na tym czacie</string>
<string name="send_to_three_dots">Wyślij do…</string>
<string name="send_without_notification">Wyślij bez powiadomienia</string>
<string name="set">Ustaw</string>
<string name="set_avatar_from_camera">Ustaw awatar z aparatu</string>
<string name="set_status">Ustaw status</string>
<string name="set_status_message">Ustaw komunikat statusu</string>
@ -478,6 +482,7 @@
<string name="this_is_a_test_message">To jest wiadomość testowa</string>
<string name="title_attachments">Załączniki</string>
<string name="today">Dzisiaj</string>
<string name="tomorrow">Jutro</string>
<string name="translate">Tłumaczenie</string>
<string name="translation">Tłumaczenie</string>
<string name="translation_copy_translated_text">Kopiuj przetłumaczony tekst</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Fone de ouvido</string>
<string name="avatar">Avatar</string>
<string name="away">Ausente</string>
<string name="calendar">Calendário</string>
<string name="call_more_actions_dialog_headline">Opções avançadas de chamada</string>
<string name="call_running_since_one_hour">A chamada está em execução há uma hora.</string>
<string name="call_without_notification">Ligue sem notificação</string>
@ -19,6 +20,7 @@
<string name="close">Fechar</string>
<string name="continuous_voice_message_recording">Gravação de bloqueio para gravação contínua da mensagem de voz</string>
<string name="conversations">Conversas</string>
<string name="custom">Personalizar</string>
<string name="danger_zone">Zona de perigo</string>
<string name="delete_avatar">Excluir avatar</string>
<string name="dnd">Não perturbe</string>
@ -35,6 +37,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 horas</string>
<string name="invisible">Invisível</string>
<string name="later_today">Hoje mais tarde</string>
<string name="load_more_results">Carregar mais resultados </string>
<string name="lock_symbol">Símbolo de cadeado</string>
<string name="lower_hand">Baixar a mão</string>
@ -403,6 +406,7 @@
<string name="nc_wrong_link">O link de conversação não é válido</string>
<string name="nc_wrong_password">Senha incorreta</string>
<string name="nc_yes">Sim</string>
<string name="next_week">Próxima semana</string>
<string name="no_phone_book_integration_due_to_permissions">Sem integração de número de telefone devido à falta de permissões</string>
<string name="oneHour">1 hora</string>
<string name="online">Online</string>
@ -456,6 +460,7 @@
<string name="send_to_forbidden">Você não tem permissão para compartilhar conteúdo neste bate-papo</string>
<string name="send_to_three_dots">Enviar para …</string>
<string name="send_without_notification">Enviar sem notificação</string>
<string name="set">Definir</string>
<string name="set_avatar_from_camera">Definir avatar da câmera</string>
<string name="set_status">Definir status</string>
<string name="set_status_message">Definir mensagem de status</string>
@ -484,8 +489,10 @@
<string name="thirtyMinutes">30 minutos</string>
<string name="thisWeek">Esta semana</string>
<string name="this_is_a_test_message">Esta é uma mensagem de teste</string>
<string name="this_weekend">Este fim de semana</string>
<string name="title_attachments">Anexos</string>
<string name="today">Hoje</string>
<string name="tomorrow">Amanhã</string>
<string name="translate">Traduzir</string>
<string name="translation">Tradução</string>
<string name="translation_copy_translated_text">Copiar texto traduzido</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Проводная гарнитура</string>
<string name="avatar">Аватар</string>
<string name="away">Отошёл</string>
<string name="calendar">Календарь</string>
<string name="call_more_actions_dialog_headline">Дополнительные настройки звонка</string>
<string name="call_running_since_one_hour">Звонок длится уже час</string>
<string name="call_without_notification">Звонок без уведомления</string>
@ -18,6 +19,7 @@
<string name="clear_status_message_after">Очищать статус после</string>
<string name="close">Закрыть</string>
<string name="conversations">Разговоры</string>
<string name="custom">Задать</string>
<string name="delete_avatar">Удалить аватар</string>
<string name="dnd">Не беспокоить</string>
<string name="dontClear">Не очищать</string>
@ -33,6 +35,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 часа</string>
<string name="invisible">Невидимый</string>
<string name="later_today">Позже сегодня</string>
<string name="load_more_results">Показать больше результатов</string>
<string name="lock_symbol">Символ блокировки</string>
<string name="lower_hand">Опустить руку</string>
@ -385,6 +388,7 @@
<string name="nc_wrong_link">Ссылка на беседу более не действительна</string>
<string name="nc_wrong_password">Неправильный пароль</string>
<string name="nc_yes">Да</string>
<string name="next_week">Следующая неделя</string>
<string name="no_phone_book_integration_due_to_permissions">Отсутствуют разрешения на интеграцию номера телефона</string>
<string name="oneHour">1 час</string>
<string name="online">В сети</string>
@ -438,6 +442,7 @@
<string name="send_to_forbidden">Вам не разрешено делиться контентом в этом чате</string>
<string name="send_to_three_dots">Отправить …</string>
<string name="send_without_notification">Отправить без уведомления</string>
<string name="set">Указать</string>
<string name="set_avatar_from_camera">Установить аватар со снимка камерой</string>
<string name="set_status">Установить статус</string>
<string name="set_status_message">Установить статус</string>
@ -465,8 +470,10 @@
<string name="take_photo_toggle_torch">Переключатель фонарика</string>
<string name="thirtyMinutes">30 минут</string>
<string name="thisWeek">Эта неделя</string>
<string name="this_weekend">Эта неделя</string>
<string name="title_attachments">Вложения</string>
<string name="today">Сегодня</string>
<string name="tomorrow">Завтра</string>
<string name="translate">Помочь с переводом</string>
<string name="translation">Перевод</string>
<string name="translation_copy_translated_text">Копировать переведенный текст</string>

View File

@ -6,11 +6,13 @@
<string name="audio_output_speaker">Altoparlante</string>
<string name="avatar">Avatar</string>
<string name="away">Ausente</string>
<string name="calendar">Calendàriu</string>
<string name="choose_avatar_from_cloud">Sèbera s\'avatar dae sa nue virtuale</string>
<string name="clear_status_message">Lìmpia su messàgiu de istadu</string>
<string name="clear_status_message_after">Lìmpia su messàgiu de istadu a pustis</string>
<string name="close">Serra</string>
<string name="conversations">Cunversatziones</string>
<string name="custom">Personaliza</string>
<string name="delete_avatar">Cantzella s\'avatar</string>
<string name="dnd">No istorbes</string>
<string name="edit">Modìfica</string>
@ -314,6 +316,7 @@
<string name="nc_wrong_link">Ligòngiu de tzarrada non vàlidu</string>
<string name="nc_wrong_password">Crae isballiada</string>
<string name="nc_yes">Eja</string>
<string name="next_week">Sa chida chi benit</string>
<string name="no_phone_book_integration_due_to_permissions">Peruna integratzione de nùmeru de telèfonu pro farta de permissos</string>
<string name="oneHour">1 ora</string>
<string name="online">In lìnia</string>
@ -362,6 +365,7 @@
<string name="thisWeek">Custa chida</string>
<string name="title_attachments">Alligongiados</string>
<string name="today">Oe</string>
<string name="tomorrow">Cras</string>
<string name="translate">Borta</string>
<string name="translation_device_settings">Impostatziones de su dispositivu</string>
<string name="translation_from">Dae</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Drátové sluchátka</string>
<string name="avatar">Avatar</string>
<string name="away">Preč</string>
<string name="calendar">Kalendár</string>
<string name="call_without_notification">Volať bez upozornenia</string>
<string name="camera_permission_granted">Povolenie fotoaparátu bolo udelené. Vyberte fotoaparát znova.</string>
<string name="choose_avatar_from_cloud">Vyberte si avatara z cloudu</string>
@ -16,6 +17,7 @@
<string name="clear_status_message_after">Vyčistiť správu o stave po</string>
<string name="close">Zatvoriť</string>
<string name="conversations">Konverzácie</string>
<string name="custom">Vlastný</string>
<string name="delete_avatar">Zmazať avatara</string>
<string name="dnd">Nerušiť</string>
<string name="dontClear">Nemazať</string>
@ -233,6 +235,7 @@
<string name="nc_push_disabled">Push notifikácie vypnuté</string>
<string name="nc_push_to_talk">Stlač a hovor PTT</string>
<string name="nc_push_to_talk_desc">S vypnutým mikrofónom, kliknite &amp;podržte pre použitie funkcie Stlač a hovor PTT</string>
<string name="nc_remind">Pripomenúť neskôr</string>
<string name="nc_remote_audio_off">Vypnúť vzdialené audio</string>
<string name="nc_remove_circle_and_members">Vymazať kruh a členov</string>
<string name="nc_remove_from_favorites">Odstrániť z obľúbených</string>
@ -369,6 +372,7 @@
<string name="nc_wrong_link">Odkaz na rozhovor nie je platný!</string>
<string name="nc_wrong_password">Nesprávne heslo</string>
<string name="nc_yes">Áno</string>
<string name="next_week">Nasledujúci týždeň</string>
<string name="no_phone_book_integration_due_to_permissions">Registrácia telefónneho čísla nie je povolená pre nedostatok práv</string>
<string name="oneHour">1 hodina</string>
<string name="online">Pripojený</string>
@ -413,6 +417,7 @@
<string name="send_to_forbidden">Nemáte oprávnenie zdieľať obsah tohto rozhovoru</string>
<string name="send_to_three_dots">Odoslať do …</string>
<string name="send_without_notification">Poslať bez upozornenia</string>
<string name="set">Nastaviť</string>
<string name="set_avatar_from_camera">Nastaviť avatara z fotoaparátu</string>
<string name="set_status">Nastaviť stav</string>
<string name="set_status_message">Nastaviť správu o stave</string>
@ -439,6 +444,7 @@
<string name="thisWeek">Tento týždeň</string>
<string name="title_attachments">Prílohy</string>
<string name="today">Dnes</string>
<string name="tomorrow">Zajtra</string>
<string name="translate">Preložiť</string>
<string name="translation_device_settings">Nastavenia zariadenia</string>
<string name="translation_from">Od</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Ožičene slušalke</string>
<string name="avatar">Podoba</string>
<string name="away">Ne spremljam</string>
<string name="calendar">Koledar</string>
<string name="call_more_actions_dialog_headline">Napredne možnosti klica</string>
<string name="call_without_notification">Klic brez obvestila</string>
<string name="camera_permission_granted">Dovoljenje za uporabo kamere je dodeljeno. Ponovno izberite kamero.</string>
@ -17,6 +18,7 @@
<string name="clear_status_message_after">Počisti sporočilo stanja po</string>
<string name="close">Zapri</string>
<string name="conversations">Pogovori</string>
<string name="custom">Po meri</string>
<string name="delete_avatar">Izbriši podobo</string>
<string name="dnd">Ne moti</string>
<string name="dontClear">Ne počisti</string>
@ -245,6 +247,7 @@
<string name="nc_push_disabled">Potisno obveščanje je onemogočeno</string>
<string name="nc_push_to_talk">Možnost »push-to-talk«</string>
<string name="nc_push_to_talk_desc">Pri onemogočenem mikrofonu lahko za začetek govora kliknete in zadržite gumb</string>
<string name="nc_remind">Opomni me kasneje</string>
<string name="nc_remote_audio_off">Oddaljen zvok je onemogočen</string>
<string name="nc_remove_circle_and_members">Odstrani krog in člane</string>
<string name="nc_remove_from_favorites">Odstrani iz priljubljenih</string>
@ -381,6 +384,7 @@
<string name="nc_wrong_link">Povezava do pogovora ni veljavna</string>
<string name="nc_wrong_password">Napačno geslo</string>
<string name="nc_yes">Da</string>
<string name="next_week">Naslednji teden</string>
<string name="no_phone_book_integration_due_to_permissions">Povezava s telefonskim imenikom ni na voljo zaradi neustreznih dovoljenj.</string>
<string name="oneHour">1 uri</string>
<string name="online">Trenutno na spletu</string>
@ -432,6 +436,7 @@
<string name="send_to_forbidden">Ni ustreznih dovoljenj za objavljanje vsebine v ta klepet</string>
<string name="send_to_three_dots">Pošlji …</string>
<string name="send_without_notification">Pošlji brez obvestila</string>
<string name="set">Nastavi</string>
<string name="set_avatar_from_camera">Nastavi sličico s kamero</string>
<string name="set_status">Nastavi stanje</string>
<string name="set_status_message">Nastavi sporočilo stanja</string>
@ -461,6 +466,7 @@
<string name="thisWeek">Ta teden</string>
<string name="title_attachments">Priloge</string>
<string name="today">Danes</string>
<string name="tomorrow">Jutri</string>
<string name="translate">Prevodi</string>
<string name="translation">Prevod</string>
<string name="translation_copy_translated_text">Kopiraj prevedeno besedilo</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Жичане слушалице са микрофоном</string>
<string name="avatar">Аватар</string>
<string name="away">Одсутан</string>
<string name="calendar">Календар</string>
<string name="call_more_actions_dialog_headline">Напредне опције позива</string>
<string name="call_running_since_one_hour">Позив траје један сат.</string>
<string name="call_without_notification">Позив без обавештења</string>
@ -19,6 +20,7 @@
<string name="close">Затвори</string>
<string name="continuous_voice_message_recording">Закључајте снимање да би се гласовна порука непрестано снимала.</string>
<string name="conversations">Разговори</string>
<string name="custom">Прилагођено</string>
<string name="danger_zone">Зона опасности</string>
<string name="delete_avatar">Обриши аватар</string>
<string name="dnd">Не узнемиравај</string>
@ -35,6 +37,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 сата</string>
<string name="invisible">Невидљива</string>
<string name="later_today">Касније данас</string>
<string name="load_more_results">Учитај још резултата</string>
<string name="lock_symbol">Симбол катанца</string>
<string name="lower_hand">Спуштена рука</string>
@ -264,6 +267,7 @@
<string name="nc_push_disabled">Брза обавештења су искључена</string>
<string name="nc_push_to_talk">Притисни за разговор</string>
<string name="nc_push_to_talk_desc">Са онемогућеним микрофоном, кликните &amp; држите да користите притисак за разговор</string>
<string name="nc_remind">Подсети ме касније</string>
<string name="nc_remote_audio_off">Удаљени аудио је искључен</string>
<string name="nc_remove_circle_and_members">Уклони круг и чланове</string>
<string name="nc_remove_from_favorites">Уклони из омиљених</string>
@ -403,6 +407,7 @@
<string name="nc_wrong_link">Веза разговора није исправна</string>
<string name="nc_wrong_password">Погрешна лозинка</string>
<string name="nc_yes">Да</string>
<string name="next_week">Наредне недеље</string>
<string name="no_phone_book_integration_due_to_permissions">Нема интеграције броја телефона јер недостају дозволе</string>
<string name="oneHour">1 сат</string>
<string name="online">На мрежи</string>
@ -456,6 +461,7 @@
<string name="send_to_forbidden">Није вам дозвољено да делите садржај у овај чет</string>
<string name="send_to_three_dots">Пошаљи у ...</string>
<string name="send_without_notification">Пошаљи без обавештења</string>
<string name="set">Постави</string>
<string name="set_avatar_from_camera">Постави аватар са камере</string>
<string name="set_status">Постави статус</string>
<string name="set_status_message">Постави статусну поруку</string>
@ -484,8 +490,10 @@
<string name="thirtyMinutes">30 минута</string>
<string name="thisWeek">Ове недеље</string>
<string name="this_is_a_test_message">Ово је тест порука</string>
<string name="this_weekend">Овог викенда</string>
<string name="title_attachments">Прилози</string>
<string name="today">Данас</string>
<string name="tomorrow">Сутра</string>
<string name="translate">Превођење</string>
<string name="translation">Превод</string>
<string name="translation_copy_translated_text">Копирај преведени текст</string>

View File

@ -8,11 +8,13 @@
<string name="audio_output_wired_headset">Sladdansluten hörlur</string>
<string name="avatar">Avatar</string>
<string name="away">Iväg</string>
<string name="calendar">Kalender</string>
<string name="choose_avatar_from_cloud">Välj avatar från moln</string>
<string name="clear_status_message">Rensa statusmeddelande</string>
<string name="clear_status_message_after">Rensa statusmeddelande efter</string>
<string name="close">Stäng</string>
<string name="conversations">Konversationer</string>
<string name="custom">Anpassad</string>
<string name="delete_avatar">Ta bort avatar</string>
<string name="dnd">Stör ej</string>
<string name="dontClear">Rensa inte</string>
@ -27,6 +29,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 timmar</string>
<string name="invisible">Osynlig</string>
<string name="later_today">Senare idag</string>
<string name="load_more_results">Visa fler resultat</string>
<string name="lock_symbol">Låssymbol</string>
<string name="menu_item_sort_by_date_newest_first">Nyast först</string>
@ -177,6 +180,7 @@
<string name="nc_push_disabled">Push-aviseringar inaktiverade</string>
<string name="nc_push_to_talk">Push-to-talk</string>
<string name="nc_push_to_talk_desc">Med mikrofon inaktiverad klickar du på &amp;vänta för att använda Push-to-talk</string>
<string name="nc_remind">Påminn mig senare</string>
<string name="nc_remove_from_favorites">Ta bort från favoriter</string>
<string name="nc_remove_participant">Ta bort deltagare</string>
<string name="nc_rename">Byt namn på konversation</string>
@ -281,6 +285,7 @@
<string name="nc_wrong_link">Konversationslänk är inte giltig</string>
<string name="nc_wrong_password">Fel lösenord</string>
<string name="nc_yes">Ja</string>
<string name="next_week">Nästa vecka</string>
<string name="oneHour">1 timme</string>
<string name="online">Online</string>
<string name="online_status">Online-status</string>
@ -303,6 +308,7 @@
<string name="scope_toggle_description">Ändra hemlighetsnivå för %1$s</string>
<string name="secondsAgo">sekunder sedan</string>
<string name="selected_list_item">Vald</string>
<string name="set">Sätt</string>
<string name="set_status">Sätt status</string>
<string name="set_status_message">Sätt statusmeddelande</string>
<string name="share">Dela</string>
@ -319,8 +325,10 @@
<string name="take_photo_toggle_torch">Starta lampa</string>
<string name="thirtyMinutes">30 minuter</string>
<string name="thisWeek">Denna vecka</string>
<string name="this_weekend">Denna helgen</string>
<string name="title_attachments">Bilagor</string>
<string name="today">Idag</string>
<string name="tomorrow">I morgon</string>
<string name="translate">Översätt</string>
<string name="translation_detect_language">Upptäck språk</string>
<string name="translation_device_settings">Enhetsinställningar</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Kablolu kulaklık</string>
<string name="avatar">Avatar</string>
<string name="away">Uzakta</string>
<string name="calendar">Takvim</string>
<string name="call_more_actions_dialog_headline">Gelişmiş çağrı seçenekleri</string>
<string name="call_running_since_one_hour">Çağrı bir saattir sürüyor.</string>
<string name="call_without_notification">Bildirim olmadan çağrı</string>
@ -19,6 +20,7 @@
<string name="close">Kapat</string>
<string name="continuous_voice_message_recording">Sesli iletinin sürekli olarak kaydedilmesi için kaydı kilitleyin</string>
<string name="conversations">Görüşmeler</string>
<string name="custom">Özel</string>
<string name="danger_zone">Tehlikeli bölge</string>
<string name="delete_avatar">Avatarı sil</string>
<string name="dnd">Rahatsız etmeyin</string>
@ -35,6 +37,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4 saat</string>
<string name="invisible">Görünmez</string>
<string name="later_today">Bugün daha sonra</string>
<string name="load_more_results">Diğer sonuçları yükle</string>
<string name="lock_symbol">Kilit simgesi</string>
<string name="lower_hand">Eli indir</string>
@ -264,6 +267,7 @@
<string name="nc_push_disabled">Anında bildirimler devre dışı</string>
<string name="nc_push_to_talk">Bas-konuş</string>
<string name="nc_push_to_talk_desc">Mikrofon devre dışı iken, Bas-konuş üzerine tıklayıp basılı tutun</string>
<string name="nc_remind">Sonra hatırlat</string>
<string name="nc_remote_audio_off">Uzak ses kapalı</string>
<string name="nc_remove_circle_and_members">Çevreyi ve üyelerini sil</string>
<string name="nc_remove_from_favorites">Sık kullanılanlardan kaldır</string>
@ -403,6 +407,7 @@
<string name="nc_wrong_link">Görüşme bağlantısı geçersiz</string>
<string name="nc_wrong_password">Parola yanlış</string>
<string name="nc_yes">Evet</string>
<string name="next_week">Sonraki hafta</string>
<string name="no_phone_book_integration_due_to_permissions">İzinler eksik olduğundan telefon numarası bütünleştirmesi yok</string>
<string name="oneHour">1 saat</string>
<string name="online">Çevrim içi</string>
@ -456,6 +461,7 @@
<string name="send_to_forbidden">Bu sohbette içerik paylaşma izniniz yok</string>
<string name="send_to_three_dots">Şuraya gönder …</string>
<string name="send_without_notification">Bildirim olmadan gönder</string>
<string name="set">Ayarla</string>
<string name="set_avatar_from_camera">Avatarı kamerayla ayarla</string>
<string name="set_status">Durumu ayarla</string>
<string name="set_status_message">Durum iletisini ayarla</string>
@ -484,8 +490,10 @@
<string name="thirtyMinutes">30 dakika</string>
<string name="thisWeek">Bu hafta</string>
<string name="this_is_a_test_message">Bu bir deneme iletisidir</string>
<string name="this_weekend">Bu hafta sonu</string>
<string name="title_attachments">Ek dosyalar</string>
<string name="today">Bugün</string>
<string name="tomorrow">Yarın</string>
<string name="translate">Çevir</string>
<string name="translation">Çeviri</string>
<string name="translation_copy_translated_text">Çevrilmiş metni kopyala</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">Дротова гарнітура</string>
<string name="avatar">Світлина</string>
<string name="away">Немає поряд</string>
<string name="calendar">Календар</string>
<string name="call_more_actions_dialog_headline">Розширені опції дзвінка</string>
<string name="call_without_notification">Дзвінок без сповіщення</string>
<string name="camera_permission_granted">Дозвіл на використання камери надано. Будь ласка, виберіть камеру ще раз.</string>
@ -17,6 +18,7 @@
<string name="clear_status_message_after">Очистити повідомлення про стан після</string>
<string name="close">Закрити</string>
<string name="conversations">Розмови</string>
<string name="custom">Власне</string>
<string name="delete_avatar">Вилучити світлину</string>
<string name="dnd">Не турбувати</string>
<string name="dontClear">Не очищати</string>
@ -244,6 +246,7 @@
<string name="nc_push_disabled">Push сповіщення вимкнено</string>
<string name="nc_push_to_talk">Тисни-та-кажи</string>
<string name="nc_push_to_talk_desc">Натисніть і утримуйте &amp; для використання PTT при вимкненому мікрофоні</string>
<string name="nc_remind">Нагадати пізніше</string>
<string name="nc_remote_audio_off">Віддалене аудіо відключено</string>
<string name="nc_remove_circle_and_members">Вилучити кола та учасників</string>
<string name="nc_remove_from_favorites">Вилучено з улюбленого</string>
@ -376,6 +379,7 @@
<string name="nc_wrong_link">Посилання на бесіду більше не дійсне</string>
<string name="nc_wrong_password">Неправильний пароль</string>
<string name="nc_yes">Так</string>
<string name="next_week">Наступний тиждень</string>
<string name="no_phone_book_integration_due_to_permissions">Відсутні дозволи на інтеграцію номера телефону</string>
<string name="oneHour">1 година</string>
<string name="online">Онлайн</string>
@ -415,6 +419,7 @@
<string name="scope_published_title">Опубліковано</string>
<string name="secondsAgo">секунд тому</string>
<string name="selected_list_item">Selected</string>
<string name="set">Встановити</string>
<string name="set_status">Встановити статус</string>
<string name="set_status_message">Встановити повідомлення про стан</string>
<string name="share">Спільний доступ</string>
@ -431,6 +436,7 @@
<string name="thisWeek">Цього тижня</string>
<string name="title_attachments">Вкладення</string>
<string name="today">Сьогодні</string>
<string name="tomorrow">Завтра</string>
<string name="translate">Перекласти</string>
<string name="translation_detect_language">Визначити мову</string>
<string name="translation_device_settings">Налаштування пристрою</string>

View File

@ -5,11 +5,13 @@
<string name="audio_output_phone">Điện thoại</string>
<string name="avatar">Hình đại diện</string>
<string name="away">Tạm vắng</string>
<string name="calendar">Lịch</string>
<string name="choose_avatar_from_cloud">Chọn hình đại diện từ đám mây</string>
<string name="clear_status_message">Xoá thông báo trạng thái</string>
<string name="clear_status_message_after">Xoá thông báo trạng thái sau</string>
<string name="close">Đóng</string>
<string name="conversations">Đàm thoại</string>
<string name="custom">Tùy chỉnh</string>
<string name="delete_avatar">Xóa hình đại diện</string>
<string name="dnd">Đừng làm phiền</string>
<string name="dontClear">Không xoá</string>
@ -214,6 +216,7 @@
<string name="nc_wrong_link">Liên kết đàm thoại này không có thực</string>
<string name="nc_wrong_password">Sai mật khẩu</string>
<string name="nc_yes"></string>
<string name="next_week">Tuần sau</string>
<string name="oneHour">1 tiếng</string>
<string name="online">Trực tuyến</string>
<string name="online_status">Trạng thái trực tuyến</string>
@ -234,6 +237,7 @@
<string name="scroll_to_bottom">Cuộn xuống dưới cùng</string>
<string name="secondsAgo">vài giây trước</string>
<string name="selected_list_item">Selected</string>
<string name="set">Đặt</string>
<string name="set_status">Đặt trạng thái</string>
<string name="set_status_message">Đặt thông báo trạng thái</string>
<string name="share">Chia sẻ</string>
@ -252,6 +256,7 @@
<string name="thisWeek">Tuần này</string>
<string name="title_attachments">Đính kèm</string>
<string name="today">Hôm nay</string>
<string name="tomorrow">Ngày mai</string>
<string name="translate">Dịch</string>
<string name="translation_device_settings">Cài đặt thiết bị</string>
<string name="translation_error_message">Không thể phát hiện ngôn ngữ</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">有线耳机</string>
<string name="avatar">头像</string>
<string name="away">离开</string>
<string name="calendar">日历</string>
<string name="call_more_actions_dialog_headline">高级呼叫选项</string>
<string name="call_without_notification">无通知呼叫</string>
<string name="camera_permission_granted">摄像头访问已授权。请重新选择摄像头。</string>
@ -17,6 +18,7 @@
<string name="clear_status_message_after">过多长时间清除状态消息</string>
<string name="close">关闭</string>
<string name="conversations">对话</string>
<string name="custom">自定义</string>
<string name="danger_zone">危险区域</string>
<string name="delete_avatar">删除头像</string>
<string name="dnd">不要打扰</string>
@ -255,6 +257,7 @@
<string name="nc_push_disabled">通知推送已禁用</string>
<string name="nc_push_to_talk">按键讲话</string>
<string name="nc_push_to_talk_desc">禁用麦克风的情况下,点击&amp;并按住使用“按键讲话”功能</string>
<string name="nc_remind">以后提醒我 </string>
<string name="nc_remote_audio_off">远程音频关闭</string>
<string name="nc_remove_circle_and_members">删除圈子和成员</string>
<string name="nc_remove_from_favorites">取消收藏</string>
@ -394,6 +397,7 @@
<string name="nc_wrong_link">对话链接无效</string>
<string name="nc_wrong_password">错误的密码</string>
<string name="nc_yes">是的</string>
<string name="next_week">下周</string>
<string name="no_phone_book_integration_due_to_permissions">由于缺少权限,没有电话集成 </string>
<string name="oneHour">1小时</string>
<string name="online">在线</string>
@ -447,6 +451,7 @@
<string name="send_to_forbidden">你不能在此聊天中分享内容</string>
<string name="send_to_three_dots">发送到 …</string>
<string name="send_without_notification">发送而不通知</string>
<string name="set">设置</string>
<string name="set_avatar_from_camera">从摄像头设置头像</string>
<string name="set_status">设定状态</string>
<string name="set_status_message">设置状态消息</string>
@ -477,6 +482,7 @@
<string name="this_is_a_test_message">这是一个测试消息</string>
<string name="title_attachments">附件</string>
<string name="today">今天</string>
<string name="tomorrow">明天</string>
<string name="translate">翻译</string>
<string name="translation">翻译</string>
<string name="translation_copy_translated_text">复制已翻译的文字</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">有線耳機</string>
<string name="avatar">虛擬化身大頭照</string>
<string name="away">不在</string>
<string name="calendar">日曆</string>
<string name="call_more_actions_dialog_headline">進階通話選項</string>
<string name="call_running_since_one_hour">請注意,通話已經持續一個小時了。</string>
<string name="call_without_notification">通話而不通知</string>
@ -19,6 +20,7 @@
<string name="close">關閉</string>
<string name="continuous_voice_message_recording">鎖定錄音以連續錄製語音訊息</string>
<string name="conversations">對話</string>
<string name="custom">自訂</string>
<string name="danger_zone">危險地帶</string>
<string name="delete_avatar">刪除虛擬化身大頭照</string>
<string name="dnd">請勿打擾</string>
@ -35,6 +37,7 @@
<string name="filename_progress">%1$s%2$d</string>
<string name="fourHours">4 小時</string>
<string name="invisible">隱藏</string>
<string name="later_today">今日稍後</string>
<string name="load_more_results">正在載入更多結果</string>
<string name="lock_symbol">鎖符號</string>
<string name="lower_hand">放下手</string>
@ -264,6 +267,7 @@
<string name="nc_push_disabled">取消推送通知</string>
<string name="nc_push_to_talk">一鍵通</string>
<string name="nc_push_to_talk_desc">在停用米高風的情況下,單擊並按住即可使用一鍵通</string>
<string name="nc_remind">稍後提醒我</string>
<string name="nc_remote_audio_off">遠端語音關閉</string>
<string name="nc_remove_circle_and_members">移除社交圈子及組員</string>
<string name="nc_remove_from_favorites">取消我的最愛</string>
@ -403,6 +407,7 @@
<string name="nc_wrong_link">對話連結無效</string>
<string name="nc_wrong_password">密碼錯誤</string>
<string name="nc_yes"></string>
<string name="next_week">下星期</string>
<string name="no_phone_book_integration_due_to_permissions">由於缺少權限而無法集成電話號碼</string>
<string name="oneHour">1 小時</string>
<string name="online">在線</string>
@ -456,6 +461,7 @@
<string name="send_to_forbidden">您不能在此聊天中分享內容</string>
<string name="send_to_three_dots">傳送到 …</string>
<string name="send_without_notification">傳送而不通知</string>
<string name="set">設置</string>
<string name="set_avatar_from_camera">從相機設置虛擬化身大頭照</string>
<string name="set_status">設定狀態</string>
<string name="set_status_message">設定狀態訊息</string>
@ -484,8 +490,10 @@
<string name="thirtyMinutes">30 分鐘</string>
<string name="thisWeek">本星期</string>
<string name="this_is_a_test_message">此乃測試訊息</string>
<string name="this_weekend">本週末</string>
<string name="title_attachments">附件</string>
<string name="today">今日</string>
<string name="tomorrow">明日</string>
<string name="translate">翻譯</string>
<string name="translation">翻譯</string>
<string name="translation_copy_translated_text">複製已翻譯的文字</string>

View File

@ -9,6 +9,7 @@
<string name="audio_output_wired_headset">有線式頭戴耳機</string>
<string name="avatar">頭像</string>
<string name="away">外出</string>
<string name="calendar">日曆</string>
<string name="call_more_actions_dialog_headline">進階通話選項</string>
<string name="call_running_since_one_hour">通話已經持續一個小時了。</string>
<string name="call_without_notification">通話而不通知</string>
@ -19,6 +20,7 @@
<string name="close">關閉</string>
<string name="continuous_voice_message_recording">鎖定錄音以連續錄製語音訊息</string>
<string name="conversations">對話</string>
<string name="custom">自訂</string>
<string name="danger_zone">危險地帶</string>
<string name="delete_avatar">刪除頭像</string>
<string name="dnd">請勿打擾</string>
@ -35,6 +37,7 @@
<string name="filename_progress">%1$s (%2$d)</string>
<string name="fourHours">4小時</string>
<string name="invisible">隱藏</string>
<string name="later_today">今天稍後</string>
<string name="load_more_results">載入更多結果</string>
<string name="lock_symbol">上鎖符號</string>
<string name="lower_hand">放手</string>
@ -264,6 +267,7 @@
<string name="nc_push_disabled">取消推送通知</string>
<string name="nc_push_to_talk">按住以說話</string>
<string name="nc_push_to_talk_desc">在停用麥克風的情況下,點擊並按住即可使用按住以說話</string>
<string name="nc_remind">稍後提醒我</string>
<string name="nc_remote_audio_off">遠端音訊關閉</string>
<string name="nc_remove_circle_and_members">移除小圈圈與成員</string>
<string name="nc_remove_from_favorites">取消我的最愛</string>
@ -403,6 +407,7 @@
<string name="nc_wrong_link">對話連結無效</string>
<string name="nc_wrong_password">密碼錯誤</string>
<string name="nc_yes"></string>
<string name="next_week">下週</string>
<string name="no_phone_book_integration_due_to_permissions">因為缺少權限而無法整合電話號碼</string>
<string name="oneHour">1小時</string>
<string name="online">線上</string>
@ -456,6 +461,7 @@
<string name="send_to_forbidden">您不被允許在此聊天中分享內容</string>
<string name="send_to_three_dots">傳送至……</string>
<string name="send_without_notification">傳送而不通知</string>
<string name="set">設定</string>
<string name="set_avatar_from_camera">從相機設定大頭照</string>
<string name="set_status">設定狀態</string>
<string name="set_status_message">設定狀態訊息</string>
@ -484,8 +490,10 @@
<string name="thirtyMinutes">30分鐘</string>
<string name="thisWeek">這個禮拜</string>
<string name="this_is_a_test_message">這是測試訊息</string>
<string name="this_weekend">本週末</string>
<string name="title_attachments">附件</string>
<string name="today">今天</string>
<string name="tomorrow">明天</string>
<string name="translate">翻譯</string>
<string name="translation">翻譯</string>
<string name="translation_copy_translated_text">複製已翻譯的文字</string>

View File

@ -376,6 +376,7 @@ How to translate with transifex:
<string name="nc_add_attachment">Add attachment</string>
<string name="emoji_category_recent">Recent</string>
<string name="emoji_backspace">Backspace</string>
<string name="see_similar_system_messages">See %1$s similar messages</string>
<!-- Conversation info guest access -->
<string name="nc_guest_access">Guest access</string>
@ -697,5 +698,13 @@ How to translate with transifex:
<string name="nc_settings_socks_value" translatable="false">1080</string>
<string name="this_is_a_test_message">This is a test message</string>
<string name="continuous_voice_message_recording">Lock recording for continuously recording of the voice message</string>
<string name="nc_remind">Remind me later</string>
<string name="next_week">Next week</string>
<string name="this_weekend">This weekend</string>
<string name="tomorrow">Tomorrow</string>
<string name="later_today">Later today</string>
<string name="custom">Custom</string>
<string name="set">Set</string>
<string name="calendar">Calendar</string>
</resources>