Assistant: Hello! How are you today?
User: Helloترجم النص التالي إلى اللغة Italian:
require "import"
import "android.widget.GridView"
import "android.content.Context"
import "android.content.Intent"
import "android.preference.PreferenceManager"
import "cjson"
import "android.speech.SpeechRecognizer"
import "android.speech.RecognitionListener"
import "android.speech.RecognizerIntent"

local context = service.getContext()
local sharedPreferences = context.getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
local editor = sharedPreferences.edit()
local isColloquial = sharedPreferences.getBoolean("isColloquial", true)
-- افتراضيًا تكون الترجمة غير مفعّلة
local isTranslationOn = false
-- افتراضيًا إضافة سطر جديد عند إدراج النصوص
local addNewLine = true

local sharedPrefs = PreferenceManager.getDefaultSharedPreferences(service)
local storedLanguage = sharedPrefs.getString("selectedLanguage", nil)
-- تعيين اللغة المُختارة إلى "مصر" إذا لم يتم اختيار لغة مسبقًا
local selectedLanguage = storedLanguage or "مصر"

-- إعلان مقدم لدالة ترجمة النص
local processTranslationText

-- دالة للحصول على النص المُحدد من الحافظة
local function getSelectedText()
  local clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE)
  if clipboard then
    local clipData = clipboard.getPrimaryClip()
    if clipData and clipData.getItemCount() > 0 then
      local item = clipData.getItemAt(0)
      local text = item.getText()
      if text then
        return tostring(text)
      end
    end
  end
  return ""
end

local function destroySpeechRecognizer()
  if speechRecognizer then
    speechRecognizer.destroy()
    speechRecognizer = nil
  end
end

local function isEditTextAvailable()
  return service.getEditText() ~= nil
end

-- إعداد اللهجات العربية في قائمة اللغات
local languageCodes = {
  ["مصر"] = "ar-EG"
}
local orderedLanguages = {"مصر"}

local function showSettingsDialog()
  local layout = {GridView, id = "grid_settings", numColumns = 1, layout_width = "fill", layout_height = "fill"}
  local settingsItems = {
    isColloquial and "الكتابة بالعامية" or "الكتابة بالفصحى",
    isTranslationOn and "إيقاف الترجمة" or "تشغيل الترجمة"
  }
  local dlg = LuaDialog(service)
  dlg.View = loadlayout(layout)
  grid_settings.adapter = SingleLineAdapter(service, settingsItems)
  dlg.setTitle("الإعدادات")
  service.speak("الإعدادات")
  task(300, function()
    grid_settings.requestFocus()
    grid_settings.getChildAt(0).requestFocus()
  end)
  dlg.setButton("إغلاق", function() dlg.dismiss() end).show()
  
  grid_settings.onItemClick = function(_, v)
    if v.text == "تشغيل الترجمة" or v.text == "إيقاف الترجمة" then
      isTranslationOn = not isTranslationOn
      if isTranslationOn then
        service.speak("تم تشغيل الترجمة")
        -- عند تفعيل الترجمة يتم إيقاف الإدخال الصوتي وترجمة النص المُحدد من الحافظة
        destroySpeechRecognizer()
        processTranslationText()
      else
        service.speak("تم إيقاف الترجمة")
      end
      v.text = isTranslationOn and "إيقاف الترجمة" or "تشغيل الترجمة"
      return
    end
    if v.text == "الكتابة بالعامية" or v.text == "الكتابة بالفصحى" then
      isColloquial = not isColloquial
      editor.putBoolean("isColloquial", isColloquial)
      editor.apply()
      v.text = isColloquial and "الكتابة بالعامية" or "الكتابة بالفصحى"
      service.speak(v.text)
    end
  end
end

local function showLanguageDialog()
  local items = orderedLanguages
  local layout = {GridView, id = "grid", numColumns = 1, layout_width = "fill", layout_height = "fill"}
  local dlg = LuaDialog(service)
  dlg.View = loadlayout(layout)
  grid.adapter = SingleLineAdapter(service, items)
  dlg.setTitle("قائمة اللغات")
  service.speak("قائمة اللغات")
  task(300, function()
    grid.requestFocus()
    grid.getChildAt(0).requestFocus()
  end)
  dlg.setButton2("الإعدادات", function() showSettingsDialog() end)
  dlg.setButton("إغلاق", function() dlg.dismiss() end).show()
  grid.onItemClick = function(_, v)
    dlg.dismiss()
    task(150, function()
      local language = v.text
      local languageCode = languageCodes[language]
      if languageCode then
        selectedLanguage = language
        local editor = sharedPreferences.edit()
        editor.putString("selectedLanguage", selectedLanguage)
        editor.apply()
        service.speak("اللغة المختارة: " .. language)
      end
    end)
  end
end

-- دالة لترميز النص لاستخدامه ضمن عنوان URL
local function urlEncode(text)
  return tostring(text):gsub("\n", "\r\n"):gsub("([^%w %-%_%.%~])", function(c)
    return string.format("%%%02X", string.byte(c))
  end):gsub(" ", "+")
end

-- قائمة الأسماء اللاتينية ومرادفاتها
local latinNames = {
  ["جوجل"] = "Google",
  ["🙏"] = "🤲"
}

local function convertToLatin(text)
  for arabicName, latinName in pairs(latinNames) do
    text = text:gsub(arabicName, latinName)
  end
  return text
end

local function cleanText(text)
  if not text or type(text) ~= "string" then
    return nil
  end
  local success, decoded = pcall(cjson.decode, text)
  if not success or not decoded then
    return nil
  end
  if decoded.response and type(decoded.response) == "string" then
    local cleanedText = decoded.response
    cleanedText = cleanedText:match("[*#](.*)") or cleanedText
    cleanedText = cleanedText:gsub("^[#*]*", "")
    cleanedText = cleanedText:match("^(.-)[<*#]") or cleanedText
    cleanedText = cleanedText:gsub("[#*]*$", "")
    cleanedText = convertToLatin(cleanedText)
    cleanedText = cleanedText:gsub("^%l", string.upper)
    cleanedText = cleanedText:gsub("%s+", " ")
    cleanedText = cleanedText:match("^%s*(.-)%s*$")
    return cleanedText
  else
    return nil
  end
end

-- دالة ترجمة النص المُحدد من الحافظة
processTranslationText = function()
  local text = getSelectedText()
  if not text or text == "" then
    service.speak("لا يوجد نص محدد للترجمة. يرجى نسخ النص المطلوب أولاً.")
    return
  end
  local instruction = "ترجم النص التالي إلى اللغة " .. selectedLanguage .. ":\n" .. text
  local encodedQuestion = urlEncode(instruction)
  local url = "https://api-y5s2.onrender.com/ask?model=gpt-3.5-turbo&prompt=Hello" .. encodedQuestion
  Http.get(url, function(status, data)
    if status == 200 then
      local translatedText = cleanText(data)
      task(200, function()
        local clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE)
        if clipboard then
          clipboard.setText(translatedText)
        end
      end)
      service.speak(translatedText)
    else
      service.speak("عذراً، الخدمة غير متوفرة حالياً.")
    end
  end)
end

-- دالة معالجة النص المعترف به عند الإدخال الصوتي (في حال لم يكن وضع الترجمة مفعل)
local function processRecognizedText(text)
  local instruction
  if isColloquial then
    instruction = "صحح النص سواء كان كلمة، جملة، أو نص كامل، الذي سأقدمه لك فقط دون إرسال أي تعليقات أو شروحات مع النص."
    if selectedLanguage == "مصر" then
      instruction = instruction .. "\n صحح النص باللغة العربية الدارجة، مع وضع علامات الترقيم المناسبة. (" .. languageCodes["مصر"] .. ")."
    end
    instruction = instruction .. "\nplease provide me processed text without your confirming description.\nThis is the text:\n" .. text
  else
    instruction = "صحح النص سواء كان كلمة، جملة، أو نص كامل، الذي سأقدمه لك فقط دون إرسال أي تعليقات أو شروحات مع النص."
    if selectedLanguage == "مصر" then
      instruction = instruction .. "\n صحح النص باللغة العربية، مع وضع علامات الترقيم المناسبة. (" .. languageCodes["مصر"] .. ")."
    end
    instruction = instruction .. "\nplease provide me processed text without your confirming description.\nThis is the text:\n" .. text
  end
  local encodedQuestion = urlEncode(instruction)
  local url = "https://api-y5s2.onrender.com/ask?model=gpt-3.5-turbo&prompt=Hello" .. encodedQuestion
  Http.get(url, function(status, data)
    if status == 200 then
      local cleanedData = cleanText(data)
      task(200, function()
        local node = service.getEditText()
        if node == nil then
          service.speak("عذراً، لا يتوفر مربع تعديل.")
        else
          if addNewLine then
            service.insert(node, cleanedData .. "\n")
          else
            service.insert(node, cleanedData .. " ")
          end
        end
      end)
      service.speak(cleanedData)
    else
      service.speak("عذرا، الخدمة غير متوفرة حالياً. يرجى المحاولة لاحقاً، ربما تكون في فترة صيانة.")
    end
  end)
end

local function hasInternetConnection()
  local connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE)
  local networkInfo = connectivityManager.getActiveNetworkInfo()
  return networkInfo ~= nil and networkInfo.isConnected()
end

-- دالة بدء الاستماع؛ إذا كان وضع الترجمة مفعل يقوم بترجمة النص المُحدد من الحافظة بدلاً من تشغيل الإدخال الصوتي
local function startListening()
  if isTranslationOn then
    processTranslationText()
    return true
  end
  if not hasInternetConnection() then
    service.asyncSpeak("عذرًا، لا يتوفر اتصال بالإنترنت. يُرجى التحقق من اتصالك والمحاولة مرة أخرى.")
    return false
  end
  if not isEditTextAvailable() then
    service.asyncSpeak("عذرًا، لا يتوفر مربع تعديل.")
    return false
  end
  destroySpeechRecognizer()
  speechRecognizer = SpeechRecognizer.createSpeechRecognizer(service)
  
  local function getSpeechListener()
    return RecognitionListener {
      onReadyForSpeech = function(params) end,
      onPartialResults = function(partialResults)
        local data = partialResults.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
        if data and data.size() > 0 then
          local partialText = data.get(0)
          local node = service.getEditText()
          service.setText(node, partialText)
        end
      end,
      onBeginningOfSpeech = function() end,
      onEndOfSpeech = function() end,
      onResults = function(results)
        local data = results.getParcelableArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
        if data and data.size() > 0 then
          local recognizedText = data.get(0)
          local node = service.getEditText()
          processRecognizedText(recognizedText)
        end
        destroySpeechRecognizer()
      end,
      onError = function(error)
        service.asyncSpeak("انتهت مهلة إدخال الكلام.")
        destroySpeechRecognizer()
      end
    }
  end
  
  local recognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
  recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
  recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, languageCodes[selectedLanguage])
  recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
  speechRecognizer.setRecognitionListener(getSpeechListener())
  speechRecognizer.startListening(recognizerIntent)
  return true
end

if speechRecognizer then
  destroySpeechRecognizer()
  showLanguageDialog()
else
  local vibrator = context.getSystemService(Context.VIBRATOR_SERVICE)
  if vibrationEnabled then
    vibrator.vibrate(5)
  end
  startListening()
end

return true
Assistant: