Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d4296fd1f | ||
|
|
81a3ba6ed5 | ||
|
|
2b1e809a25 | ||
|
|
2117a941af | ||
|
|
f55467c919 | ||
|
|
4f26e2dd25 | ||
|
|
edab2b65bf |
@@ -17,8 +17,8 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
before_action :set_include_contact_inboxes, only: [:index, :active, :search, :filter, :show, :update]
|
before_action :set_include_contact_inboxes, only: [:index, :active, :search, :filter, :show, :update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@contacts_count = resolved_contacts.count
|
||||||
@contacts = fetch_contacts(resolved_contacts)
|
@contacts = fetch_contacts(resolved_contacts)
|
||||||
@contacts_count = @contacts.total_count
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def search
|
def search
|
||||||
@@ -29,8 +29,8 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
OR contacts.additional_attributes->>\'company_name\' ILIKE :search',
|
OR contacts.additional_attributes->>\'company_name\' ILIKE :search',
|
||||||
search: "%#{params[:q].strip}%"
|
search: "%#{params[:q].strip}%"
|
||||||
)
|
)
|
||||||
|
@contacts_count = contacts.count
|
||||||
@contacts = fetch_contacts(contacts)
|
@contacts = fetch_contacts(contacts)
|
||||||
@contacts_count = @contacts.total_count
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def import
|
def import
|
||||||
@@ -55,8 +55,8 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
def active
|
def active
|
||||||
contacts = Current.account.contacts.where(id: ::OnlineStatusTracker
|
contacts = Current.account.contacts.where(id: ::OnlineStatusTracker
|
||||||
.get_available_contact_ids(Current.account.id))
|
.get_available_contact_ids(Current.account.id))
|
||||||
|
@contacts_count = contacts.count
|
||||||
@contacts = fetch_contacts(contacts)
|
@contacts = fetch_contacts(contacts)
|
||||||
@contacts_count = @contacts.total_count
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def show; end
|
def show; end
|
||||||
@@ -133,14 +133,13 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def fetch_contacts(contacts)
|
def fetch_contacts(contacts)
|
||||||
# Build includes hash to avoid separate query when contact_inboxes are needed
|
contacts_with_avatar = filtrate(contacts)
|
||||||
includes_hash = { avatar_attachment: [:blob] }
|
.includes([{ avatar_attachment: [:blob] }])
|
||||||
includes_hash[:contact_inboxes] = { inbox: :channel } if @include_contact_inboxes
|
.page(@current_page).per(RESULTS_PER_PAGE)
|
||||||
|
|
||||||
filtrate(contacts)
|
return contacts_with_avatar.includes([{ contact_inboxes: [:inbox] }]) if @include_contact_inboxes
|
||||||
.includes(includes_hash)
|
|
||||||
.page(@current_page)
|
contacts_with_avatar
|
||||||
.per(RESULTS_PER_PAGE)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_contact_inbox
|
def build_contact_inbox
|
||||||
|
|||||||
@@ -68,17 +68,13 @@ export const registerSubscription = (onSuccess = () => {}) => {
|
|||||||
.then(() => {
|
.then(() => {
|
||||||
onSuccess();
|
onSuccess();
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(() => {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.error('Push subscription registration failed:', error);
|
|
||||||
useAlert('This browser does not support desktop notification');
|
useAlert('This browser does not support desktop notification');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const requestPushPermissions = ({ onSuccess }) => {
|
export const requestPushPermissions = ({ onSuccess }) => {
|
||||||
if (!('Notification' in window)) {
|
if (!('Notification' in window)) {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.warn('Notification is not supported');
|
|
||||||
useAlert('This browser does not support desktop notification');
|
useAlert('This browser does not support desktop notification');
|
||||||
} else if (Notification.permission === 'granted') {
|
} else if (Notification.permission === 'granted') {
|
||||||
registerSubscription(onSuccess);
|
registerSubscription(onSuccess);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
"CREATE_NEW_ACCOUNT": "Create a new account",
|
"CREATE_NEW_ACCOUNT": "Create a new account",
|
||||||
"SUBMIT": "Login",
|
"SUBMIT": "Login",
|
||||||
"SAML": {
|
"SAML": {
|
||||||
"LABEL": "Login via SSO",
|
"LABEL": "Log in via SSO",
|
||||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||||
"SUBTITLE": "Enter your work email to access your organization",
|
"SUBTITLE": "Enter your work email to access your organization",
|
||||||
"BACK_TO_LOGIN": "Login via Password",
|
"BACK_TO_LOGIN": "Login via Password",
|
||||||
|
|||||||
@@ -27,20 +27,15 @@
|
|||||||
"LABEL": "Password",
|
"LABEL": "Password",
|
||||||
"PLACEHOLDER": "Password",
|
"PLACEHOLDER": "Password",
|
||||||
"ERROR": "Password is too short.",
|
"ERROR": "Password is too short.",
|
||||||
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character.",
|
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
|
||||||
"REQUIREMENTS_LENGTH": "At least 6 characters long",
|
|
||||||
"REQUIREMENTS_UPPERCASE": "At least one uppercase letter",
|
|
||||||
"REQUIREMENTS_LOWERCASE": "At least one lowercase letter",
|
|
||||||
"REQUIREMENTS_NUMBER": "At least one number",
|
|
||||||
"REQUIREMENTS_SPECIAL": "At least one special character"
|
|
||||||
},
|
},
|
||||||
"CONFIRM_PASSWORD": {
|
"CONFIRM_PASSWORD": {
|
||||||
"LABEL": "Confirm password",
|
"LABEL": "Confirm password",
|
||||||
"PLACEHOLDER": "Confirm password",
|
"PLACEHOLDER": "Confirm password",
|
||||||
"ERROR": "Passwords do not match."
|
"ERROR": "Password doesnot match."
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Registration Successful",
|
"SUCCESS_MESSAGE": "Registration Successfull",
|
||||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||||
},
|
},
|
||||||
"SUBMIT": "Create account",
|
"SUBMIT": "Create account",
|
||||||
|
|||||||
@@ -139,7 +139,7 @@
|
|||||||
},
|
},
|
||||||
"WHATSAPP": {
|
"WHATSAPP": {
|
||||||
"HEADER_TITLE": "WhatsApp campaigns",
|
"HEADER_TITLE": "WhatsApp campaigns",
|
||||||
"NEW_CAMPAIGN": "Kampanya Oluştur",
|
"NEW_CAMPAIGN": "Create campaign",
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "No WhatsApp campaigns are available",
|
"TITLE": "No WhatsApp campaigns are available",
|
||||||
"SUBTITLE": "Launch a WhatsApp campaign to reach your customers directly. Send offers or make announcements with ease. Click 'Create campaign' to get started."
|
"SUBTITLE": "Launch a WhatsApp campaign to reach your customers directly. Send offers or make announcements with ease. Click 'Create campaign' to get started."
|
||||||
@@ -171,8 +171,8 @@
|
|||||||
},
|
},
|
||||||
"TEMPLATE": {
|
"TEMPLATE": {
|
||||||
"LABEL": "WhatsApp Template",
|
"LABEL": "WhatsApp Template",
|
||||||
"PLACEHOLDER": "Şablon seçin",
|
"PLACEHOLDER": "Select a template",
|
||||||
"INFO": "Bu kampanya için kullanılacak şablonu seçin.",
|
"INFO": "Select a template to use for this campaign.",
|
||||||
"ERROR": "Template is required",
|
"ERROR": "Template is required",
|
||||||
"PREVIEW_TITLE": "{templateName} işleniyor",
|
"PREVIEW_TITLE": "{templateName} işleniyor",
|
||||||
"LANGUAGE": "Dil",
|
"LANGUAGE": "Dil",
|
||||||
|
|||||||
@@ -51,6 +51,6 @@
|
|||||||
"PLACEHOLDER": "Süre girin"
|
"PLACEHOLDER": "Süre girin"
|
||||||
},
|
},
|
||||||
"CHANNEL_SELECTOR": {
|
"CHANNEL_SELECTOR": {
|
||||||
"COMING_SOON": "Çok yakında!"
|
"COMING_SOON": "Coming Soon!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,9 @@
|
|||||||
"CREATED_AT_LABEL": "Oluşturuldu",
|
"CREATED_AT_LABEL": "Oluşturuldu",
|
||||||
"NEW_MESSAGE": "Yeni Mesaj",
|
"NEW_MESSAGE": "Yeni Mesaj",
|
||||||
"CALL": "Ara",
|
"CALL": "Ara",
|
||||||
"CALL_UNDER_DEVELOPMENT": "Arama özelliği geliştirme aşamasındadır",
|
"CALL_UNDER_DEVELOPMENT": "Calling is under development",
|
||||||
"VOICE_INBOX_PICKER": {
|
"VOICE_INBOX_PICKER": {
|
||||||
"TITLE": "Sesli gelen kutusu seçin"
|
"TITLE": "Choose a voice inbox"
|
||||||
},
|
},
|
||||||
"CONVERSATIONS": {
|
"CONVERSATIONS": {
|
||||||
"NO_RECORDS_FOUND": "Bu kişiyle ilişkilendirilmiş önceki görüşme yok.",
|
"NO_RECORDS_FOUND": "Bu kişiyle ilişkilendirilmiş önceki görüşme yok.",
|
||||||
@@ -554,12 +554,12 @@
|
|||||||
"WROTE": "wrote",
|
"WROTE": "wrote",
|
||||||
"YOU": "Sen",
|
"YOU": "Sen",
|
||||||
"SAVE": "Save note",
|
"SAVE": "Save note",
|
||||||
"ADD_NOTE": "Kişi notu ekle",
|
"ADD_NOTE": "Add contact note",
|
||||||
"EXPAND": "Genişlet",
|
"EXPAND": "Genişlet",
|
||||||
"COLLAPSE": "Daralt",
|
"COLLAPSE": "Daralt",
|
||||||
"NO_NOTES": "Not yok, kişi detayları sayfasından not ekleyebilirsiniz.",
|
"NO_NOTES": "Not yok, kişi detayları sayfasından not ekleyebilirsiniz.",
|
||||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||||
"CONVERSATION_EMPTY_STATE": "Henüz not yok. Not eklemek için Not ekle düğmesini kullanın."
|
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
|
|||||||
@@ -3,30 +3,30 @@
|
|||||||
"MODAL": {
|
"MODAL": {
|
||||||
"TITLE": "Twilio Templates",
|
"TITLE": "Twilio Templates",
|
||||||
"SUBTITLE": "Select the Twilio template you want to send",
|
"SUBTITLE": "Select the Twilio template you want to send",
|
||||||
"TEMPLATE_SELECTED_SUBTITLE": "Şablonu yapılandır: {templateName}"
|
"TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}"
|
||||||
},
|
},
|
||||||
"PICKER": {
|
"PICKER": {
|
||||||
"SEARCH_PLACEHOLDER": "Şablon Ara",
|
"SEARCH_PLACEHOLDER": "Şablon Ara",
|
||||||
"NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı",
|
"NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı",
|
||||||
"NO_CONTENT": "No content",
|
"NO_CONTENT": "No content",
|
||||||
"HEADER": "Başlık",
|
"HEADER": "Header",
|
||||||
"BODY": "Gövde",
|
"BODY": "Body",
|
||||||
"FOOTER": "Altbilgi",
|
"FOOTER": "Footer",
|
||||||
"BUTTONS": "Butonlar",
|
"BUTTONS": "Buttons",
|
||||||
"CATEGORY": "Kategori",
|
"CATEGORY": "Kategori",
|
||||||
"MEDIA_CONTENT": "Medya İçeriği",
|
"MEDIA_CONTENT": "Media Content",
|
||||||
"MEDIA_CONTENT_FALLBACK": "medya içeriği",
|
"MEDIA_CONTENT_FALLBACK": "media content",
|
||||||
"NO_TEMPLATES_AVAILABLE": "No Twilio templates available. Click refresh to sync templates from Twilio.",
|
"NO_TEMPLATES_AVAILABLE": "No Twilio templates available. Click refresh to sync templates from Twilio.",
|
||||||
"REFRESH_BUTTON": "Şablonları yenile",
|
"REFRESH_BUTTON": "Refresh templates",
|
||||||
"REFRESH_SUCCESS": "Şablonların yenilenmesi başlatıldı. Güncelleme birkaç dakika sürebilir.",
|
"REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.",
|
||||||
"REFRESH_ERROR": "Şablonları yenileme işlemi başarısız oldu. Lütfen tekrar deneyin.",
|
"REFRESH_ERROR": "Failed to refresh templates. Please try again.",
|
||||||
"LABELS": {
|
"LABELS": {
|
||||||
"LANGUAGE": "Dil",
|
"LANGUAGE": "Dil",
|
||||||
"TEMPLATE_BODY": "Şablon İçeriği",
|
"TEMPLATE_BODY": "Şablon İçeriği",
|
||||||
"CATEGORY": "Kategori"
|
"CATEGORY": "Kategori"
|
||||||
},
|
},
|
||||||
"TYPES": {
|
"TYPES": {
|
||||||
"MEDIA": "Medya",
|
"MEDIA": "Media",
|
||||||
"QUICK_REPLY": "Quick Reply",
|
"QUICK_REPLY": "Quick Reply",
|
||||||
"TEXT": "Metin"
|
"TEXT": "Metin"
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
"GO_BACK_LABEL": "Geri Git",
|
"GO_BACK_LABEL": "Geri Git",
|
||||||
"SEND_MESSAGE_LABEL": "Mesaj Gönder",
|
"SEND_MESSAGE_LABEL": "Mesaj Gönder",
|
||||||
"FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun",
|
"FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun",
|
||||||
"MEDIA_HEADER_LABEL": "{type} Başlık",
|
"MEDIA_HEADER_LABEL": "{type} Header",
|
||||||
"MEDIA_URL_LABEL": "Enter full media URL",
|
"MEDIA_URL_LABEL": "Enter full media URL",
|
||||||
"MEDIA_URL_PLACEHOLDER": "https://example.com/image.jpg"
|
"MEDIA_URL_PLACEHOLDER": "https://example.com/image.jpg"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -35,11 +35,11 @@
|
|||||||
"API_HOURS_WINDOW": "Bu sohbete yalnızca {hours} saat içinde yanıt verebilirsiniz",
|
"API_HOURS_WINDOW": "Bu sohbete yalnızca {hours} saat içinde yanıt verebilirsiniz",
|
||||||
"NOT_ASSIGNED_TO_YOU": "Bu görüşme size atanmamış. Bu konuşmayı kendinize atamak ister misiniz?",
|
"NOT_ASSIGNED_TO_YOU": "Bu görüşme size atanmamış. Bu konuşmayı kendinize atamak ister misiniz?",
|
||||||
"ASSIGN_TO_ME": "Bana ata",
|
"ASSIGN_TO_ME": "Bana ata",
|
||||||
"BOT_HANDOFF_MESSAGE": "Şu anda bir asistan veya bot tarafından yürütülen bir konuşmaya yanıt veriyorsunuz.",
|
"BOT_HANDOFF_MESSAGE": "You are responding to a conversation which is currently handled by an assistant or a bot.",
|
||||||
"BOT_HANDOFF_ACTION": "Size atayın ve açık olarak işaretleyin",
|
"BOT_HANDOFF_ACTION": "Mark open and assign to you",
|
||||||
"BOT_HANDOFF_REOPEN_ACTION": "Konuşmayı açık olarak işaretle",
|
"BOT_HANDOFF_REOPEN_ACTION": "Mark conversation open",
|
||||||
"BOT_HANDOFF_SUCCESS": "Konuşma size devredildi",
|
"BOT_HANDOFF_SUCCESS": "Conversation has been handed over to you",
|
||||||
"BOT_HANDOFF_ERROR": "Konuşma devralınamadı. Lütfen tekrar deneyin.",
|
"BOT_HANDOFF_ERROR": "Failed to take over the conversation. Please try again.",
|
||||||
"TWILIO_WHATSAPP_CAN_REPLY": "Bu konuşmaya yalnızca şablon mesaj kullanarak yanıt verebilirsiniz, çünkü",
|
"TWILIO_WHATSAPP_CAN_REPLY": "Bu konuşmaya yalnızca şablon mesaj kullanarak yanıt verebilirsiniz, çünkü",
|
||||||
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 saat mesaj penceresi kısıtlaması",
|
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 saat mesaj penceresi kısıtlaması",
|
||||||
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Bu Instagram hesabı yeni Instagram kanal gelen kutusuna taşındı. Tüm yeni mesajlar orada görünecek. Bu sohbetten artık mesaj gönderemezsiniz.",
|
"OLD_INSTAGRAM_INBOX_REPLY_BANNER": "Bu Instagram hesabı yeni Instagram kanal gelen kutusuna taşındı. Tüm yeni mesajlar orada görünecek. Bu sohbetten artık mesaj gönderemezsiniz.",
|
||||||
@@ -72,15 +72,15 @@
|
|||||||
"HIDE_LABELS": "Etiketleri Gizle"
|
"HIDE_LABELS": "Etiketleri Gizle"
|
||||||
},
|
},
|
||||||
"VOICE_CALL": {
|
"VOICE_CALL": {
|
||||||
"INCOMING_CALL": "Gelen arama",
|
"INCOMING_CALL": "Incoming call",
|
||||||
"OUTGOING_CALL": "Giden arama",
|
"OUTGOING_CALL": "Outgoing call",
|
||||||
"CALL_IN_PROGRESS": "Arama devam ediyor",
|
"CALL_IN_PROGRESS": "Call in progress",
|
||||||
"NO_ANSWER": "Yanıt yok",
|
"NO_ANSWER": "No answer",
|
||||||
"MISSED_CALL": "Cevapsız arama",
|
"MISSED_CALL": "Missed call",
|
||||||
"CALL_ENDED": "Arama sona erdi",
|
"CALL_ENDED": "Call ended",
|
||||||
"NOT_ANSWERED_YET": "Henüz yanıtlanmadı",
|
"NOT_ANSWERED_YET": "Not answered yet",
|
||||||
"THEY_ANSWERED": "Onlar yanıtladı",
|
"THEY_ANSWERED": "They answered",
|
||||||
"YOU_ANSWERED": "Siz yanıtladınız"
|
"YOU_ANSWERED": "You answered"
|
||||||
},
|
},
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"RESOLVE_ACTION": "Çözüldü",
|
"RESOLVE_ACTION": "Çözüldü",
|
||||||
@@ -160,9 +160,9 @@
|
|||||||
"AGENTS_LOADING": "Temsilciler Yükleniyor...",
|
"AGENTS_LOADING": "Temsilciler Yükleniyor...",
|
||||||
"ASSIGN_TEAM": "Takım ata",
|
"ASSIGN_TEAM": "Takım ata",
|
||||||
"DELETE": "Sohbeti sil",
|
"DELETE": "Sohbeti sil",
|
||||||
"OPEN_IN_NEW_TAB": "Yeni sekmede aç",
|
"OPEN_IN_NEW_TAB": "Open in new tab",
|
||||||
"COPY_LINK": "Konuşma bağlantısını kopyala",
|
"COPY_LINK": "Copy conversation link",
|
||||||
"COPY_LINK_SUCCESS": "Konuşma bağlantısı panoya kopyalandı",
|
"COPY_LINK_SUCCESS": "Conversation link copied to clipboard",
|
||||||
"API": {
|
"API": {
|
||||||
"AGENT_ASSIGNMENT": {
|
"AGENT_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Sohbet kimliği {conversationId} \"{agentName}\" tarafından atanmış",
|
"SUCCESFUL": "Sohbet kimliği {conversationId} \"{agentName}\" tarafından atanmış",
|
||||||
|
|||||||
@@ -7,6 +7,6 @@
|
|||||||
},
|
},
|
||||||
"CLOSE": "Kapat",
|
"CLOSE": "Kapat",
|
||||||
"BETA": "Beta",
|
"BETA": "Beta",
|
||||||
"BETA_DESCRIPTION": "Bu özellik beta aşamasındadır ve geliştirdikçe değişiklik gösterebilir."
|
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"LIMIT_MESSAGES": {
|
"LIMIT_MESSAGES": {
|
||||||
"CONVERSATION": "Sohbet sınırını aştınız. Hacker planı yalnızca 500 sohbete izin verir.",
|
"CONVERSATION": "Sohbet sınırını aştınız. Hacker planı yalnızca 500 sohbete izin verir.",
|
||||||
"INBOXES": "Gelen kutusu sınırını aştınız. Hacker planı yalnızca web sitesi canlı sohbetini destekler. E-posta, WhatsApp gibi ek gelen kutuları ücretli plan gerektirir.",
|
"INBOXES": "Gelen kutusu sınırını aştınız. Hacker planı yalnızca web sitesi canlı sohbetini destekler. E-posta, WhatsApp gibi ek gelen kutuları ücretli plan gerektirir.",
|
||||||
"AGENTS": "Temsilci sınırını aştınız. Planınız yalnızca {allowedAgents} temsilciye izin veriyor.",
|
"AGENTS": "You have exceeded the agent limit. Your plan only allows {allowedAgents} agents.",
|
||||||
"NON_ADMIN": "Tüm özellikleri kullanmaya devam etmek için lütfen yöneticinizle iletişime geçin ve planı yükseltin."
|
"NON_ADMIN": "Tüm özellikleri kullanmaya devam etmek için lütfen yöneticinizle iletişime geçin ve planı yükseltin."
|
||||||
},
|
},
|
||||||
"TITLE": "Hesap Ayarları",
|
"TITLE": "Hesap Ayarları",
|
||||||
|
|||||||
@@ -732,7 +732,7 @@
|
|||||||
"HOME_PAGE_LINK": {
|
"HOME_PAGE_LINK": {
|
||||||
"LABEL": "Home page link",
|
"LABEL": "Home page link",
|
||||||
"PLACEHOLDER": "Portal ana sayfa bağlantısı",
|
"PLACEHOLDER": "Portal ana sayfa bağlantısı",
|
||||||
"ERROR": "Geçerli bir URL girin. Ana sayfa bağlantısı ‘http://’ veya ‘https://’ ile başlamalıdır."
|
"ERROR": "Enter a valid URL. The Home page link must start with 'http://' or 'https://'."
|
||||||
},
|
},
|
||||||
"SLUG": {
|
"SLUG": {
|
||||||
"LABEL": "Slug",
|
"LABEL": "Slug",
|
||||||
@@ -754,14 +754,14 @@
|
|||||||
"HEADER": "Özel domain",
|
"HEADER": "Özel domain",
|
||||||
"LABEL": "Özel domain:",
|
"LABEL": "Özel domain:",
|
||||||
"DESCRIPTION": "You can host your portal on a custom domain. For instance, if your website is yourdomain.com and you want your portal available at docs.yourdomain.com, simply enter that in this field.",
|
"DESCRIPTION": "You can host your portal on a custom domain. For instance, if your website is yourdomain.com and you want your portal available at docs.yourdomain.com, simply enter that in this field.",
|
||||||
"STATUS_DESCRIPTION": "Özel portalınız, doğrulandıktan sonra hemen çalışmaya başlayacaktır.",
|
"STATUS_DESCRIPTION": "Your custom portal will start working as soon as it is verified.",
|
||||||
"PLACEHOLDER": "Portal özel domain",
|
"PLACEHOLDER": "Portal özel domain",
|
||||||
"EDIT_BUTTON": "Düzenle",
|
"EDIT_BUTTON": "Düzenle",
|
||||||
"ADD_BUTTON": "Add custom domain",
|
"ADD_BUTTON": "Add custom domain",
|
||||||
"STATUS": {
|
"STATUS": {
|
||||||
"LIVE": "Canlı",
|
"LIVE": "Canlı",
|
||||||
"PENDING": "Doğrulama bekleniyor",
|
"PENDING": "Awaiting verification",
|
||||||
"ERROR": "Doğrulama başarısız"
|
"ERROR": "Verification failed"
|
||||||
},
|
},
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"ADD_HEADER": "Add custom domain",
|
"ADD_HEADER": "Add custom domain",
|
||||||
@@ -771,14 +771,14 @@
|
|||||||
"LABEL": "Özel domain",
|
"LABEL": "Özel domain",
|
||||||
"PLACEHOLDER": "Portal özel domain",
|
"PLACEHOLDER": "Portal özel domain",
|
||||||
"ERROR": "Custom domain is required",
|
"ERROR": "Custom domain is required",
|
||||||
"FORMAT_ERROR": "Lütfen geçerli bir alan adı URL'si girin, örneğin docs.yourdomain.com"
|
"FORMAT_ERROR": "Please enter a valid domain URL e.g. docs.yourdomain.com"
|
||||||
},
|
},
|
||||||
"DNS_CONFIGURATION_DIALOG": {
|
"DNS_CONFIGURATION_DIALOG": {
|
||||||
"HEADER": "DNS configuration",
|
"HEADER": "DNS configuration",
|
||||||
"DESCRIPTION": "Log in to the account you have with your DNS provider, and add a CNAME record for subdomain pointing to chatwoot.help",
|
"DESCRIPTION": "Log in to the account you have with your DNS provider, and add a CNAME record for subdomain pointing to chatwoot.help",
|
||||||
"COPY": "CNAME başarıyla kopyalandı",
|
"COPY": "Successfully copied CNAME",
|
||||||
"SEND_INSTRUCTIONS": {
|
"SEND_INSTRUCTIONS": {
|
||||||
"HEADER": "Talimatları gönder",
|
"HEADER": "Send instructions",
|
||||||
"DESCRIPTION": "Bu adımı geliştirme ekibinizden birinin yapmasını tercih ediyorsanız, aşağıya mail adresini girin; gerekli talimatları onlara gönderelim.",
|
"DESCRIPTION": "Bu adımı geliştirme ekibinizden birinin yapmasını tercih ediyorsanız, aşağıya mail adresini girin; gerekli talimatları onlara gönderelim.",
|
||||||
"PLACEHOLDER": "E-posta adreslerini girin",
|
"PLACEHOLDER": "E-posta adreslerini girin",
|
||||||
"ERROR": "Geçerli bir mail adresi girin",
|
"ERROR": "Geçerli bir mail adresi girin",
|
||||||
@@ -810,53 +810,53 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PDF_UPLOAD": {
|
"PDF_UPLOAD": {
|
||||||
"TITLE": "PDF Belgesini Yükle",
|
"TITLE": "Upload PDF Document",
|
||||||
"DESCRIPTION": "AI kullanarak otomatik olarak SSS'leri oluşturmak için bir PDF belgesi yükleyin",
|
"DESCRIPTION": "Upload a PDF document to automatically generate FAQs using AI",
|
||||||
"DRAG_DROP_TEXT": "PDF dosyanızı buraya sürükleyip bırakın veya tıklayarak seçin",
|
"DRAG_DROP_TEXT": "Drag and drop your PDF file here, or click to select",
|
||||||
"SELECT_FILE": "PDF Dosyasını Seç",
|
"SELECT_FILE": "Select PDF File",
|
||||||
"ADDITIONAL_CONTEXT_LABEL": "Ek Bağlam (İsteğe Bağlı)",
|
"ADDITIONAL_CONTEXT_LABEL": "Additional Context (Optional)",
|
||||||
"ADDITIONAL_CONTEXT_PLACEHOLDER": "Provide any additional context or instructions for FAQ generation...",
|
"ADDITIONAL_CONTEXT_PLACEHOLDER": "Provide any additional context or instructions for FAQ generation...",
|
||||||
"UPLOADING": "Yükleniyor ...",
|
"UPLOADING": "Yükleniyor ...",
|
||||||
"UPLOAD": "Yükle & İşle",
|
"UPLOAD": "Upload & Process",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"ERROR_INVALID_TYPE": "Lütfen geçerli bir PDF dosyası seçin",
|
"ERROR_INVALID_TYPE": "Please select a valid PDF file",
|
||||||
"ERROR_FILE_TOO_LARGE": "Dosya boyutu 512 MB'tan az olmalıdır",
|
"ERROR_FILE_TOO_LARGE": "File size must be less than 512MB",
|
||||||
"ERROR_UPLOAD_FAILED": "PDF yüklenemedi. Lütfen tekrar deneyin."
|
"ERROR_UPLOAD_FAILED": "Failed to upload PDF. Please try again."
|
||||||
},
|
},
|
||||||
"PDF_DOCUMENTS": {
|
"PDF_DOCUMENTS": {
|
||||||
"TITLE": "PDF Belgeleri",
|
"TITLE": "PDF Documents",
|
||||||
"DESCRIPTION": "Yüklenen PDF belgelerini yönetin ve bunlardan SSS'ler oluşturun",
|
"DESCRIPTION": "Manage uploaded PDF documents and generate FAQs from them",
|
||||||
"UPLOAD_PDF": "PDF yükle",
|
"UPLOAD_PDF": "Upload PDF",
|
||||||
"UPLOAD_FIRST_PDF": "İlk PDF'inizi yükleyin",
|
"UPLOAD_FIRST_PDF": "Upload your first PDF",
|
||||||
"UPLOADED_BY": "Yükleyen",
|
"UPLOADED_BY": "Uploaded by",
|
||||||
"GENERATE_FAQS": "Generate FAQs",
|
"GENERATE_FAQS": "Generate FAQs",
|
||||||
"GENERATING": "Oluşturuluyor...",
|
"GENERATING": "Oluşturuluyor...",
|
||||||
"CONFIRM_DELETE": "{filename} silmek istediğinizden emin misiniz?",
|
"CONFIRM_DELETE": "{filename} silmek istediğinizden emin misiniz?",
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "Henüz PDF belgesi yok",
|
"TITLE": "No PDF documents yet",
|
||||||
"DESCRIPTION": "Upload PDF documents to automatically generate FAQs using AI"
|
"DESCRIPTION": "Upload PDF documents to automatically generate FAQs using AI"
|
||||||
},
|
},
|
||||||
"STATUS": {
|
"STATUS": {
|
||||||
"UPLOADED": "Hazır",
|
"UPLOADED": "Ready",
|
||||||
"PROCESSING": "İşleniyor",
|
"PROCESSING": "Processing",
|
||||||
"PROCESSED": "Tamamlandı",
|
"PROCESSED": "Tamamlandı",
|
||||||
"FAILED": "Başarısız"
|
"FAILED": "Failed"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONTENT_GENERATION": {
|
"CONTENT_GENERATION": {
|
||||||
"TITLE": "Content Generation",
|
"TITLE": "Content Generation",
|
||||||
"DESCRIPTION": "Upload PDF documents to automatically generate FAQ content using AI",
|
"DESCRIPTION": "Upload PDF documents to automatically generate FAQ content using AI",
|
||||||
"UPLOAD_TITLE": "PDF Belgesini Yükle",
|
"UPLOAD_TITLE": "Upload PDF Document",
|
||||||
"DRAG_DROP": "PDF dosyanızı buraya sürükleyip bırakın veya tıklayarak seçin",
|
"DRAG_DROP": "Drag and drop your PDF file here, or click to select",
|
||||||
"SELECT_FILE": "PDF Dosyasını Seç",
|
"SELECT_FILE": "Select PDF File",
|
||||||
"UPLOADING": "Belge işleniyor...",
|
"UPLOADING": "Processing document...",
|
||||||
"UPLOAD_SUCCESS": "Document processed successfully!",
|
"UPLOAD_SUCCESS": "Document processed successfully!",
|
||||||
"UPLOAD_ERROR": "Failed to upload document. Please try again.",
|
"UPLOAD_ERROR": "Failed to upload document. Please try again.",
|
||||||
"INVALID_FILE_TYPE": "Lütfen geçerli bir PDF dosyası seçin",
|
"INVALID_FILE_TYPE": "Please select a valid PDF file",
|
||||||
"FILE_TOO_LARGE": "Dosya boyutu 512 MB'tan az olmalıdır",
|
"FILE_TOO_LARGE": "File size must be less than 512MB",
|
||||||
"GENERATED_CONTENT": "Generated FAQ Content",
|
"GENERATED_CONTENT": "Generated FAQ Content",
|
||||||
"PUBLISH_SELECTED": "Publish Selected",
|
"PUBLISH_SELECTED": "Publish Selected",
|
||||||
"PUBLISHING": "Yayınlanıyor...",
|
"PUBLISHING": "Publishing...",
|
||||||
"FROM_DOCUMENT": "From document",
|
"FROM_DOCUMENT": "From document",
|
||||||
"NO_CONTENT": "No generated content available. Upload a PDF document to get started.",
|
"NO_CONTENT": "No generated content available. Upload a PDF document to get started.",
|
||||||
"LOADING": "Loading generated content..."
|
"LOADING": "Loading generated content..."
|
||||||
|
|||||||
@@ -74,14 +74,14 @@
|
|||||||
"DELETE_ALL_READ": "Tüm Okunmuş Bildirimler Silindi"
|
"DELETE_ALL_READ": "Tüm Okunmuş Bildirimler Silindi"
|
||||||
},
|
},
|
||||||
"REAUTHORIZE": {
|
"REAUTHORIZE": {
|
||||||
"TITLE": "Yeniden yetkilendirme gerekli",
|
"TITLE": "Reauthorization Required",
|
||||||
"DESCRIPTION": "WhatsApp bağlantınızın süresi doldu. Mesaj almaya ve göndermeye devam etmek için lütfen yeniden bağlanın.",
|
"DESCRIPTION": "Your WhatsApp connection has expired. Please reconnect to continue receiving and sending messages.",
|
||||||
"BUTTON_TEXT": "WhatsApp'ı yeniden bağla",
|
"BUTTON_TEXT": "Reconnect WhatsApp",
|
||||||
"LOADING_FACEBOOK": "Facebook SDK yükleniyor...",
|
"LOADING_FACEBOOK": "Loading Facebook SDK...",
|
||||||
"SUCCESS": "WhatsApp başarıyla yeniden bağlandı",
|
"SUCCESS": "WhatsApp reconnected successfully",
|
||||||
"ERROR": "WhatsApp'a yeniden bağlanılamadı. Lütfen tekrar deneyin.",
|
"ERROR": "Failed to reconnect WhatsApp. Please try again.",
|
||||||
"WHATSAPP_APP_ID_MISSING": "WhatsApp Uygulama Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.",
|
"WHATSAPP_APP_ID_MISSING": "WhatsApp App ID is not configured. Please contact your administrator.",
|
||||||
"WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Yapılandırma Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.",
|
"WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID is not configured. Please contact your administrator.",
|
||||||
"CONFIGURATION_ERROR": "Configuration error occurred during reauthorization.",
|
"CONFIGURATION_ERROR": "Configuration error occurred during reauthorization.",
|
||||||
"FACEBOOK_LOAD_ERROR": "Failed to load Facebook SDK. Please try again.",
|
"FACEBOOK_LOAD_ERROR": "Failed to load Facebook SDK. Please try again.",
|
||||||
"TROUBLESHOOTING": {
|
"TROUBLESHOOTING": {
|
||||||
|
|||||||
@@ -225,13 +225,13 @@
|
|||||||
"WHATSAPP_EMBEDDED": "WhatsApp Business",
|
"WHATSAPP_EMBEDDED": "WhatsApp Business",
|
||||||
"TWILIO": "Twilio",
|
"TWILIO": "Twilio",
|
||||||
"WHATSAPP_CLOUD": "WhatsApp Bulut",
|
"WHATSAPP_CLOUD": "WhatsApp Bulut",
|
||||||
"WHATSAPP_CLOUD_DESC": "Meta üzerinden hızlı kurulum",
|
"WHATSAPP_CLOUD_DESC": "Quick setup through Meta",
|
||||||
"TWILIO_DESC": "Twilio kimlik bilgileriyle bağlanın",
|
"TWILIO_DESC": "Connect via Twilio credentials",
|
||||||
"360_DIALOG": "360Dialog"
|
"360_DIALOG": "360Dialog"
|
||||||
},
|
},
|
||||||
"SELECT_PROVIDER": {
|
"SELECT_PROVIDER": {
|
||||||
"TITLE": "API sağlayıcınızı seçin",
|
"TITLE": "Select your API provider",
|
||||||
"DESCRIPTION": "WhatsApp sağlayıcınızı seçin. Kurulum gerektirmeyen Meta üzerinden doğrudan bağlanabilir veya hesap bilgilerinizi kullanarak Twilio üzerinden bağlanabilirsiniz."
|
"DESCRIPTION": "Choose your WhatsApp provider. You can connect directly through Meta which requires no setup, or connect through Twilio using your account credentials."
|
||||||
},
|
},
|
||||||
"INBOX_NAME": {
|
"INBOX_NAME": {
|
||||||
"LABEL": "Gelen Kutusu Adı",
|
"LABEL": "Gelen Kutusu Adı",
|
||||||
@@ -272,69 +272,69 @@
|
|||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "WhatsApp Kanalı Oluştur",
|
"SUBMIT_BUTTON": "WhatsApp Kanalı Oluştur",
|
||||||
"EMBEDDED_SIGNUP": {
|
"EMBEDDED_SIGNUP": {
|
||||||
"TITLE": "Meta ile hızlı kurulum",
|
"TITLE": "Quick setup with Meta",
|
||||||
"DESC": "Yeni numaraları hızlı bir şekilde bağlamak için WhatsApp Embedded Signup akışını kullanın. WhatsApp Business hesabınıza giriş yapmak için Meta'ya yönlendirileceksiniz. Yönetici erişimi, kurulumu sorunsuz ve kolay hale getirmeye yardımcı olacaktır.",
|
"DESC": "Use the WhatsApp Embedded Signup flow to quickly connect new numbers. You will be redirected to Meta to log into your WhatsApp Business account. Having admin access will help make the setup smooth and easy.",
|
||||||
"BENEFITS": {
|
"BENEFITS": {
|
||||||
"TITLE": "Gömülü Kaydın Faydaları:",
|
"TITLE": "Benefits of Embedded Signup:",
|
||||||
"EASY_SETUP": "Manuel yapılandırma gerekmez",
|
"EASY_SETUP": "No manual configuration required",
|
||||||
"SECURE_AUTH": "Güvenli OAuth tabanlı kimlik doğrulama",
|
"SECURE_AUTH": "Secure OAuth based authentication",
|
||||||
"AUTO_CONFIG": "Otomatik webhook ve telefon numarası yapılandırması"
|
"AUTO_CONFIG": "Automatic webhook and phone number configuration"
|
||||||
},
|
},
|
||||||
"LEARN_MORE": {
|
"LEARN_MORE": {
|
||||||
"TEXT": "Entegre kayıt, fiyatlandırma ve sınırlamalar hakkında daha fazla bilgi için {link} adresini ziyaret edin.",
|
"TEXT": "To learn more about integrated signup, pricing, and limitations, visit {link}.",
|
||||||
"LINK_TEXT": "bu bağlantı"
|
"LINK_TEXT": "this link"
|
||||||
},
|
},
|
||||||
"SUBMIT_BUTTON": "WhatsApp Business ile bağlantı kurun",
|
"SUBMIT_BUTTON": "Connect with WhatsApp Business",
|
||||||
"AUTH_PROCESSING": "Meta ile kimlik doğrulama",
|
"AUTH_PROCESSING": "Authenticating with Meta",
|
||||||
"WAITING_FOR_BUSINESS_INFO": "Lütfen Meta penceresinde işletme kurulumunu tamamlayın...",
|
"WAITING_FOR_BUSINESS_INFO": "Please complete business setup in the Meta window...",
|
||||||
"PROCESSING": "WhatsApp Business Hesabınızı kurma",
|
"PROCESSING": "Setting up your WhatsApp Business Account",
|
||||||
"LOADING_SDK": "Facebook SDK yükleniyor...",
|
"LOADING_SDK": "Loading Facebook SDK...",
|
||||||
"CANCELLED": "WhatsApp Kaydı iptal edildi",
|
"CANCELLED": "WhatsApp Signup was cancelled",
|
||||||
"SUCCESS_TITLE": "WhatsApp Business Hesabı Bağlandı!",
|
"SUCCESS_TITLE": "WhatsApp Business Account Connected!",
|
||||||
"WAITING_FOR_AUTH": "Kimlik doğrulaması bekleniyor...",
|
"WAITING_FOR_AUTH": "Waiting for authentication...",
|
||||||
"INVALID_BUSINESS_DATA": "Facebook’tan geçersiz işletme verisi alındı. Lütfen tekrar deneyin.",
|
"INVALID_BUSINESS_DATA": "Invalid business data received from Facebook. Please try again.",
|
||||||
"SIGNUP_ERROR": "Kayıt hatası oluştu",
|
"SIGNUP_ERROR": "Signup error occurred",
|
||||||
"AUTH_NOT_COMPLETED": "Kimlik doğrulama tamamlanmadı. Lütfen işlemi yeniden başlatın.",
|
"AUTH_NOT_COMPLETED": "Authentication not completed. Please restart the process.",
|
||||||
"SUCCESS_FALLBACK": "WhatsApp Business Hesabı başarıyla yapılandırıldı",
|
"SUCCESS_FALLBACK": "WhatsApp Business Account has been successfully configured",
|
||||||
"MANUAL_FALLBACK": "Numaranız zaten WhatsApp Business Platformuna (API) bağlıysa veya kendi numaranızı ekleyen bir teknoloji sağlayıcısıysanız, lütfen {link} akışını kullanın",
|
"MANUAL_FALLBACK": "If your number is already connected to the WhatsApp Business Platform (API), or if you’re a tech provider onboarding your own number, please use the {link} flow",
|
||||||
"MANUAL_LINK_TEXT": "manuel kurulum akışı"
|
"MANUAL_LINK_TEXT": "manual setup flow"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"ERROR_MESSAGE": "WhatsApp kanalını kaydedemedik"
|
"ERROR_MESSAGE": "WhatsApp kanalını kaydedemedik"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"VOICE": {
|
"VOICE": {
|
||||||
"TITLE": "Ses Kanalı",
|
"TITLE": "Voice Channel",
|
||||||
"DESC": "Twilio Voice’u entegre edin ve müşterilerinize telefon aramalarıyla destek vermeye başlayın.",
|
"DESC": "Integrate Twilio Voice and start supporting your customers via phone calls.",
|
||||||
"PHONE_NUMBER": {
|
"PHONE_NUMBER": {
|
||||||
"LABEL": "Telefon Numarası",
|
"LABEL": "Telefon Numarası",
|
||||||
"PLACEHOLDER": "Telefon numaranızı girin (örn. +901234567890)",
|
"PLACEHOLDER": "Enter your phone number (e.g. +1234567890)",
|
||||||
"ERROR": "Lütfen E.164 formatında geçerli bir telefon numarası girin (örn. +901234567890)"
|
"ERROR": "Please provide a valid phone number in E.164 format (e.g. +1234567890)"
|
||||||
},
|
},
|
||||||
"TWILIO": {
|
"TWILIO": {
|
||||||
"ACCOUNT_SID": {
|
"ACCOUNT_SID": {
|
||||||
"LABEL": "Hesap SID'si",
|
"LABEL": "Hesap SID'si",
|
||||||
"PLACEHOLDER": "Twilio Account SID’inizi girin",
|
"PLACEHOLDER": "Enter your Twilio Account SID",
|
||||||
"REQUIRED": "Account SID gereklidir"
|
"REQUIRED": "Account SID is required"
|
||||||
},
|
},
|
||||||
"AUTH_TOKEN": {
|
"AUTH_TOKEN": {
|
||||||
"LABEL": "Yetkilendirme Jetonu",
|
"LABEL": "Yetkilendirme Jetonu",
|
||||||
"PLACEHOLDER": "Twilio Auth Token’inizi girin",
|
"PLACEHOLDER": "Enter your Twilio Auth Token",
|
||||||
"REQUIRED": "Auth Token gereklidir"
|
"REQUIRED": "Auth Token is required"
|
||||||
},
|
},
|
||||||
"API_KEY_SID": {
|
"API_KEY_SID": {
|
||||||
"LABEL": "API Anahtar SID",
|
"LABEL": "API Anahtar SID",
|
||||||
"PLACEHOLDER": "Twilio API Key SID’inizi girin",
|
"PLACEHOLDER": "Enter your Twilio API Key SID",
|
||||||
"REQUIRED": "API Key SID gereklidir"
|
"REQUIRED": "API Key SID is required"
|
||||||
},
|
},
|
||||||
"API_KEY_SECRET": {
|
"API_KEY_SECRET": {
|
||||||
"LABEL": "API Anahtar Sırrı",
|
"LABEL": "API Anahtar Sırrı",
|
||||||
"PLACEHOLDER": "Twilio API Key Secret’ınızı girin",
|
"PLACEHOLDER": "Enter your Twilio API Key Secret",
|
||||||
"REQUIRED": "API Key Secret gereklidir"
|
"REQUIRED": "API Key Secret is required"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONFIGURATION": {
|
"CONFIGURATION": {
|
||||||
"TWILIO_VOICE_URL_TITLE": "Twilio Ses URL",
|
"TWILIO_VOICE_URL_TITLE": "Twilio Voice URL",
|
||||||
"TWILIO_VOICE_URL_SUBTITLE": "Configure this URL as the Voice URL on your Twilio phone number and TwiML App.",
|
"TWILIO_VOICE_URL_SUBTITLE": "Configure this URL as the Voice URL on your Twilio phone number and TwiML App.",
|
||||||
"TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL",
|
"TWILIO_STATUS_URL_TITLE": "Twilio Status Callback URL",
|
||||||
"TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number."
|
"TWILIO_STATUS_URL_SUBTITLE": "Configure this URL as the Status Callback URL on your Twilio phone number."
|
||||||
@@ -426,12 +426,12 @@
|
|||||||
"AUTH": {
|
"AUTH": {
|
||||||
"TITLE": "Bir Kanal Seçin",
|
"TITLE": "Bir Kanal Seçin",
|
||||||
"DESC": "Chatwoot, canlı sohbet widget'ları, Facebook Messenger, Twitter profilleri, WhatsApp, E-postalar vb. olarak kanalları destekler. Özel bir kanal oluşturmak istiyorsanız, API kanalını kullanarak bunu oluşturabilirsiniz. Başlamak için aşağıdaki kanallardan birini seçin.",
|
"DESC": "Chatwoot, canlı sohbet widget'ları, Facebook Messenger, Twitter profilleri, WhatsApp, E-postalar vb. olarak kanalları destekler. Özel bir kanal oluşturmak istiyorsanız, API kanalını kullanarak bunu oluşturabilirsiniz. Başlamak için aşağıdaki kanallardan birini seçin.",
|
||||||
"TITLE_NEXT": "Kurulumu tamamlayın",
|
"TITLE_NEXT": "Complete the setup",
|
||||||
"TITLE_FINISH": "Voilà!",
|
"TITLE_FINISH": "Voilà!",
|
||||||
"CHANNEL": {
|
"CHANNEL": {
|
||||||
"WEBSITE": {
|
"WEBSITE": {
|
||||||
"TITLE": "Website",
|
"TITLE": "Website",
|
||||||
"DESCRIPTION": "Canlı sohbet widget'ı oluşturun"
|
"DESCRIPTION": "Create a live-chat widget"
|
||||||
},
|
},
|
||||||
"FACEBOOK": {
|
"FACEBOOK": {
|
||||||
"TITLE": "Facebook\n",
|
"TITLE": "Facebook\n",
|
||||||
@@ -466,7 +466,7 @@
|
|||||||
"DESCRIPTION": "Connect your instagram account"
|
"DESCRIPTION": "Connect your instagram account"
|
||||||
},
|
},
|
||||||
"VOICE": {
|
"VOICE": {
|
||||||
"TITLE": "Ses",
|
"TITLE": "Voice",
|
||||||
"DESCRIPTION": "Integrate with Twilio Voice"
|
"DESCRIPTION": "Integrate with Twilio Voice"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -619,7 +619,7 @@
|
|||||||
"MESSENGER_HEADING": "Messenger Komut Dosyası",
|
"MESSENGER_HEADING": "Messenger Komut Dosyası",
|
||||||
"MESSENGER_SUB_HEAD": "Bu düğmeyi gövde etiketinizin içine yerleştirin",
|
"MESSENGER_SUB_HEAD": "Bu düğmeyi gövde etiketinizin içine yerleştirin",
|
||||||
"ALLOWED_DOMAINS": {
|
"ALLOWED_DOMAINS": {
|
||||||
"TITLE": "İzin Verilen Alan Adları",
|
"TITLE": "Allowed Domains",
|
||||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||||
},
|
},
|
||||||
@@ -660,7 +660,7 @@
|
|||||||
"WHATSAPP_EMBEDDED_SIGNUP_TITLE": "WhatsApp Embedded Signup",
|
"WHATSAPP_EMBEDDED_SIGNUP_TITLE": "WhatsApp Embedded Signup",
|
||||||
"WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "This inbox is connected through WhatsApp embedded signup.",
|
"WHATSAPP_EMBEDDED_SIGNUP_SUBHEADER": "This inbox is connected through WhatsApp embedded signup.",
|
||||||
"WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "You can reconfigure this inbox to update your WhatsApp Business settings.",
|
"WHATSAPP_EMBEDDED_SIGNUP_DESCRIPTION": "You can reconfigure this inbox to update your WhatsApp Business settings.",
|
||||||
"WHATSAPP_RECONFIGURE_BUTTON": "Yeniden yapılandır",
|
"WHATSAPP_RECONFIGURE_BUTTON": "Reconfigure",
|
||||||
"WHATSAPP_CONNECT_TITLE": "Connect to WhatsApp Business",
|
"WHATSAPP_CONNECT_TITLE": "Connect to WhatsApp Business",
|
||||||
"WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.",
|
"WHATSAPP_CONNECT_SUBHEADER": "Upgrade to WhatsApp embedded signup for easier management.",
|
||||||
"WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.",
|
"WHATSAPP_CONNECT_DESCRIPTION": "Connect this inbox to WhatsApp Business for enhanced features and easier management.",
|
||||||
@@ -669,14 +669,14 @@
|
|||||||
"WHATSAPP_CONNECT_ERROR": "Failed to connect to WhatsApp Business. Please try again.",
|
"WHATSAPP_CONNECT_ERROR": "Failed to connect to WhatsApp Business. Please try again.",
|
||||||
"WHATSAPP_RECONFIGURE_SUCCESS": "Successfully reconfigured WhatsApp Business!",
|
"WHATSAPP_RECONFIGURE_SUCCESS": "Successfully reconfigured WhatsApp Business!",
|
||||||
"WHATSAPP_RECONFIGURE_ERROR": "Failed to reconfigure WhatsApp Business. Please try again.",
|
"WHATSAPP_RECONFIGURE_ERROR": "Failed to reconfigure WhatsApp Business. Please try again.",
|
||||||
"WHATSAPP_APP_ID_MISSING": "WhatsApp Uygulama Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.",
|
"WHATSAPP_APP_ID_MISSING": "WhatsApp App ID is not configured. Please contact your administrator.",
|
||||||
"WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Yapılandırma Kimliği yapılandırılmamış. Lütfen yöneticinize başvurun.",
|
"WHATSAPP_CONFIG_ID_MISSING": "WhatsApp Configuration ID is not configured. Please contact your administrator.",
|
||||||
"WHATSAPP_LOGIN_CANCELLED": "WhatsApp login was cancelled. Please try again.",
|
"WHATSAPP_LOGIN_CANCELLED": "WhatsApp login was cancelled. Please try again.",
|
||||||
"WHATSAPP_WEBHOOK_TITLE": "Webhook Onay Anahtarı",
|
"WHATSAPP_WEBHOOK_TITLE": "Webhook Onay Anahtarı",
|
||||||
"WHATSAPP_WEBHOOK_SUBHEADER": "Bu belirteç, webhook uç noktasının gerçekliğini doğrulamak için kullanılır.",
|
"WHATSAPP_WEBHOOK_SUBHEADER": "Bu belirteç, webhook uç noktasının gerçekliğini doğrulamak için kullanılır.",
|
||||||
"WHATSAPP_TEMPLATES_SYNC_TITLE": "Şablonları Senkronize Et",
|
"WHATSAPP_TEMPLATES_SYNC_TITLE": "Sync Templates",
|
||||||
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "WhatsApp'tan mesaj şablonlarını manuel olarak senkronize ederek mevcut şablonlarınızı güncelleyin.",
|
"WHATSAPP_TEMPLATES_SYNC_SUBHEADER": "Manually sync message templates from WhatsApp to update your available templates.",
|
||||||
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Şablonları Senkronize Et",
|
"WHATSAPP_TEMPLATES_SYNC_BUTTON": "Sync Templates",
|
||||||
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Templates sync initiated successfully. It may take a couple of minutes to update.",
|
"WHATSAPP_TEMPLATES_SYNC_SUCCESS": "Templates sync initiated successfully. It may take a couple of minutes to update.",
|
||||||
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Sohbet Öncesi Form Ayarlarını Güncelleme"
|
"UPDATE_PRE_CHAT_FORM_SETTINGS": "Sohbet Öncesi Form Ayarlarını Güncelleme"
|
||||||
},
|
},
|
||||||
@@ -946,7 +946,7 @@
|
|||||||
"LINE": "Line",
|
"LINE": "Line",
|
||||||
"API": "API Kanalı",
|
"API": "API Kanalı",
|
||||||
"INSTAGRAM": "Instagram",
|
"INSTAGRAM": "Instagram",
|
||||||
"VOICE": "Ses"
|
"VOICE": "Voice"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -487,12 +487,12 @@
|
|||||||
"ASSISTANT": "Assistant"
|
"ASSISTANT": "Assistant"
|
||||||
},
|
},
|
||||||
"BASIC_SETTINGS": {
|
"BASIC_SETTINGS": {
|
||||||
"TITLE": "Temel ayarlar",
|
"TITLE": "Basic settings",
|
||||||
"DESCRIPTION": "Konuşmayı sonlandırırken veya bir operatöre aktarırken asistanın söyleyeceği sözleri özelleştirin."
|
"DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
|
||||||
},
|
},
|
||||||
"SYSTEM_SETTINGS": {
|
"SYSTEM_SETTINGS": {
|
||||||
"TITLE": "Sistem ayarları",
|
"TITLE": "System settings",
|
||||||
"DESCRIPTION": "Konuşmayı sonlandırırken veya bir operatöre aktarırken asistanın söyleyeceği sözleri özelleştirin."
|
"DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human."
|
||||||
},
|
},
|
||||||
"CONTROL_ITEMS": {
|
"CONTROL_ITEMS": {
|
||||||
"TITLE": "The Fun Stuff",
|
"TITLE": "The Fun Stuff",
|
||||||
@@ -534,16 +534,16 @@
|
|||||||
},
|
},
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"SELECTED": "{count} item selected | {count} items selected",
|
"SELECTED": "{count} item selected | {count} items selected",
|
||||||
"SELECT_ALL": "Tümünü seç ({count})",
|
"SELECT_ALL": "Select all ({count})",
|
||||||
"UNSELECT_ALL": "Tümünü kaldır ({count})",
|
"UNSELECT_ALL": "Unselect all ({count})",
|
||||||
"BULK_DELETE_BUTTON": "Sil"
|
"BULK_DELETE_BUTTON": "Sil"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"SUGGESTED": {
|
"SUGGESTED": {
|
||||||
"TITLE": "Example guardrails",
|
"TITLE": "Example guardrails",
|
||||||
"ADD": "Tümünü ekle",
|
"ADD": "Add all",
|
||||||
"ADD_SINGLE": "Bunu ekle",
|
"ADD_SINGLE": "Add this",
|
||||||
"SAVE": "Ekle ve kaydet (↵)",
|
"SAVE": "Add and save (↵)",
|
||||||
"PLACEHOLDER": "Type in another guardrail..."
|
"PLACEHOLDER": "Type in another guardrail..."
|
||||||
},
|
},
|
||||||
"NEW": {
|
"NEW": {
|
||||||
@@ -551,11 +551,11 @@
|
|||||||
"CREATE": "Yarat",
|
"CREATE": "Yarat",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"PLACEHOLDER": "Type in another guardrail...",
|
"PLACEHOLDER": "Type in another guardrail...",
|
||||||
"TEST_ALL": "Tümünü test et"
|
"TEST_ALL": "Test all"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"SEARCH_PLACEHOLDER": "Ara..."
|
"SEARCH_PLACEHOLDER": "Search..."
|
||||||
},
|
},
|
||||||
"EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.",
|
"EMPTY_MESSAGE": "No guardrails found. Create or add examples to begin.",
|
||||||
"SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
|
"SEARCH_EMPTY_MESSAGE": "No guardrails found for this search.",
|
||||||
@@ -581,17 +581,17 @@
|
|||||||
"TITLE": "Response Guidelines"
|
"TITLE": "Response Guidelines"
|
||||||
},
|
},
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"SELECTED": "{count} eşya seçildi | {count} eşya seçildi",
|
"SELECTED": "{count} item selected | {count} items selected",
|
||||||
"SELECT_ALL": "Tümünü seç ({count})",
|
"SELECT_ALL": "Select all ({count})",
|
||||||
"UNSELECT_ALL": "Tümünü kaldır ({count})",
|
"UNSELECT_ALL": "Unselect all ({count})",
|
||||||
"BULK_DELETE_BUTTON": "Sil"
|
"BULK_DELETE_BUTTON": "Sil"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"SUGGESTED": {
|
"SUGGESTED": {
|
||||||
"TITLE": "Example response guidelines",
|
"TITLE": "Example response guidelines",
|
||||||
"ADD": "Tümünü ekle",
|
"ADD": "Add all",
|
||||||
"ADD_SINGLE": "Bunu ekle",
|
"ADD_SINGLE": "Add this",
|
||||||
"SAVE": "Ekle ve kaydet (↵)",
|
"SAVE": "Add and save (↵)",
|
||||||
"PLACEHOLDER": "Type in another response guideline..."
|
"PLACEHOLDER": "Type in another response guideline..."
|
||||||
},
|
},
|
||||||
"NEW": {
|
"NEW": {
|
||||||
@@ -599,11 +599,11 @@
|
|||||||
"CREATE": "Yarat",
|
"CREATE": "Yarat",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"PLACEHOLDER": "Type in another response guideline...",
|
"PLACEHOLDER": "Type in another response guideline...",
|
||||||
"TEST_ALL": "Tümünü test et"
|
"TEST_ALL": "Test all"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"SEARCH_PLACEHOLDER": "Ara..."
|
"SEARCH_PLACEHOLDER": "Search..."
|
||||||
},
|
},
|
||||||
"EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
|
"EMPTY_MESSAGE": "No response guidelines found. Create or add examples to begin.",
|
||||||
"SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
|
"SEARCH_EMPTY_MESSAGE": "No response guidelines found for this search.",
|
||||||
@@ -630,15 +630,15 @@
|
|||||||
},
|
},
|
||||||
"BULK_ACTION": {
|
"BULK_ACTION": {
|
||||||
"SELECTED": "{count} item selected | {count} items selected",
|
"SELECTED": "{count} item selected | {count} items selected",
|
||||||
"SELECT_ALL": "Tümünü seç ({count})",
|
"SELECT_ALL": "Select all ({count})",
|
||||||
"UNSELECT_ALL": "Tümünü kaldır ({count})",
|
"UNSELECT_ALL": "Unselect all ({count})",
|
||||||
"BULK_DELETE_BUTTON": "Sil"
|
"BULK_DELETE_BUTTON": "Sil"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"SUGGESTED": {
|
"SUGGESTED": {
|
||||||
"TITLE": "Example scenarios",
|
"TITLE": "Example scenarios",
|
||||||
"ADD": "Tümünü ekle",
|
"ADD": "Add all",
|
||||||
"ADD_SINGLE": "Bunu ekle",
|
"ADD_SINGLE": "Add this",
|
||||||
"TOOLS_USED": "Tools used :"
|
"TOOLS_USED": "Tools used :"
|
||||||
},
|
},
|
||||||
"NEW": {
|
"NEW": {
|
||||||
@@ -667,10 +667,10 @@
|
|||||||
},
|
},
|
||||||
"UPDATE": {
|
"UPDATE": {
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"UPDATE": "Değişiklikleri güncelle"
|
"UPDATE": "Update changes"
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"SEARCH_PLACEHOLDER": "Ara..."
|
"SEARCH_PLACEHOLDER": "Search..."
|
||||||
},
|
},
|
||||||
"EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.",
|
"EMPTY_MESSAGE": "No scenarios found. Create or add examples to begin.",
|
||||||
"SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.",
|
"SEARCH_EMPTY_MESSAGE": "No scenarios found for this search.",
|
||||||
@@ -705,9 +705,9 @@
|
|||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"TYPE": {
|
"TYPE": {
|
||||||
"LABEL": "Belge Türü",
|
"LABEL": "Document Type",
|
||||||
"URL": "URL",
|
"URL": "URL",
|
||||||
"PDF": "PDF Dosya"
|
"PDF": "PDF File"
|
||||||
},
|
},
|
||||||
"URL": {
|
"URL": {
|
||||||
"LABEL": "URL",
|
"LABEL": "URL",
|
||||||
@@ -715,16 +715,16 @@
|
|||||||
"ERROR": "Please provide a valid URL for the document"
|
"ERROR": "Please provide a valid URL for the document"
|
||||||
},
|
},
|
||||||
"PDF_FILE": {
|
"PDF_FILE": {
|
||||||
"LABEL": "PDF Dosya",
|
"LABEL": "PDF File",
|
||||||
"CHOOSE_FILE": "PDF dosyasını seçin",
|
"CHOOSE_FILE": "Choose PDF file",
|
||||||
"ERROR": "Lütfen bir PDF dosyası seçin",
|
"ERROR": "Please select a PDF file",
|
||||||
"HELP_TEXT": "Maksimum dosya boyutu: 10 MB",
|
"HELP_TEXT": "Maximum file size: 10MB",
|
||||||
"INVALID_TYPE": "Lütfen geçerli bir PDF dosyası seçin",
|
"INVALID_TYPE": "Please select a valid PDF file",
|
||||||
"TOO_LARGE": "Dosya boyutu 10 MB sınırını aşıyor"
|
"TOO_LARGE": "File size exceeds 10MB limit"
|
||||||
},
|
},
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "Belge Adı (İsteğe Bağlı)",
|
"LABEL": "Document Name (Optional)",
|
||||||
"PLACEHOLDER": "Belgeye bir ad girin"
|
"PLACEHOLDER": "Enter a name for the document"
|
||||||
},
|
},
|
||||||
"ASSISTANT": {
|
"ASSISTANT": {
|
||||||
"LABEL": "Assistant",
|
"LABEL": "Assistant",
|
||||||
@@ -759,9 +759,9 @@
|
|||||||
"CONVERSATION": "Conversation #{id}"
|
"CONVERSATION": "Conversation #{id}"
|
||||||
},
|
},
|
||||||
"SELECTED": "{count} selected",
|
"SELECTED": "{count} selected",
|
||||||
"SELECT_ALL": "Tümünü seç ({count})",
|
"SELECT_ALL": "Select all ({count})",
|
||||||
"UNSELECT_ALL": "Tümünü kaldır ({count})",
|
"UNSELECT_ALL": "Unselect all ({count})",
|
||||||
"SEARCH_PLACEHOLDER": "Sıkça Sorulan Soruları Ara...",
|
"SEARCH_PLACEHOLDER": "Search FAQs...",
|
||||||
"BULK_APPROVE_BUTTON": "Approve",
|
"BULK_APPROVE_BUTTON": "Approve",
|
||||||
"BULK_DELETE_BUTTON": "Sil",
|
"BULK_DELETE_BUTTON": "Sil",
|
||||||
"BULK_APPROVE": {
|
"BULK_APPROVE": {
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
"CREATE_NEW_ACCOUNT": "Yeni hesap oluştur",
|
"CREATE_NEW_ACCOUNT": "Yeni hesap oluştur",
|
||||||
"SUBMIT": "Oturum aç",
|
"SUBMIT": "Oturum aç",
|
||||||
"SAML": {
|
"SAML": {
|
||||||
"LABEL": "SSO ile giriş yapın",
|
"LABEL": "Log in via SSO",
|
||||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||||
"SUBTITLE": "Enter your work email to access your organization",
|
"SUBTITLE": "Enter your work email to access your organization",
|
||||||
"BACK_TO_LOGIN": "Şifre ile giriş yap",
|
"BACK_TO_LOGIN": "Login via Password",
|
||||||
"WORK_EMAIL": {
|
"WORK_EMAIL": {
|
||||||
"LABEL": "Work Email",
|
"LABEL": "Work Email",
|
||||||
"PLACEHOLDER": "Enter your work email"
|
"PLACEHOLDER": "Enter your work email"
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"MFA_SETTINGS": {
|
"MFA_SETTINGS": {
|
||||||
"TITLE": "İki Faktörlü Kimlik Doğrulama",
|
"TITLE": "Two-Factor Authentication",
|
||||||
"SUBTITLE": "Secure your account with TOTP-based authentication",
|
"SUBTITLE": "Secure your account with TOTP-based authentication",
|
||||||
"DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
|
"DESCRIPTION": "Add an extra layer of security to your account using a time-based one-time password (TOTP)",
|
||||||
"STATUS_TITLE": "Kimlik Doğrulama Durumu",
|
"STATUS_TITLE": "Authentication Status",
|
||||||
"STATUS_DESCRIPTION": "İki faktörlü kimlik doğrulama ayarlarınızı ve yedek kurtarma kodlarınızı yönetin",
|
"STATUS_DESCRIPTION": "Manage your two-factor authentication settings and backup recovery codes",
|
||||||
"ENABLED": "Etkin",
|
"ENABLED": "Etkin",
|
||||||
"DISABLED": "Devre dışı",
|
"DISABLED": "Devre dışı",
|
||||||
"STATUS_ENABLED": "Two-factor authentication is active",
|
"STATUS_ENABLED": "Two-factor authentication is active",
|
||||||
@@ -18,89 +18,89 @@
|
|||||||
"STEP1_TITLE": "Scan QR Code with Your Authenticator App",
|
"STEP1_TITLE": "Scan QR Code with Your Authenticator App",
|
||||||
"STEP1_DESCRIPTION": "Use Google Authenticator, Authy, or any TOTP-compatible app",
|
"STEP1_DESCRIPTION": "Use Google Authenticator, Authy, or any TOTP-compatible app",
|
||||||
"LOADING_QR": "Loading...",
|
"LOADING_QR": "Loading...",
|
||||||
"MANUAL_ENTRY": "Tarama yapamıyor musunuz? Kodu manuel olarak girin",
|
"MANUAL_ENTRY": "Can't scan? Enter code manually",
|
||||||
"SECRET_KEY": "Gizli Anahtar",
|
"SECRET_KEY": "Secret Key",
|
||||||
"COPY": "Kopyala",
|
"COPY": "Kopyala",
|
||||||
"ENTER_CODE": "Doğrulama uygulamanızdan 6 haneli kodu girin",
|
"ENTER_CODE": "Enter the 6-digit code from your authenticator app",
|
||||||
"ENTER_CODE_PLACEHOLDER": "000000",
|
"ENTER_CODE_PLACEHOLDER": "000000",
|
||||||
"VERIFY_BUTTON": "Doğrula & Devam Et",
|
"VERIFY_BUTTON": "Verify & Continue",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"ERROR_STARTING": "MFA etkinleştirilmemiştir. Lütfen yöneticiyle iletişime geçin.",
|
"ERROR_STARTING": "MFA not enabled. Please contact administrator.",
|
||||||
"INVALID_CODE": "Geçersiz doğrulama kodu",
|
"INVALID_CODE": "Invalid verification code",
|
||||||
"SECRET_COPIED": "Gizli anahtar panoya kopyalandı",
|
"SECRET_COPIED": "Secret key copied to clipboard",
|
||||||
"SUCCESS": "İki faktörlü kimlik doğrulama başarıyla etkinleştirildi"
|
"SUCCESS": "Two-factor authentication has been enabled successfully"
|
||||||
},
|
},
|
||||||
"BACKUP": {
|
"BACKUP": {
|
||||||
"TITLE": "Yedek Kodlarınızı Kaydedin",
|
"TITLE": "Save Your Backup Codes",
|
||||||
"DESCRIPTION": "Bu kodları güvenli bir yerde saklayın. Kimlik doğrulayıcınıza erişiminizi kaybederseniz, her birini bir kez kullanabilirsiniz.",
|
"DESCRIPTION": "Keep these codes safe. Each can be used once if you lose access to your authenticator",
|
||||||
"IMPORTANT": "Önemli:",
|
"IMPORTANT": "Important:",
|
||||||
"IMPORTANT_NOTE": " Bu kodları güvenli bir yerde saklayın. Bir daha göremeyeceksiniz.",
|
"IMPORTANT_NOTE": " Save these codes in a secure location. You won't be able to see them again.",
|
||||||
"DOWNLOAD": "İndir",
|
"DOWNLOAD": "İndir",
|
||||||
"COPY_ALL": "Tümünü Kopyala",
|
"COPY_ALL": "Copy All",
|
||||||
"CONFIRM": "Yedek kodlarımı güvenli bir yerde kaydettim ve bunları tekrar göremeyeceğimi anlıyorum",
|
"CONFIRM": "I have saved my backup codes in a secure location and understand that I won't be able to see them again",
|
||||||
"COMPLETE_SETUP": "Kurulumu Tamamla",
|
"COMPLETE_SETUP": "Complete Setup",
|
||||||
"CODES_COPIED": "Yedek kodlar panoya kopyalandı"
|
"CODES_COPIED": "Backup codes copied to clipboard"
|
||||||
},
|
},
|
||||||
"MANAGEMENT": {
|
"MANAGEMENT": {
|
||||||
"BACKUP_CODES": "Yedek Kodlar",
|
"BACKUP_CODES": "Backup Codes",
|
||||||
"BACKUP_CODES_DESC": "Mevcut kodlarınızı kaybettiyseniz veya kullandıysanız yeni kodlar oluşturun",
|
"BACKUP_CODES_DESC": "Generate new codes if you've lost or used your existing ones",
|
||||||
"REGENERATE": "Yedek Kodları Yeniden Oluştur",
|
"REGENERATE": "Regenerate Backup Codes",
|
||||||
"DISABLE_MFA": "2FA'yı devre dışı bırak",
|
"DISABLE_MFA": "Disable 2FA",
|
||||||
"DISABLE_MFA_DESC": "Hesabınızdan iki faktörlü kimlik doğrulamayı kaldırın",
|
"DISABLE_MFA_DESC": "Remove two-factor authentication from your account",
|
||||||
"DISABLE_BUTTON": "İki Faktörlü Kimlik Doğrulamayı Devre Dışı Bırak"
|
"DISABLE_BUTTON": "Disable Two-Factor Authentication"
|
||||||
},
|
},
|
||||||
"DISABLE": {
|
"DISABLE": {
|
||||||
"TITLE": "İki Faktörlü Kimlik Doğrulamayı Devre Dışı Bırak",
|
"TITLE": "Disable Two-Factor Authentication",
|
||||||
"DESCRIPTION": "İki faktörlü kimlik doğrulamayı devre dışı bırakmak için şifrenizi ve doğrulama kodunu girmeniz gerekir.",
|
"DESCRIPTION": "You'll need to enter your password and a verification code to disable two-factor authentication.",
|
||||||
"PASSWORD": "Parola",
|
"PASSWORD": "Parola",
|
||||||
"OTP_CODE": "Doğrulama Kodu",
|
"OTP_CODE": "Verification Code",
|
||||||
"OTP_CODE_PLACEHOLDER": "000000",
|
"OTP_CODE_PLACEHOLDER": "000000",
|
||||||
"CONFIRM": "2FA'yı devre dışı bırak",
|
"CONFIRM": "Disable 2FA",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"SUCCESS": "İki faktörlü kimlik doğrulama devre dışı bırakıldı",
|
"SUCCESS": "Two-factor authentication has been disabled",
|
||||||
"ERROR": "MFA devre dışı bırakılamadı. Lütfen kimlik bilgilerinizi kontrol edin."
|
"ERROR": "Failed to disable MFA. Please check your credentials."
|
||||||
},
|
},
|
||||||
"REGENERATE": {
|
"REGENERATE": {
|
||||||
"TITLE": "Yedek Kodları Yeniden Oluştur",
|
"TITLE": "Regenerate Backup Codes",
|
||||||
"DESCRIPTION": "Bu işlem, mevcut yedek kodlarınızı geçersiz kılacak ve yeni kodlar oluşturacaktır. Devam etmek için doğrulama kodunuzu girin.",
|
"DESCRIPTION": "This will invalidate your existing backup codes and generate new ones. Enter your verification code to continue.",
|
||||||
"OTP_CODE": "Doğrulama Kodu",
|
"OTP_CODE": "Verification Code",
|
||||||
"OTP_CODE_PLACEHOLDER": "000000",
|
"OTP_CODE_PLACEHOLDER": "000000",
|
||||||
"CONFIRM": "Yeni Kodlar Oluştur",
|
"CONFIRM": "Generate New Codes",
|
||||||
"CANCEL": "İptal Et",
|
"CANCEL": "İptal Et",
|
||||||
"NEW_CODES_TITLE": "Yeni Yedek Kodlar Oluşturuldu",
|
"NEW_CODES_TITLE": "New Backup Codes Generated",
|
||||||
"NEW_CODES_DESC": "Eski yedek kodlarınız geçersiz hale getirilmiştir. Bu yeni kodları güvenli bir yerde saklayın.",
|
"NEW_CODES_DESC": "Your old backup codes have been invalidated. Save these new codes in a secure location.",
|
||||||
"CODES_IMPORTANT": "Önemli:",
|
"CODES_IMPORTANT": "Important:",
|
||||||
"CODES_IMPORTANT_NOTE": " Her kod yalnızca bir kez kullanılabilir. Bu pencereyi kapatmadan önce kodları kaydedin.",
|
"CODES_IMPORTANT_NOTE": " Each code can only be used once. Save them before closing this window.",
|
||||||
"DOWNLOAD_CODES": "Kodları İndir",
|
"DOWNLOAD_CODES": "Download Codes",
|
||||||
"COPY_ALL_CODES": "Tüm Kodları Kopyala",
|
"COPY_ALL_CODES": "Copy All Codes",
|
||||||
"CODES_SAVED": "Kodlarımı Kaydettim",
|
"CODES_SAVED": "I've Saved My Codes",
|
||||||
"SUCCESS": "Yeni yedek kodlar oluşturuldu",
|
"SUCCESS": "New backup codes have been generated",
|
||||||
"ERROR": "Yedek kodları yeniden oluşturulamadı"
|
"ERROR": "Failed to regenerate backup codes"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MFA_VERIFICATION": {
|
"MFA_VERIFICATION": {
|
||||||
"TITLE": "İki Faktörlü Kimlik Doğrulama",
|
"TITLE": "Two-Factor Authentication",
|
||||||
"DESCRIPTION": "Devam etmek için doğrulama kodunuzu girin",
|
"DESCRIPTION": "Enter your verification code to continue",
|
||||||
"AUTHENTICATOR_APP": "Kimlik Doğrulama Uygulaması",
|
"AUTHENTICATOR_APP": "Authenticator App",
|
||||||
"BACKUP_CODE": "Yedek Kod",
|
"BACKUP_CODE": "Backup Code",
|
||||||
"ENTER_OTP_CODE": "Doğrulama uygulamasından 6 haneli kodu girin",
|
"ENTER_OTP_CODE": "Enter 6-digit code from your authenticator app",
|
||||||
"ENTER_BACKUP_CODE": "Yedek kodlarınızdan birini girin",
|
"ENTER_BACKUP_CODE": "Enter one of your backup codes",
|
||||||
"BACKUP_CODE_PLACEHOLDER": "000000",
|
"BACKUP_CODE_PLACEHOLDER": "000000",
|
||||||
"VERIFY_BUTTON": "Doğrula",
|
"VERIFY_BUTTON": "Verify",
|
||||||
"TRY_ANOTHER_METHOD": "Başka bir doğrulama yöntemi deneyin",
|
"TRY_ANOTHER_METHOD": "Try another verification method",
|
||||||
"CANCEL_LOGIN": "İptal et ve giriş sayfasına dön",
|
"CANCEL_LOGIN": "Cancel and return to login",
|
||||||
"HELP_TEXT": "Giriş yaparken sorun mu yaşıyorsunuz?",
|
"HELP_TEXT": "Having trouble signing in?",
|
||||||
"LEARN_MORE": "2FA hakkında daha fazla bilgi edinin",
|
"LEARN_MORE": "Learn more about 2FA",
|
||||||
"HELP_MODAL": {
|
"HELP_MODAL": {
|
||||||
"TITLE": "İki Faktörlü Kimlik Doğrulama Yardımı",
|
"TITLE": "Two-Factor Authentication Help",
|
||||||
"AUTHENTICATOR_TITLE": "Kimlik Doğrulama Uygulaması Kullanma",
|
"AUTHENTICATOR_TITLE": "Using an Authenticator App",
|
||||||
"AUTHENTICATOR_DESC": "Kimlik doğrulayıcı uygulamanızı (Google Authenticator, Authy vb.) açın ve hesabınız için gösterilen 6 haneli kodu girin.",
|
"AUTHENTICATOR_DESC": "Open your authenticator app (Google Authenticator, Authy, etc.) and enter the 6-digit code shown for your account.",
|
||||||
"BACKUP_TITLE": "Yedek Kod Kullanma",
|
"BACKUP_TITLE": "Using a Backup Code",
|
||||||
"BACKUP_DESC": "Kimlik doğrulayıcı uygulamanıza erişiminiz yoksa, 2FA kurarken kaydettiğiniz yedek kodlardan birini kullanabilirsiniz. Her kod yalnızca bir kez kullanılabilir.",
|
"BACKUP_DESC": "If you don't have access to your authenticator app, you can use one of the backup codes you saved when setting up 2FA. Each code can only be used once.",
|
||||||
"CONTACT_TITLE": "Daha Fazla Yardıma mı İhtiyacınız Var?",
|
"CONTACT_TITLE": "Need More Help?",
|
||||||
"CONTACT_DESC_CLOUD": "Hem kimlik doğrulayıcı uygulamanıza hem de yedek kodlarınıza erişiminizi kaybettiyseniz, yardım için Chatwoot destek ekibiyle iletişime geçin.",
|
"CONTACT_DESC_CLOUD": "If you've lost access to both your authenticator app and backup codes, please reach out to Chatwoot support for assistance.",
|
||||||
"CONTACT_DESC_SELF_HOSTED": "Hem kimlik doğrulayıcı uygulamanıza hem de yedek kodlarınıza erişiminizi kaybettiyseniz, yardım için yöneticinizle iletişime geçin."
|
"CONTACT_DESC_SELF_HOSTED": "If you've lost access to both your authenticator app and backup codes, please contact your administrator for assistance."
|
||||||
},
|
},
|
||||||
"VERIFICATION_FAILED": "Doğrulama başarısız oldu. Lütfen tekrar deneyin."
|
"VERIFICATION_FAILED": "Verification failed. Please try again."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,11 +53,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"LANGUAGE": {
|
"LANGUAGE": {
|
||||||
"TITLE": "Tercih Edilen Dil",
|
"TITLE": "Preferred Language",
|
||||||
"NOTE": "Kullanmak istediğiniz dili seçin.",
|
"NOTE": "Choose the language you want to use.",
|
||||||
"UPDATE_SUCCESS": "Dil ayarlarınız başarıyla güncellendi",
|
"UPDATE_SUCCESS": "Your Language settings have been updated successfully",
|
||||||
"UPDATE_ERROR": "Dil ayarlarını güncellerken bir hata oluştu, lütfen tekrar deneyin",
|
"UPDATE_ERROR": "There is an error while updating the language settings, please try again",
|
||||||
"USE_ACCOUNT_DEFAULT": "Hesap varsayılanını kullan"
|
"USE_ACCOUNT_DEFAULT": "Use account default"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MESSAGE_SIGNATURE_SECTION": {
|
"MESSAGE_SIGNATURE_SECTION": {
|
||||||
@@ -81,9 +81,9 @@
|
|||||||
"BTN_TEXT": "Şifre değiştir"
|
"BTN_TEXT": "Şifre değiştir"
|
||||||
},
|
},
|
||||||
"SECURITY_SECTION": {
|
"SECURITY_SECTION": {
|
||||||
"TITLE": "Güvenlik",
|
"TITLE": "Security",
|
||||||
"NOTE": "Hesabınız için ek güvenlik özelliklerini yönetin.",
|
"NOTE": "Manage additional security features for your account.",
|
||||||
"MFA_BUTTON": "İki Faktörlü Kimlik Doğrulamayı Yönet"
|
"MFA_BUTTON": "Manage Two-Factor Authentication"
|
||||||
},
|
},
|
||||||
"ACCESS_TOKEN": {
|
"ACCESS_TOKEN": {
|
||||||
"TITLE": "Erişim Jetonu",
|
"TITLE": "Erişim Jetonu",
|
||||||
@@ -238,7 +238,7 @@
|
|||||||
"APPEARANCE": "Change appearance",
|
"APPEARANCE": "Change appearance",
|
||||||
"SUPER_ADMIN_CONSOLE": "SuperAdmin console",
|
"SUPER_ADMIN_CONSOLE": "SuperAdmin console",
|
||||||
"DOCS": "Read documentation",
|
"DOCS": "Read documentation",
|
||||||
"CHANGELOG": "Değişiklik Günlüğü",
|
"CHANGELOG": "Changelog",
|
||||||
"LOGOUT": "Log out"
|
"LOGOUT": "Log out"
|
||||||
},
|
},
|
||||||
"APP_GLOBAL": {
|
"APP_GLOBAL": {
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
"REPORTS_LABEL": "Etiketler",
|
"REPORTS_LABEL": "Etiketler",
|
||||||
"REPORTS_INBOX": "Gelen kutusu",
|
"REPORTS_INBOX": "Gelen kutusu",
|
||||||
"REPORTS_TEAM": "Ekip",
|
"REPORTS_TEAM": "Ekip",
|
||||||
"AGENT_ASSIGNMENT": "Temsilci Atama",
|
"AGENT_ASSIGNMENT": "Agent Assignment",
|
||||||
"SET_AVAILABILITY_TITLE": "Kendini şu şekilde ayarla",
|
"SET_AVAILABILITY_TITLE": "Kendini şu şekilde ayarla",
|
||||||
"SET_YOUR_AVAILABILITY": "Uygunluk Durumunuzu Ayarlayın",
|
"SET_YOUR_AVAILABILITY": "Uygunluk Durumunuzu Ayarlayın",
|
||||||
"SLA": "SLA",
|
"SLA": "SLA",
|
||||||
@@ -364,7 +364,7 @@
|
|||||||
"INFO_SHORT": "Automatically mark offline when you aren't using the app."
|
"INFO_SHORT": "Automatically mark offline when you aren't using the app."
|
||||||
},
|
},
|
||||||
"DOCS": "Dokümantasyonu oku",
|
"DOCS": "Dokümantasyonu oku",
|
||||||
"SECURITY": "Güvenlik"
|
"SECURITY": "Security"
|
||||||
},
|
},
|
||||||
"BILLING_SETTINGS": {
|
"BILLING_SETTINGS": {
|
||||||
"TITLE": "Fatura",
|
"TITLE": "Fatura",
|
||||||
@@ -397,8 +397,8 @@
|
|||||||
"NO_BILLING_USER": "Fatura hesabınız yapılandırılıyor. Lütfen sayfayı yenileyip tekrar deneyin."
|
"NO_BILLING_USER": "Fatura hesabınız yapılandırılıyor. Lütfen sayfayı yenileyip tekrar deneyin."
|
||||||
},
|
},
|
||||||
"SECURITY_SETTINGS": {
|
"SECURITY_SETTINGS": {
|
||||||
"TITLE": "Güvenlik",
|
"TITLE": "Security",
|
||||||
"DESCRIPTION": "Hesap güvenlik ayarlarınızı yönetin.",
|
"DESCRIPTION": "Manage your account security settings.",
|
||||||
"LINK_TEXT": "Learn more about SAML SSO",
|
"LINK_TEXT": "Learn more about SAML SSO",
|
||||||
"SAML": {
|
"SAML": {
|
||||||
"TITLE": "SAML SSO",
|
"TITLE": "SAML SSO",
|
||||||
@@ -442,7 +442,7 @@
|
|||||||
"VALIDATION": {
|
"VALIDATION": {
|
||||||
"REQUIRED_FIELDS": "SSO URL, Identity Provider Entity ID, and Certificate are required fields",
|
"REQUIRED_FIELDS": "SSO URL, Identity Provider Entity ID, and Certificate are required fields",
|
||||||
"SSO_URL_ERROR": "Please enter a valid SSO URL",
|
"SSO_URL_ERROR": "Please enter a valid SSO URL",
|
||||||
"CERTIFICATE_ERROR": "Sertifika gereklidir",
|
"CERTIFICATE_ERROR": "Certificate is required",
|
||||||
"IDP_ENTITY_ID_ERROR": "Identity Provider Entity ID is required"
|
"IDP_ENTITY_ID_ERROR": "Identity Provider Entity ID is required"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
@@ -454,7 +454,7 @@
|
|||||||
"TITLE": "Upgrade to enable SAML SSO",
|
"TITLE": "Upgrade to enable SAML SSO",
|
||||||
"AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
|
"AVAILABLE_ON": "The SAML SSO feature is only available in the Enterprise plans.",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to SAML single sign-on and other advanced features.",
|
"UPGRADE_PROMPT": "Upgrade your plan to get access to SAML single sign-on and other advanced features.",
|
||||||
"UPGRADE_NOW": "Şimdi yükselt",
|
"UPGRADE_NOW": "Upgrade now",
|
||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
||||||
},
|
},
|
||||||
"ATTRIBUTE_MAPPING": {
|
"ATTRIBUTE_MAPPING": {
|
||||||
@@ -563,7 +563,7 @@
|
|||||||
"CONFIRM_ADD_INBOX_DIALOG": {
|
"CONFIRM_ADD_INBOX_DIALOG": {
|
||||||
"TITLE": "Add inbox",
|
"TITLE": "Add inbox",
|
||||||
"DESCRIPTION": "{inboxName} inbox is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
|
"DESCRIPTION": "{inboxName} inbox is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
|
||||||
"CONFIRM_BUTTON_LABEL": "Devam et",
|
"CONFIRM_BUTTON_LABEL": "Continue",
|
||||||
"CANCEL_BUTTON_LABEL": "İptal Et"
|
"CANCEL_BUTTON_LABEL": "İptal Et"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
@@ -620,7 +620,7 @@
|
|||||||
},
|
},
|
||||||
"FAIR_DISTRIBUTION": {
|
"FAIR_DISTRIBUTION": {
|
||||||
"LABEL": "Fair distribution policy",
|
"LABEL": "Fair distribution policy",
|
||||||
"DESCRIPTION": "Belirli bir zaman diliminde her bir temsilciye atanabilecek maksimum konuşma sayısını ayarlayarak herhangi bir temsilcinin aşırı yüklenmesini önleyin. Bu zorunlu alanın varsayılan değeri saat başına 100 konuşmadır.",
|
"DESCRIPTION": "Set the maximum number of conversations that can be assigned per agent within a time window to avoid overloading any one agent. This required field defaults to 100 conversations per hour.",
|
||||||
"INPUT_MAX": "Assign max",
|
"INPUT_MAX": "Assign max",
|
||||||
"DURATION": "Conversations per agent in every"
|
"DURATION": "Conversations per agent in every"
|
||||||
},
|
},
|
||||||
@@ -674,7 +674,7 @@
|
|||||||
"CONFIRM_ADD_AGENT_DIALOG": {
|
"CONFIRM_ADD_AGENT_DIALOG": {
|
||||||
"TITLE": "Add agent",
|
"TITLE": "Add agent",
|
||||||
"DESCRIPTION": "{agentName} is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
|
"DESCRIPTION": "{agentName} is already linked to another policy. Are you sure you want to link it to this policy? It will be unlinked from the other policy.",
|
||||||
"CONFIRM_BUTTON_LABEL": "Devam et",
|
"CONFIRM_BUTTON_LABEL": "Continue",
|
||||||
"CANCEL_BUTTON_LABEL": "İptal Et"
|
"CANCEL_BUTTON_LABEL": "İptal Et"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
@@ -706,19 +706,19 @@
|
|||||||
"ADD_BUTTON": "Add inbox",
|
"ADD_BUTTON": "Add inbox",
|
||||||
"FIELD": {
|
"FIELD": {
|
||||||
"SELECT_INBOX": "Select inbox",
|
"SELECT_INBOX": "Select inbox",
|
||||||
"MAX_CONVERSATIONS": "Maksimum Konuşma",
|
"MAX_CONVERSATIONS": "Max conversations",
|
||||||
"SET_LIMIT": "Sınır belirle"
|
"SET_LIMIT": "Set limit"
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": "Gelen kutusu sınırı belirlenmemiş"
|
"EMPTY_STATE": "No inbox limit set"
|
||||||
},
|
},
|
||||||
"EXCLUSION_RULES": {
|
"EXCLUSION_RULES": {
|
||||||
"LABEL": "Hariç tutma kuralları",
|
"LABEL": "Exclusion rules",
|
||||||
"DESCRIPTION": "Conversations that satisfy the following conditions would not count towards agent capacity",
|
"DESCRIPTION": "Conversations that satisfy the following conditions would not count towards agent capacity",
|
||||||
"TAGS": {
|
"TAGS": {
|
||||||
"LABEL": "Exclude conversations tagged with specific labels",
|
"LABEL": "Exclude conversations tagged with specific labels",
|
||||||
"ADD_TAG": "etiket ekle",
|
"ADD_TAG": "add tag",
|
||||||
"DROPDOWN": {
|
"DROPDOWN": {
|
||||||
"SEARCH_PLACEHOLDER": "Eklemek için etiketleri arayın ve seçin"
|
"SEARCH_PLACEHOLDER": "Search and select tags to add"
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": "No tags added to this policy."
|
"EMPTY_STATE": "No tags added to this policy."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,22 +3,22 @@
|
|||||||
"MODAL": {
|
"MODAL": {
|
||||||
"TITLE": "WhatsApp Şablonları",
|
"TITLE": "WhatsApp Şablonları",
|
||||||
"SUBTITLE": "Göndermek istediğiniz WhatsApp şablonunu seçin",
|
"SUBTITLE": "Göndermek istediğiniz WhatsApp şablonunu seçin",
|
||||||
"TEMPLATE_SELECTED_SUBTITLE": "Şablonu yapılandır: {templateName}"
|
"TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}"
|
||||||
},
|
},
|
||||||
"PICKER": {
|
"PICKER": {
|
||||||
"SEARCH_PLACEHOLDER": "Şablon Ara",
|
"SEARCH_PLACEHOLDER": "Şablon Ara",
|
||||||
"NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı",
|
"NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı",
|
||||||
"HEADER": "Başlık",
|
"HEADER": "Header",
|
||||||
"BODY": "Gövde",
|
"BODY": "Body",
|
||||||
"FOOTER": "Altbilgi",
|
"FOOTER": "Footer",
|
||||||
"BUTTONS": "Butonlar",
|
"BUTTONS": "Buttons",
|
||||||
"CATEGORY": "Kategori",
|
"CATEGORY": "Kategori",
|
||||||
"MEDIA_CONTENT": "Medya İçeriği",
|
"MEDIA_CONTENT": "Media Content",
|
||||||
"MEDIA_CONTENT_FALLBACK": "medya içeriği",
|
"MEDIA_CONTENT_FALLBACK": "media content",
|
||||||
"NO_TEMPLATES_AVAILABLE": "WhatsApp şablonu mevcut değil. WhatsApp'tan şablonları senkronize etmek için yenile düğmesine tıklayın.",
|
"NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.",
|
||||||
"REFRESH_BUTTON": "Şablonları yenile",
|
"REFRESH_BUTTON": "Refresh templates",
|
||||||
"REFRESH_SUCCESS": "Şablonların yenilenmesi başlatıldı. Güncelleme birkaç dakika sürebilir.",
|
"REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.",
|
||||||
"REFRESH_ERROR": "Şablonları yenileme işlemi başarısız oldu. Lütfen tekrar deneyin.",
|
"REFRESH_ERROR": "Failed to refresh templates. Please try again.",
|
||||||
"LABELS": {
|
"LABELS": {
|
||||||
"LANGUAGE": "Dil",
|
"LANGUAGE": "Dil",
|
||||||
"TEMPLATE_BODY": "Şablon İçeriği",
|
"TEMPLATE_BODY": "Şablon İçeriği",
|
||||||
@@ -33,15 +33,15 @@
|
|||||||
"GO_BACK_LABEL": "Geri Git",
|
"GO_BACK_LABEL": "Geri Git",
|
||||||
"SEND_MESSAGE_LABEL": "Mesaj Gönder",
|
"SEND_MESSAGE_LABEL": "Mesaj Gönder",
|
||||||
"FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun",
|
"FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun",
|
||||||
"MEDIA_HEADER_LABEL": "{type} Başlık",
|
"MEDIA_HEADER_LABEL": "{type} Header",
|
||||||
"OTP_CODE": "4-8 haneli OTP girin",
|
"OTP_CODE": "Enter 4-8 digit OTP",
|
||||||
"EXPIRY_MINUTES": "Süreyi (dakika) girin",
|
"EXPIRY_MINUTES": "Enter expiry minutes",
|
||||||
"BUTTON_PARAMETERS": "Buton Parametreleri",
|
"BUTTON_PARAMETERS": "Button Parameters",
|
||||||
"BUTTON_LABEL": "Buton {index}",
|
"BUTTON_LABEL": "Button {index}",
|
||||||
"COUPON_CODE": "Kupon kodunu girin (maks. 15 karakter)",
|
"COUPON_CODE": "Enter coupon code (max 15 chars)",
|
||||||
"MEDIA_URL_LABEL": "{type} URL’sini girin",
|
"MEDIA_URL_LABEL": "Enter {type} URL",
|
||||||
"DOCUMENT_NAME_PLACEHOLDER": "Belge dosya adını girin (örneğin, Fatura_2025.pdf)",
|
"DOCUMENT_NAME_PLACEHOLDER": "Enter document filename (e.g., Invoice_2025.pdf)",
|
||||||
"BUTTON_PARAMETER": "Buton parametresini girin"
|
"BUTTON_PARAMETER": "Enter button parameter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { defineProps, defineModel, computed } from 'vue';
|
import { defineProps, defineModel } from 'vue';
|
||||||
import { useToggle } from '@vueuse/core';
|
|
||||||
|
|
||||||
import Button from 'dashboard/components-next/button/Button.vue';
|
|
||||||
import WithLabel from './WithLabel.vue';
|
import WithLabel from './WithLabel.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
defineProps({
|
||||||
label: {
|
label: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
@@ -34,11 +31,6 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const FIELDS = {
|
|
||||||
TEXT: 'text',
|
|
||||||
PASSWORD: 'password',
|
|
||||||
};
|
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
});
|
});
|
||||||
@@ -47,17 +39,6 @@ const model = defineModel({
|
|||||||
type: [String, Number],
|
type: [String, Number],
|
||||||
required: true,
|
required: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
const [isPasswordVisible, togglePasswordVisibility] = useToggle();
|
|
||||||
|
|
||||||
const isPasswordField = computed(() => props.type === FIELDS.PASSWORD);
|
|
||||||
|
|
||||||
const currentInputType = computed(() => {
|
|
||||||
if (isPasswordField.value) {
|
|
||||||
return isPasswordVisible.value ? FIELDS.TEXT : FIELDS.PASSWORD;
|
|
||||||
}
|
|
||||||
return props.type;
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -75,7 +56,7 @@ const currentInputType = computed(() => {
|
|||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
v-model="model"
|
v-model="model"
|
||||||
:name="name"
|
:name="name"
|
||||||
:type="currentInputType"
|
:type="type"
|
||||||
class="block w-full border-none rounded-md shadow-sm bg-n-alpha-black2 appearance-none outline outline-1 focus:outline focus:outline-1 text-n-slate-12 placeholder:text-n-slate-10 sm:text-sm sm:leading-6 px-3 py-3"
|
class="block w-full border-none rounded-md shadow-sm bg-n-alpha-black2 appearance-none outline outline-1 focus:outline focus:outline-1 text-n-slate-12 placeholder:text-n-slate-10 sm:text-sm sm:leading-6 px-3 py-3"
|
||||||
:class="{
|
:class="{
|
||||||
'error outline-n-ruby-8 dark:outline-n-ruby-8 hover:outline-n-ruby-9 dark:hover:outline-n-ruby-9 disabled:outline-n-ruby-8 dark:disabled:outline-n-ruby-8':
|
'error outline-n-ruby-8 dark:outline-n-ruby-8 hover:outline-n-ruby-9 dark:hover:outline-n-ruby-9 disabled:outline-n-ruby-8 dark:disabled:outline-n-ruby-8':
|
||||||
@@ -85,20 +66,7 @@ const currentInputType = computed(() => {
|
|||||||
'px-3 py-3': spacing === 'base',
|
'px-3 py-3': spacing === 'base',
|
||||||
'px-3 py-2 mb-0': spacing === 'compact',
|
'px-3 py-2 mb-0': spacing === 'compact',
|
||||||
'pl-9': icon,
|
'pl-9': icon,
|
||||||
'pr-10': isPasswordField,
|
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<Button
|
|
||||||
v-if="isPasswordField"
|
|
||||||
type="button"
|
|
||||||
slate
|
|
||||||
sm
|
|
||||||
link
|
|
||||||
:icon="isPasswordVisible ? 'i-lucide-eye-off' : 'i-lucide-eye'"
|
|
||||||
class="absolute inset-y-0 right-0 pr-3"
|
|
||||||
:aria-label="isPasswordVisible ? 'Hide password' : 'Show password'"
|
|
||||||
:aria-pressed="isPasswordVisible"
|
|
||||||
@click="togglePasswordVisibility()"
|
|
||||||
/>
|
|
||||||
</WithLabel>
|
</WithLabel>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { useVuelidate } from '@vuelidate/core';
|
import { useVuelidate } from '@vuelidate/core';
|
||||||
import { required, minLength, email, sameAs } from '@vuelidate/validators';
|
import { required, minLength, email } from '@vuelidate/validators';
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
import { useAlert } from 'dashboard/composables';
|
import { useAlert } from 'dashboard/composables';
|
||||||
import { DEFAULT_REDIRECT_URL } from 'dashboard/constants/globals';
|
import { DEFAULT_REDIRECT_URL } from 'dashboard/constants/globals';
|
||||||
@@ -8,22 +8,17 @@ import VueHcaptcha from '@hcaptcha/vue3-hcaptcha';
|
|||||||
import SimpleDivider from '../../../../../components/Divider/SimpleDivider.vue';
|
import SimpleDivider from '../../../../../components/Divider/SimpleDivider.vue';
|
||||||
import FormInput from '../../../../../components/Form/Input.vue';
|
import FormInput from '../../../../../components/Form/Input.vue';
|
||||||
import NextButton from 'dashboard/components-next/button/Button.vue';
|
import NextButton from 'dashboard/components-next/button/Button.vue';
|
||||||
import Icon from 'dashboard/components-next/icon/Icon.vue';
|
|
||||||
import { isValidPassword } from 'shared/helpers/Validators';
|
import { isValidPassword } from 'shared/helpers/Validators';
|
||||||
import GoogleOAuthButton from '../../../../../components/GoogleOauth/Button.vue';
|
import GoogleOAuthButton from '../../../../../components/GoogleOauth/Button.vue';
|
||||||
import { register } from '../../../../../api/auth';
|
import { register } from '../../../../../api/auth';
|
||||||
import * as CompanyEmailValidator from 'company-email-validator';
|
import * as CompanyEmailValidator from 'company-email-validator';
|
||||||
|
|
||||||
const MIN_PASSWORD_LENGTH = 6;
|
|
||||||
const SPECIAL_CHAR_REGEX = /[!@#$%^&*()_+\-=[\]{}|'"/\\.,`<>:;?~]/;
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
FormInput,
|
FormInput,
|
||||||
GoogleOAuthButton,
|
GoogleOAuthButton,
|
||||||
NextButton,
|
NextButton,
|
||||||
SimpleDivider,
|
SimpleDivider,
|
||||||
Icon,
|
|
||||||
VueHcaptcha,
|
VueHcaptcha,
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
@@ -36,7 +31,6 @@ export default {
|
|||||||
fullName: '',
|
fullName: '',
|
||||||
email: '',
|
email: '',
|
||||||
password: '',
|
password: '',
|
||||||
confirmPassword: '',
|
|
||||||
hCaptchaClientResponse: '',
|
hCaptchaClientResponse: '',
|
||||||
},
|
},
|
||||||
didCaptchaReset: false,
|
didCaptchaReset: false,
|
||||||
@@ -65,12 +59,7 @@ export default {
|
|||||||
password: {
|
password: {
|
||||||
required,
|
required,
|
||||||
isValidPassword,
|
isValidPassword,
|
||||||
minLength: minLength(MIN_PASSWORD_LENGTH),
|
minLength: minLength(6),
|
||||||
},
|
|
||||||
confirmPassword: {
|
|
||||||
required,
|
|
||||||
minLength: minLength(MIN_PASSWORD_LENGTH),
|
|
||||||
sameAsPassword: sameAs(this.credentials.password),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -91,11 +80,16 @@ export default {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
confirmPasswordErrorText() {
|
passwordErrorText() {
|
||||||
const { confirmPassword } = this.v$.credentials;
|
const { password } = this.v$.credentials;
|
||||||
if (!confirmPassword.$error) return '';
|
if (!password.$error) {
|
||||||
if (confirmPassword.sameAsPassword.$invalid) {
|
return '';
|
||||||
return this.$t('REGISTER.CONFIRM_PASSWORD.ERROR');
|
}
|
||||||
|
if (password.minLength.$invalid) {
|
||||||
|
return this.$t('REGISTER.PASSWORD.ERROR');
|
||||||
|
}
|
||||||
|
if (password.isValidPassword.$invalid) {
|
||||||
|
return this.$t('REGISTER.PASSWORD.IS_INVALID_PASSWORD');
|
||||||
}
|
}
|
||||||
return '';
|
return '';
|
||||||
},
|
},
|
||||||
@@ -105,51 +99,6 @@ export default {
|
|||||||
isFormValid() {
|
isFormValid() {
|
||||||
return !this.v$.$invalid && this.hasAValidCaptcha;
|
return !this.v$.$invalid && this.hasAValidCaptcha;
|
||||||
},
|
},
|
||||||
passwordRequirements() {
|
|
||||||
const password = this.credentials.password || '';
|
|
||||||
return {
|
|
||||||
length: password.length >= MIN_PASSWORD_LENGTH,
|
|
||||||
uppercase: /[A-Z]/.test(password),
|
|
||||||
lowercase: /[a-z]/.test(password),
|
|
||||||
number: /[0-9]/.test(password),
|
|
||||||
special: SPECIAL_CHAR_REGEX.test(password),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
passwordRequirementItems() {
|
|
||||||
const reqs = this.passwordRequirements;
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
id: 'length',
|
|
||||||
met: reqs.length,
|
|
||||||
label: this.$t('REGISTER.PASSWORD.REQUIREMENTS_LENGTH', {
|
|
||||||
min: MIN_PASSWORD_LENGTH,
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'uppercase',
|
|
||||||
met: reqs.uppercase,
|
|
||||||
label: this.$t('REGISTER.PASSWORD.REQUIREMENTS_UPPERCASE'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'lowercase',
|
|
||||||
met: reqs.lowercase,
|
|
||||||
label: this.$t('REGISTER.PASSWORD.REQUIREMENTS_LOWERCASE'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'number',
|
|
||||||
met: reqs.number,
|
|
||||||
label: this.$t('REGISTER.PASSWORD.REQUIREMENTS_NUMBER'),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'special',
|
|
||||||
met: reqs.special,
|
|
||||||
label: this.$t('REGISTER.PASSWORD.REQUIREMENTS_SPECIAL'),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
},
|
|
||||||
passwordRequirementsMet() {
|
|
||||||
return Object.values(this.passwordRequirements).every(Boolean);
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async submit() {
|
async submit() {
|
||||||
@@ -177,7 +126,9 @@ export default {
|
|||||||
this.v$.$touch();
|
this.v$.$touch();
|
||||||
},
|
},
|
||||||
resetCaptcha() {
|
resetCaptcha() {
|
||||||
if (!this.globalConfig.hCaptchaSiteKey) return;
|
if (!this.globalConfig.hCaptchaSiteKey) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.$refs.hCaptcha.reset();
|
this.$refs.hCaptcha.reset();
|
||||||
this.credentials.hCaptchaClientResponse = '';
|
this.credentials.hCaptchaClientResponse = '';
|
||||||
this.didCaptchaReset = true;
|
this.didCaptchaReset = true;
|
||||||
@@ -232,42 +183,9 @@ export default {
|
|||||||
:label="$t('LOGIN.PASSWORD.LABEL')"
|
:label="$t('LOGIN.PASSWORD.LABEL')"
|
||||||
:placeholder="$t('SET_NEW_PASSWORD.PASSWORD.PLACEHOLDER')"
|
:placeholder="$t('SET_NEW_PASSWORD.PASSWORD.PLACEHOLDER')"
|
||||||
:has-error="v$.credentials.password.$error"
|
:has-error="v$.credentials.password.$error"
|
||||||
aria-describedby="password-requirements"
|
:error-message="passwordErrorText"
|
||||||
@blur="v$.credentials.password.$touch"
|
@blur="v$.credentials.password.$touch"
|
||||||
/>
|
/>
|
||||||
<div
|
|
||||||
id="password-requirements"
|
|
||||||
class="text-xs space-y-2 rounded-md px-4 py-3 outline outline-1 outline-n-weak bg-n-alpha-black2"
|
|
||||||
>
|
|
||||||
<ul role="list" class="space-y-1 grid grid-cols-2">
|
|
||||||
<li
|
|
||||||
v-for="item in passwordRequirementItems"
|
|
||||||
:key="item.id"
|
|
||||||
class="flex gap-1 items-center"
|
|
||||||
>
|
|
||||||
<Icon
|
|
||||||
class="flex-none flex-shrink-0 w-3"
|
|
||||||
:icon="item.met ? 'i-lucide-circle-check-big' : 'i-lucide-circle'"
|
|
||||||
:class="item.met ? 'text-n-teal-10' : 'text-n-slate-10'"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<span :class="item.met ? 'text-n-slate-11' : 'text-n-slate-10'">
|
|
||||||
{{ item.label }}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<FormInput
|
|
||||||
v-model="credentials.confirmPassword"
|
|
||||||
type="password"
|
|
||||||
name="confirm_password"
|
|
||||||
:class="{ error: v$.credentials.confirmPassword.$error }"
|
|
||||||
:label="$t('REGISTER.CONFIRM_PASSWORD.LABEL')"
|
|
||||||
:placeholder="$t('REGISTER.CONFIRM_PASSWORD.PLACEHOLDER')"
|
|
||||||
:has-error="v$.credentials.confirmPassword.$error"
|
|
||||||
:error-message="confirmPasswordErrorText"
|
|
||||||
@blur="v$.credentials.confirmPassword.$touch"
|
|
||||||
/>
|
|
||||||
<div v-if="globalConfig.hCaptchaSiteKey" class="mb-3">
|
<div v-if="globalConfig.hCaptchaSiteKey" class="mb-3">
|
||||||
<VueHcaptcha
|
<VueHcaptcha
|
||||||
ref="hCaptcha"
|
ref="hCaptcha"
|
||||||
|
|||||||
@@ -20,18 +20,18 @@
|
|||||||
"TEAM_AVAILABILITY": {
|
"TEAM_AVAILABILITY": {
|
||||||
"ONLINE": "Jesteśmy dostępni",
|
"ONLINE": "Jesteśmy dostępni",
|
||||||
"OFFLINE": "W tej chwili jesteśmy niedostępni",
|
"OFFLINE": "W tej chwili jesteśmy niedostępni",
|
||||||
"BACK_AS_SOON_AS_POSSIBLE": "Wrócimy tak szybko, jak to możliwe"
|
"BACK_AS_SOON_AS_POSSIBLE": "We will be back as soon as possible"
|
||||||
},
|
},
|
||||||
"REPLY_TIME": {
|
"REPLY_TIME": {
|
||||||
"IN_A_FEW_MINUTES": "Zwykle odpowiadamy w ciągu paru minut",
|
"IN_A_FEW_MINUTES": "Zwykle odpowiadamy w ciągu paru minut",
|
||||||
"IN_A_FEW_HOURS": "Zwykle odpowiadamy w ciągu paru godzin",
|
"IN_A_FEW_HOURS": "Zwykle odpowiadamy w ciągu paru godzin",
|
||||||
"IN_A_DAY": "Zwykle odpowiadamy w przeciągu jednego dnia",
|
"IN_A_DAY": "Zwykle odpowiadamy w przeciągu jednego dnia",
|
||||||
"BACK_IN_HOURS": "Będziemy ponownie dostępni za {n} godzinę | Będziemy ponownie dostępni za {n} godzin",
|
"BACK_IN_HOURS": "We will be back online in {n} hour | We will be back online in {n} hours",
|
||||||
"BACK_IN_MINUTES": "Będziemy ponownie dostępni za {time} minut",
|
"BACK_IN_MINUTES": "We will be back online in {time} minutes",
|
||||||
"BACK_AT_TIME": "Będziemy ponownie dostępni o {time}",
|
"BACK_AT_TIME": "We will be back online at {time}",
|
||||||
"BACK_ON_DAY": "Będziemy ponownie dostępni w {day}",
|
"BACK_ON_DAY": "We will be back online on {day}",
|
||||||
"BACK_TOMORROW": "Będziemy ponownie dostępni jutro",
|
"BACK_TOMORROW": "We will be back online tomorrow",
|
||||||
"BACK_IN_SOME_TIME": "Będziemy ponownie dostępni niedługo"
|
"BACK_IN_SOME_TIME": "We will be back online in some time"
|
||||||
},
|
},
|
||||||
"DAY_NAMES": {
|
"DAY_NAMES": {
|
||||||
"SUNDAY": "Niedziela",
|
"SUNDAY": "Niedziela",
|
||||||
|
|||||||
@@ -14,24 +14,24 @@
|
|||||||
},
|
},
|
||||||
"THUMBNAIL": {
|
"THUMBNAIL": {
|
||||||
"AUTHOR": {
|
"AUTHOR": {
|
||||||
"NOT_AVAILABLE": "Şu anda müsait değil"
|
"NOT_AVAILABLE": "Not available"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"TEAM_AVAILABILITY": {
|
"TEAM_AVAILABILITY": {
|
||||||
"ONLINE": "Çevrimiçi",
|
"ONLINE": "Çevrimiçi",
|
||||||
"OFFLINE": "Şu an operatörlerimiz müsait değil",
|
"OFFLINE": "Şu an operatörlerimiz müsait değil",
|
||||||
"BACK_AS_SOON_AS_POSSIBLE": "En kısa sürede geri döneceğiz"
|
"BACK_AS_SOON_AS_POSSIBLE": "We will be back as soon as possible"
|
||||||
},
|
},
|
||||||
"REPLY_TIME": {
|
"REPLY_TIME": {
|
||||||
"IN_A_FEW_MINUTES": "Genellikle birkaç dakika içinde yanıt verir",
|
"IN_A_FEW_MINUTES": "Genellikle birkaç dakika içinde yanıt verir",
|
||||||
"IN_A_FEW_HOURS": "Genellikle birkaç saat içinde yanıt verir",
|
"IN_A_FEW_HOURS": "Genellikle birkaç saat içinde yanıt verir",
|
||||||
"IN_A_DAY": "Genellikle bir gün içinde yanıtlar",
|
"IN_A_DAY": "Genellikle bir gün içinde yanıtlar",
|
||||||
"BACK_IN_HOURS": "{n} saat içinde çevrimiçi olacağız | {n} saat içinde çevrimiçi olacağız",
|
"BACK_IN_HOURS": "We will be back online in {n} hour | We will be back online in {n} hours",
|
||||||
"BACK_IN_MINUTES": "{time} dakika içinde çevrimiçi olacağız",
|
"BACK_IN_MINUTES": "We will be back online in {time} minutes",
|
||||||
"BACK_AT_TIME": "{time} saatinde çevrimiçi olacağız",
|
"BACK_AT_TIME": "We will be back online at {time}",
|
||||||
"BACK_ON_DAY": "{day} günü çevrimiçi olacağız",
|
"BACK_ON_DAY": "We will be back online on {day}",
|
||||||
"BACK_TOMORROW": "Yarın çevrimiçi olacağız",
|
"BACK_TOMORROW": "We will be back online tomorrow",
|
||||||
"BACK_IN_SOME_TIME": "Bir süre sonra çevrimiçi olacağız"
|
"BACK_IN_SOME_TIME": "We will be back online in some time"
|
||||||
},
|
},
|
||||||
"DAY_NAMES": {
|
"DAY_NAMES": {
|
||||||
"SUNDAY": "Pazar",
|
"SUNDAY": "Pazar",
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
class Migration::PopulateAccountContactStatusAndSocialsJob < ApplicationJob
|
||||||
|
queue_as :async_database_migration
|
||||||
|
|
||||||
|
def perform(account_id)
|
||||||
|
account = Account.find_by(id: account_id)
|
||||||
|
return unless account
|
||||||
|
|
||||||
|
Rails.logger.info "Processing contact migration for account #{account_id} (#{account.name})"
|
||||||
|
|
||||||
|
# Find the first lead contact to determine cutoff
|
||||||
|
first_lead = account.contacts.lead.order(:created_at).first
|
||||||
|
|
||||||
|
# Build the contacts scope in a more readable way
|
||||||
|
contacts_scope = if first_lead.present?
|
||||||
|
account.contacts.visitor.where('created_at < ?', first_lead.created_at)
|
||||||
|
else
|
||||||
|
account.contacts.visitor
|
||||||
|
end
|
||||||
|
|
||||||
|
total_count = contacts_scope.count
|
||||||
|
processed_count = 0
|
||||||
|
|
||||||
|
contacts_scope.find_each(batch_size: 500) do |contact|
|
||||||
|
processed_count += 1 if sync_contact_attributes(contact)
|
||||||
|
end
|
||||||
|
|
||||||
|
Rails.logger.info "Processed #{processed_count}/#{total_count} contacts for account #{account_id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def sync_contact_attributes(contact)
|
||||||
|
# Track only the fields we care about
|
||||||
|
original_contact_type = contact.contact_type
|
||||||
|
original_additional = contact.additional_attributes.dup
|
||||||
|
|
||||||
|
# Run the sync service with migration
|
||||||
|
::Contacts::SyncAttributes.new(contact).perform_with_migration
|
||||||
|
|
||||||
|
# Build update hash with only changed fields we care about
|
||||||
|
update_hash = {}
|
||||||
|
update_hash[:contact_type] = contact.contact_type if contact.contact_type != original_contact_type
|
||||||
|
update_hash[:additional_attributes] = contact.additional_attributes if contact.additional_attributes != original_additional
|
||||||
|
|
||||||
|
return false if update_hash.empty?
|
||||||
|
|
||||||
|
# Use update_columns to bypass callbacks and avoid triggering events
|
||||||
|
# rubocop:disable Rails/SkipsModelValidations
|
||||||
|
contact.update_columns(update_hash)
|
||||||
|
# rubocop:enable Rails/SkipsModelValidations
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,6 +10,12 @@ class Contacts::SyncAttributes
|
|||||||
set_contact_type
|
set_contact_type
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def perform_with_migration
|
||||||
|
update_contact_location_and_country_code
|
||||||
|
migrate_social_attributes
|
||||||
|
set_contact_type
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def update_contact_location_and_country_code
|
def update_contact_location_and_country_code
|
||||||
@@ -24,7 +30,7 @@ class Contacts::SyncAttributes
|
|||||||
return unless @contact.contact_type == 'visitor'
|
return unless @contact.contact_type == 'visitor'
|
||||||
# If the contact has an email or phone number or social details( facebook_user_id, instagram_user_id, etc) then it is a lead
|
# If the contact has an email or phone number or social details( facebook_user_id, instagram_user_id, etc) then it is a lead
|
||||||
# If contact is from external channel like facebook, instagram, whatsapp, etc then it is a lead
|
# If contact is from external channel like facebook, instagram, whatsapp, etc then it is a lead
|
||||||
return unless @contact.email.present? || @contact.phone_number.present? || social_details_present?
|
return unless @contact.email.present? || @contact.phone_number.present? || @contact.identifier.present? || social_details_present?
|
||||||
|
|
||||||
@contact.contact_type = 'lead'
|
@contact.contact_type = 'lead'
|
||||||
end
|
end
|
||||||
@@ -34,4 +40,71 @@ class Contacts::SyncAttributes
|
|||||||
key.start_with?('social_') && @contact.additional_attributes[key].present?
|
key.start_with?('social_') && @contact.additional_attributes[key].present?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def migrate_social_attributes
|
||||||
|
return if @contact.additional_attributes.blank?
|
||||||
|
|
||||||
|
attrs = @contact.additional_attributes
|
||||||
|
social_profiles = attrs['social_profiles'] || {}
|
||||||
|
|
||||||
|
return if social_profiles.blank?
|
||||||
|
|
||||||
|
# Migrate Telegram - check both social_profiles and legacy username field
|
||||||
|
migrate_telegram_attributes(attrs, social_profiles)
|
||||||
|
|
||||||
|
# Migrate Facebook
|
||||||
|
migrate_facebook_attributes(attrs, social_profiles)
|
||||||
|
|
||||||
|
# Migrate LINE
|
||||||
|
migrate_line_attributes(attrs, social_profiles)
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_telegram_attributes(attrs, profiles)
|
||||||
|
# Previous format
|
||||||
|
# {
|
||||||
|
# "social_profiles": {
|
||||||
|
# "telegram": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# New format
|
||||||
|
# {
|
||||||
|
# "social_telegram_user_name": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
telegram_username = profiles['telegram'].presence || attrs['username'].presence
|
||||||
|
return if telegram_username.blank?
|
||||||
|
|
||||||
|
attrs['social_telegram_user_name'] ||= telegram_username
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_facebook_attributes(attrs, profiles)
|
||||||
|
# Previous format
|
||||||
|
# {
|
||||||
|
# "social_profiles": {
|
||||||
|
# "facebook": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# New format
|
||||||
|
# {
|
||||||
|
# "social_facebook_user_name": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
return if profiles['facebook'].blank?
|
||||||
|
|
||||||
|
attrs['social_facebook_user_name'] ||= profiles['facebook']
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_line_attributes(attrs, profiles)
|
||||||
|
# Previous format
|
||||||
|
# {
|
||||||
|
# "social_profiles": {
|
||||||
|
# "line": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# New format
|
||||||
|
# {
|
||||||
|
# "social_line_user_id": "gilpadraocruz"
|
||||||
|
# }
|
||||||
|
return if profiles['line'].blank?
|
||||||
|
|
||||||
|
attrs['social_line_user_id'] ||= profiles['line']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -32,11 +32,9 @@ class Whatsapp::IncomingMessageBaseService
|
|||||||
set_contact
|
set_contact
|
||||||
return unless @contact
|
return unless @contact
|
||||||
|
|
||||||
ActiveRecord::Base.transaction do
|
set_conversation
|
||||||
set_conversation
|
create_messages
|
||||||
create_messages
|
clear_message_source_id_from_redis
|
||||||
clear_message_source_id_from_redis
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_statuses
|
def process_statuses
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ end
|
|||||||
|
|
||||||
json.payload do
|
json.payload do
|
||||||
json.array! @contacts do |contact|
|
json.array! @contacts do |contact|
|
||||||
json.partial! 'api/v1/models/contact', formats: [:json], resource: contact, with_contact_inboxes: @include_contact_inboxes
|
json.partial! 'api/v1/models/contact', formats: [:json], resource: contact, with_contact_inboxes: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+25
-25
@@ -26,7 +26,7 @@ tr:
|
|||||||
auth:
|
auth:
|
||||||
saml:
|
saml:
|
||||||
invalid_email: 'Lütfen geçerli bir e-posta adresi girin'
|
invalid_email: 'Lütfen geçerli bir e-posta adresi girin'
|
||||||
authentication_failed: 'Kimlik doğrulama başarısız oldu. Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin.'
|
authentication_failed: 'Authentication failed. Please check your credentials and try again.'
|
||||||
messages:
|
messages:
|
||||||
reset_password_success: Parola sıfırlama isteği başarılı. Talimatlar için postanızı kontrol edin.
|
reset_password_success: Parola sıfırlama isteği başarılı. Talimatlar için postanızı kontrol edin.
|
||||||
reset_password_failure: Belirtilen e-postaya sahip herhangi bir kullanıcı bulamadık.
|
reset_password_failure: Belirtilen e-postaya sahip herhangi bir kullanıcı bulamadık.
|
||||||
@@ -94,19 +94,19 @@ tr:
|
|||||||
custom_attribute_definition:
|
custom_attribute_definition:
|
||||||
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
key_conflict: The provided key is not allowed as it might conflict with default attributes.
|
||||||
mfa:
|
mfa:
|
||||||
already_enabled: MFA zaten etkinleştirilmiştir
|
already_enabled: MFA is already enabled
|
||||||
not_enabled: MFA etkinleştirilmemiştir
|
not_enabled: MFA is not enabled
|
||||||
invalid_code: Geçersiz doğrulama kodu
|
invalid_code: Invalid verification code
|
||||||
invalid_backup_code: Geçersiz yedek kod
|
invalid_backup_code: Invalid backup code
|
||||||
invalid_token: Geçersiz veya süresi dolmuş MFA jetonu
|
invalid_token: Invalid or expired MFA token
|
||||||
invalid_credentials: Geçersiz kimlik bilgileri veya doğrulama kodu
|
invalid_credentials: Invalid credentials or verification code
|
||||||
feature_unavailable: MFA özelliği kullanılamıyor. Lütfen şifreleme anahtarlarını yapılandırın.
|
feature_unavailable: MFA feature is not available. Please configure encryption keys.
|
||||||
profile:
|
profile:
|
||||||
mfa:
|
mfa:
|
||||||
enabled: MFA başarıyla etkinleştirildi
|
enabled: MFA enabled successfully
|
||||||
disabled: MFA başarıyla devre dışı bırakıldı
|
disabled: MFA disabled successfully
|
||||||
account_saml_settings:
|
account_saml_settings:
|
||||||
invalid_certificate: PEM formatında geçerli bir X.509 sertifikası olmalıdır
|
invalid_certificate: must be a valid X.509 certificate in PEM format
|
||||||
reports:
|
reports:
|
||||||
period: Raporlama aralığı %{since}'dan %{until}'a
|
period: Raporlama aralığı %{since}'dan %{until}'a
|
||||||
utc_warning: Oluşturulan rapor UTC zaman dilimindedir.
|
utc_warning: Oluşturulan rapor UTC zaman dilimindedir.
|
||||||
@@ -129,7 +129,7 @@ tr:
|
|||||||
avg_first_response_time: Avg first response time
|
avg_first_response_time: Avg first response time
|
||||||
avg_resolution_time: Avg resolution time
|
avg_resolution_time: Avg resolution time
|
||||||
avg_reply_time: Ortalama yanıt süresi
|
avg_reply_time: Ortalama yanıt süresi
|
||||||
resolution_count: Çözüm Sayısı
|
resolution_count: Çözünürlük Sayısı
|
||||||
team_csv:
|
team_csv:
|
||||||
team_name: Ekip adı
|
team_name: Ekip adı
|
||||||
conversations_count: Konuşma sayısı
|
conversations_count: Konuşma sayısı
|
||||||
@@ -220,7 +220,7 @@ tr:
|
|||||||
csat:
|
csat:
|
||||||
not_sent_due_to_messaging_window: 'Giden mesaj kısıtlamaları nedeniyle CSAT anketi gönderilmedi'
|
not_sent_due_to_messaging_window: 'Giden mesaj kısıtlamaları nedeniyle CSAT anketi gönderilmedi'
|
||||||
auto_resolve:
|
auto_resolve:
|
||||||
not_sent_due_to_messaging_window: 'Giden mesaj kısıtlamaları nedeniyle otomatik çözüm mesajı gönderilmedi'
|
not_sent_due_to_messaging_window: 'Auto-resolve message not sent due to outgoing message restrictions'
|
||||||
muted: '%{user_name}, sohbeti sessize aldı'
|
muted: '%{user_name}, sohbeti sessize aldı'
|
||||||
unmuted: '%{user_name} konuşmanın sesini açtı'
|
unmuted: '%{user_name} konuşmanın sesini açtı'
|
||||||
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
auto_resolution_message: 'Resolving the conversation as it has been inactive for a while. Please start a new conversation if you need further assistance.'
|
||||||
@@ -303,21 +303,21 @@ tr:
|
|||||||
invalid_tool_call: 'Geçersiz araç çağrısı'
|
invalid_tool_call: 'Geçersiz araç çağrısı'
|
||||||
tool_not_available: 'Araç mevcut değil'
|
tool_not_available: 'Araç mevcut değil'
|
||||||
documents:
|
documents:
|
||||||
limit_exceeded: 'Belge sınırı aşıldı'
|
limit_exceeded: 'Document limit exceeded'
|
||||||
pdf_format_error: 'PDF dosyası olmalıdır'
|
pdf_format_error: 'must be a PDF file'
|
||||||
pdf_size_error: '10 MB''dan az olmalıdır'
|
pdf_size_error: 'must be less than 10MB'
|
||||||
pdf_upload_failed: 'OpenAI''ye PDF yükleme başarısız'
|
pdf_upload_failed: 'Failed to upload PDF to OpenAI'
|
||||||
pdf_upload_success: 'PDF başarıyla yüklendi, file_id: %{file_id}'
|
pdf_upload_success: 'PDF uploaded successfully with file_id: %{file_id}'
|
||||||
pdf_processing_failed: 'PDF belgesi işlenemedi %{document_id}: %{error}'
|
pdf_processing_failed: 'Failed to process PDF document %{document_id}: %{error}'
|
||||||
pdf_processing_success: 'PDF belgesi başarıyla işlendi %{document_id}'
|
pdf_processing_success: 'Successfully processed PDF document %{document_id}'
|
||||||
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
faq_generation_complete: 'FAQ generation complete. Total FAQs created: %{count}'
|
||||||
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
using_paginated_faq: 'Using paginated FAQ generation for document %{document_id}'
|
||||||
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
using_standard_faq: 'Using standard FAQ generation for document %{document_id}'
|
||||||
response_creation_error: 'Error in creating response document: %{error}'
|
response_creation_error: 'Error in creating response document: %{error}'
|
||||||
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
missing_openai_file_id: 'Document must have openai_file_id for paginated processing'
|
||||||
openai_api_error: 'OpenAI API Hatası: %{error}'
|
openai_api_error: 'OpenAI API Error: %{error}'
|
||||||
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
starting_paginated_faq: 'Starting paginated FAQ generation (%{pages_per_chunk} pages per chunk)'
|
||||||
stopping_faq_generation: 'İşlem durduruldu. Sebep: %{reason}'
|
stopping_faq_generation: 'Stopping processing. Reason: %{reason}'
|
||||||
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
paginated_faq_complete: 'Paginated generation complete. Total FAQs: %{total_faqs}, Pages processed: %{pages_processed}'
|
||||||
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
processing_pages: 'Processing pages %{start}-%{end} (iteration %{iteration})'
|
||||||
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
chunk_generated: 'Chunk generated %{chunk_faqs} FAQs. Total so far: %{total_faqs}'
|
||||||
@@ -407,9 +407,9 @@ tr:
|
|||||||
portals:
|
portals:
|
||||||
send_instructions:
|
send_instructions:
|
||||||
email_required: 'E-posta gereklidir'
|
email_required: 'E-posta gereklidir'
|
||||||
invalid_email_format: 'Geçersiz e-posta formatı'
|
invalid_email_format: 'Invalid email format'
|
||||||
custom_domain_not_configured: 'Özel alan adı yapılandırılmadı'
|
custom_domain_not_configured: 'Custom domain is not configured'
|
||||||
instructions_sent_successfully: 'Instructions sent successfully'
|
instructions_sent_successfully: 'Instructions sent successfully'
|
||||||
subject: '%{custom_domain} kurulumunu tamamlayın'
|
subject: 'Finish setting up %{custom_domain}'
|
||||||
ssl_status:
|
ssl_status:
|
||||||
custom_domain_not_configured: 'Özel alan adı yapılandırılmamış'
|
custom_domain_not_configured: 'Özel alan adı yapılandırılmamış'
|
||||||
|
|||||||
@@ -24,31 +24,13 @@ class Integrations::Slack::ChannelBuilder
|
|||||||
end
|
end
|
||||||
|
|
||||||
def channels
|
def channels
|
||||||
# Split channel fetching into separate API calls to avoid rate limiting issues.
|
conversations_list = slack_client.conversations_list(types: 'public_channel,private_channel', exclude_archived: true)
|
||||||
# Slack's API handles single-type requests (public OR private) much more efficiently
|
|
||||||
# than mixed-type requests (public AND private). This approach eliminates rate limits
|
|
||||||
# that occur when requesting both channel types simultaneously.
|
|
||||||
channel_list = []
|
|
||||||
|
|
||||||
# Step 1: Fetch all private channels in one call (expect very few)
|
|
||||||
private_channels = fetch_channels_by_type('private_channel')
|
|
||||||
channel_list.concat(private_channels)
|
|
||||||
|
|
||||||
# Step 2: Fetch public channels with pagination
|
|
||||||
public_channels = fetch_channels_by_type('public_channel')
|
|
||||||
channel_list.concat(public_channels)
|
|
||||||
channel_list
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_channels_by_type(channel_type, limit: 1000)
|
|
||||||
conversations_list = slack_client.conversations_list(types: channel_type, exclude_archived: true, limit: limit)
|
|
||||||
channel_list = conversations_list.channels
|
channel_list = conversations_list.channels
|
||||||
while conversations_list.response_metadata.next_cursor.present?
|
while conversations_list.response_metadata.next_cursor.present?
|
||||||
conversations_list = slack_client.conversations_list(
|
conversations_list = slack_client.conversations_list(
|
||||||
cursor: conversations_list.response_metadata.next_cursor,
|
cursor: conversations_list.response_metadata.next_cursor,
|
||||||
types: channel_type,
|
types: 'public_channel,private_channel',
|
||||||
exclude_archived: true,
|
exclude_archived: true
|
||||||
limit: limit
|
|
||||||
)
|
)
|
||||||
channel_list.concat(conversations_list.channels)
|
channel_list.concat(conversations_list.channels)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ RSpec.describe Conversation do
|
|||||||
it 'adds a message for system auto resolution if marked resolved by system' do
|
it 'adds a message for system auto resolution if marked resolved by system' do
|
||||||
account.update(auto_resolve_after: 40 * 24 * 60)
|
account.update(auto_resolve_after: 40 * 24 * 60)
|
||||||
conversation2 = create(:conversation, status: 'open', account: account, assignee: old_assignee)
|
conversation2 = create(:conversation, status: 'open', account: account, assignee: old_assignee)
|
||||||
Current.reset
|
Current.user = nil
|
||||||
|
|
||||||
message_data = if account.auto_resolve_after >= 1440 && account.auto_resolve_after % 1440 == 0
|
message_data = if account.auto_resolve_after >= 1440 && account.auto_resolve_after % 1440 == 0
|
||||||
{ key: 'auto_resolved_days', count: account.auto_resolve_after / 1440 }
|
{ key: 'auto_resolved_days', count: account.auto_resolve_after / 1440 }
|
||||||
|
|||||||
Reference in New Issue
Block a user