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 isTranslationOn = sharedPreferences.getBoolean("translation_enabled", false)
local isColloquial = sharedPreferences.getBoolean("isColloquial", true)
local addNewLine = true

local sharedPrefs = PreferenceManager.getDefaultSharedPreferences(service)
local storedLanguage = sharedPrefs.getString("selectedLanguage", nil)
local selectedLanguage = storedLanguage or "مصر"

-- إعلان مقدم لدالة ترجمة النص
local processTranslationText

-- دالة لاسترجاع النص المُراد ترجمته؛ 
-- بما أن دوال الحصول على النص من العنصر المُركز غير متوفرة،
-- يتم الاعتماد على الحافظة، فيجب على المستخدم نسخ النص المطلوب.
local function getFocusedText()
  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",
  ["العربية"] = "ar"
}
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
      editor.putBoolean("translation_enabled", isTranslationOn)
      editor.apply()
      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 spEditor = sharedPreferences.edit()
        spEditor.putString("selectedLanguage", selectedLanguage)
        spEditor.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:
-- تحصل على النص المنسوخ من الحافظة (الذي يجب أن يكون النص المُحدد من أي عنصر)
-- ثم تُكوّن استعلام الترجمة وترسله إلى الخادم، وفي حال نجاح الاستجابة تُنسخ النتيجة إلى الحافظة وتُنطق.
processTranslationText = function()
  local text = getFocusedText()
  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

-- دالة startListening:
-- إذا كان وضع الترجمة مفعل يتم استدعاء processTranslationText دون بدء الإدخال الصوتي،
-- وإلا يتم بدء الاستماع بالطريقة الاعتيادية.
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: