mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-10 14:24:05 +01:00
Merge branch 'master' into Share
This commit is contained in:
commit
48135f3fab
@ -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"
|
||||
|
@ -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()
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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>
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
||||
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
@ -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)
|
||||
}
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
27
app/src/main/res/drawable/baseline_calendar_month_24.xml
Normal file
27
app/src/main/res/drawable/baseline_calendar_month_24.xml
Normal 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>
|
9
app/src/main/res/drawable/baseline_unfold_less_24.xml
Normal file
9
app/src/main/res/drawable/baseline_unfold_less_24.xml
Normal 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>
|
9
app/src/main/res/drawable/baseline_unfold_more_24.xml
Normal file
9
app/src/main/res/drawable/baseline_unfold_more_24.xml
Normal 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>
|
218
app/src/main/res/layout/dialog_date_time_picker.xml
Normal file
218
app/src/main/res/layout/dialog_date_time_picker.xml
Normal 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>
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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">Sí</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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 l’utilisation 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 l’utilisation 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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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">Já</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>
|
||||
|
@ -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">Sì</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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 &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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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å &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>
|
||||
|
@ -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>
|
||||
|
@ -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">Натисніть і утримуйте & для використання 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>
|
||||
|
@ -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">Có</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>
|
||||
|
@ -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">禁用麦克风的情况下,点击&并按住使用“按键讲话”功能</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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user