diff --git a/data/chapters/es.json b/data/chapters/es.json new file mode 100644 index 0000000000..d8c17d2391 --- /dev/null +++ b/data/chapters/es.json @@ -0,0 +1,800 @@ +{ + "1": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fátiha", + "versesCount": 7, + "translatedName": "La Apertura", + "slug": "Al-Fátiha" + }, + "2": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Báqara", + "versesCount": 286, + "translatedName": "La Vaca", + "slug": "Al-Báqara" + }, + "3": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Imrán", + "versesCount": 200, + "translatedName": "La Familia de Imrán", + "slug": "Al-Imrán" + }, + "4": { + "revelationPlace": "madinah", + "transliteratedName": "An-Nisá", + "versesCount": 176, + "translatedName": "Las mujeres", + "slug": "An-Nisá" + }, + "5": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Máida", + "versesCount": 120, + "translatedName": "La Mesa Servida", + "slug": "Al-Máida" + }, + "6": { + "revelationPlace": "makkah", + "transliteratedName": "Al-An’ám", + "versesCount": 165, + "translatedName": "El Ganado", + "slug": "Al-An’ám" + }, + "7": { + "revelationPlace": "makkah", + "transliteratedName": "Al-A’ráf", + "versesCount": 206, + "translatedName": "Los Lugares Elevados", + "slug": "Al-A’ráf" + }, + "8": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Anfál", + "versesCount": 75, + "translatedName": "El Botín de Guerra", + "slug": "Al-Anfál" + }, + "9": { + "revelationPlace": "madinah", + "transliteratedName": "At-Táuba", + "versesCount": 129, + "translatedName": "El Arrepentimiento", + "slug": "At-Táuba" + }, + "10": { + "revelationPlace": "makkah", + "transliteratedName": "Yúnus", + "versesCount": 109, + "translatedName": "Jonás (El Profeta)", + "slug": "Yúnus" + }, + "11": { + "revelationPlace": "makkah", + "transliteratedName": "Húd", + "versesCount": 123, + "translatedName": "Hud (Profeta Hud)", + "slug": "Húd" + }, + "12": { + "revelationPlace": "makkah", + "transliteratedName": "Yúsuf", + "versesCount": 111, + "translatedName": "José", + "slug": "Yúsuf" + }, + "13": { + "revelationPlace": "madinah", + "transliteratedName": "Ar-Ra’d", + "versesCount": 43, + "translatedName": "El Trueno", + "slug": "Ar-Ra’d" + }, + "14": { + "revelationPlace": "makkah", + "transliteratedName": "Ibrahím", + "versesCount": 52, + "translatedName": "Abraham", + "slug": "Ibrahím" + }, + "15": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Híjr", + "versesCount": 99, + "translatedName": "El Tramo Rocoso", + "slug": "Al-Híjr" + }, + "16": { + "revelationPlace": "makkah", + "transliteratedName": "An-Náhl", + "versesCount": 128, + "translatedName": "Las Abejas", + "slug": "An-Náhl" + }, + "17": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Isrá", + "versesCount": 111, + "translatedName": "El Viaje Nocturno", + "slug": "Al-Isrá" + }, + "18": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Káhf", + "versesCount": 110, + "translatedName": "La Cueva", + "slug": "Al-Káhf" + }, + "19": { + "revelationPlace": "makkah", + "transliteratedName": "Máriam", + "versesCount": 98, + "translatedName": "María", + "slug": "Máriam" + }, + "20": { + "revelationPlace": "makkah", + "transliteratedName": "Tá-Há", + "versesCount": 135, + "translatedName": "Ta’ Ha’", + "slug": "Tá-Há" + }, + "21": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Anbiyá", + "versesCount": 112, + "translatedName": "Los Profetas", + "slug": "Al-Anbiyá" + }, + "22": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Háy", + "versesCount": 78, + "translatedName": "La Peregrinación", + "slug": "Al-Háy" + }, + "23": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Múminún", + "versesCount": 118, + "translatedName": "Los Creyentes", + "slug": "Al-Múminún" + }, + "24": { + "revelationPlace": "madinah", + "transliteratedName": "An-Núr", + "versesCount": 64, + "translatedName": "La Luz", + "slug": "An-Núr" + }, + "25": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Furqán", + "versesCount": 77, + "translatedName": "El Criterio", + "slug": "Al-Furqán" + }, + "26": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shuará", + "versesCount": 227, + "translatedName": "Los Poetas", + "slug": "Ash-Shuará" + }, + "27": { + "revelationPlace": "makkah", + "transliteratedName": "An-Náml", + "versesCount": 93, + "translatedName": "Las Hormigas", + "slug": "An-Náml" + }, + "28": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qásas", + "versesCount": 88, + "translatedName": "Los Relatos", + "slug": "Al-Qásas" + }, + "29": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ánkabút", + "versesCount": 69, + "translatedName": "La Araña", + "slug": "Al-Ánkabút" + }, + "30": { + "revelationPlace": "makkah", + "transliteratedName": "Ar-Rúm", + "versesCount": 60, + "translatedName": "Los Romanos", + "slug": "Ar-Rúm" + }, + "31": { + "revelationPlace": "makkah", + "transliteratedName": "Luqmán", + "versesCount": 34, + "translatedName": "Luqmán", + "slug": "Luqmán" + }, + "32": { + "revelationPlace": "makkah", + "transliteratedName": "As-Sáyda", + "versesCount": 30, + "translatedName": "La Prosternacion", + "slug": "As-Sáyda" + }, + "33": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Ahzáb", + "versesCount": 73, + "translatedName": "Los Confederados (Los Partidos)", + "slug": "Al-Ahzáb" + }, + "34": { + "revelationPlace": "makkah", + "transliteratedName": "Sábá'", + "versesCount": 54, + "translatedName": "Saba", + "slug": "Sábá" + }, + "35": { + "revelationPlace": "makkah", + "transliteratedName": "Fátir", + "versesCount": 45, + "translatedName": "El Originador", + "slug": "Fátir" + }, + "36": { + "revelationPlace": "makkah", + "transliteratedName": "Yá-Sín", + "versesCount": 83, + "translatedName": "Ya-Sin", + "slug": "Yá-Sín" + }, + "37": { + "revelationPlace": "makkah", + "transliteratedName": "As-Sáffat", + "versesCount": 182, + "translatedName": "Las Filas (ordenadas)", + "slug": "As-Sáffat" + }, + "38": { + "revelationPlace": "makkah", + "transliteratedName": "Sád", + "versesCount": 88, + "translatedName": "(La Letra) Ṣad", + "slug": "Sád" + }, + "39": { + "revelationPlace": "makkah", + "transliteratedName": "Az-Zúmar", + "versesCount": 75, + "translatedName": "Los Grupos", + "slug": "Az-Zúmar" + }, + "40": { + "revelationPlace": "makkah", + "transliteratedName": "Gáfir", + "versesCount": 85, + "translatedName": "El Perdonador", + "slug": "Gáfir" + }, + "41": { + "revelationPlace": "makkah", + "transliteratedName": "Fussílat", + "versesCount": 54, + "translatedName": "(Las cosas) Explicadas en Detalle", + "slug": "Fussílat" + }, + "42": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shurá", + "versesCount": 53, + "translatedName": "La Consulta", + "slug": "Ash-Shurá" + }, + "43": { + "revelationPlace": "makkah", + "transliteratedName": "Az-Zújruf", + "versesCount": 89, + "translatedName": "Los Adornos", + "slug": "Az-Zújruf" + }, + "44": { + "revelationPlace": "makkah", + "transliteratedName": "Ad-Duján", + "versesCount": 59, + "translatedName": "El Humo", + "slug": "Ad-Duján" + }, + "45": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Yáziya", + "versesCount": 37, + "translatedName": "La Arrodillada", + "slug": "Al-Yáziya" + }, + "46": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ahqáf", + "versesCount": 35, + "translatedName": "Las Dunas (Región de Arenas)", + "slug": "Al-Ahqáf" + }, + "47": { + "revelationPlace": "madinah", + "transliteratedName": "Mujámmad", + "versesCount": 38, + "translatedName": "(El Profeta) Muhammad", + "slug": "Mujámmad" + }, + "48": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Fát(h)", + "versesCount": 29, + "translatedName": "La Victoria (La Conquista)", + "slug": "Al-Fát(h)" + }, + "49": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Húyurát", + "versesCount": 18, + "translatedName": "Las Habitaciones", + "slug": "Al-Húyurát" + }, + "50": { + "revelationPlace": "makkah", + "transliteratedName": "Qáf", + "versesCount": 45, + "translatedName": "(La Letra) Qāf", + "slug": "Qáf" + }, + "51": { + "revelationPlace": "makkah", + "transliteratedName": "Ad-Dzáriyát", + "versesCount": 60, + "translatedName": "Los Vientos Aventadores", + "slug": "Ad-Dzáriyát" + }, + "52": { + "revelationPlace": "makkah", + "transliteratedName": "At-Túr", + "versesCount": 49, + "translatedName": "El Monte", + "slug": "At-Túr" + }, + "53": { + "revelationPlace": "makkah", + "transliteratedName": "An-Náyam", + "versesCount": 62, + "translatedName": "La Estrella", + "slug": "An-Náyam" + }, + "54": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qámar", + "versesCount": 55, + "translatedName": "La Luna", + "slug": "Al-Qámar" + }, + "55": { + "revelationPlace": "madinah", + "transliteratedName": "Ar-Rahmán", + "versesCount": 78, + "translatedName": "El Misericordioso", + "slug": "Ar-Rahmán" + }, + "56": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Wáqi’a", + "versesCount": 96, + "translatedName": "El Acontecimiento (El Suceso)", + "slug": "Al-Wáqi’a" + }, + "57": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hadíd", + "versesCount": 29, + "translatedName": "El Hierro", + "slug": "Al-Hadíd" + }, + "58": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Muyádila", + "versesCount": 22, + "translatedName": "La Discutidora (La Pleitista)", + "slug": "Al-Muyádila" + }, + "59": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hashr", + "versesCount": 24, + "translatedName": "El Exilio", + "slug": "Al-Hashr" + }, + "60": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Mumtájana", + "versesCount": 13, + "translatedName": "La Examinada", + "slug": "Al-Mumtájana" + }, + "61": { + "revelationPlace": "madinah", + "transliteratedName": "As-Saff", + "versesCount": 14, + "translatedName": "Las Filas (Las Hileras)", + "slug": "As-Saff" + }, + "62": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Yumua", + "versesCount": 11, + "translatedName": "El Viernes", + "slug": "Al-Yumua" + }, + "63": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Munáfiqún", + "versesCount": 11, + "translatedName": "Los Hipócritas", + "slug": "Al-Munáfiqún" + }, + "64": { + "revelationPlace": "madinah", + "transliteratedName": "At-Tagábon", + "versesCount": 18, + "translatedName": "La Privación", + "slug": "At-Tagábon" + }, + "65": { + "revelationPlace": "madinah", + "transliteratedName": "At-Talák", + "versesCount": 12, + "translatedName": "El Divorcio", + "slug": "At-Talák" + }, + "66": { + "revelationPlace": "madinah", + "transliteratedName": "At-Tahrím", + "versesCount": 12, + "translatedName": "La Prohibición", + "slug": "At-Tahrím" + }, + "67": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Múlk", + "versesCount": 30, + "translatedName": "La Soberanía (El Reino)", + "slug": "Al-Múlk" + }, + "68": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qálam", + "versesCount": 52, + "translatedName": "La Pluma", + "slug": "Al-Qálam" + }, + "69": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Háqqa", + "versesCount": 52, + "translatedName": "La Verdad Ineludible (La Inevitable)", + "slug": "Al-Háqqa" + }, + "70": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ma’áriy", + "versesCount": 44, + "translatedName": "Las Ascensiones", + "slug": "Al-Ma’áriy" + }, + "71": { + "revelationPlace": "makkah", + "transliteratedName": "Núh", + "versesCount": 28, + "translatedName": "Noé", + "slug": "Núh" + }, + "72": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Yinn", + "versesCount": 28, + "translatedName": "Los Genios (Los Jinn)", + "slug": "Al-Yinn" + }, + "73": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Muzámmil", + "versesCount": 20, + "translatedName": "El Arropado (El Envuelto)", + "slug": "Al-Muzámmil" + }, + "74": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mudázir", + "versesCount": 56, + "translatedName": "El Cubierto (El Arropado)", + "slug": "Al-Mudázir" + }, + "75": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qiyáma", + "versesCount": 40, + "translatedName": "La Resurrección", + "slug": "Al-Qiyáma" + }, + "76": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Insán", + "versesCount": 31, + "translatedName": "El Hombre (La Humanidad)", + "slug": "Al-Insán" + }, + "77": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mursalát", + "versesCount": 50, + "translatedName": "Las Enviadas (Mensajeras)", + "slug": "Al-Mursalát" + }, + "78": { + "revelationPlace": "makkah", + "transliteratedName": "An-Nabá", + "versesCount": 40, + "translatedName": "La Noticia (El Gran Anuncio)", + "slug": "An-Nabá" + }, + "79": { + "revelationPlace": "makkah", + "transliteratedName": "An-Názi’at", + "versesCount": 46, + "translatedName": "Las Desgarradoras (Las que Arrancan)", + "slug": "An-Názi’at" + }, + "80": { + "revelationPlace": "makkah", + "transliteratedName": "‘Abasa", + "versesCount": 42, + "translatedName": "(Él) frunció el ceño", + "slug": "‘Abasa" + }, + "81": { + "revelationPlace": "makkah", + "transliteratedName": "At-Takwír", + "versesCount": 29, + "translatedName": "El Arrollamiento", + "slug": "At-Takwír" + }, + "82": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Infitár", + "versesCount": 19, + "translatedName": "La Hendidura", + "slug": "Al-Infitár" + }, + "83": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mutaffifín", + "versesCount": 36, + "translatedName": "Los Defraudadores", + "slug": "Al-Mutaffifín" + }, + "84": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Inshiqák", + "versesCount": 25, + "translatedName": "La Grieta (La Ruptura)", + "slug": "Al-Inshiqák" + }, + "85": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Burúy", + "versesCount": 22, + "translatedName": "Las Constelaciones", + "slug": "Al-Burúy" + }, + "86": { + "revelationPlace": "makkah", + "transliteratedName": "At-Táriq", + "versesCount": 17, + "translatedName": "El Astro Nocturno (El Llamador)", + "slug": "At-Táriq" + }, + "87": { + "revelationPlace": "makkah", + "transliteratedName": "Al-A’lá", + "versesCount": 19, + "translatedName": "El Altísimo", + "slug": "Al-A’lá" + }, + "88": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ghashiya", + "versesCount": 26, + "translatedName": "La que Envuelve (La Cobertura)", + "slug": "Al-Ghashiya" + }, + "89": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fáyr", + "versesCount": 30, + "translatedName": "El Alba", + "slug": "Al-Fáyr" + }, + "90": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Bálad", + "versesCount": 20, + "translatedName": "La Ciudad", + "slug": "Al-Bálad" + }, + "91": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Sháms", + "versesCount": 15, + "translatedName": "El Sol", + "slug": "Ash-Sháms" + }, + "92": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Láyl", + "versesCount": 21, + "translatedName": "La Noche", + "slug": "Al-Láyl" + }, + "93": { + "revelationPlace": "makkah", + "transliteratedName": "Ad-Duhá", + "versesCount": 11, + "translatedName": "La Mañana Clara", + "slug": "Ad-Duhá" + }, + "94": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shárh", + "versesCount": 8, + "translatedName": "La Apertura (El Desahogo)", + "slug": "Ash-Shárh" + }, + "95": { + "revelationPlace": "makkah", + "transliteratedName": "At-Tín", + "versesCount": 8, + "translatedName": "El Higo", + "slug": "At-Tín" + }, + "96": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Álaq", + "versesCount": 19, + "translatedName": "El Coágulo (La Adherencia)", + "slug": "Al-Álaq" + }, + "97": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qádr", + "versesCount": 5, + "translatedName": "El Decreto (La Noche del Destino/Poder)", + "slug": "Al-Qádr" + }, + "98": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Báyyina", + "versesCount": 8, + "translatedName": "La Prueba Evidente", + "slug": "Al-Báyyina" + }, + "99": { + "revelationPlace": "madinah", + "transliteratedName": "Az-Zálzala", + "versesCount": 8, + "translatedName": "El Terremoto (La Sacudida)", + "slug": "Az-Zálzala" + }, + "100": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ádiyát", + "versesCount": 11, + "translatedName": "Los Corceles (Los que galopan)", + "slug": "Al-Ádiyát" + }, + "101": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qári’a", + "versesCount": 11, + "translatedName": "El Gran Acontecimiento (El Golpe)", + "slug": "Al-Qári’a" + }, + "102": { + "revelationPlace": "makkah", + "transliteratedName": "At-Takázur", + "versesCount": 8, + "translatedName": "La Rivalidad por el Aumento Mundano", + "slug": "At-Takázur" + }, + "103": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ásr", + "versesCount": 3, + "translatedName": "El Tiempo", + "slug": "Al-Ásr" + }, + "104": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Húmaza", + "versesCount": 9, + "translatedName": "El Calumniador (El Difamador)", + "slug": "Al-Húmaza" + }, + "105": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fíl", + "versesCount": 5, + "translatedName": "El Elefante", + "slug": "Al-Fíl" + }, + "106": { + "revelationPlace": "makkah", + "transliteratedName": "Quráish", + "versesCount": 4, + "translatedName": "(La tribu de) Quraish", + "slug": "Quráish" + }, + "107": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Máun", + "versesCount": 7, + "translatedName": "La Ayuda Pequeña (La Caridad)", + "slug": "Al-Máun" + }, + "108": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Káuzar", + "versesCount": 3, + "translatedName": "La Abundancia de Bondad", + "slug": "Al-Káuzar" + }, + "109": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Káfirún", + "versesCount": 6, + "translatedName": "Los Incrédulos (Los Negadores)", + "slug": "Al-Káfirún" + }, + "110": { + "revelationPlace": "madinah", + "transliteratedName": "An-Násr", + "versesCount": 3, + "translatedName": "El Socorro", + "slug": "An-Násr" + }, + "111": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Másad", + "versesCount": 5, + "translatedName": "Las Fibras de Palmera", + "slug": "Al-Másad" + }, + "112": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ij'lás", + "versesCount": 4, + "translatedName": "La Sinceridad (La Declaración de la Unidad de Dios)", + "slug": "Al-Ij'lás" + }, + "113": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fálaq", + "versesCount": 5, + "translatedName": "El Alba (El Amanecer)", + "slug": "Al-Fálaq" + }, + "114": { + "revelationPlace": "makkah", + "transliteratedName": "An-Nás", + "versesCount": 6, + "translatedName": "La Gente (La Humanidad)", + "slug": "An-Nás" + } +} diff --git a/data/chapters/sw.json b/data/chapters/sw.json new file mode 100644 index 0000000000..a2bfebf3b5 --- /dev/null +++ b/data/chapters/sw.json @@ -0,0 +1,800 @@ +{ + "1": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fatihah", + "versesCount": 7, + "translatedName": "", + "slug": "Al-Fatihah" + }, + "2": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Baqarah", + "versesCount": 286, + "translatedName": "", + "slug": "Al-Baqarah" + }, + "3": { + "revelationPlace": "madinah", + "transliteratedName": "Aali-Imran", + "versesCount": 200, + "translatedName": "", + "slug": "Aali-Imran" + }, + "4": { + "revelationPlace": "madinah", + "transliteratedName": "An-Nisaa", + "versesCount": 176, + "translatedName": "", + "slug": "An-Nisaa" + }, + "5": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Maidah", + "versesCount": 120, + "translatedName": "", + "slug": "Al-Maidah" + }, + "6": { + "revelationPlace": "makkah", + "transliteratedName": "Al-An-Am", + "versesCount": 165, + "translatedName": "", + "slug": "Al-An-Am" + }, + "7": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Aaraf", + "versesCount": 206, + "translatedName": "", + "slug": "Al-Aaraf" + }, + "8": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Anfal", + "versesCount": 75, + "translatedName": "", + "slug": "Al-Anfal" + }, + "9": { + "revelationPlace": "madinah", + "transliteratedName": "At-Tawba", + "versesCount": 129, + "translatedName": "", + "slug": "At-Tawba" + }, + "10": { + "revelationPlace": "makkah", + "transliteratedName": "Yunus", + "versesCount": 109, + "translatedName": "", + "slug": "Yunus" + }, + "11": { + "revelationPlace": "makkah", + "transliteratedName": "Hud", + "versesCount": 123, + "translatedName": "", + "slug": "Hud" + }, + "12": { + "revelationPlace": "makkah", + "transliteratedName": "Yusuf", + "versesCount": 111, + "translatedName": "", + "slug": "Yusuf" + }, + "13": { + "revelationPlace": "madinah", + "transliteratedName": "Ar-Raad", + "versesCount": 43, + "translatedName": "", + "slug": "Ar-Raad" + }, + "14": { + "revelationPlace": "makkah", + "transliteratedName": "Ibrahim", + "versesCount": 52, + "translatedName": "", + "slug": "Ibrahim" + }, + "15": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Hijr", + "versesCount": 99, + "translatedName": "", + "slug": "Al-Hijr" + }, + "16": { + "revelationPlace": "makkah", + "transliteratedName": "An-Nahl", + "versesCount": 128, + "translatedName": "", + "slug": "An-Nahl" + }, + "17": { + "revelationPlace": "makkah", + "transliteratedName": "Bani Israil", + "versesCount": 111, + "translatedName": "", + "slug": "Bani Israil" + }, + "18": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Kahf", + "versesCount": 110, + "translatedName": "", + "slug": "Al-Kahf" + }, + "19": { + "revelationPlace": "makkah", + "transliteratedName": "Maryam", + "versesCount": 98, + "translatedName": "", + "slug": "Maryam" + }, + "20": { + "revelationPlace": "makkah", + "transliteratedName": "Ta Ha", + "versesCount": 135, + "translatedName": "", + "slug": "Ta Ha" + }, + "21": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Anbiyaa", + "versesCount": 112, + "translatedName": "", + "slug": "Al-Anbiyaa" + }, + "22": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hajj", + "versesCount": 78, + "translatedName": "", + "slug": "Al-Hajj" + }, + "23": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Muuminun", + "versesCount": 118, + "translatedName": "", + "slug": "Al-Muuminun" + }, + "24": { + "revelationPlace": "madinah", + "transliteratedName": "An-Nur", + "versesCount": 64, + "translatedName": "", + "slug": "An-Nur" + }, + "25": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Furqan", + "versesCount": 77, + "translatedName": "", + "slug": "Al-Furqan" + }, + "26": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shuaraa", + "versesCount": 227, + "translatedName": "", + "slug": "Ash-Shuaraa" + }, + "27": { + "revelationPlace": "makkah", + "transliteratedName": "An-Naml", + "versesCount": 93, + "translatedName": "", + "slug": "An-Naml" + }, + "28": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qasas", + "versesCount": 88, + "translatedName": "", + "slug": "Al-Qasas" + }, + "29": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ankabuut", + "versesCount": 69, + "translatedName": "", + "slug": "Al-Ankabuut" + }, + "30": { + "revelationPlace": "makkah", + "transliteratedName": "Ar-Rum", + "versesCount": 60, + "translatedName": "", + "slug": "Ar-Rum" + }, + "31": { + "revelationPlace": "makkah", + "transliteratedName": "Luqman", + "versesCount": 34, + "translatedName": "", + "slug": "Luqman" + }, + "32": { + "revelationPlace": "makkah", + "transliteratedName": "As-Sajdah", + "versesCount": 30, + "translatedName": "", + "slug": "As-Sajdah" + }, + "33": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Ahzab", + "versesCount": 73, + "translatedName": "", + "slug": "Al-Ahzab" + }, + "34": { + "revelationPlace": "makkah", + "transliteratedName": "Saba", + "versesCount": 54, + "translatedName": "", + "slug": "Saba" + }, + "35": { + "revelationPlace": "makkah", + "transliteratedName": "Fatir", + "versesCount": 45, + "translatedName": "", + "slug": "Fatir" + }, + "36": { + "revelationPlace": "makkah", + "transliteratedName": "Yasyn", + "versesCount": 83, + "translatedName": "", + "slug": "Yasyn" + }, + "37": { + "revelationPlace": "makkah", + "transliteratedName": "As-Saaffat", + "versesCount": 182, + "translatedName": "", + "slug": "As-Saaffat" + }, + "38": { + "revelationPlace": "makkah", + "transliteratedName": "Sad", + "versesCount": 88, + "translatedName": "", + "slug": "Sad" + }, + "39": { + "revelationPlace": "makkah", + "transliteratedName": "Az-Zumar", + "versesCount": 75, + "translatedName": "", + "slug": "Az-Zumar" + }, + "40": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Muumin", + "versesCount": 85, + "translatedName": "", + "slug": "Al-Muumin" + }, + "41": { + "revelationPlace": "makkah", + "transliteratedName": "Ha-Mym-Sajdah", + "versesCount": 54, + "translatedName": "", + "slug": "Ha-Mym-Sajdah" + }, + "42": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shuura", + "versesCount": 53, + "translatedName": "", + "slug": "Ash-Shuura" + }, + "43": { + "revelationPlace": "makkah", + "transliteratedName": "Az-Zukhruf", + "versesCount": 89, + "translatedName": "", + "slug": "Az-Zukhruf" + }, + "44": { + "revelationPlace": "makkah", + "transliteratedName": "Ad-Dukhan", + "versesCount": 59, + "translatedName": "", + "slug": "Ad-Dukhan" + }, + "45": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Jathiyah", + "versesCount": 37, + "translatedName": "", + "slug": "Al-Jathiyah" + }, + "46": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ahqaf", + "versesCount": 35, + "translatedName": "", + "slug": "Al-Ahqaf" + }, + "47": { + "revelationPlace": "madinah", + "transliteratedName": "Muhammad", + "versesCount": 38, + "translatedName": "", + "slug": "Muhammad" + }, + "48": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Fat-H", + "versesCount": 29, + "translatedName": "", + "slug": "Al-Fat-H" + }, + "49": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hujurat", + "versesCount": 18, + "translatedName": "", + "slug": "Al-Hujurat" + }, + "50": { + "revelationPlace": "makkah", + "transliteratedName": "Qaf", + "versesCount": 45, + "translatedName": "", + "slug": "Qaf" + }, + "51": { + "revelationPlace": "makkah", + "transliteratedName": "Adh-Dhaariyat", + "versesCount": 60, + "translatedName": "", + "slug": "Adh-Dhaariyat" + }, + "52": { + "revelationPlace": "makkah", + "transliteratedName": "At-Tur", + "versesCount": 49, + "translatedName": "", + "slug": "At-Tur" + }, + "53": { + "revelationPlace": "makkah", + "transliteratedName": "An-Najm", + "versesCount": 62, + "translatedName": "", + "slug": "An-Najm" + }, + "54": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qamar", + "versesCount": 55, + "translatedName": "", + "slug": "Al-Qamar" + }, + "55": { + "revelationPlace": "madinah", + "transliteratedName": "Ar-Rahman", + "versesCount": 78, + "translatedName": "", + "slug": "Ar-Rahman" + }, + "56": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Waqiah", + "versesCount": 96, + "translatedName": "", + "slug": "Al-Waqiah" + }, + "57": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hadyd", + "versesCount": 29, + "translatedName": "", + "slug": "Al-Hadyd" + }, + "58": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Mujadilah", + "versesCount": 22, + "translatedName": "", + "slug": "Al-Mujadilah" + }, + "59": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Hashr", + "versesCount": 24, + "translatedName": "", + "slug": "Al-Hashr" + }, + "60": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Mumtahinah", + "versesCount": 13, + "translatedName": "", + "slug": "Al-Mumtahinah" + }, + "61": { + "revelationPlace": "madinah", + "transliteratedName": "As-Saff", + "versesCount": 14, + "translatedName": "", + "slug": "As-Saff" + }, + "62": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Jumua", + "versesCount": 11, + "translatedName": "", + "slug": "Al-Jumua" + }, + "63": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Munaafiqun", + "versesCount": 11, + "translatedName": "", + "slug": "Al-Munaafiqun" + }, + "64": { + "revelationPlace": "madinah", + "transliteratedName": "At-Taghaabun", + "versesCount": 18, + "translatedName": "", + "slug": "At-Taghaabun" + }, + "65": { + "revelationPlace": "madinah", + "transliteratedName": "At-Talaq", + "versesCount": 12, + "translatedName": "", + "slug": "At-Talaq" + }, + "66": { + "revelationPlace": "madinah", + "transliteratedName": "At-Tahrym", + "versesCount": 12, + "translatedName": "", + "slug": "At-Tahrym" + }, + "67": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mulk", + "versesCount": 30, + "translatedName": "", + "slug": "Al-Mulk" + }, + "68": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qalam", + "versesCount": 52, + "translatedName": "", + "slug": "Al-Qalam" + }, + "69": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Haqqah", + "versesCount": 52, + "translatedName": "", + "slug": "Al-Haqqah" + }, + "70": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ma'arij", + "versesCount": 44, + "translatedName": "", + "slug": "Al-Ma'arij" + }, + "71": { + "revelationPlace": "makkah", + "transliteratedName": "Nuh", + "versesCount": 28, + "translatedName": "", + "slug": "Nuh" + }, + "72": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Jinn", + "versesCount": 28, + "translatedName": "", + "slug": "Al-Jinn" + }, + "73": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Muzzammil", + "versesCount": 20, + "translatedName": "", + "slug": "Al-Muzzammil" + }, + "74": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Muddaththir", + "versesCount": 56, + "translatedName": "", + "slug": "Al-Muddaththir" + }, + "75": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qiyama", + "versesCount": 40, + "translatedName": "", + "slug": "Al-Qiyama" + }, + "76": { + "revelationPlace": "madinah", + "transliteratedName": "Ad-Dahr", + "versesCount": 31, + "translatedName": "", + "slug": "Ad-Dahr" + }, + "77": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mursalat", + "versesCount": 50, + "translatedName": "", + "slug": "Al-Mursalat" + }, + "78": { + "revelationPlace": "makkah", + "transliteratedName": "An-Nabaa", + "versesCount": 40, + "translatedName": "", + "slug": "An-Nabaa" + }, + "79": { + "revelationPlace": "makkah", + "transliteratedName": "An-Naziat", + "versesCount": 46, + "translatedName": "", + "slug": "An-Naziat" + }, + "80": { + "revelationPlace": "makkah", + "transliteratedName": "Abasa", + "versesCount": 42, + "translatedName": "", + "slug": "Abasa" + }, + "81": { + "revelationPlace": "makkah", + "transliteratedName": "At-Takwyr", + "versesCount": 29, + "translatedName": "", + "slug": "At-Takwyr" + }, + "82": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Infitar", + "versesCount": 19, + "translatedName": "", + "slug": "Al-Infitar" + }, + "83": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Mutaffifyn", + "versesCount": 36, + "translatedName": "", + "slug": "Al-Mutaffifyn" + }, + "84": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Inshiqaq", + "versesCount": 25, + "translatedName": "", + "slug": "Al-Inshiqaq" + }, + "85": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Buruj", + "versesCount": 22, + "translatedName": "", + "slug": "Al-Buruj" + }, + "86": { + "revelationPlace": "makkah", + "transliteratedName": "At-Tariq", + "versesCount": 17, + "translatedName": "", + "slug": "At-Tariq" + }, + "87": { + "revelationPlace": "makkah", + "transliteratedName": "Al-A’laa", + "versesCount": 19, + "translatedName": "", + "slug": "Al-A’laa" + }, + "88": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ghashiyah", + "versesCount": 26, + "translatedName": "", + "slug": "Al-Ghashiyah" + }, + "89": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fajr", + "versesCount": 30, + "translatedName": "", + "slug": "Al-Fajr" + }, + "90": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Balad", + "versesCount": 20, + "translatedName": "", + "slug": "Al-Balad" + }, + "91": { + "revelationPlace": "makkah", + "transliteratedName": "Ash-Shams", + "versesCount": 15, + "translatedName": "", + "slug": "Ash-Shams" + }, + "92": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Layl", + "versesCount": 21, + "translatedName": "", + "slug": "Al-Layl" + }, + "93": { + "revelationPlace": "makkah", + "transliteratedName": "Adh-Dhuhaa", + "versesCount": 11, + "translatedName": "", + "slug": "Adh-Dhuhaa" + }, + "94": { + "revelationPlace": "makkah", + "transliteratedName": "Alam-Nashrah", + "versesCount": 8, + "translatedName": "", + "slug": "Alam-Nashrah" + }, + "95": { + "revelationPlace": "makkah", + "transliteratedName": "At-Tyn", + "versesCount": 8, + "translatedName": "", + "slug": "At-Tyn" + }, + "96": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Alaq", + "versesCount": 19, + "translatedName": "", + "slug": "Al-Alaq" + }, + "97": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qadr", + "versesCount": 5, + "translatedName": "", + "slug": "Al-Qadr" + }, + "98": { + "revelationPlace": "madinah", + "transliteratedName": "Al-Bayyinah", + "versesCount": 8, + "translatedName": "", + "slug": "Al-Bayyinah" + }, + "99": { + "revelationPlace": "madinah", + "transliteratedName": "Az-Zilzal", + "versesCount": 8, + "translatedName": "", + "slug": "Az-Zilzal" + }, + "100": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Aadiyat", + "versesCount": 11, + "translatedName": "", + "slug": "Al-Aadiyat" + }, + "101": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Qariah", + "versesCount": 11, + "translatedName": "", + "slug": "Al-Qariah" + }, + "102": { + "revelationPlace": "makkah", + "transliteratedName": "At-Takaathur", + "versesCount": 8, + "translatedName": "", + "slug": "At-Takaathur" + }, + "103": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Asr", + "versesCount": 3, + "translatedName": "", + "slug": "Al-Asr" + }, + "104": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Humazah", + "versesCount": 9, + "translatedName": "", + "slug": "Al-Humazah" + }, + "105": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Fyl", + "versesCount": 5, + "translatedName": "", + "slug": "Al-Fyl" + }, + "106": { + "revelationPlace": "makkah", + "transliteratedName": "Quraysh", + "versesCount": 4, + "translatedName": "", + "slug": "Quraysh" + }, + "107": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Maun", + "versesCount": 7, + "translatedName": "", + "slug": "Al-Maun" + }, + "108": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Kawthar", + "versesCount": 3, + "translatedName": "", + "slug": "Al-Kawthar" + }, + "109": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Kafirun", + "versesCount": 6, + "translatedName": "", + "slug": "Al-Kafirun" + }, + "110": { + "revelationPlace": "madinah", + "transliteratedName": "An-Nasr", + "versesCount": 3, + "translatedName": "", + "slug": "An-Nasr" + }, + "111": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Lahab", + "versesCount": 5, + "translatedName": "", + "slug": "Al-Lahab" + }, + "112": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Ikhlas", + "versesCount": 4, + "translatedName": "", + "slug": "Al-Ikhlas" + }, + "113": { + "revelationPlace": "makkah", + "transliteratedName": "Al-Falaq", + "versesCount": 5, + "translatedName": "", + "slug": "Al-Falaq" + }, + "114": { + "revelationPlace": "makkah", + "transliteratedName": "An-Naas", + "versesCount": 6, + "translatedName": "", + "slug": "An-Naas" + } +} diff --git a/format-locales.sh b/format-locales.sh new file mode 100644 index 0000000000..6693074a72 --- /dev/null +++ b/format-locales.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Default file name if not provided +DEFAULT_FILE="about.json" + +# Path to locales directory +LOCALES_DIR="./locales" + +# Get the file name from command line argument or use default +FILE_NAME=${1:-$DEFAULT_FILE} + +echo "Using file name: $FILE_NAME" + +# Find all language directories +LANG_DIRS=$(find "$LOCALES_DIR" -mindepth 1 -maxdepth 1 -type d) + +for lang_dir in $LANG_DIRS; do + file_path="$lang_dir/$FILE_NAME" + + # Check if the file exists + if [ -f "$file_path" ]; then + echo "Processing $file_path" + + # Format the file using jq + jq . "$file_path" > "$file_path.tmp" && mv "$file_path.tmp" "$file_path" + + # Stage the file with Git + git add "$file_path" + echo "Formatted and staged $file_path" + else + echo "Skipping $file_path - file does not exist" + fi +done + +echo "All $FILE_NAME files have been formatted and staged" diff --git a/i18n.json b/i18n.json index 9a31e2ab3e..17ee6cf663 100644 --- a/i18n.json +++ b/i18n.json @@ -15,12 +15,14 @@ "tr", "ur", "zh", - "ms" + "ms", + "es", + "sw" ], "defaultLocale": "en", "pages": { - "*": ["common", "error", "radio", "quick-links", "onboarding"], - "/": ["home", "radio", "collection", "reading-goal", "reciter"], + "*": ["common", "error", "radio", "quick-links", "onboarding", "login"], + "/": ["home", "radio", "collection", "reading-goal", "reciter", "learn"], "/reading-goal": ["reading-goal", "reciter"], "/my-learning-plans": ["learn"], "/learning-plans": ["learn"], @@ -29,6 +31,7 @@ "/reading-goal/progress": ["reading-goal", "reading-progress"], "/[chapterId]": ["quran-reader", "reading-goal", "notes", "chapter", "surah-info"], "/[chapterId]/reflections": ["quran-reader", "reading-goal", "notes"], + "/[chapterId]/lessons": ["quran-reader", "reading-goal", "notes"], "/[chapterId]/[verseId]": ["quran-reader", "reading-goal", "notes"], "/[chapterId]/[verseId]/tafsirs": ["quran-reader", "reading-goal", "notes"], "/page/[pageId]": ["quran-reader", "reading-goal", "notes"], @@ -54,6 +57,8 @@ "/reciters": ["reciter", "home"], "/profile": ["home", "profile", "collection", "quran-reader"], "/login": ["login"], + "/forgot-password": ["login"], + "/reset-password": ["login"], "/about-the-quran": ["about-quran"], "/notes-and-reflections": ["notes"], "/ramadan": ["ramadan-activities"], diff --git a/locales/ar/about.json b/locales/ar/about.json index 4a9ee6c176..1c84124f2f 100644 --- a/locales/ar/about.json +++ b/locales/ar/about.json @@ -1,14 +1,42 @@ { "credits": { - "desc": "لم يكن هذا المشروع ممكنًا بدون العديد من المكتبات والمشاريع مفتوحة المصدر التي استخدمناها:", - "lokalize": "<0>Lokalize: نظام ترجمة بمساعدة الكمبيوتر يركز على الإنتاجية وضمان الجودة ويوفر سير عمل سلس للترجمة.", - "quran-align": "<0>Collin Fair: أداة لإنتاج تجزئة دقيقة للكلمات للتلاوات القرآنية المسجلة.", - "quran-complex": "<0>مجمع القرآن: يعتبر مجمع الملك فهد لطباعة المصحف الشريف رائداً في خدمة القرآن الكريم وعلومه وترجمة معانيه والحفاظ على النص القرآني من التشويه، وذلك من خلال الاستخدام الأمثل للتقنيات المتقدمة في مجالات الطباعة والتسجيلات الصوتية والنشر الإلكتروني والتطبيقات الرقمية.", - "quran-enc": "<0>QuranEnc: بوابة تقدم ترجمات مجانية وموثوقة لمعاني وتفاسير القرآن الكريم بالعديد من لغات العالم.", - "tanzil": "<0>Tanzil: مشروع قرآني دولي يهدف إلى توفير نص قرآني دقيق وموثق للغاية.", - "title": "الشكر موصول إلى", - "vercel": "<0>Vercel: عبارة عن نظام أساسي للنشر والتعاون لمطوري الواجهة الأمامية والذي يضع مطور الواجهة الأمامية أولاً، ويمنحهم أدوات شاملة لبناء مواقع ويب وتطبيقات عالية الأداء.", - "zekr": "<0>Zekr: منصة مفتوحة لدراسة القرآن الكريم لتصفح القرآن والبحث فيه" - }, - "main-description": "تأسس Quran.com في عام 1995. يهدف الموقع إلى تسهيل قراءة القرآن ودراسته وتعلمه. المشروع مفتوح المصدر، وهو مبني بالتعاون بين أعضاء الفريق الأساسيين وفريق <0>Tarteel." + "desc": "ونحن نعرب عن امتناننا لجميع الذين دعموا وساهموا في هذا المشروع، مما ساعد في جعل القرآن الكريم في متناول الملايين في جميع أنحاء العالم.", + "lokalize": "<0>Lokalize: نظام ترجمة بمساعدة الكمبيوتر يركز على الإنتاجية وضمان الجودة ويوفر سير عمل توطين سلس.", + "quran-align": "<0>كولين فير: أداة لإنتاج تقسيمات دقيقة للكلمات من التلاوة القرآنية المسجلة.", + "quran-complex": "<0>مجمع القرآن الكريم: مجمع الملك فهد لطباعة المصحف الشريف رائد في خدمة القرآن الكريم وعلومه، وترجمة معانيه، وحماية النص القرآني من التحريف، من خلال الاستخدام الأمثل للتقنيات المتقدمة في مجال الطباعة والتسجيلات الصوتية والنشر الإلكتروني والتطبيقات الرقمية.", + "quran-enc": "<0>QuranEnc: بوابة تحتوي على ترجمات مجانية وموثوقة لمعاني وتفاسير القرآن الكريم بالعديد من لغات العالم.", + "tanzil": "<0>تنزيل: مشروع قرآني دولي يهدف إلى توفير نص قرآني دقيق للغاية.", + "tarteel": "<0>ترتيل: تطبيق لحفظ القرآن الكريم باستخدام الذكاء الاصطناعي. صُمم هذا التطبيق لمساعدتك على الحفظ بذكاء، سواء كنت تبحث عن آية أو تتابع تقدمك أو تتابع تلاوتك.", + "title": "الاعتمادات", + "vercel": "<0>Vercel: عبارة عن منصة نشر وتعاون لمطوري الواجهة الأمامية والتي تضع مطور الواجهة الأمامية في المقام الأول، مما يمنحهم أدوات شاملة لبناء مواقع الويب والتطبيقات عالية الأداء.", + "zekr": "<0>ذكر: أداة مفتوحة المصدر لدراسة القرآن الكريم وتصفحه والبحث فيه" + }, + "global-effort": { + "desc": "يعتمد ملايين الأشخاص من مختلف أنحاء العالم على موقع Quran.com باعتباره المصدر الرقمي الأساسي للقرآن الكريم. وسواء كانوا يأتون للتلاوة أو التأمل أو الحفظ أو الدراسة، فإنهم يشتركون في هدف مشترك: الرغبة الصادقة في التواصل مع كلمات الله. \\n مع استمرارنا في النمو، نظل ملتزمين بضمان بقاء موقع Quran.com مساحة موثوقة وسهلة الوصول ومصممة بشكل جميل لأي شخص يسعى إلى التفاعل مع القرآن الكريم.", + "title": "جهد عالمي" + }, + "key-features": { + "desc": "تم تصميم موقع Quran.com لدعم كل مرحلة من مراحل التفاعل مع القرآن الكريم، من القراءة والحفظ إلى الدراسة والتأمل. وتتضمن ميزاتنا ما يلي:", + "features": [ + "واجهة قرآنية سهلة الاستخدام - تجربة قراءة نظيفة وبديهية على أي جهاز.", + "ترجمات متعددة وتفسير – إمكانية الوصول إلى الترجمات بلغات متعددة، بالإضافة إلى التفسير.", + "التلاوات الصوتية – استمع إلى تلاوات عالية الجودة من القراء المشهورين عالميًا، مع القدرة على المتابعة كلمة بكلمة.", + "البحث والتنقل المتقدم - ابحث عن الآيات بشكل فوري حسب الموضوع أو الكلمات الرئيسية في جميع أنحاء القرآن الكريم.", + "وضع علامات مرجعية على الآيات والملاحظات عليها – احفظ الآيات واكتب تأملات شخصية للرجوع إليها لاحقًا.", + "تكامل QuranReflect – التفاعل مع المجتمع العالمي من خلال التأملات والرؤى المشتركة بين العلماء والأفراد.", + "تتبع تقدم القراءة والأهداف – تتبع أهدافك اليومية وسجل القراءة", + "واجهات برمجة التطبيقات للمطورين - وصول مجاني إلى المحتوى والميزات اللازمة لتشغيل التطبيقات الإسلامية والبحث والتطوير.", + "وأكثر من ذلك بكثير ولله الحمد." + ], + "title": "الميزات والعروض الرئيسية" + }, + "main-description": "منذ تأسيسه في عام 1995، التزم موقع Quran.com بجعل القرآن الكريم متاحًا للجميع بطريقة واضحة وأصيلة وسهلة التعامل. كل يوم، يلجأ ملايين الأشخاص في جميع أنحاء العالم إلى موقع Quran.com لقراءة القرآن الكريم والاستماع إليه ودراسته والتأمل فيه - سواء كانوا طلابًا مدى الحياة أو علماء أو في بداية رحلتهم.", + "our-mission": { + "desc": "إن القرآن الكريم من أجل قراءته وفهمه والتأمل فيه. وتتلخص مهمتنا في إزالة الحواجز التي تحول دون الوصول إليه وتمكين الأفراد والمجتمعات من خلال توفير تجربة قرآنية موثوقة ومصممة بشكل جيد ومثمرة للغاية. ونهدف إلى أن نكون مصدرًا موثوقًا به لأي شخص يسعى إلى التفاعل مع القرآن الكريم، مسترشدين بمبادئ الدقة والوضوح والإخلاص.", + "title": "مهمتنا" + }, + "who-we-are": { + "desc": "إن موقع Quran.com هو وقف تم إنشاؤه كأمانة عامة لضمان بقاء القرآن الكريم في متناول الجميع، مجانًا وبدون أي مصالح تجارية. ويديره مؤسسة Quran.Foundation، وهي منظمة غير ربحية 501(c)(3)، والتي تدعم وتطور موقع Quran.com كجزء من مهمتها لتوفير مصادر قرآنية عالية الجودة وأصيلة للعالم. إن التزامنا هو خدمة القرآن الكريم وقرائه بتميز وإخلاص ومسؤولية.", + "title": "من نحن" + } } diff --git a/locales/ar/apps.json b/locales/ar/apps.json index 108d935a17..9fa6a967cb 100644 --- a/locales/ar/apps.json +++ b/locales/ar/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "من قبل المطورين الأساسيين لموقع Quran.com ، يأتي تطبيق مصحف iOS و Android الجميل والخالي من الإعلانات. أصبح من السهل الآن قراءة القرآن أثناء التنقل وحفظه والاستماع إلى القراء المفضلين لديك.", - "tarteel-desc": "ترتيل هو أول تطبيق قرآني يستخدم أدوات الذكاء الاصطناعي للتفاعل مع تلاوتك وإبراز الأخطاء. رفيق قرآني يقوده الصوت في راحة يديك، يعمل ترتيل بشكل حدسي لمساعدتك على قراءة القرآن وتلاوته وحفظه وفهمه بثقة! <0><0> تفخر ترتيل بكونها مطوراً أساسياً لموقع Quran.com بالإضافة إلى كونها عضواً في مجلس إدارته." + "quran-desc": "من قبل المطورين الأساسيين لموقع Quran.com ، يأتي تطبيق مصحف iOS و Android الجميل والخالي من الإعلانات. أصبح من السهل الآن قراءة القرآن أثناء التنقل وحفظه والاستماع إلى القراء المفضلين لديك." } diff --git a/locales/ar/common.json b/locales/ar/common.json index be00ce6d0d..8bfd45bd5b 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "التنقلات", "no-nav-results": "لا توجد نتائج تنقل", - "placeholder": "ماذا تريد أن تقرأ؟", - "powered-by": "البحث الصوتي بدعم من Tarteel.ai", + "placeholder": "ابحث في القرآن الكريم...", "recent-navigations": "التنقلات الأخيرة", "search-by-voice": "البحث عن طريق الصوت", "try-navigating": "حاول الانتقال إلى" @@ -122,9 +121,11 @@ } }, "continue": "أكمل", + "contribute-to-our-mission": "ساهم في مهمتنا", "copied": "نُسِخ", "copied-to-clipboard": "نُسِخَ إلى الحافظة", "copy": "نَسْخ", + "copylink": "نسخ الوصلة", "counter": { "decrease": "انقُصْ", "increase": "زِدْ" @@ -134,6 +135,7 @@ "developers": "المطورون", "display": "عرض", "donate": "تبرع", + "donate-now": "تبرع الآن", "donate_monthly": "تبرع شهريا", "donate_once": "تبرع مرة واحدة", "edit": "تعديل", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*الحد الأقصى لعدد الآيات {{maxNumberOfVerses}} آية", "ranges-wrong-order": "الآية الافتتاحية يجب أن تكون قبل الآية الختامية." }, + "errors": { + "account-banned": "عذرا، تم حظر حسابك. تواصل مع مؤسسة القرآن الكريم", + "badRequest": "*طلب غير صالح", + "banned": "*عذرا، حسابك محظور. تواصل مع مؤسسة القرآن الكريم", + "confirm": "*تأكيد كلمة المرور لا تتطابق مع كلمة المرور", + "email": "*تنسيق البريد الإلكتروني غير صالح!", + "exactLength": "*يجب أن تكون القيمة بالطول الدقيق", + "expiredToken": "*هذه الرمزية انتهت صلاحيتها", + "forgot-password-failed": "فشل إرسال رسالة البريد الإلكتروني لإعادة تعيين كلمة المرور. يرجى المحاولة مرة أخرى.", + "immutable": "*لا يمكن تغيير هذه القيمة", + "invalid": "*هذا {{fieldName}} غير صالح", + "invalidEmailOrPassword": "*البريد الإلكتروني أو كلمة المرور غير صالحة", + "max": "* يجب أن يكون {{fieldName}} أقل من أو يساوي {{max}} رقمًا", + "min": "* يجب أن يكون {{fieldName}} أكبر من أو يساوي {{min}} رقمًا", + "name": "* يجب أن يتكون {{fieldName}} من أحرف وأرقام فقط", + "notFound": "*لم يتم العثور عليه", + "required": "* {{fieldName}} مفقود!", + "reset-password-failed": "فشلت عملية إعادة تعيين كلمة المرور. يرجى المحاولة مرة أخرى.", + "signin-failed": "فشل تسجيل الدخول. يرجى المحاولة مرة أخرى.", + "signup-failed": "فشل التسجيل. يرجى المحاولة مرة أخرى.", + "taken": "* {{fieldName}} موجود بالفعل!", + "usedToken": "*تم استخدام هذا الرمز بالفعل", + "username": "* {{fieldName}} يقبل الشرطة السفلية والأحرف فقط", + "verification-code-invalid": "هذا رمز التحقق غير صالح", + "verification-code-length": "يجب أن يكون رمز التحقق مكونًا {{length}} رقمًا", + "verification-failed": "فشلت عملية التحقق. يرجى المحاولة مرة أخرى.", + "verification-resend-failed": "فشل إعادة إرسال رمز التحقق" + }, "exciting-updates": "تحديثات رائعة", "feedback": "التعليقات", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "حجم خط الترجمة" }, "footer": { - "description": "موقع Quran.com هو صدقة جارية. نأمل أن نسهل على الجميع قراءة القرآن الكريم ودراسته وتعلمه. القرآن الكريم له أسماء عديدة منها القرآن الكريم والكتاب والفرقان والموعظة والذكر والنور.", + "description": "يعد موقع Quran.com منصة موثوقة يستخدمها ملايين الأشخاص حول العالم لقراءة القرآن الكريم والبحث فيه والاستماع إليه والتأمل فيه بعدة لغات. كما يوفر الموقع ترجمات وتفسيرات وتلاوات وترجمة كلمة بكلمة وأدوات للدراسة العميقة، مما يجعل القرآن الكريم في متناول الجميع.

بصفته مؤسسة صدقة جارية، يكرس موقع Quran.com نفسه لمساعدة الناس على التواصل بعمق مع القرآن الكريم. بدعم من مؤسسة Quran.Foundation، وهي منظمة غير ربحية 501(c)(3)، يواصل موقع Quran.com النمو كمورد مجاني وقيم للجميع، الحمد لله\"", "hiring": "نحن نوظف! انضم إلى فريق مؤسسة القرآن وساهم في مهمتنا. تقدم بطلبك الآن! ", "rights": "كل الحقوق محفوظة", - "title": "اقرأ وادرس وتعلم القرآن الكريم." + "title": "اقرأ واستمع وابحث وتدبر في القرآن الكريم" }, "form": { "body": "المحتوي", "code": "رمز التحقق", + "confirm-password": "تأكيد كلمة المرور", "email": "البريد الإلكتروني", "firstName": "الاسم الأول", "lastName": "الاسم الأخير", - "title": "عنوان" + "password": "كلمة المرور", + "title": "عنوان", + "username": "اسم المستخدم", + "verification-code": "رمز التحقق" }, "from": "من", + "fundraising-share-title": "شارك في جمع التبرعات لصالح موقع Quran.com", "fundraising-sticky-banner": { "cta": "تبرع", "title": "تبرع في أفضل الأيام!" @@ -217,6 +252,7 @@ "learn-more": "تعرف على المزيد", "learning-plans": "خطط التعلم", "less": "أقل", + "lessons": "الدروس", "loading": "التحميل جارٍ", "login": "تسجيل الدخول", "logout": "تسجيل الخروج", @@ -250,6 +286,7 @@ "off": "إيقاف", "oldest": "الأقدم", "on": "تشغيل", + "our-projects": "مشاريعنا", "page": "صفحة", "pages": "الصفحات", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} من {{totalNumberOfResults}} نتيجة للبحث", @@ -272,6 +309,7 @@ "privacy": "الخصوصية", "product-updates": "تحديثات المنتج", "profile": "الملف الشخصي", + "projects-desc": "المشاريع غير الربحية التي تملكها أو تديرها أو ترعاها مؤسسة القرآن الكريم", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "راديو القرآن", @@ -287,6 +325,7 @@ "reciters": "القراء", "reflect": "تدبر", "reflections": "تدبرات", + "reflections-and-lessons": "تأملات ودروس", "remove": "إزالة", "rename": "إعادة تسمية", "retry": "أعد المحاولة", @@ -296,10 +335,12 @@ "save-to-collection": "حفظ في المجموعة", "search-for": "ابحث عن '{{searchQuery}}'", "search-results": "نتائج البحث: {{count}}", + "search-results-no-count": "نتائج البحث", "search": { "filters": "تصفية البحث", "hint": "حاول البحث عن", "jump-to": "انتقل إلى", + "more-results": "المزيد من النتائج", "no-results": "لم يتم العثور على نتائج", "no-results-suggestion": "لم نتمكن من العثور على أي نتائج بحث مطابقة لـ \"{{searchQuery}}\". حاول البحث عن كلمة مختلفة.", "popular": "عمليات البحث الشائعة", @@ -340,8 +381,10 @@ "search-juz": "ابحث عن جزء", "search-page": "ابحث عن صفحة", "search-surah": "ابحث عن سورة", + "search-verse": "بحث الآية", "try-navigating-with": "نصيحة: حاول التنقل باستخدام" }, + "sign-in": "تسجيل الدخول", "sitemap": "خريطة الموقع", "sort": { "ascending": "تصاعديًا", @@ -362,10 +405,6 @@ "tafsirs-desc": "اقرأ العديد من التفسيرات للآية {{ayahNumber}} من سورة {{surahName}} لعلماء تفسير موثوقين", "title": "التفسير" }, - "tarteel": { - "app": "تطبيق ترتيل", - "name": "ترتيل" - }, "terms-and-conditions": "الشروط والأحكام", "theme": "السمة", "themes": { @@ -400,13 +439,13 @@ "view": "عرض", "voice": { "ask-permission": "الرجاء السماح باستخدام الميكروفون لبدء استخدام البحث الصوتي", - "error": "حصل خطأ. الرجاء المحاولة مرة اخرى لاحقاً. أو قم بتنزيل", - "no-permission": "يبدو أنك لم تعُطِ الإذن لاستخدام الميكروفون في هذه الصفحة. يرجى السماح باستخدام الميكروفون والمحاولة مرة أخرى أو تنزيل", - "not-supported": "يبدو أن المتصفح الخاص بك لا يدعم الميكروفون. الرجاء تجربة متصفح مختلف أو تنزيل", + "error": "لقد حدث خطأ، يرجى المحاولة مرة أخرى لاحقًا.", + "no-permission": "يبدو أنك لم تقم بتمكين أذونات الميكروفون. يرجى تمكين أذونات الميكروفون والمحاولة مرة أخرى.", + "not-supported": "يبدو أن متصفحك لا يدعم الميكروفون. يرجى تجربة متصفح آخر.", "suggest": "يرجى البدء في التلاوة وستظهر آياتك.", "suggest-subtitle": "اقرأ أي آية باللغة العربية، وستظهر الآية", "suggest-title": "اقرأ الآن", - "voice-search-powered-by": "البحث الصوتي مدعوم من" + "voice-search-powered-by": "البحث الصوتي مدعوم بواسطة" }, "wbw": "كلمة بكلمة", "wbw-lang-summary": "مصدر الترجمة كلمة بكلمة: {{source}} . هذا المصدر مستقل عن اختيار ترجمة الآية.", diff --git a/locales/ar/developers.json b/locales/ar/developers.json index 92036e0748..dc56231118 100644 --- a/locales/ar/developers.json +++ b/locales/ar/developers.json @@ -15,6 +15,5 @@ "q-next": "<0>الواجهة الأمامية ل Quran.com - مكتوبة باستخدام Next.js.", "q-v2": "<0>قرآن.كوم - مكتوب بلغة روبي أون ريلز." }, - "sub-main-desc": "نحن فريق من المطورين والمصممين ومديري المنتجات والمفكرين نعمل على موقع Quran.com بجانب مساهمة فريق <0> ترتيل لتقديم أفضل تجربة قرآنية على الانترنت. الحمد لله لقد أنعم الله علينا بالعمل لدى بعض الشركات الكبيرة حول العالم - ونشعر أن هذا هو أقل ما يمكننا فعله لمساعدة أمتنا على المضي قدمًا في تعلم ودراسة دينهم. إن العمل على موقع Quran.com مرضي للغاية ونسأل الله أن يجزينا (ويجزيكم) خيرًا على جهودنا.", "thanks": "نحن نتطلع إلى مساهمتك!" } diff --git a/locales/ar/home.json b/locales/ar/home.json index 0c25f3dd12..b83da81849 100644 --- a/locales/ar/home.json +++ b/locales/ar/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "حقق أهدافك القرآنية", + "begin": "يبدأ", + "chapters-and-verses": "الفصول والآيات", + "continue-read": "متابعة القراءة", + "explore-topics": "استكشاف المواضيع", + "first-time-reading": "هل أنت جديد على القرآن الكريم؟ ابدأ من هنا ", + "know-someone": "تنمو معنا في رمضان ", + "learning-plan": "خطط التعلم", + "listen-to-radio": "استمع إلى راديو القرآن الكريم", + "my-quran": "قرآني", + "navigate-quran": "تصفح القرآن الكريم", "no-bookmarks": "ليس لديك أي إشارات مرجعية حتى الآن", "no-recently-read": "ليس لديك أي جلسات قراءة بعد", "noble-quran": "القرآن الكريم", + "popular": "شائع", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "رحلة نمو القرآن" }, - "ramadan-activities-cta": " اتبع التقويم القرآني العالمي <\/b> للحصول على قراءات أسبوعية، وبودكاست ملهمة، ودعوة للتأمل! <\/link>", + "qr-community": "اقرأ الآيات والتأملات المميزة لهذا اليوم", + "ramadan-activities-cta": " اتبع التقويم القرآني العالمي للحصول على قراءات أسبوعية، وبودكاست ملهمة، ودعوة للتأمل! ", + "ramadan": { + "header": "أدوات لتعميق علاقتك بالقرآن الكريم", + "title": "هل أنت مستعد لرمضان؟" + }, "read-juz": "اقرأ الجزء", "recently-read": "قرئ مؤخرًا", - "revelation-order-disclaimer": "يُظهر هذا المنظر الترتيب الزمني للسور في القرآن بناءً على وقت نزولها على النبي محمد ﷺ <\/hover> . التسلسل الزمني هو موضوع رأي العلماء وبعض السور نزلت مجزئة في أوقات مختلفة. الترتيب هنا يعتمد على عمل Tanzil.net <\/link> . [ملحوظة: ترتيب المصحف المجمّع من سورة الفاتحة إلى سورة الناس محل إجماع.]", + "revelation-order-disclaimer": "يُظهر هذا المنظر الترتيب الزمني للسور في القرآن بناءً على وقت نزولها على النبي محمد . التسلسل الزمني هو موضوع رأي العلماء وبعض السور نزلت مجزئة في أوقات مختلفة. الترتيب هنا يعتمد على عمل Tanzil.net . [ملحوظة: ترتيب المصحف المجمّع من سورة الفاتحة إلى سورة الناس محل إجماع.]", + "see-more-learning-plans": "شاهد المزيد", + "set-custom-goal": "حدد هدفا", + "share-quran": { + "description": "ساعد في نشر القرآن الكريم للمتعلمين الجدد", + "title": "شارك القرآن!" + }, + "start-read": "ابدأ القراءة", + "stay-consistent": "تتبع السلاسل، وإنشاء أهداف مخصصة، والبقاء على اتساق", "tab": { "bookmarks": "إشارات مرجعية", "popular": "شائع" @@ -38,4 +63,4 @@ "welcome": { "title": "إنه شهر القرآن! ساعد الملايين من المستخدمين في الوصول إلى هدى القرآن." } -} \ No newline at end of file +} diff --git a/locales/ar/learn.json b/locales/ar/learn.json index ed31ef8724..831444e13b 100644 --- a/locales/ar/learn.json +++ b/locales/ar/learn.json @@ -24,7 +24,9 @@ "feedback-success": "شكرا لك على تعليقاتك!", "your-feedback": "تعليقاتك" }, + "help-about-reflection": "مساعدة حول ميزة الانعكاس", "learn-duration": "المدة", + "learn-more": "يتعلم أكثر", "learning-plan-material": "مواد خطة التعلم", "learning-plan-meta-desc": "ستساعدك خطة التعلم هذه على تغيير الطريقة التي تتعامل بها مع القرآن، ابدأ رحلتك اليوم!", "learning-plans-desc": "عزز معرفتك بدروس سهلة المتابعة تساعدك على الارتقاء في رحلتك مع القرآن.

ابدأ خطة التعلم اليوم! يتم متابعة تقدمك حتى تصل إلى خط النهاية.", @@ -34,9 +36,12 @@ "next-lesson": "الدرس التالي", "not-enrolled": "أنت غير مسجل في خطة التعلم حتى الآن.", "prev-lesson": "الدرس السابق", + "reflection-description-1": "عند النقر على \"إضافة تأمل\" سيتم نقلك إلى QuranReflect، وهي منصة لمشاركة التأملات الشخصية حول القرآن الكريم. وعلى عكس التفسير العلمي، فإن التأملات هي رؤى وتجارب شخصية تتعلق بالآيات.", + "reflection-description-2": "إذا قمت بالنشر علنًا، فسيتم مراجعة تأملاتك بواسطة فريق الإشراف وستصبح مرئية لمجتمع QuranReflect.", "start-learning": "ابدا بالتعلم", "tabs": { "main": "التفاصيل الرئيسة", "syllabus": "المنهج" - } + }, + "what-happens-when-you-click-add-reflection": "ماذا يحدث عند النقر فوق \"إضافة انعكاس\"؟" } diff --git a/locales/ar/login.json b/locales/ar/login.json index 6866e50502..bb2c38960f 100644 --- a/locales/ar/login.json +++ b/locales/ar/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "بانتظار التأكيد", + "back": "خلف", + "back-to-login": "العودة إلى تسجيل الدخول", + "check-email-title": "تحقق من البريد الإلكتروني لإكمال التسجيل", + "confirm": "يتأكد", + "confirm-new-password-placeholder": "تأكيد كلمة المرور الجديدة", + "confirm-password-placeholder": "تأكيد كلمة المرور", + "continue": "يكمل", "continue-apple": "ادخل عبر أبل", "continue-email": "ادخل عبر البريد الإلكتروني", "continue-facebook": "ادخل عبر فيسبوك", "continue-google": "ادخل عبر جوجل", "email-placeholder": "عنوان البريد الإلكتروني", + "error": { + "email-required": "البريد الإلكتروني مفقود!", + "invalid-credentials": "البريد الإلكتروني أو كلمة المرور غير صالحة", + "invalid-email": "تنسيق البريد الإلكتروني غير صالح!", + "login-failed": "فشل تسجيل الدخول. يرجى المحاولة مرة أخرى.", + "password-required": "كلمة المرور مفقودة!" + }, + "errors": { + "account-banned": "عذرا، حسابك محظور. تواصل مع مؤسسة القرآن الكريم", + "badRequest": "*طلب غير صالح", + "banned": "*عذرا، حسابك محظور. تواصل مع مؤسسة القرآن الكريم", + "confirm": "*تأكيد كلمة المرور لا تتطابق مع كلمة المرور", + "email": "*تنسيق البريد الإلكتروني غير صالح!", + "exactLength": "*يجب أن تكون القيمة بالطول الدقيق", + "expiredToken": "*هذه الرمزية انتهت صلاحيتها", + "forgot-password-failed": "فشل إرسال رسالة البريد الإلكتروني لإعادة تعيين كلمة المرور. يرجى المحاولة مرة أخرى.", + "immutable": "*لا يمكن تغيير هذه القيمة", + "invalid": "*هذا {{fieldName}} غير صالح", + "invalidEmailOrPassword": "*البريد الإلكتروني أو كلمة المرور غير صالحة", + "max": "* يجب أن يكون {{fieldName}} أقل من أو يساوي {{max}} رقمًا", + "min": "* يجب أن يكون {{fieldName}} أكبر من أو يساوي {{min}} رقمًا", + "name": "* يجب أن يتكون {{fieldName}} من أحرف وأرقام فقط", + "notFound": "*لم يتم العثور عليه", + "required": "* {{fieldName}} مفقود!", + "reset-password-failed": "فشلت عملية إعادة تعيين كلمة المرور. يرجى المحاولة مرة أخرى.", + "signin-failed": "فشل تسجيل الدخول. يرجى المحاولة مرة أخرى.", + "signup-failed": "فشل التسجيل. يرجى المحاولة مرة أخرى.", + "taken": "* {{fieldName}} موجود بالفعل!", + "usedToken": "*تم استخدام هذا الرمز بالفعل", + "username": "* {{fieldName}} يقبل الشرطة السفلية والأحرف فقط", + "verification-code-invalid": "هذا رمز التحقق غير صالح", + "verification-code-length": "يجب أن يكون رمز التحقق مكونًا {{length}} رقمًا", + "verification-failed": "فشلت عملية التحقق. يرجى المحاولة مرة أخرى.", + "verification-resend-failed": "فشل إعادة إرسال رمز التحقق" + }, "feature-1": "تتبع أهدافك", "feature-2": "حافظ على استمرارية القراءة", "feature-3": "إنشاء مجموعات", "feature-4": "مزامنة بياناتك عبر المتصفحات", "feature-5": "و اكثر!", "feature-6": " جديد! ملاحظات وتدبرات", + "first-name-placeholder": "الاسم الأول", + "forgot-password": "هل نسيت كلمة السر", + "forgot-password-description": "أدخل عنوان بريدك الإلكتروني وسنرسل إليك تعليمات لإعادة تعيين كلمة المرور الخاصة بك.", + "forgot-password-success": "تم إرسال رسالة البريد الإلكتروني لإعادة تعيين كلمة المرور! يرجى التحقق من صندوق الوارد الخاص بك.", + "forgot-password-title": "هل نسيت كلمة السر؟", + "last-name-placeholder": "اسم العائلة", "login-cta": "تسجيل الدخول أو الاشتراك الآن:", "login-error": { "AuthenticationError": "المصادقة فشلت. الرجاء معاودة المحاولة في وقت لاحق", + "BannedUserError": "عذرا، تم حظر حسابك. تواصل مع مؤسسة القرآن الكريم.", "TokenExpiredError": "لقد تم تسجيل خروجك، يرجى تسجيل الدخول مرة أخرى." }, "login-title": "تسجيل الدخول إلى موقع Quran.com", + "new-password-placeholder": "كلمة المرور الجديدة", "other-options": "خيارات تسجيل الدخول الأخرى", + "password-placeholder": "كلمة المرور", + "password-reset-success": "تم إعادة تعيين كلمة المرور بنجاح!", + "password-rules": { + "lowercase": "حرف صغير واحد على الأقل", + "max-length": "الحد الأقصى 20 حرفًا", + "min-length": "الحد الأدنى 8 أحرف", + "number": "على الأقل رقم واحد", + "special": "على الأقل حرف خاص واحد (!@#$%^&*_-)", + "uppercase": "حرف كبير واحد على الأقل" + }, "privacy-policy": "حماية خصوصيتك هي أولويتنا - من خلال التسجيل، فإنك توافق على سياسة الخصوصية و الشروط والأحكام الخاصة بنا.", - "verify-code": "تحقق من أن رمز الحماية المقدم يطابق النص التالي:" + "quran-text": "القرآن الكريم", + "quran-title": "قرآن.كوم", + "reflect-feature-1": "تأمل في القرآن الكريم", + "reflect-feature-2": "انضم إلى المجموعات", + "reflect-feature-3": "التفاعل مع الآخرين", + "reflect-feature-4": "و اكثر!", + "reset-password": "إعادة تعيين كلمة المرور", + "reset-password-success": "تم إعادة تعيين كلمة المرور بنجاح!", + "set-new-password": "تعيين كلمة مرور جديدة", + "sign-in": "تسجيل الدخول", + "sign-in-or-sign-up": "تسجيل الدخول أو التسجيل", + "sign-up": "اشتراك", + "unified-registration-1": "التسجيل الموحد لـ ", + "unified-registration-2": "مؤسسة القرآن الكريم", + "unified-registration-3": "سيكون لديك إمكانية الوصول إلى المواقع التالية ", + "unified-registration-4": "من خلال تفاصيل تسجيل الدخول الخاصة بك.", + "username-placeholder": "اسم المستخدم", + "verification-code-instruction": "الرجاء إدخال الرمز الموجود في البريد الإلكتروني لإكمال التسجيل", + "verification-code-resend": "إعادة إرسال البريد الإلكتروني", + "verification-code-resend-countdown": "إعادة إرسال رسالة التحقق في {{seconds}} ثانية...", + "verification-code-sent": "تم إرسال رمز التحقق!", + "verification-code-sent-to": "لقد أرسلنا للتو بريدًا إلكترونيًا إلى", + "verification-code-spam-note": "لم تتلق بريدًا إلكترونيًا؟ تحقق من مجلد البريد العشوائي", + "verify-code": "تحقق من أن رمز الحماية المقدم يطابق النص التالي:", + "welcome-description-1": "التسجيل الموحد لـ", + "welcome-description-2": ".مؤسسة", + "welcome-description-3": "سيكون لديك إمكانية الوصول إلى مواقع الويب التالية من خلال تفاصيل تسجيل الدخول الخاصة بك.", + "welcome-title": "مرحبا بكم في" } diff --git a/locales/ar/onboarding.json b/locales/ar/onboarding.json index 49ddc23cdd..c53d2064f7 100644 --- a/locales/ar/onboarding.json +++ b/locales/ar/onboarding.json @@ -87,10 +87,6 @@ "description": "اختر من بين مجموعة متنوعة من الترجمات بلغات متعددة. نصيحة: قارن الترجمات عن طريق تحديد خيارات متعددة", "title": "ترجمات" }, - "voice-search": { - "description": "اضغط على أيقونة الميكروفون واقرأ الآية التي تبحث عنها. نصيحة سريعة! لاكتشاف مكان القراءة (على سبيل المثال، صلاة التراويح)، اضغط على أيقونة الميكروفون. بعد اكتشاف آية أو آيتين، اضغط على \"إيقاف\" للعثور على الموقع", - "title": "البحث الصوتي (ترتيل)" - }, "wbw-audio": { "description": "حدد هذا الخيار للاستماع إلى كل كلمة على حدة بمجرد النقر على الكلمة!", "title": "استمع إلى النقل الحرفي كلمة بكلمة من خلال النقر على كلمة" diff --git a/locales/ar/question.json b/locales/ar/question.json index 5b1f6074df..78b09cce31 100644 --- a/locales/ar/question.json +++ b/locales/ar/question.json @@ -1,4 +1,5 @@ { "q-and-a": "الأسئلة والأجوبة المتعلقة بـ ", - "question": "سؤال" + "question": "سؤال", + "questions-meta-desc": "اكتشف الإجابات الموثوقة لتعميق فهمك للقرآن الكريم." } diff --git a/locales/ar/quick-links.json b/locales/ar/quick-links.json index 5f58adbe2d..b26574b2de 100644 --- a/locales/ar/quick-links.json +++ b/locales/ar/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "عن القرآن", "ayat-ul-kursi": "آية الكرسي", + "jesus-in-quran": "عيسى في القرآن", "kahf": "سورة الكهف", "mulk": "سورة الملك", "muzzammil": "سورة المزّمّل", @@ -8,5 +9,6 @@ "rahman": "سورة الرّحمن", "sunnah": "آيات عن السنة النبوية", "waqiah": "سورة الواقعة", + "what-is-ramadan": "ما هو رمضان؟", "yaseen": "سورة يس" } diff --git a/locales/ar/quran-reader.json b/locales/ar/quran-reader.json index f4314bd5ec..26b2700c83 100644 --- a/locales/ar/quran-reader.json +++ b/locales/ar/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "بداية الحزب", "include-translator": "تضمين اسم المترجم؟", "juz-beginning": "بداية الجزء", + "lessons-desc": "اقرأ وشارك الدروس القرآنية للآية {{ayahNumber}} من سورة {{surahName}}", + "lessons-disclaimer": "الدروس هي رؤى وتفسيرات شخصية للقرآن الكريم، ولا ينبغي اعتبارها مرجعية.", + "lessons-not-available": "لا توجد دروس مراجعة لهذه الآية", "mad-2": "مدّ حركتان", "mad-2-4-6": "مدّ ٢ أو ٤ أو ٦ جوازا", "mad-4-5": "مدّ واجب ٤ أو ٥ حركات", diff --git a/locales/ar/radio.json b/locales/ar/radio.json index 3033a25423..b645885ef0 100644 --- a/locales/ar/radio.json +++ b/locales/ar/radio.json @@ -22,5 +22,6 @@ "pause-radio": "إيقاف الراديو", "play-radio": "تشغيل الراديو", "radio-desc": "الاستماع إلى تلاوات جميلة من القرآن الكريم بدون توقف من قبل مختلف القراء.", - "reciter-stations": "محطات القراء" + "reciter-stations": "محطات القراء", + "station": "محطة" } diff --git a/locales/ar/reading-goal.json b/locales/ar/reading-goal.json index 8e0a8ddb57..545eb2ad1a 100644 --- a/locales/ar/reading-goal.json +++ b/locales/ar/reading-goal.json @@ -7,6 +7,7 @@ "create-plan": "ضع خطة", "create-reading-goal": "إنشاء هدف", "daily-progress": "التقدم اليومي", + "daily-progress-completed": "تم الانتهاء! 🎉", "daily": { "description": "سيتم إعادة تعيين هدفك كل يوم", "title": "الهدف اليومي" @@ -40,6 +41,7 @@ "description": "هل يجب إعادة تعيين هدفك كل يوم أم كل عدد من الأيام؟ لا تقلق، سنتتبع تقدمك بغض النظر عن التكرار الذي تختاره.", "title": "اختر وتيرة لهدفك" }, + "goal-completed": "تم تحقيق الهدف! 🎉 ", "goal-done": { "description": "سيتم تسجيل أي قراءة إضافية", "title": "لقد أكملت هدف اليوم" @@ -86,9 +88,12 @@ "time-goal": "اقرأ {{time}} من القرآن" }, "reading-goal": "هدف القراءة", + "reading-goal-description": "هل تجد صعوبة في الحفاظ على الاتساق مع أهدافك في قراءة القرآن؟

رحلة نمو القرآن هي ميزة ديناميكية تم تطويرها لمساعدتك على البقاء ثابتًا في رحلتك مع القرآن. سواء كنت تهدف إلى القراءة لمدة 10 دقائق يوميًا، أو إكمال جزء في شهر، أو إنهاء القرآن بالكامل في عام، وما إلى ذلك، يمكن أن يساعدك Quran.com الآن في تحديد هدف مخصص وتتبع سلاسل القراءة اليومية الخاصة بك، مع التعديل مع إحراز تقدم. إنه مجاني تمامًا للاستخدام ونأمل أن يساعدك في البقاء متحفزًا للوصول إلى هدفك!", "reading-goal-label": "أنت على", + "reading-goal-title": "تعريف برحلة نمو القرآن الكريم", "recommended": "مُستَحسَن", "remaining": "المتبقي لهذا اليوم", + "remaining-base": "متبقي", "remaining-days": { "zero": "بقي صفر يوم", "one": "بقي يوم واحد", @@ -97,6 +102,7 @@ "many": "بقي {{days}} يوما", "other": "بقي {{days}} يوم" }, + "set-a-new-goal": "حدد هدفا جديدا", "set-reading-goal-success": "تم تعيين هدف القراءة الخاص بك بنجاح.", "start-journey": "ابدأ رحلتك!", "start-reading": "ابدأ القراءة", diff --git a/locales/ar/support.json b/locales/ar/support.json index 2b2af821f5..0f9af934d5 100644 --- a/locales/ar/support.json +++ b/locales/ar/support.json @@ -7,11 +7,9 @@ "donate-q": "كيف يمكنني التبرع؟", "download-a": "للأسف لا. نحن لا نوفر إمكانية تنزيل موقعنا أو القرآن على جهاز الكمبيوتر الخاص بك حتى الآن. ولكن يمكنك تنزيل تطبيق الهاتف المحمول الخاص بنا للقراءة عند عدم الاتصال بالانترنت.", "download-q": "هل يمكنني تنزيل موقع Quran.com على جهاز الكمبيوتر الخاص بي؟", - "fiqh-a": "Quran.com هو أداة للقراءة والاستماع والدراسة عبر الإنترنت. يتكون فريق عمل Quran.com من مهندسي برمجيات ومصممين ومديري منتجات. للأسف، هذه حدود مهاراتنا، لا يوجد ضمن مجموعتنا علماء أو أئمة أو شيوخ كجزء من الفريق للمساعدة في الأسئلة الإسلامية أو الفقهية أو الفتوى. نحاول الامتناع عن الإجابة على أي من هذه الأسئلة وننصح بالتحدث إلى إمامك المحلي في مسجد أو إلى أحد الشيوخ.", - "fiqh-q": "أسئلة إسلامية / فقهية / فتاوى", "header": "المساعدة والتعليقات", "main-desc": "يرجى مراجعة الأسئلة الشائعة لمعرفة ما إذا كان قد تمت الإجابة على سؤالك بالفعل. إذا لزم الأمر، يمكنك <0>الاتصال بنا وسنبذل قصارى جهدنا للرد عليك في أقرب وقت ممكن، ولكن نود إعلامك أننا فريق صغير، لذا يرجى أن تكون لطيفًا.", - "mobile-a": "نعم! يرجى زيارة <0>صفحة تطبيقات الجوال لمزيد من المعلومات.", + "mobile-a": "نعم! يرجى زيارة <0>القرآن لنظام Android أو <1>القرآن لنظام iOS لتنزيل التطبيقات", "mobile-q": "هل لدى موقع Quran.com تطبيق للجوال؟", "other-languages-a": "لتغيير لغة الموقع، توجد قائمة تظهر في الزاوية اليمنى العليا في كل صفحة (الزاوية اليسرى العليا للغات التي تكتب من اليمين إلى اليسار). استخدم هذه القائمة لاختيار لغتك المفضلة.", "other-languages-q": "هل يمكنني تصفح الموقع بلغات أخرى؟", diff --git a/locales/bn/about.json b/locales/bn/about.json index cad7c3d588..082d6950b7 100644 --- a/locales/bn/about.json +++ b/locales/bn/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "এই প্রকল্পটি আমরা ব্যবহার করেছি এমন অনেকগুলি ওপেন সোর্স লাইব্রেরি এবং প্রকল্প ছাড়া সম্ভব হত না:", - "lokalize": "<0>লোকালাইজ<\/0>: একটি কম্পিউটার-সহায়তা অনুবাদ সিস্টেম যা উত্পাদনশীলতা এবং গুণমানের নিশ্চয়তার উপর ফোকাস করে এবং একটি বিরামহীন স্থানীয়করণ কর্মপ্রবাহ প্রদান করে।", - "quran-align": "<0>কলিন ফেয়ার<\/0>: রেকর্ড করা কোরআন তেলাওয়াতের শব্দ-নির্দিষ্ট বিভাজন তৈরির জন্য একটি টুল।", - "quran-complex": "<0>QuranComplex<\/0>: কিং ফাহদ গ্লোরিয়াস কোরান প্রিন্টিং কমপ্লেক্স মহিমান্বিত কোরান ও এর বিজ্ঞান পরিবেশন, এর অর্থ অনুবাদ এবং কোরানের পাঠ্যকে বিকৃতি থেকে রক্ষা করার জন্য সর্বোত্তম ব্যবহারের মাধ্যমে একটি অগ্রণী। প্রিন্টিং, অডিও রেকর্ডিং, ইলেকট্রনিক প্রকাশনা এবং ডিজিটাল অ্যাপ্লিকেশনের ক্ষেত্রে উন্নত প্রযুক্তি।", - "quran-enc": "<0>আল-কুরআনুল কারীম বিশ্বকোষ<\/0>: একটি পোর্টাল যা বিশ্বের বিভিন্ন ভাষায় মহৎ কোরআনের অর্থ ও ব্যাখ্যার বিনামূল্যে এবং বিশ্বস্ত অনুবাদের বৈশিষ্ট্যযুক্ত।", - "tanzil": "<0>তানজিল<\/0>: একটি আন্তর্জাতিক কোরানিক প্রকল্প যার লক্ষ্য একটি উচ্চ-যাচাইকৃত সুনির্দিষ্ট কুরআন পাঠ প্রদান করা।", - "title": "ক্রেডিট", - "vercel": "<0>Vercel<\/0> : ফ্রন্টএন্ড ডেভেলপারদের জন্য একটি স্থাপনা এবং সহযোগিতার প্ল্যাটফর্ম যা ফ্রন্টএন্ড ডেভেলপারকে প্রথমে রাখে, তাদের উচ্চ-পারফরম্যান্স ওয়েবসাইট এবং অ্যাপ্লিকেশন তৈরি করার জন্য ব্যাপক টুল দেয়।", - "zekr": "<0>Zekr<\/0>: একটি উন্মুক্ত প্ল্যাটফর্ম কুরআন অধ্যয়নের সরঞ্জাম ব্রাউজিং এবং কুরআন নিয়ে গবেষণার জন্য" - }, - "main-description": "Quran.com 1995 সালে প্রতিষ্ঠিত হয়েছিল। ওয়েবসাইটের লক্ষ্য যে কেউ কুরআন পড়তে, অধ্যয়ন করতে এবং শিখতে পারে। প্রকল্পটি ওপেন সোর্স এবং মূল দলের সদস্য এবং <0>Tarteel টিম<\/0> মধ্যে সহযোগিতা হিসেবে নির্মিত।" -} \ No newline at end of file + "credits": { + "desc": "যারা এই প্রকল্পে সমর্থন ও অবদান রেখেছেন, বিশ্বব্যাপী লক্ষ লক্ষ মানুষের কাছে কুরআন সহজলভ্য করতে সাহায্য করেছেন, তাদের সকলের প্রতি আমরা কৃতজ্ঞতা প্রকাশ করছি।", + "lokalize": "<0>স্থানীয়করণ: একটি কম্পিউটার-সহায়তাপ্রাপ্ত অনুবাদ ব্যবস্থা যা উৎপাদনশীলতা এবং গুণমান নিশ্চিতকরণের উপর দৃষ্টি নিবদ্ধ করে এবং একটি নির্বিঘ্ন স্থানীয়করণ কর্মপ্রবাহ প্রদান করে।", + "quran-align": "<0>কলিন ফেয়ার: রেকর্ডকৃত কুরআন তেলাওয়াতের শব্দ-নির্ভুল বিভাজন তৈরির একটি হাতিয়ার।", + "quran-complex": "<0>কুরআন কমপ্লেক্স: কিং ফাহাদ গ্লোরিয়াস কুরআন প্রিন্টিং কমপ্লেক্স মুদ্রণ, অডিও রেকর্ডিং, ইলেকট্রনিক প্রকাশনা এবং ডিজিটাল অ্যাপ্লিকেশনের ক্ষেত্রে উন্নত প্রযুক্তির সর্বোত্তম ব্যবহারের মাধ্যমে মহিমান্বিত কুরআন এবং এর বিজ্ঞান পরিবেশন, এর অর্থ অনুবাদ এবং কুরআনের পাঠকে বিকৃতি থেকে রক্ষা করার ক্ষেত্রে একটি অগ্রণী প্রতিষ্ঠান।", + "quran-enc": "<0>QuranEnc: একটি পোর্টাল যেখানে বিশ্বের বিভিন্ন ভাষায় পবিত্র কুরআনের অর্থ এবং ব্যাখ্যার বিনামূল্যে এবং বিশ্বাসযোগ্য অনুবাদ রয়েছে।", + "tanzil": "<0>তানজিল: একটি আন্তর্জাতিক কুরআন প্রকল্প যার লক্ষ্য একটি অত্যন্ত যাচাইকৃত নির্ভুল কুরআন পাঠ প্রদান করা।", + "tarteel": "<0>টারটিল: একটি এআই-চালিত কুরআন মুখস্থ করার অ্যাপ। এটি আপনাকে আরও স্মার্টভাবে মুখস্থ করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে, আপনি কোনও আয়াত খুঁজছেন, আপনার অগ্রগতি ট্র্যাক করছেন, অথবা আপনার তেলাওয়াতের সাথে সাথে অনুসরণ করছেন।", + "title": "ক্রেডিট", + "vercel": "<0>Versel: ফ্রন্টএন্ড ডেভেলপারদের জন্য একটি স্থাপনা এবং সহযোগিতা প্ল্যাটফর্ম যা ফ্রন্টএন্ড ডেভেলপারদের প্রথমে রাখে, তাদের উচ্চ-কার্যক্ষমতাসম্পন্ন ওয়েবসাইট এবং অ্যাপ্লিকেশন তৈরির জন্য ব্যাপক সরঞ্জাম দেয়।", + "zekr": "<0>জেকর: কুরআন ব্রাউজিং এবং গবেষণার জন্য একটি উন্মুক্ত প্ল্যাটফর্ম কুরআন অধ্যয়নের সরঞ্জাম।" + }, + "global-effort": { + "desc": "বিশ্বজুড়ে লক্ষ লক্ষ মানুষ তাদের প্রাথমিক ডিজিটাল কুরআন সম্পদ হিসেবে Quran.com-এর উপর নির্ভর করে। তারা তেলাওয়াত, প্রতিফলন, মুখস্থ বা অধ্যয়ন যাই করুক না কেন, তাদের একটি সাধারণ উদ্দেশ্য রয়েছে: আল্লাহর বাণীর সাথে সংযোগ স্থাপনের আন্তরিক ইচ্ছা। \\n আমরা যতই এগিয়ে যাচ্ছি, আমরা নিশ্চিত করতে প্রতিশ্রুতিবদ্ধ যে Quran.com কুরআনের সাথে জড়িত হতে আগ্রহী যে কারও জন্য একটি বিশ্বস্ত, অ্যাক্সেসযোগ্য এবং সুন্দরভাবে ডিজাইন করা স্থান হয়ে থাকবে।", + "title": "একটি বিশ্বব্যাপী প্রচেষ্টা" + }, + "key-features": { + "desc": "Quran.com কুরআনের সাথে সম্পৃক্ততার প্রতিটি পর্যায়ে সহায়তা করার জন্য তৈরি করা হয়েছে - পাঠ এবং মুখস্থ থেকে শুরু করে অধ্যয়ন এবং প্রতিফলন পর্যন্ত। আমাদের বৈশিষ্ট্যগুলির মধ্যে রয়েছে:", + "features": [ + "ব্যবহারকারী-বান্ধব কুরআন ইন্টারফেস - যেকোনো ডিভাইসে একটি পরিষ্কার এবং স্বজ্ঞাত পাঠের অভিজ্ঞতা।", + "একাধিক অনুবাদ এবং তাফসীর - তাফসীরের সাথে একাধিক ভাষায় অনুবাদের অ্যাক্সেস।", + "অডিও তেলাওয়াত - বিশ্বখ্যাত ক্বারীদের উচ্চমানের তেলাওয়াত শুনুন, যাতে আপনি শব্দের পর শব্দ অনুসরণ করতে পারেন।", + "উন্নত অনুসন্ধান এবং নেভিগেশন - সমগ্র কুরআন জুড়ে বিষয় বা কীওয়ার্ড অনুসারে তাৎক্ষণিকভাবে আয়াত খুঁজুন।", + "আয়াহ বুকমার্কিং এবং নোটস - শ্লোকগুলি সংরক্ষণ করুন এবং পরবর্তী রেফারেন্সের জন্য ব্যক্তিগত প্রতিফলন লিখুন।", + "কুরআন প্রতিফলন একীকরণ - পণ্ডিত এবং ব্যক্তিদের দ্বারা ভাগ করা প্রতিফলন এবং অন্তর্দৃষ্টির মাধ্যমে একটি বিশ্ব সম্প্রদায়ের সাথে যুক্ত হন।", + "পঠনের অগ্রগতি ট্র্যাকিং এবং লক্ষ্য - আপনার দৈনন্দিন লক্ষ্য এবং পঠনের ইতিহাস ট্র্যাক রাখুন", + "ডেভেলপারদের জন্য API - ইসলামিক অ্যাপ এবং গবেষণা ও উন্নয়নকে শক্তিশালী করার জন্য কন্টেন্ট এবং বৈশিষ্ট্যগুলিতে বিনামূল্যে অ্যাক্সেস।", + "আর অনেক কিছু, আলহামদুলিল্লাহ।" + ], + "title": "মূল বৈশিষ্ট্য এবং অফার" + }, + "main-description": "১৯৯৫ সালে প্রতিষ্ঠার পর থেকে, Quran.com সকলের কাছে কুরআনকে স্পষ্ট, খাঁটি এবং সহজে ব্যবহারের উপযোগী করে তুলে ধরার জন্য প্রতিশ্রুতিবদ্ধ। প্রতিদিন, বিশ্বব্যাপী লক্ষ লক্ষ মানুষ কুরআন পড়তে, শুনতে, অধ্যয়ন করতে এবং তার উপর চিন্তাভাবনা করার জন্য Quran.com-এর দিকে ঝুঁকে পড়েন - তারা আজীবন ছাত্র, পণ্ডিত, অথবা তাদের যাত্রা শুরু করার জন্য।", + "our-mission": { + "desc": "কুরআন পাঠ, বোধগম্য এবং প্রতিফলিত করার জন্য তৈরি। আমাদের লক্ষ্য হলো ব্যক্তি ও সম্প্রদায়ের প্রবেশাধিকারের প্রতিবন্ধকতা দূর করা এবং তাদেরকে একটি নির্ভরযোগ্য, সুপরিকল্পিত এবং গভীরভাবে সমৃদ্ধ কুরআনের অভিজ্ঞতা প্রদানের মাধ্যমে ক্ষমতায়িত করা। আমরা নির্ভুলতা, স্পষ্টতা এবং আন্তরিকতার নীতি দ্বারা পরিচালিত কুরআনের সাথে জড়িত হতে আগ্রহী যে কারও জন্য একটি বিশ্বস্ত উৎস হিসেবে কাজ করার লক্ষ্য রাখি।", + "title": "আমাদের লক্ষ্য" + }, + "who-we-are": { + "desc": "Quran.com একটি ওয়াকফ (অর্থ প্রদান) যা একটি পাবলিক ট্রাস্ট হিসেবে প্রতিষ্ঠিত হয়েছে যাতে কুরআন সকলের কাছে বিনামূল্যে এবং বাণিজ্যিক স্বার্থ ছাড়াই সহজলভ্য হয়। এটি Quran.Foundation দ্বারা পরিচালিত হয়, একটি 501(c)(3) অলাভজনক সংস্থা, যা বিশ্বকে উচ্চমানের, খাঁটি কুরআনিক সম্পদ সরবরাহ করার লক্ষ্যে Quran.com কে টিকিয়ে রাখে এবং বিকাশ করে। আমাদের প্রতিশ্রুতি হল উৎকর্ষতা, আন্তরিকতা এবং দায়িত্বের সাথে কুরআন এবং এর পাঠকদের সেবা করা।", + "title": "আমরা কারা" + } +} diff --git a/locales/bn/apps.json b/locales/bn/apps.json index 5f5059746e..986af4176d 100644 --- a/locales/bn/apps.json +++ b/locales/bn/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Quran.com এর মূল বিকাশকারীদের দ্বারা, সুন্দর এবং বিজ্ঞাপন-মুক্ত মুশাফ iOS এবং Android অ্যাপস আসে। এখন যেতে যেতে কুরআন পড়া, মুখস্থ করা এবং আপনার প্রিয় তেলাওয়াতকারীদের শোনা সহজ।", - "tarteel-desc": "Tarteel হল প্রথম কুরআন অ্যাপ যা আপনার তেলাওয়াতের সাথে ইন্টারঅ্যাক্ট করতে এবং ভুল হাইলাইট করতে AI টুল ব্যবহার করে। আপনার হাতের তালুতে একটি ভয়েস-নেতৃত্বাধীন কুরআন সঙ্গী, Tarteel আপনাকে আত্মবিশ্বাসের সাথে কুরআন পড়তে, তিলাওয়াত করতে, মুখস্থ করতে এবং বুঝতে সাহায্য করার জন্য স্বজ্ঞাতভাবে কাজ করে! <0><\/0><0><\/0> Tarteel Quran.com এর কোর ডেভেলপার হওয়ার সাথে সাথে তাদের পরিচালনা বোর্ডের সদস্য হতে পেরে গর্বিত।" -} \ No newline at end of file + "quran-desc": "Quran.com এর মূল বিকাশকারীদের দ্বারা, সুন্দর এবং বিজ্ঞাপন-মুক্ত মুশাফ iOS এবং Android অ্যাপস আসে। এখন যেতে যেতে কুরআন পড়া, মুখস্থ করা এবং আপনার প্রিয় তেলাওয়াতকারীদের শোনা সহজ।" +} diff --git a/locales/bn/common.json b/locales/bn/common.json index e4a4218f26..467328df40 100644 --- a/locales/bn/common.json +++ b/locales/bn/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "নেভিগেশন", "no-nav-results": "কোন নেভিগেশন ফলাফল", - "placeholder": "কি আপনি পড়তে চান?", - "powered-by": "Tarteel.ai দ্বারা চালিত ভয়েস অনুসন্ধান", + "placeholder": "কুরআন অনুসন্ধান করুন...", "recent-navigations": "সাম্প্রতিক নেভিগেশন", "search-by-voice": "ভয়েস দ্বারা অনুসন্ধান করুন", "try-navigating": "নেভিগেট করার চেষ্টা করুন" @@ -122,9 +121,11 @@ } }, "continue": "চালিয়ে যান", + "contribute-to-our-mission": "আমাদের লক্ষ্যে অবদান রাখুন", "copied": "কপি করা হয়েছে", "copied-to-clipboard": "ক্লিপবোর্ডে কপি করা হয়েছে", "copy": "কপি", + "copylink": "লিংক কপি করুন", "counter": { "decrease": "হ্রাস", "increase": "বৃদ্ধি" @@ -134,6 +135,7 @@ "developers": "বিকাশকারীরা", "display": "প্রদর্শন", "donate": "দান করুন", + "donate-now": "এখনই দান করুন", "donate_monthly": "মাসিক দান করুন", "donate_once": "একবার দান করুন", "edit": "সম্পাদনা করুন", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*সর্বোচ্চ {{maxNumberOfVerses}} আয়াত", "ranges-wrong-order": "শুরুর শ্লোকটি শেষের আয়াতের আগে হতে হবে।" }, + "errors": { + "account-banned": "দুঃখিত, আপনার অ্যাকাউন্টটি নিষিদ্ধ। Quran.Foundation এর সাথে যোগাযোগ করুন", + "badRequest": "*অবৈধ অনুরোধ", + "banned": "*দুঃখিত, আপনার অ্যাকাউন্টটি নিষিদ্ধ। Quran.Foundation এর সাথে যোগাযোগ করুন।", + "confirm": "*নিশ্চিত করুন যে পাসওয়ার্ডটি পাসওয়ার্ডের সাথে মেলে না।", + "email": "*অবৈধ ইমেল ফর্ম্যাট!", + "exactLength": "*মান অবশ্যই সঠিক দৈর্ঘ্যের হতে হবে", + "expiredToken": "*এই টোকেনের মেয়াদ শেষ হয়ে গেছে।", + "forgot-password-failed": "পাসওয়ার্ড রিসেট ইমেল পাঠানো যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", + "immutable": "*এই মান পরিবর্তন করা যাবে না।", + "invalid": "*এই {{fieldName}} টি অবৈধ।", + "invalidEmailOrPassword": "*ভুল ইমেল বা পাসওয়ার্ড", + "max": "* {{fieldName}} অবশ্যই {{max}} সংখ্যার চেয়ে কম বা সমান হতে হবে", + "min": "* {{fieldName}} অবশ্যই {{min}} সংখ্যার চেয়ে বেশি বা সমান হতে হবে", + "name": "* {{fieldName}} শুধুমাত্র অক্ষর এবং সংখ্যার হতে হবে", + "notFound": "*পাওয়া যায়নি", + "required": "* {{fieldName}} অনুপস্থিত!", + "reset-password-failed": "পাসওয়ার্ড রিসেট করতে ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "signin-failed": "সাইন ইন ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "signup-failed": "সাইন আপ করা যায়নি। আবার চেষ্টা করুন।", + "taken": "* {{fieldName}} ইতিমধ্যেই বিদ্যমান!", + "usedToken": "*এই টোকেনটি ইতিমধ্যেই ব্যবহৃত হয়েছে", + "username": "* {{fieldName}} শুধুমাত্র আন্ডারস্কোর এবং অক্ষর গ্রহণ করে", + "verification-code-invalid": "এই যাচাইকরণ কোডটি অবৈধ।", + "verification-code-length": "যাচাইকরণ কোডটি {{length}} সংখ্যার হতে হবে", + "verification-failed": "যাচাইকরণ ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "verification-resend-failed": "যাচাইকরণ কোড পুনরায় পাঠানো যায়নি" + }, "exciting-updates": "উত্তেজনাপূর্ণ আপডেট", "feedback": "প্রতিক্রিয়া", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "অনুবাদ ফন্টের আকার" }, "footer": { - "description": "Quran.com একটি সাদাকাহ জারিয়াহ। আমরা আশা করি প্রত্যেকের জন্য নোবেল কুরআন পড়া, অধ্যয়ন করা এবং শেখা সহজ হবে। নোবেল কুরআনের অনেক নাম রয়েছে যার মধ্যে রয়েছে আল-কুরআন আল-করিম, আল-কেতাব, আল-ফুরকান, আল-মাউইথা, আল-থিকর এবং আল-নূর।", + "description": "Quran.com হল একটি বিশ্বস্ত প্ল্যাটফর্ম যা বিশ্বব্যাপী লক্ষ লক্ষ মানুষ বিভিন্ন ভাষায় কুরআন পড়তে, অনুসন্ধান করতে, শুনতে এবং তার উপর চিন্তাভাবনা করার জন্য ব্যবহার করে। এটি অনুবাদ, তাফসির, তেলাওয়াত, শব্দে শব্দ অনুবাদ এবং গভীর অধ্যয়নের জন্য সরঞ্জাম সরবরাহ করে, যা সকলের কাছে কুরআনকে সহজলভ্য করে তোলে।

সাদাকাহ জারিয়াহ হিসেবে, Quran.com মানুষকে কুরআনের সাথে গভীরভাবে সংযুক্ত হতে সাহায্য করার জন্য নিবেদিতপ্রাণ। Quran.Foundation দ্বারা সমর্থিত, একটি 501(c)(3) অলাভজনক সংস্থা, Quran.com সকলের জন্য একটি বিনামূল্যের এবং মূল্যবান সম্পদ হিসেবে বেড়ে চলেছে, আলহামদুলিল্লাহ”", "hiring": "আমরা নিয়োগের করছি! কুরআন ফাউন্ডেশন দলে যোগ দিন এবং আমাদের মিশনে অবদান রাখুন। এখনই আবেদন করুন! ", "rights": "সমস্ত অধিকার সংরক্ষিত", - "title": "মহান কুরআন পড়ুন, অধ্যয়ন করুন এবং শিখুন।" + "title": "কুরআন পড়ুন, শুনুন, অনুসন্ধান করুন এবং চিন্তা করুন" }, "form": { "body": "শরীর", "code": "যাচাইকরণ কোড", + "confirm-password": "পাসওয়ার্ড নিশ্চিত করুন", "email": "ইমেইল", "firstName": "নামের প্রথম অংশ", "lastName": "নামের শেষাংশ", - "title": "শিরোনাম" + "password": "পাসওয়ার্ড", + "title": "শিরোনাম", + "username": "ব্যবহারকারীর নাম", + "verification-code": "যাচাইকরণ কোড" }, "from": "থেকে", + "fundraising-share-title": "Quran.com তহবিল সংগ্রহ শেয়ার করুন", "fundraising-sticky-banner": { "cta": "দান করুন", "title": "সেরা দিন সময় দিন!" @@ -217,6 +252,7 @@ "learn-more": "আরও জানুন", "learning-plans": "শেখার পরিকল্পনা", "less": "কম", + "lessons": "পাঠ", "loading": "লোড হচ্ছে", "login": "প্রবেশ করুন", "logout": "প্রস্থান", @@ -250,6 +286,7 @@ "off": "বন্ধ", "oldest": "প্রবীণতম", "on": "চালু", + "our-projects": "আমাদের প্রকল্পগুলি", "page": "পাতা", "pages": "পাতা", "pagination-summary": "{{currentResultNumber}} totalNumberOfResults}}টি ফলাফলের মধ্যে {{totalNumberOfResults}} - {{endOfResultNumber}}", @@ -272,6 +309,7 @@ "privacy": "গোপনীয়তা", "product-updates": "পণ্য আপডেট", "profile": "প্রোফাইল", + "projects-desc": "কুরআন.ফাউন্ডেশনের মালিকানাধীন, পরিচালিত, অথবা স্পনসরকৃত অলাভজনক প্রকল্প।", "q-reflect": "কুরআন প্রতিফলন", "quran-com": "কুরআন ডট কম", "quran-radio": "কোরআন রেডিও", @@ -287,6 +325,7 @@ "reciters": "আবৃত্তিকারী", "reflect": "প্রতিফলিত করা", "reflections": "প্রতিফলন", + "reflections-and-lessons": "প্রতিফলন এবং পাঠ", "remove": "অপসারণ", "rename": "নাম পরিবর্তন করুন", "retry": "পুনরায় চেষ্টা করা", @@ -296,10 +335,12 @@ "save-to-collection": "সংগ্রহে সংরক্ষণ করুন", "search-for": "'{{searchQuery}}' অনুসন্ধান করুন", "search-results": "{{count}} সার্চ ফলাফল", + "search-results-no-count": "অনুসন্ধান ফলাফল", "search": { "filters": "ফিল্টার", "hint": "খোঁজার চেষ্টা করুন", "jump-to": "লাফ দাও", + "more-results": "আরও ফলাফল", "no-results": "কোন ফলাফল পাওয়া যায়নি", "no-results-suggestion": "{{searchQuery}} \" এর জন্য কোনো মিলিত অনুসন্ধান ফলাফল খুঁজে পাইনি৷ একটি ভিন্ন কীওয়ার্ড অনুসন্ধান করার চেষ্টা করুন।", "popular": "জনপ্রিয় অনুসন্ধান", @@ -340,8 +381,10 @@ "search-juz": "Juz অনুসন্ধান করুন", "search-page": "অনুসন্ধান পৃষ্ঠা", "search-surah": "সূরা অনুসন্ধান করুন", + "search-verse": "অনুসন্ধান শ্লোক", "try-navigating-with": "পরামর্শ: এর সাথে নেভিগেট করার চেষ্টা করুন" }, + "sign-in": "প্রবেশ কর", "sitemap": "সাইটম্যাপ", "sort": { "ascending": "আরোহী", @@ -362,10 +405,6 @@ "tafsirs-desc": "বিশ্বস্ত তাফসির আলেমদের দ্বারা {{surahName}} সূরার {{surahName}} {{ayahNumber}} আয়াতের বিভিন্ন তাফসির পড়ুন", "title": "তাফসির" }, - "tarteel": { - "app": "Tarteel অ্যাপ", - "name": "তারতেল.আ" - }, "terms-and-conditions": "শর্তাবলী", "theme": "থিম", "themes": { @@ -400,9 +439,9 @@ "view": "দেখুন", "voice": { "ask-permission": "ভয়েস অনুসন্ধান ব্যবহার শুরু করতে অনুগ্রহ করে মাইক্রোফোন অনুমতি সক্ষম করুন৷", - "error": "একটি ত্রুটি ঘটেছে। পরে আবার চেষ্টা করুন. অথবা ডাউনলোড করুন", - "no-permission": "মনে হচ্ছে আপনার কাছে মাইক্রোফোনের অনুমতিগুলি সক্রিয় নেই৷ অনুগ্রহ করে মাইক্রোফোন অনুমতি সক্ষম করুন এবং আবার চেষ্টা করুন বা ডাউনলোড করুন৷", - "not-supported": "মনে হচ্ছে আপনার ব্রাউজার মাইক্রোফোন সমর্থন করে না। একটি ভিন্ন ব্রাউজার চেষ্টা করুন বা ডাউনলোড করুন", + "error": "একটি ত্রুটি ঘটেছে, দয়া করে পরে আবার চেষ্টা করুন।", + "no-permission": "মনে হচ্ছে আপনার মাইক্রোফোনের অনুমতিগুলি সক্ষম করা নেই। অনুগ্রহ করে মাইক্রোফোনের অনুমতিগুলি সক্ষম করুন এবং আবার চেষ্টা করুন।", + "not-supported": "মনে হচ্ছে আপনার ব্রাউজার মাইক্রোফোন সমর্থন করে না। অনুগ্রহ করে অন্য একটি ব্রাউজার চেষ্টা করুন।", "suggest": "আবৃত্তি শুরু করুন এবং আপনার আয়াত প্রদর্শিত হবে.", "suggest-subtitle": "আরবীতে যেকোনো আয়াত তেলাওয়াত করুন, আয়াতটি আসবে", "suggest-title": "এখন আবৃত্তি করুন", diff --git a/locales/bn/developers.json b/locales/bn/developers.json index 77c7616e56..59d0749ae7 100644 --- a/locales/bn/developers.json +++ b/locales/bn/developers.json @@ -1,20 +1,19 @@ { - "footer": "- কুরআন ডট কম দল", - "header": "উন্নয়ন সাহায্য", - "issues-cta": "আপনার যদি কোন প্রশ্ন থাকে বা রক্ষণাবেক্ষণকারীদের সাথে যোগাযোগ করতে চান, শুধু একটি সমস্যা লিখুন! আমরা যত তাড়াতাড়ি সম্ভব আপনার কাছে ফিরে আসব, ইনশাআল্লাহ।", - "issues-guide": "সাধারণত আমরা <0>গিথুব প্রকল্পগুলি<\/0> পরবর্তী কী কাজ করতে হবে, কী আসছে এবং কোন বাগগুলি রয়েছে যা সমাধান করা দরকার তার উত্স হিসাবে ব্যবহার করি। উদাহরণস্বরূপ<1>এই ইউআরএল<\/1> বাগগুলির তালিকা রয়েছে, যা আমাদের সাহায্যের প্রয়োজন এবং আসন্ন বৈশিষ্ট্যগুলি।", - "main-desc": "আসসালামু আলাইকম, প্রথমত, কুরআন ডটকম এবং এর প্রকল্পগুলি বিকাশে আমাদের সহায়তা করার জন্য আপনার আগ্রহের জন্য আপনাকে অনেক ধন্যবাদ। আমরা আপনার সাথে কাজ করতে উত্তেজিত!", - "projects": { - "all": "আমাদের কাছে গিথুবে হোস্ট করা বেশ কয়েকটি প্রকল্প রয়েছে। আপনি সেগুলি সব খুঁজে পেতে পারেন <0>এখানে<\/0> । কিন্তু তাদের রূপরেখা দিতে:", - "q-android": "<0>কুরআন অ্যান্ড্রয়েড<\/0>", - "q-api": "<0>Quran.com API<\/0> - রুবি অন রেলে লেখা।", - "q-api-docs": "<0> Quran.com API ডক্স <\/0> - আমাদের API ডক্স পোর্টাল।", - "q-audio": "<0>কুরআনিক অডিও<\/0> এবং <1>কুরআনিক অডিও মোবাইল অ্যাপস<\/1>", - "q-audio-segments": "<0>কুরআন অডিও সেগমেন্ট<\/0>", - "q-ios": "<0>কুরআন iOS<\/0>", - "q-next": "<0>Quran.com ফ্রন্টেন্ড<\/0> - Next.js এ লেখা।", - "q-v2": "<0>Quran.com<\/0> - রুবি অন রেলে লেখা।" - }, - "sub-main-desc": "আমরা ডেভেলপার, ডিজাইনার, প্রোডাক্ট ম্যানেজার এবং চিন্তাবিদদের একটি দল যা <0>Tarteel<\/0> টিমের সাথে সহযোগিতায় কাজ করে সেরা অনলাইন কুরআন পড়ার অভিজ্ঞতা প্রদান করতে। আলহামদুলিল্লাহ আমরা সারা বিশ্বে কিছু বড় কোম্পানির জন্য কাজ করার জন্য ধন্য হয়েছি - এবং মনে করি যে আমাদের উম্মাহকে তাদের ধর্ম শেখার এবং অধ্যয়ন করতে এগিয়ে যেতে সাহায্য করার জন্য এটিই আমরা করতে পারি। Quran.com-এ কাজ করা খুবই আনন্দদায়ক এবং আমাদের প্রচেষ্টার জন্য আল্লাহ আমাদের সবাইকে পুরস্কৃত করুন (এবং আপনাকে পুরস্কৃত করুন)।", - "thanks": "পড়ার জন্য ধন্যবাদ! আপনি কিছু কোড কমিট দেখার জন্য উন্মুখ!" -} \ No newline at end of file + "footer": "- কুরআন ডট কম দল", + "header": "উন্নয়ন সাহায্য", + "issues-cta": "আপনার যদি কোন প্রশ্ন থাকে বা রক্ষণাবেক্ষণকারীদের সাথে যোগাযোগ করতে চান, শুধু একটি সমস্যা লিখুন! আমরা যত তাড়াতাড়ি সম্ভব আপনার কাছে ফিরে আসব, ইনশাআল্লাহ।", + "issues-guide": "সাধারণত আমরা <0>গিথুব প্রকল্পগুলি পরবর্তী কী কাজ করতে হবে, কী আসছে এবং কোন বাগগুলি রয়েছে যা সমাধান করা দরকার তার উত্স হিসাবে ব্যবহার করি। উদাহরণস্বরূপ<1>এই ইউআরএল বাগগুলির তালিকা রয়েছে, যা আমাদের সাহায্যের প্রয়োজন এবং আসন্ন বৈশিষ্ট্যগুলি।", + "main-desc": "আসসালামু আলাইকম, প্রথমত, কুরআন ডটকম এবং এর প্রকল্পগুলি বিকাশে আমাদের সহায়তা করার জন্য আপনার আগ্রহের জন্য আপনাকে অনেক ধন্যবাদ। আমরা আপনার সাথে কাজ করতে উত্তেজিত!", + "projects": { + "all": "আমাদের কাছে গিথুবে হোস্ট করা বেশ কয়েকটি প্রকল্প রয়েছে। আপনি সেগুলি সব খুঁজে পেতে পারেন <0>এখানে । কিন্তু তাদের রূপরেখা দিতে:", + "q-android": "<0>কুরআন অ্যান্ড্রয়েড", + "q-api": "<0>Quran.com API - রুবি অন রেলে লেখা।", + "q-api-docs": "<0> Quran.com API ডক্স - আমাদের API ডক্স পোর্টাল।", + "q-audio": "<0>কুরআনিক অডিও এবং <1>কুরআনিক অডিও মোবাইল অ্যাপস", + "q-audio-segments": "<0>কুরআন অডিও সেগমেন্ট", + "q-ios": "<0>কুরআন iOS", + "q-next": "<0>Quran.com ফ্রন্টেন্ড - Next.js এ লেখা।", + "q-v2": "<0>Quran.com - রুবি অন রেলে লেখা।" + }, + "thanks": "পড়ার জন্য ধন্যবাদ! আপনি কিছু কোড কমিট দেখার জন্য উন্মুখ!" +} diff --git a/locales/bn/home.json b/locales/bn/home.json index d8f1f1cdda..ed43a1aae8 100644 --- a/locales/bn/home.json +++ b/locales/bn/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "তোমার কুরআনের লক্ষ্য অর্জন করো", + "begin": "শুরু করুন", + "chapters-and-verses": "অধ্যায় এবং পদ", + "continue-read": "পড়া চালিয়ে যান", + "explore-topics": "বিষয়গুলি অন্বেষণ করুন", + "first-time-reading": "কুরআনে নতুন? এখান থেকে শুরু করুন ", + "know-someone": "আমাদের সাথে এই রমজান বাড়ান", + "learning-plan": "শেখার পরিকল্পনা", + "listen-to-radio": "কুরআন রেডিও শুনুন", + "my-quran": "আমার কুরআন", + "navigate-quran": "কুরআন নেভিগেট করুন", "no-bookmarks": "আপনি এখনও কোনো বুকমার্ক নেই", "no-recently-read": "আপনার এখনও কোনো পড়ার সেশন নেই", "noble-quran": "নোবেল কুরআন", + "popular": "জনপ্রিয়", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "কুরআন বৃদ্ধির যাত্রা" }, - "ramadan-activities-cta": " সাপ্তাহিক পাঠ, অনুপ্রেরণামূলক পডকাস্ট এবং প্রতিফলনের জন্য একটি আহ্বানের জন্য গ্লোবাল কোরানিক ক্যালেন্ডার <\/b> অনুসরণ করুন! <\/link>", + "qr-community": "আজকের আলোচিত পদ এবং প্রতিফলন পড়ুন", + "ramadan-activities-cta": " সাপ্তাহিক পাঠ, অনুপ্রেরণামূলক পডকাস্ট এবং প্রতিফলনের জন্য একটি আহ্বানের জন্য গ্লোবাল কোরানিক ক্যালেন্ডার অনুসরণ করুন! ", + "ramadan": { + "header": "কুরআনের সাথে আপনার সংযোগ গভীর করার সরঞ্জাম", + "title": "রমজানের জন্য প্রস্তুত?" + }, "read-juz": "জুজ পড়ুন", "recently-read": "সম্প্রতি পঠিত", - "revelation-order-disclaimer": "এই দৃষ্টিভঙ্গিটি কুরআনের সূরাগুলির কালানুক্রমিক ক্রম দেখায় যখন সেগুলি নবী মুহাম্মদের কাছে অবতীর্ণ হয়েছিল তার উপর ভিত্তি করে ﷺ <\/hover> । কালপঞ্জি পণ্ডিতদের মতামতের একটি বিষয় এবং কিছু সূরা বিভিন্ন সময়ে অংশে অবতীর্ণ হয়েছে। এখানে অর্ডার করা Tanzil.net <\/link> এর কাজের উপর ভিত্তি করে। [দ্রষ্টব্য: আল-ফাতিহা থেকে আল-নাস পর্যন্ত সংকলিত মুশফের আদেশটি সর্বসম্মত বিষয়।]", + "revelation-order-disclaimer": "এই দৃষ্টিভঙ্গিটি কুরআনের সূরাগুলির কালানুক্রমিক ক্রম দেখায় যখন সেগুলি নবী মুহাম্মদের কাছে অবতীর্ণ হয়েছিল তার উপর ভিত্তি করে । কালপঞ্জি পণ্ডিতদের মতামতের একটি বিষয় এবং কিছু সূরা বিভিন্ন সময়ে অংশে অবতীর্ণ হয়েছে। এখানে অর্ডার করা Tanzil.net এর কাজের উপর ভিত্তি করে। [দ্রষ্টব্য: আল-ফাতিহা থেকে আল-নাস পর্যন্ত সংকলিত মুশফের আদেশটি সর্বসম্মত বিষয়।]", + "see-more-learning-plans": "আরও দেখুন", + "set-custom-goal": "লক্ষ্য নির্ধারণ করুন", + "share-quran": { + "description": "নতুন শিক্ষার্থীদের কাছে কুরআন ছড়িয়ে দিতে সাহায্য করুন", + "title": "কুরআন শেয়ার করুন!" + }, + "start-read": "পড়া শুরু করুন", + "stay-consistent": "স্ট্রিক ট্র্যাক করুন, কাস্টম লক্ষ্য তৈরি করুন, ধারাবাহিক থাকুন", "tab": { "bookmarks": "বুকমার্ক", "popular": "জনপ্রিয়" diff --git a/locales/bn/learn.json b/locales/bn/learn.json index 7d7ed8df1d..514c4182fb 100644 --- a/locales/bn/learn.json +++ b/locales/bn/learn.json @@ -24,7 +24,9 @@ "feedback-success": "আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ!", "your-feedback": "আপনার প্রতিক্রিয়া" }, + "help-about-reflection": "প্রতিফলন বৈশিষ্ট্য সম্পর্কে সাহায্য", "learn-duration": "সময়কাল", + "learn-more": "আরও জানুন", "learning-plan-material": "শেখার পরিকল্পনা উপাদান", "learning-plan-meta-desc": "এই লার্নিং প্ল্যানটি আপনি যেভাবে কুরআনের সাথে জড়িত থাকবেন তা পরিবর্তন করতে সাহায্য করবে, আজই আপনার যাত্রা শুরু করুন!", "learning-plans-desc": "সহজে অনুসরণযোগ্য পাঠের মাধ্যমে আপনার জ্ঞান বৃদ্ধি করুন যা আপনাকে কুরআনের সাথে আপনার যাত্রায় ক্রমবর্ধমান রাখে।

আজই একটি শেখার পরিকল্পনা শুরু করুন! আপনি ফিনিস লাইনে পৌঁছানো পর্যন্ত আপনার অগ্রগতি ট্র্যাক করা হয়।", @@ -34,9 +36,12 @@ "next-lesson": "পরবর্তী পাঠ", "not-enrolled": "আপনি এখনও লার্নিং প্ল্যান এ নথিভুক্ত নন।", "prev-lesson": "পূর্ববর্তী পাঠ", + "reflection-description-1": "\"প্রতিফলন যোগ করুন\" এ ক্লিক করলে আপনি কুরআন রিফ্লেক্টে চলে যাবেন, যা কুরআনের উপর ব্যক্তিগত প্রতিফলন ভাগ করে নেওয়ার একটি প্ল্যাটফর্ম। তাফসির (পণ্ডিতদের ব্যাখ্যা) থেকে ভিন্ন, প্রতিফলন হল আয়াতের সাথে সম্পর্কিত ব্যক্তিগত অন্তর্দৃষ্টি এবং অভিজ্ঞতা।", + "reflection-description-2": "আপনি যদি সর্বজনীনভাবে পোস্ট করেন, তাহলে আপনার প্রতিফলন মডারেশন টিম দ্বারা পর্যালোচনা করা হবে এবং QuranReflect সম্প্রদায়ের কাছে দৃশ্যমান হবে।", "start-learning": "শেখা শুরু করো", "tabs": { "main": "প্রধান বিবরণ", "syllabus": "পাঠ্যক্রম" - } + }, + "what-happens-when-you-click-add-reflection": "\"প্রতিফলন যোগ করুন\" এ ক্লিক করলে কী হবে?" } diff --git a/locales/bn/login.json b/locales/bn/login.json index c842d28d9f..02a7b7ccbd 100644 --- a/locales/bn/login.json +++ b/locales/bn/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "অপেক্ষা নিশ্চিতকরণ", + "back": "পিছনে", + "back-to-login": "লগইনে ফিরে যান", + "check-email-title": "সাইন আপ সম্পূর্ণ করতে ইমেল চেক করুন", + "confirm": "নিশ্চিত করুন", + "confirm-new-password-placeholder": "নতুন পাসওয়ার্ড নিশ্চিত করুন", + "confirm-password-placeholder": "পাসওয়ার্ড নিশ্চিত করুন", + "continue": "চালিয়ে যান", "continue-apple": "অ্যাপলের সাথে চালিয়ে যান", "continue-email": "ইমেল দিয়ে চালিয়ে যান", "continue-facebook": "ফেসবুকের সাথে চালিয়ে যান", "continue-google": "Google এর সাথে চালিয়ে যান", "email-placeholder": "ইমেইল ঠিকানা", + "error": { + "email-required": "ইমেলটি নেই!", + "invalid-credentials": "অবৈধ ইমেল বা পাসওয়ার্ড", + "invalid-email": "অবৈধ ইমেল ফর্ম্যাট!", + "login-failed": "লগইন ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "password-required": "পাসওয়ার্ড নেই!" + }, + "errors": { + "account-banned": "দুঃখিত, আপনার অ্যাকাউন্টটি নিষিদ্ধ। Quran.Foundation এর সাথে যোগাযোগ করুন", + "badRequest": "*অবৈধ অনুরোধ", + "banned": "*দুঃখিত, আপনার অ্যাকাউন্টটি নিষিদ্ধ। Quran.Foundation এর সাথে যোগাযোগ করুন।", + "confirm": "*নিশ্চিত করুন যে পাসওয়ার্ডটি পাসওয়ার্ডের সাথে মেলে না।", + "email": "*অবৈধ ইমেল ফর্ম্যাট!", + "exactLength": "*মান অবশ্যই সঠিক দৈর্ঘ্যের হতে হবে", + "expiredToken": "*এই টোকেনের মেয়াদ শেষ হয়ে গেছে।", + "forgot-password-failed": "পাসওয়ার্ড রিসেট ইমেল পাঠানো যায়নি। অনুগ্রহ করে আবার চেষ্টা করুন।", + "immutable": "*এই মান পরিবর্তন করা যাবে না।", + "invalid": "*এই {{fieldName}} টি অবৈধ।", + "invalidEmailOrPassword": "*ভুল ইমেল বা পাসওয়ার্ড", + "max": "* {{fieldName}} অবশ্যই {{max}} সংখ্যার চেয়ে কম বা সমান হতে হবে", + "min": "* {{fieldName}} অবশ্যই {{min}} সংখ্যার চেয়ে বেশি বা সমান হতে হবে", + "name": "* {{fieldName}} শুধুমাত্র অক্ষর এবং সংখ্যার হতে হবে", + "notFound": "*পাওয়া যায়নি", + "required": "* {{fieldName}} অনুপস্থিত!", + "reset-password-failed": "পাসওয়ার্ড রিসেট করতে ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "signin-failed": "সাইন ইন ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "signup-failed": "সাইন আপ করা যায়নি। আবার চেষ্টা করুন।", + "taken": "* {{fieldName}} ইতিমধ্যেই বিদ্যমান!", + "usedToken": "*এই টোকেনটি ইতিমধ্যেই ব্যবহৃত হয়েছে", + "username": "* {{fieldName}} শুধুমাত্র আন্ডারস্কোর এবং অক্ষর গ্রহণ করে", + "verification-code-invalid": "এই যাচাইকরণ কোডটি অবৈধ।", + "verification-code-length": "যাচাইকরণ কোডটি {{length}} সংখ্যার হতে হবে", + "verification-failed": "যাচাইকরণ ব্যর্থ হয়েছে। অনুগ্রহ করে আবার চেষ্টা করুন।", + "verification-resend-failed": "যাচাইকরণ কোড পুনরায় পাঠানো যায়নি" + }, "feature-1": "আপনার লক্ষ্য ট্র্যাক", "feature-2": "পড়ার ধারা বজায় রাখুন", "feature-3": "সংগ্রহ তৈরি করুন", "feature-4": "ব্রাউজার জুড়ে আপনার ডেটা সিঙ্ক করুন", "feature-5": "এবং আরো!", "feature-6": " নতুন! নোট ও প্রতিফলন", + "first-name-placeholder": "প্রথম নাম", + "forgot-password": "পাসওয়ার্ড ভুলে গেছেন", + "forgot-password-description": "আপনার ইমেল ঠিকানা লিখুন এবং আমরা আপনার পাসওয়ার্ড রিসেট করার নির্দেশাবলী পাঠাব।", + "forgot-password-success": "পাসওয়ার্ড রিসেট ইমেল পাঠানো হয়েছে! অনুগ্রহ করে আপনার ইনবক্স চেক করুন।", + "forgot-password-title": "পাসওয়ার্ড ভুলে গেছেন?", + "last-name-placeholder": "পদবি", "login-cta": "লগ ইন বা এখন সাইন আপ করুন:", "login-error": { "AuthenticationError": "প্রমাণীকরণ ব্যর্থ হয়েছে. অনুগ্রহ করে একটু পরে আবার চেষ্টা করুন", + "BannedUserError": "দুঃখিত, আপনার অ্যাকাউন্টটি নিষিদ্ধ। Quran.Foundation এর সাথে যোগাযোগ করুন।", "TokenExpiredError": "আপনি লগ আউট করা হয়েছে, আবার লগইন করুন." }, "login-title": "Quran.com এ লগইন করুন", + "new-password-placeholder": "নতুন পাসওয়ার্ড", "other-options": "অন্যান্য লগইন বিকল্প", + "password-placeholder": "পাসওয়ার্ড", + "password-reset-success": "পাসওয়ার্ড সফলভাবে রিসেট করা হয়েছে!", + "password-rules": { + "lowercase": "কমপক্ষে একটি ছোট হাতের অক্ষর", + "max-length": "সর্বোচ্চ ২০টি অক্ষর", + "min-length": "সর্বনিম্ন ৮টি অক্ষর", + "number": "কমপক্ষে একটি সংখ্যা", + "special": "কমপক্ষে একটি বিশেষ অক্ষর (!@#$%^&*_-)", + "uppercase": "কমপক্ষে একটি বড় হাতের অক্ষর" + }, "privacy-policy": "আপনার গোপনীয়তা রক্ষা করা আমাদের অগ্রাধিকার – সাইন আপ করার মাধ্যমে, আপনি আমাদের গোপনীয়তা নীতি এবং শর্তাবলী সম্মত হন।", - "verify-code": "প্রদত্ত নিরাপত্তা কোড নিম্নলিখিত পাঠ্যের সাথে মেলে তা যাচাই করুন:" + "quran-text": "কুরআন", + "quran-title": "কুরআন.কম", + "reflect-feature-1": "কুরআনের উপর চিন্তা করুন", + "reflect-feature-2": "গ্রুপে যোগদান করুন", + "reflect-feature-3": "অন্যদের সাথে যোগাযোগ করুন", + "reflect-feature-4": "এবং আরও!", + "reset-password": "পাসওয়ার্ড রিসেট করুন", + "reset-password-success": "পাসওয়ার্ড সফলভাবে রিসেট করা হয়েছে!", + "set-new-password": "একটি নতুন পাসওয়ার্ড সেট করুন", + "sign-in": "প্রবেশ কর", + "sign-in-or-sign-up": "সাইন ইন অথবা সাইন আপ করুন", + "sign-up": "সাইন আপ করুন", + "unified-registration-1": "এর একীভূত নিবন্ধন ", + "unified-registration-2": "কুরআন। ফাউন্ডেশন", + "unified-registration-3": ". আপনার নিম্নলিখিত ওয়েবসাইটগুলিতে অ্যাক্সেস থাকবে ", + "unified-registration-4": "আপনার সাইন ইন বিশদের মাধ্যমে।", + "username-placeholder": "ব্যবহারকারীর নাম", + "verification-code-instruction": "সাইন আপ সম্পূর্ণ করতে ইমেলে প্রদত্ত কোডটি প্রবেশ করান।", + "verification-code-resend": "ইমেল পুনরায় পাঠান", + "verification-code-resend-countdown": "{{seconds}} সেকেন্ডের মধ্যে যাচাইকরণ ইমেল পুনরায় পাঠান...", + "verification-code-sent": "যাচাইকরণ কোড পাঠানো হয়েছে!", + "verification-code-sent-to": "আমরা এইমাত্র একটি ইমেল পাঠিয়েছি", + "verification-code-spam-note": "কোন ইমেল পাননি? আপনার স্প্যাম ফোল্ডারটি পরীক্ষা করুন।", + "verify-code": "প্রদত্ত নিরাপত্তা কোড নিম্নলিখিত পাঠ্যের সাথে মেলে তা যাচাই করুন:", + "welcome-description-1": "এর একীভূত নিবন্ধন", + "welcome-description-2": ".ফাউন্ডেশন", + "welcome-description-3": "আপনার সাইন ইন বিশদের মাধ্যমে আপনি নিম্নলিখিত ওয়েবসাইটগুলিতে অ্যাক্সেস পাবেন।", + "welcome-title": "স্বাগতম" } diff --git a/locales/bn/onboarding.json b/locales/bn/onboarding.json index 45d3cb4323..e42fb25157 100644 --- a/locales/bn/onboarding.json +++ b/locales/bn/onboarding.json @@ -87,10 +87,6 @@ "description": "একাধিক ভাষায় বিভিন্ন ধরনের অনুবাদ থেকে বেছে নিন। টিপ: একাধিক বিকল্প নির্বাচন করে অনুবাদ তুলনা করুন", "title": "অনুবাদ" }, - "voice-search": { - "description": "মাইক আইকনে আলতো চাপুন এবং আপনি যে আয়াতটি অনুসন্ধান করছেন তা আবৃত্তি করুন। দ্রুত নির্দেশনা! কেউ কোথায় তেলাওয়াত করছে তা আবিষ্কার করতে (যেমন তারাবীহ নামাজ), মাইক আইকনে আলতো চাপুন। এক বা দুটি শ্লোক সনাক্ত হওয়ার পরে, অবস্থানটি খুঁজে পেতে স্টপ টিপুন", - "title": "ভয়েস অনুসন্ধান (তারটেল)" - }, "wbw-audio": { "description": "শুধুমাত্র শব্দে ক্লিক করে প্রতিটি শব্দ পৃথকভাবে শুনতে এই বিকল্পটি নির্বাচন করুন!", "title": "শব্দে ক্লিক করে শব্দ দ্বারা শব্দ প্রতিবর্ণীকরণ শুনুন" diff --git a/locales/bn/question.json b/locales/bn/question.json index f0d2ba23cf..c82f6d9f36 100644 --- a/locales/bn/question.json +++ b/locales/bn/question.json @@ -1,4 +1,5 @@ { "q-and-a": "সম্পর্কিত প্রশ্নোত্তর ", - "question": "প্রশ্ন" + "question": "প্রশ্ন", + "questions-meta-desc": "কুরআন সম্পর্কে আপনার বোধগম্যতা আরও গভীর করতে বিশ্বস্ত উত্তরগুলি অন্বেষণ করুন।" } diff --git a/locales/bn/quick-links.json b/locales/bn/quick-links.json index bdce907cb0..93f1858e1d 100644 --- a/locales/bn/quick-links.json +++ b/locales/bn/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "কুরআন সম্পর্কে", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "প্রতিফলনের রমজানে যোগ দিন", - "rahman": "Surah Ar-Rahman", - "sunnah": "সুন্নাহ সম্পর্কে আয়াত", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "কুরআন সম্পর্কে", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "কুরআনে যীশু", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "প্রতিফলনের রমজানে যোগ দিন", + "rahman": "Surah Ar-Rahman", + "sunnah": "সুন্নাহ সম্পর্কে আয়াত", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "রমজান কি?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/bn/quran-reader.json b/locales/bn/quran-reader.json index 33e398d80f..e3b436421c 100644 --- a/locales/bn/quran-reader.json +++ b/locales/bn/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "হিযবের সূচনা", "include-translator": "অনুবাদকের নাম অন্তর্ভুক্ত করবেন?", "juz-beginning": "জুজের শুরু", + "lessons-desc": "সূরা {{ayahNumber}} এর আয়াত {{surahName}} এর কুরআনের পাঠ পড়ুন এবং শেয়ার করুন", + "lessons-disclaimer": "পাঠগুলি হল ব্যক্তিগত অন্তর্দৃষ্টি এবং কুরআনের ব্যাখ্যা। এগুলিকে প্রামাণিক হিসেবে গ্রহণ করা উচিত নয়।", + "lessons-not-available": "এই আয়াতের জন্য কোন পর্যালোচিত পাঠ নেই।", "mad-2": "মাদ 2 সেকেন্ড", "mad-2-4-6": "অনুমোদিত মাদ 2 বা 4 বা 6 সেকেন্ড", "mad-4-5": "প্রয়োজনীয় মাদ ৪ বা ৫ সেকেন্ড", diff --git a/locales/bn/radio.json b/locales/bn/radio.json index 1b1289de43..79fca4530d 100644 --- a/locales/bn/radio.json +++ b/locales/bn/radio.json @@ -1,26 +1,27 @@ { - "change": "পরিবর্তন", - "curated-station": { - "juz-amma": { - "description": "কুরআনের শেষ জুজ শুনুন", - "title": "জুজ আম্মা" - }, - "popular-recitations": { - "description": "আবৃত্তির দৈনিক কিউরেটেড ফিড", - "title": "জনপ্রিয় আবৃত্তি" - }, - "surah-al-kahf": { - "description": "সূরা আলকাফ বারবার শুনুন", - "title": "সূরা আল কাহফ" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "তিলাওয়াতকারীদের কিউরেশন থেকে সূরাগুলো", - "title": "ইয়াসিন, আল-ওয়াকিয়া, আল-মুলক" - } + "change": "পরিবর্তন", + "curated-station": { + "juz-amma": { + "description": "কুরআনের শেষ জুজ শুনুন", + "title": "জুজ আম্মা" }, - "curated-stations": "কিউরেটেড স্টেশন", - "pause-radio": "রেডিও থামান", - "play-radio": "রেডিও চালান", - "radio-desc": "বিভিন্ন তেলাওয়াতকারীদের দ্বারা পবিত্র কুরআনের অবিরাম সুন্দর তেলাওয়াত শুনুন।", - "reciter-stations": "আবৃত্তিকারী স্টেশন" -} \ No newline at end of file + "popular-recitations": { + "description": "আবৃত্তির দৈনিক কিউরেটেড ফিড", + "title": "জনপ্রিয় আবৃত্তি" + }, + "surah-al-kahf": { + "description": "সূরা আলকাফ বারবার শুনুন", + "title": "সূরা আল কাহফ" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "তিলাওয়াতকারীদের কিউরেশন থেকে সূরাগুলো", + "title": "ইয়াসিন, আল-ওয়াকিয়া, আল-মুলক" + } + }, + "curated-stations": "কিউরেটেড স্টেশন", + "pause-radio": "রেডিও থামান", + "play-radio": "রেডিও চালান", + "radio-desc": "বিভিন্ন তেলাওয়াতকারীদের দ্বারা পবিত্র কুরআনের অবিরাম সুন্দর তেলাওয়াত শুনুন।", + "reciter-stations": "আবৃত্তিকারী স্টেশন", + "station": "স্টেশন" +} diff --git a/locales/bn/reading-goal.json b/locales/bn/reading-goal.json index 63fdb5707d..0983fbb07c 100644 --- a/locales/bn/reading-goal.json +++ b/locales/bn/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "পড়া চালিয়ে যান", - "continuous": { - "description": "আপনার লক্ষ্য কয়েক দিনের মধ্যে আপনার অগ্রগতি গণনা করবে", - "title": "একটি সময়কাল ধরে" - }, - "create-plan": "পরিকল্পনা তৈরি করুন", - "create-reading-goal": "লক্ষ্য তৈরি করুন", - "daily-progress": "দৈনিক অগ্রগতি", - "daily": { - "description": "আপনার লক্ষ্য প্রতিদিন পুনরায় সেট করা হবে", - "title": "প্রতিদিনের লক্ষ্য" - }, - "day-x": "দিন {{day}}", - "days": "দিন", - "duration": "সময়কাল (দিন)", - "ending-chapter": "শেষ সূরা", - "ending-verse": "আয়াত শেষ", - "examples-subtitle": "এখানে সাধারণ লক্ষ্যগুলির একটি তালিকা রয়েছে। আপনি নিজের লক্ষ্যও তৈরি করতে পারেন।", - "examples-title": "একটি পূর্বনির্ধারিত লক্ষ্য চয়ন করুন বা আপনার নিজের তৈরি করুন", - "examples": { - "custom": { - "description": "আপনার জন্য উপযুক্ত একটি কাস্টম লক্ষ্য সেট করুন", - "title": "কাস্টম" - }, - "khatm": { - "description": "একটি ক্লাসিক খতম গোল। প্রতিদিন 1 জুজ পড়ুন", - "title": "30 দিনে কুরআন পড়ুন" - }, - "time": { - "description": "একটি সহজ শিক্ষানবিস-বান্ধব লক্ষ্য", - "title": "প্রতিদিন 10 মিনিট পড়ুন" - }, - "year": { - "description": "পরের বছর নিজের গতিতে কুরআন পড়ুন", - "title": "এক বছরে কুরআন পড়ুন" - } - }, - "frequency-tab": { - "description": "আপনার লক্ষ্য কি প্রতিদিন বা প্রতি দিন রিসেট করা উচিত? চিন্তা করবেন না, আপনি যে ফ্রিকোয়েন্সি চয়ন করুন না কেন আমরা আপনার অগ্রগতি ট্র্যাক করব৷", - "title": "আপনার লক্ষ্যের জন্য একটি ফ্রিকোয়েন্সি চয়ন করুন" - }, - "goal-done": { - "description": "কোনো অতিরিক্ত পড়া এখনও রেকর্ড করা হবে", - "title": "আপনি আজকের লক্ষ্য পূরণ করেছেন" - }, - "goal-target": { - "description": "আপনার লক্ষ্য পূরণ করতে আপনার কত সময়, পৃষ্ঠা বা আয়াত পড়তে হবে?", - "title": "আপনার লক্ষ্যের জন্য একটি লক্ষ্য নির্ধারণ করুন" - }, - "goal-type": { - "description": "আপনার লক্ষ্য কি সময়, পৃষ্ঠা বা একটি কাস্টম পরিসরের উপর ভিত্তি করে হওয়া উচিত (অর্থাৎ, কুরআনের 3 জুজ)?", - "title": "আপনার লক্ষ্যের জন্য একটি মানদণ্ড চয়ন করুন" - }, - "goal-types": { - "pages": { - "description": "আপনার লক্ষ্য পেজ ভিত্তিক হবে", - "title": "পাতা" - }, - "range": { - "description": "আপনার লক্ষ্য হবে একটি কাস্টম রেঞ্জের আয়াতের উপর ভিত্তি করে (এটি একটি সূরা, একটি জুজ বা এমনকি পুরো কুরআন হতে পারে)", - "title": "কাস্টম পরিসীমা" - }, - "time": { - "description": "আপনার লক্ষ্য সময়ের উপর ভিত্তি করে হবে", - "title": "সময়" - } - }, - "plus-x-more-days": { - "one": "আরও {{days}} দিন", - "other": "আরও {{days}} দিন" - }, - "preview-schedule": { - "description": "এভাবেই আপনার লক্ষ্য দেখাবে। আপনি সর্বদা এটি পরে পরিবর্তন করতে পারেন।", - "title": "এখানে আপনার সময়সূচীর একটি পূর্বরূপ আছে" - }, - "progress": { - "complete": "আজকের লক্ষ্য সম্পূর্ণ 🎉", - "goal-complete": "আপনার লক্ষ্য সম্পূর্ণ 🎉", - "pages-goal": "কুরআনের {{pages}} পৃষ্ঠা পড়ুন", - "range-goal": "{{from}} থেকে {{to}} পড়ুন", - "time-goal": "কুরআন {{time}} পড়ুন" - }, - "reading-goal": "পড়ার লক্ষ্য", - "reading-goal-description": "আপনি কি আপনার কুরআন পাঠের লক্ষ্যগুলির সাথে সামঞ্জস্য বজায় রাখা কঠিন বলে মনে করেন? কুরআন গ্রোথ জার্নি হল একটি গতিশীল বৈশিষ্ট্য যা আপনাকে কুরআনের সাথে আপনার যাত্রায় সামঞ্জস্যপূর্ণ থাকতে সাহায্য করার জন্য তৈরি করা হয়েছে। আপনি প্রতিদিন 10 মিনিট পড়ার লক্ষ্য রাখুন, এক মাসে একটি জুজ সম্পূর্ণ করুন বা এক বছরে পুরো কুরআন শেষ করুন, ইত্যাদি, Quran.com এখন আপনাকে একটি কাস্টম লক্ষ্য সেট করতে এবং আপনার প্রতিদিনের পড়ার স্ট্রিকগুলি ট্র্যাক রাখতে সহায়তা করতে পারে, যখন আপনি অগ্রগতি হিসাবে সমন্বয়. এটি ব্যবহার করা সম্পূর্ণ বিনামূল্যে এবং আমরা আশা করি এটি আপনাকে আপনার লক্ষ্যে পৌঁছাতে অনুপ্রাণিত থাকতে সাহায্য করবে!", - "reading-goal-label": "আপনি একটি উপর আছেন", - "reading-goal-title": "কোরান গ্রোথ জার্নি প্রবর্তন", - "recommended": "প্রস্তাবিত", - "remaining": "আজকের জন্য বাকি", - "remaining-days": { - "one": "{{days}} দিন বাকি", - "other": "{{days}} দিন বাকি" - }, - "set-reading-goal-success": "আপনার পড়ার লক্ষ্য সফলভাবে সেট করা হয়েছে।", - "start-journey": "আপনার যাত্রা শুরু করুন!", - "start-reading": "পড়া শুরু করুন", - "starting-chapter": "সূরা শুরু", - "starting-verse": "শুরু করছি আয়াত", - "streak": "স্ট্রিক", - "streak-definition": "একটি স্ট্রীক হল আপনি পরপর কত দিন কুরআন পড়েছেন।", - "timeline-meaning": "আপনার টাইমলাইন মানে কি?", - "timeline-states": { - "checked": "আপনি আপনার লক্ষ্য পূরণ করেছেন", - "filled": "আপনি কিছু পড়েছেন কিন্তু আপনার লক্ষ্য পূরণ করার জন্য যথেষ্ট নয়", - "none": "সেদিন তুমি এখনো কিছু পড়নি", - "stroked": "তুমি আজ কিছু পড়নি" - }, - "todays-goal": "আজকের গোল", - "view-progress": "অগ্রগতি দেখুন", - "week-progress": "এই সপ্তাহের অগ্রগতি", - "x-days": { - "one": "{{days}} দিন", - "other": "{{days}} দিন" - }, - "x-days-streak": "{{days}} দিনের ধারা", - "x-hours": { - "one": "{{hours}} ঘন্টা", - "other": "{{hours}} ঘন্টা" - }, - "x-minutes": { - "one": "{{minutes}} মিনিট", - "other": "{{minutes}} মিনিট" - }, - "x-pages": { - "one": "{{pages}} পৃষ্ঠা", - "other": "{{pages}} পৃষ্ঠা" - }, - "x-seconds": { - "one": "{{seconds}} সেকেন্ড", - "other": "{{seconds}} সেকেন্ড" + "continue-reading": "পড়া চালিয়ে যান", + "continuous": { + "description": "আপনার লক্ষ্য কয়েক দিনের মধ্যে আপনার অগ্রগতি গণনা করবে", + "title": "একটি সময়কাল ধরে" + }, + "create-plan": "পরিকল্পনা তৈরি করুন", + "create-reading-goal": "লক্ষ্য তৈরি করুন", + "daily-progress": "দৈনিক অগ্রগতি", + "daily-progress-completed": "সম্পন্ন! 🎉", + "daily": { + "description": "আপনার লক্ষ্য প্রতিদিন পুনরায় সেট করা হবে", + "title": "প্রতিদিনের লক্ষ্য" + }, + "day-x": "দিন {{day}}", + "days": "দিন", + "duration": "সময়কাল (দিন)", + "ending-chapter": "শেষ সূরা", + "ending-verse": "আয়াত শেষ", + "examples-subtitle": "এখানে সাধারণ লক্ষ্যগুলির একটি তালিকা রয়েছে। আপনি নিজের লক্ষ্যও তৈরি করতে পারেন।", + "examples-title": "একটি পূর্বনির্ধারিত লক্ষ্য চয়ন করুন বা আপনার নিজের তৈরি করুন", + "examples": { + "custom": { + "description": "আপনার জন্য উপযুক্ত একটি কাস্টম লক্ষ্য সেট করুন", + "title": "কাস্টম" + }, + "khatm": { + "description": "একটি ক্লাসিক খতম গোল। প্রতিদিন 1 জুজ পড়ুন", + "title": "30 দিনে কুরআন পড়ুন" + }, + "time": { + "description": "একটি সহজ শিক্ষানবিস-বান্ধব লক্ষ্য", + "title": "প্রতিদিন 10 মিনিট পড়ুন" + }, + "year": { + "description": "পরের বছর নিজের গতিতে কুরআন পড়ুন", + "title": "এক বছরে কুরআন পড়ুন" + } + }, + "frequency-tab": { + "description": "আপনার লক্ষ্য কি প্রতিদিন বা প্রতি দিন রিসেট করা উচিত? চিন্তা করবেন না, আপনি যে ফ্রিকোয়েন্সি চয়ন করুন না কেন আমরা আপনার অগ্রগতি ট্র্যাক করব৷", + "title": "আপনার লক্ষ্যের জন্য একটি ফ্রিকোয়েন্সি চয়ন করুন" + }, + "goal-completed": "লক্ষ্য পূরণ! 🎉 ", + "goal-done": { + "description": "কোনো অতিরিক্ত পড়া এখনও রেকর্ড করা হবে", + "title": "আপনি আজকের লক্ষ্য পূরণ করেছেন" + }, + "goal-target": { + "description": "আপনার লক্ষ্য পূরণ করতে আপনার কত সময়, পৃষ্ঠা বা আয়াত পড়তে হবে?", + "title": "আপনার লক্ষ্যের জন্য একটি লক্ষ্য নির্ধারণ করুন" + }, + "goal-type": { + "description": "আপনার লক্ষ্য কি সময়, পৃষ্ঠা বা একটি কাস্টম পরিসরের উপর ভিত্তি করে হওয়া উচিত (অর্থাৎ, কুরআনের 3 জুজ)?", + "title": "আপনার লক্ষ্যের জন্য একটি মানদণ্ড চয়ন করুন" + }, + "goal-types": { + "pages": { + "description": "আপনার লক্ষ্য পেজ ভিত্তিক হবে", + "title": "পাতা" + }, + "range": { + "description": "আপনার লক্ষ্য হবে একটি কাস্টম রেঞ্জের আয়াতের উপর ভিত্তি করে (এটি একটি সূরা, একটি জুজ বা এমনকি পুরো কুরআন হতে পারে)", + "title": "কাস্টম পরিসীমা" + }, + "time": { + "description": "আপনার লক্ষ্য সময়ের উপর ভিত্তি করে হবে", + "title": "সময়" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "আরও {{days}} দিন", + "other": "আরও {{days}} দিন" + }, + "preview-schedule": { + "description": "এভাবেই আপনার লক্ষ্য দেখাবে। আপনি সর্বদা এটি পরে পরিবর্তন করতে পারেন।", + "title": "এখানে আপনার সময়সূচীর একটি পূর্বরূপ আছে" + }, + "progress": { + "complete": "আজকের লক্ষ্য সম্পূর্ণ 🎉", + "goal-complete": "আপনার লক্ষ্য সম্পূর্ণ 🎉", + "pages-goal": "কুরআনের {{pages}} পৃষ্ঠা পড়ুন", + "range-goal": "{{from}} থেকে {{to}} পড়ুন", + "time-goal": "কুরআন {{time}} পড়ুন" + }, + "reading-goal": "পড়ার লক্ষ্য", + "reading-goal-description": "আপনার কি কুরআন পাঠের লক্ষ্যের সাথে সামঞ্জস্য বজায় রাখা কঠিন বলে মনে হয়?

কুরআন গ্রোথ জার্নি হল একটি গতিশীল বৈশিষ্ট্য যা আপনাকে কুরআনের সাথে আপনার যাত্রায় ধারাবাহিক থাকতে সাহায্য করার জন্য তৈরি করা হয়েছে। আপনি প্রতিদিন ১০ মিনিট পাঠ করার লক্ষ্য রাখুন, এক মাসে একটি জুজ সম্পূর্ণ করুন, অথবা এক বছরে সম্পূর্ণ কুরআন শেষ করুন, ইত্যাদি, Quran.com এখন আপনাকে একটি কাস্টম লক্ষ্য নির্ধারণ করতে এবং আপনার প্রতিদিনের পাঠের ধারা ট্র্যাক রাখতে সাহায্য করতে পারে, পাশাপাশি আপনি অগ্রগতির সাথে সাথে সামঞ্জস্য করতে পারেন। এটি ব্যবহার করা সম্পূর্ণ বিনামূল্যে এবং আমরা আশা করি এটি আপনাকে আপনার লক্ষ্যে পৌঁছাতে অনুপ্রাণিত থাকতে সাহায্য করবে!", + "reading-goal-label": "আপনি একটি উপর আছেন", + "reading-goal-title": "কুরআন গ্রোথ জার্নির সাথে পরিচয় করিয়ে দিচ্ছি", + "recommended": "প্রস্তাবিত", + "remaining": "আজকের জন্য বাকি", + "remaining-base": "অবশিষ্ট", + "remaining-days": { + "one": "{{days}} দিন বাকি", + "other": "{{days}} দিন বাকি" + }, + "set-a-new-goal": "একটি নতুন লক্ষ্য নির্ধারণ করুন", + "set-reading-goal-success": "আপনার পড়ার লক্ষ্য সফলভাবে সেট করা হয়েছে।", + "start-journey": "আপনার যাত্রা শুরু করুন!", + "start-reading": "পড়া শুরু করুন", + "starting-chapter": "সূরা শুরু", + "starting-verse": "শুরু করছি আয়াত", + "streak": "স্ট্রিক", + "streak-definition": "একটি স্ট্রীক হল আপনি পরপর কত দিন কুরআন পড়েছেন।", + "timeline-meaning": "আপনার টাইমলাইন মানে কি?", + "timeline-states": { + "checked": "আপনি আপনার লক্ষ্য পূরণ করেছেন", + "filled": "আপনি কিছু পড়েছেন কিন্তু আপনার লক্ষ্য পূরণ করার জন্য যথেষ্ট নয়", + "none": "সেদিন তুমি এখনো কিছু পড়নি", + "stroked": "তুমি আজ কিছু পড়নি" + }, + "todays-goal": "আজকের গোল", + "view-progress": "অগ্রগতি দেখুন", + "week-progress": "এই সপ্তাহের অগ্রগতি", + "x-days": { + "one": "{{days}} দিন", + "other": "{{days}} দিন" + }, + "x-days-streak": "{{days}} দিনের ধারা", + "x-hours": { + "one": "{{hours}} ঘন্টা", + "other": "{{hours}} ঘন্টা" + }, + "x-minutes": { + "one": "{{minutes}} মিনিট", + "other": "{{minutes}} মিনিট" + }, + "x-pages": { + "one": "{{pages}} পৃষ্ঠা", + "other": "{{pages}} পৃষ্ঠা" + }, + "x-seconds": { + "one": "{{seconds}} সেকেন্ড", + "other": "{{seconds}} সেকেন্ড" + } +} diff --git a/locales/bn/support.json b/locales/bn/support.json index da529065bd..509a710443 100644 --- a/locales/bn/support.json +++ b/locales/bn/support.json @@ -1,27 +1,25 @@ { - "bug-a": "অনুগ্রহ করে এই বাগটি <0>এখানে<\/0> রিপোর্ট করুন এবং আমরা যত তাড়াতাড়ি সম্ভব এই বাগটি ঠিক করব ইনশাআল্লাহ।", - "bug-q": "আমি একটি অনুবাদ বাগ খুঁজে পেয়েছি, আমি এটি কোথায় ফাইল করব?", - "developer-a": "আরও তথ্যের জন্য অনুগ্রহ করে <0>বিকাশকারীদের পৃষ্ঠা<\/0>", - "developer-q": "আমি একজন ডেভেলপার। আমি কিভাবে অবদান রাখতে পারি?", - "donate-a": "প্রথমত, আমরা সত্যিই অবদান রাখার জন্য আপনার আগ্রহের প্রশংসা করি। অনুগ্রহ করে <0>এই<\/0> লিঙ্কে যান", - "donate-q": "আমি কিভাবে দান করতে পারি?", - "download-a": "দুর্ভাগ্যক্রমে না. আমরা এখনও আপনার কম্পিউটারে আমাদের ওয়েবসাইট বা কুরআন ডাউনলোড করার কার্যকারিতা প্রদান করি না। তবে অফলাইনে পড়ার জন্য আপনি আমাদের মোবাইল অ্যাপ ইনস্টল করতে পারেন।", - "download-q": "আমি কি আমার কম্পিউটারে Quran.com ডাউনলোড করতে পারি?", - "fiqh-a": "Quran.com একটি অনলাইন পঠন, শোনা এবং অধ্যয়নের সরঞ্জাম। Quran.com এর পিছনের দলটি সফটওয়্যার ইঞ্জিনিয়ার, ডিজাইনার এবং প্রোডাক্ট ম্যানেজারদের নিয়ে গঠিত। দুর্ভাগ্যবশত, এটি আমাদের দক্ষতার সীমাবদ্ধতা যা আমাদের দলে ইসলামী, ফিকাহ বা ফতোয়া সম্পর্কিত প্রশ্নে সহায়তা করার জন্য পণ্ডিত, ইমাম বা শেখ নেই। আমরা এই প্রশ্নের উত্তর দেওয়া থেকে বিরত থাকার চেষ্টা করি এবং আপনাকে পরামর্শ দিই যে আপনি আপনার স্থানীয় ইমামের সাথে বা একজন শেখের সাথে কথা বলুন।", - "fiqh-q": "ইসলামিক\/ফিকাহ\/ফতওয়া সংক্রান্ত প্রশ্ন", - "header": "সাহায্য এবং প্রতিক্রিয়া", - "main-desc": "আপনার প্রশ্নের উত্তর ইতিমধ্যেই দেওয়া হয়েছে কিনা তা দেখতে অনুগ্রহ করে প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন। প্রয়োজন হলে আপনি যা করতে পারেন <0>আমাদের সঙ্গে যোগাযোগ করুন<\/0> & আমরা যত তাড়াতাড়ি সম্ভব আপনাকে ফেরত পেতে আমাদের সাধ্যমত চেষ্টা করবো, কিন্তু ঠিক তাই আপনি কি জানেন আমরা করছি একটি ছোট দল এত সুন্দর হতে দয়া করে।", - "mobile-a": "হ্যাঁ! আরও তথ্যের জন্য অনুগ্রহ করে আমাদের <0>মোবাইল অ্যাপস পৃষ্ঠা<\/0>", - "mobile-q": "Quran.com এর কি মোবাইল অ্যাপ আছে?", - "other-languages-a": "আপনার পছন্দের ভাষা পরিবর্তন করতে, প্রতিটি পৃষ্ঠার উপরের ডানদিকে একটি ড্রপ ডাউন রয়েছে (ডান থেকে বাম ভাষার উপরের বাম কোণে)। আপনার পছন্দের ভাষা বেছে নিতে এই ড্রপডাউনটি ব্যবহার করুন।", - "other-languages-q": "আমি কি অন্য ভাষায় সাইট ব্রাউজ করতে পারি?", - "reciters-a": "এই আবৃত্তিকার সম্পর্কে আরও তথ্য জমা দিন <0>এখানে<\/0>", - "reciters-q": "আরো আবৃত্তিকারী যোগ করা হচ্ছে", - "site-down-a": "এটা ভালো না! যদি সাইটটি একেবারেই কাজ না করে বা সম্ভবত আপনি 'দুঃখিত, কিছু ভুল হয়েছে' টেক্সট সহ একটি সাদা স্ক্রীন দেখতে পান, আপনি যদি এটি <0>এখানে<\/0> রিপোর্ট করতে পারেন তবে আমরা এটির প্রশংসা করব।", - "site-down-q": "সাইট কাজ করছে না, কিভাবে বলবো?", - "support": "সমর্থন", - "tafsir-a": "হ্যাঁ, আমাদের কিছু তাফসির আছে। প্রতিটি আয়াতের পাশে প্রদর্শিত আইকনে ক্লিক করুন, তারপরে তাফিসারে ক্লিক করুন। অ্যাপ আপনাকে উপলব্ধ তাফসিরের তালিকা দেখাবে। আপনি যে তাফসির পড়তে চান তাতে ক্লিক করুন।", - "tafsir-q": "তাফসীর পাওয়া যায় কি?", - "translations-a": "একটি নতুন সংখ্যা খুলুন <0>এখানে<\/0> সমস্ত বিবরণ সহ, অনুবাদের লিঙ্ক এবং আমরা এটি যোগ করার জন্য যথাসাধ্য চেষ্টা করব।", - "translations-q": "অন্য অনুবাদ যোগ করুন" -} \ No newline at end of file + "bug-a": "অনুগ্রহ করে এই বাগটি <0>এখানে রিপোর্ট করুন এবং আমরা যত তাড়াতাড়ি সম্ভব এই বাগটি ঠিক করব ইনশাআল্লাহ।", + "bug-q": "আমি একটি অনুবাদ বাগ খুঁজে পেয়েছি, আমি এটি কোথায় ফাইল করব?", + "developer-a": "আরও তথ্যের জন্য অনুগ্রহ করে <0>বিকাশকারীদের পৃষ্ঠা", + "developer-q": "আমি একজন ডেভেলপার। আমি কিভাবে অবদান রাখতে পারি?", + "donate-a": "প্রথমত, আমরা সত্যিই অবদান রাখার জন্য আপনার আগ্রহের প্রশংসা করি। অনুগ্রহ করে <0>এই লিঙ্কে যান", + "donate-q": "আমি কিভাবে দান করতে পারি?", + "download-a": "দুর্ভাগ্যক্রমে না. আমরা এখনও আপনার কম্পিউটারে আমাদের ওয়েবসাইট বা কুরআন ডাউনলোড করার কার্যকারিতা প্রদান করি না। তবে অফলাইনে পড়ার জন্য আপনি আমাদের মোবাইল অ্যাপ ইনস্টল করতে পারেন।", + "download-q": "আমি কি আমার কম্পিউটারে Quran.com ডাউনলোড করতে পারি?", + "header": "সাহায্য এবং প্রতিক্রিয়া", + "main-desc": "আপনার প্রশ্নের উত্তর ইতিমধ্যেই দেওয়া হয়েছে কিনা তা দেখতে অনুগ্রহ করে প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন। প্রয়োজন হলে আপনি যা করতে পারেন <0>আমাদের সঙ্গে যোগাযোগ করুন & আমরা যত তাড়াতাড়ি সম্ভব আপনাকে ফেরত পেতে আমাদের সাধ্যমত চেষ্টা করবো, কিন্তু ঠিক তাই আপনি কি জানেন আমরা করছি একটি ছোট দল এত সুন্দর হতে দয়া করে।", + "mobile-a": "হ্যাঁ! অ্যাপসটি ডাউনলোড করতে দয়া করে <0>Android এর জন্য Quran অথবা <1>Quran iOS দেখুন।", + "mobile-q": "Quran.com এর কি মোবাইল অ্যাপ আছে?", + "other-languages-a": "আপনার পছন্দের ভাষা পরিবর্তন করতে, প্রতিটি পৃষ্ঠার উপরের ডানদিকে একটি ড্রপ ডাউন রয়েছে (ডান থেকে বাম ভাষার উপরের বাম কোণে)। আপনার পছন্দের ভাষা বেছে নিতে এই ড্রপডাউনটি ব্যবহার করুন।", + "other-languages-q": "আমি কি অন্য ভাষায় সাইট ব্রাউজ করতে পারি?", + "reciters-a": "এই আবৃত্তিকার সম্পর্কে আরও তথ্য জমা দিন <0>এখানে", + "reciters-q": "আরো আবৃত্তিকারী যোগ করা হচ্ছে", + "site-down-a": "এটা ভালো না! যদি সাইটটি একেবারেই কাজ না করে বা সম্ভবত আপনি 'দুঃখিত, কিছু ভুল হয়েছে' টেক্সট সহ একটি সাদা স্ক্রীন দেখতে পান, আপনি যদি এটি <0>এখানে রিপোর্ট করতে পারেন তবে আমরা এটির প্রশংসা করব।", + "site-down-q": "সাইট কাজ করছে না, কিভাবে বলবো?", + "support": "সমর্থন", + "tafsir-a": "হ্যাঁ, আমাদের কিছু তাফসির আছে। প্রতিটি আয়াতের পাশে প্রদর্শিত আইকনে ক্লিক করুন, তারপরে তাফিসারে ক্লিক করুন। অ্যাপ আপনাকে উপলব্ধ তাফসিরের তালিকা দেখাবে। আপনি যে তাফসির পড়তে চান তাতে ক্লিক করুন।", + "tafsir-q": "তাফসীর পাওয়া যায় কি?", + "translations-a": "একটি নতুন সংখ্যা খুলুন <0>এখানে সমস্ত বিবরণ সহ, অনুবাদের লিঙ্ক এবং আমরা এটি যোগ করার জন্য যথাসাধ্য চেষ্টা করব।", + "translations-q": "অন্য অনুবাদ যোগ করুন" +} diff --git a/locales/en/about.json b/locales/en/about.json index 91ab8e3a6d..aff21183cb 100644 --- a/locales/en/about.json +++ b/locales/en/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "This project wouldn't have been possible without the many open source libraries and projects we've used:", - "lokalize": "<0>Lokalize<\/0>: A computer-aided translation system that focuses on productivity and quality assurance and provides a seamless localization workflow.", - "quran-align": "<0>Collin Fair<\/0>: A tool for producing word-precise segmentation of recorded Qur'anic recitation.", - "quran-complex": "<0>QuranComplex<\/0>: King Fahd Glorious Qur'an Printing Complex is a leader in serving the Glorious Qur’an and its Sciences, translating its Meanings, and safeguarding the Qur’anic Text from distortion, through the optimal use of advanced technologies in the field of printing, audio recordings, electronic publishing and digital applications.", - "quran-enc": "<0>QuranEnc<\/0>: A portal featuring free and trustworthy translations of the meanings and exegeses of the noble Qur'an in many world languages.", - "tanzil": "<0>Tanzil<\/0>: An international Quranic project aimed at providing a highly-verified precise Quran text.", - "title": "Credits", - "vercel": "<0>Vercel<\/0>: is a deployment and collaboration platform for frontend developers which puts the frontend developer first, giving them comprehensive tools to build high-performance websites and applications.", - "zekr": "<0>Zekr<\/0>: An open platform Quran study tool for browsing and researching on the Quran" - }, - "main-description": "Quran.com was founded in 1995. The website aims to make it easy for anyone to read, study, and learn the Quran. The project is open source and is built as a collaboration between core team members and the <0>Tarteel team<\/0>." -} \ No newline at end of file + "credits": { + "desc": "We extend our gratitude to all those who have supported and contributed to this project, helping to make the Quran accessible to millions worldwide.", + "lokalize": "<0>Lokalize: A computer-aided translation system that focuses on productivity and quality assurance and provides a seamless localization workflow.", + "quran-align": "<0>Collin Fair: A tool for producing word-precise segmentation of recorded Qur'anic recitation.", + "quran-complex": "<0>QuranComplex: King Fahd Glorious Qur'an Printing Complex is a leader in serving the Glorious Qur'an and its Sciences, translating its Meanings, and safeguarding the Qur'anic Text from distortion, through the optimal use of advanced technologies in the field of printing, audio recordings, electronic publishing and digital applications.", + "quran-enc": "<0>QuranEnc: A portal featuring free and trustworthy translations of the meanings and exegeses of the noble Qur'an in many world languages.", + "tanzil": "<0>Tanzil: An international Quranic project aimed at providing a highly-verified precise Quran text.", + "tarteel": "<0>Tarteel: An AI-powered Quran memorization app. It's designed to help you memorize smarter, whether you're searching for a verse, tracking your progress, or following along with your recitation.", + "title": "Credits", + "vercel": "<0>Vercel: is a deployment and collaboration platform for frontend developers which puts the frontend developer first, giving them comprehensive tools to build high-performance websites and applications.", + "zekr": "<0>Zekr: An open platform Quran study tool for browsing and researching on the Quran" + }, + "global-effort": { + "desc": "Millions of people from all over the world rely on Quran.com as their primary digital Quran resource. Whether they come to recite, reflect, memorize, or study, they share a common purpose: a sincere desire to connect with the words of Allah.\\nAs we continue to grow, we remain committed to ensuring that Quran.com remains a trusted, accessible, and beautifully designed space for anyone seeking to engage with the Quran.", + "title": "A Global Effort" + }, + "key-features": { + "desc": "Quran.com is designed to support every stage of engagement with the Quran—from reading and memorization to study and reflection. Our features include:", + "features": [ + "User-Friendly Quran Interface– A clean and intuitive reading experience on any device.", + "Multiple Translations & Tafsir – Access to translations in multiple languages, along with tafsir.", + "Audio Recitations – Listen to high-quality recitations from world-renowned Qaris, with the ability to follow along word by word.", + "Advanced Search & Navigation – Find verses instantly by topic or keywords across the entire Quran.", + "Ayah Bookmarking & Notes – Save verses and write personal reflections for later reference.", + "QuranReflect Integration – Engage with a global community through reflections and insights shared by scholars and individuals.", + "Reading Progress Tracking and Goals – Keep track of your daily goals and reading history", + "APIs for Developers – Free access to content and features to power Islamic apps and R&D.", + "And much more, Alhamdullilah." + ], + "title": "Key Features & Offerings" + }, + "main-description": "Since its founding in 1995, Quran.com has been committed to making the Quran available to everyone in a way that is clear, authentic, and easy to engage with. Every day, millions of people worldwide turn to Quran.com to read, listen, study, and reflect on the Quran—whether they are lifelong students, scholars, or just beginning their journey.", + "our-mission": { + "desc": "The Quran is meant to be read, understood, and reflected upon. Our mission is to remove barriers to access and empower individuals and communities by providing a reliable, well-designed, and deeply enriching Quranic experience. We aim to serve as a trusted source for anyone seeking to engage with the Quran, guided by the principles of accuracy, clarity, and sincerity.", + "title": "Our Mission" + }, + "who-we-are": { + "desc": "Quran.com is a waqf (endowment), established as a public trust to ensure that the Quran remains accessible to all, free of charge and without commercial interests. It is managed by Quran.Foundation, a 501(c)(3) nonprofit organization, which sustains and develops Quran.com as part of its mission to provide high-quality, authentic Quranic resources to the world. Our commitment is to serve the Quran and its readers with excellence, sincerity, and responsibility.", + "title": "Who We Are" + } +} diff --git a/locales/en/apps.json b/locales/en/apps.json index 9282d45f97..b5f3f3dd72 100644 --- a/locales/en/apps.json +++ b/locales/en/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "By the core developers of Quran.com, comes the beautiful and ad-free mushaf iOS and Android apps. It’s now easier to read the Quran on the go, memorize it, and listen to your favorite reciters.", - "tarteel-desc": "Tarteel is the first Quran app to use AI tools to interact with your recitation and highlight mistakes. A voice-led Quran companion in the palm of your hands, Tarteel works intuitively to help you read, recite, memorize and understand the Quran with confidence!<0><\/0><0><\/0>Tarteel is proud to be a core developer of Quran.com as well as a member of their board of governance." -} \ No newline at end of file + "quran-desc": "By the core developers of Quran.com, comes the beautiful and ad-free mushaf iOS and Android apps. It’s now easier to read the Quran on the go, memorize it, and listen to your favorite reciters." +} diff --git a/locales/en/common.json b/locales/en/common.json index e1d6306438..1767258df3 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -6,13 +6,13 @@ "auth-onboarding": { "data-sync": { "action": "Next", - "description": "Whether you’re using Quran.com on your phone or your laptop, your bookmarks, last read verses, and your preferences will be available", + "description": "Whether you're using Quran.com on your phone or your laptop, your bookmarks, last read verses, and your preferences will be available", "title": "Your data will be synced

across devices" }, "feedback": { "action": "Okay, got it", "description": "Thank you for using Quran.com and we would be glad to hear your feedback on feedback.quran.com", - "title": "We wanna hear your thoughts" + "title": "We want to hear your thoughts" }, "quran-foundation-link": { "action": "Next", @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigations", "no-nav-results": "No navigation results", - "placeholder": "What do you want to read?", - "powered-by": "Voice search powered by Tarteel.ai", + "placeholder": "Search the Quran...", "recent-navigations": "Recent navigations", "search-by-voice": "Search by voice", "try-navigating": "Try navigating to" @@ -122,9 +121,11 @@ } }, "continue": "Continue", + "contribute-to-our-mission": "Contribute to our mission", "copied": "Copied", "copied-to-clipboard": "Copied to clipboard", "copy": "Copy", + "copylink": "Copy link", "counter": { "decrease": "Decrease", "increase": "Increase" @@ -134,6 +135,7 @@ "developers": "Developers", "display": "Display", "donate": "Donate", + "donate-now": "Donate now", "donate_monthly": "Donate monthly", "donate_once": "Donate once", "edit": "Edit", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} Ayahs", "ranges-wrong-order": "The starting verse has to be before the ending verse." }, + "errors": { + "account-banned": "Sorry, Your account is banned. Contact Quran.Foundation", + "badRequest": "*Invalid request", + "banned": "*Sorry, Your account is banned. Contact Quran.Foundation", + "confirm": "*Confirm password doesn't match the password", + "email": "*Invalid Email Format!", + "exactLength": "*Value must be exact length", + "expiredToken": "*This token is expired", + "forgot-password-failed": "Failed to send password reset email. Please try again.", + "immutable": "*This value cannot be changed", + "invalid": "*This {{fieldName}} is invalid", + "invalidEmailOrPassword": "*Invalid email or password", + "max": "*{{fieldName}} must be less than or equal to {{max}} digits", + "min": "*{{fieldName}} must be more than or equal to {{min}} digits", + "name": "*{{fieldName}} should be letters and numbers only", + "notFound": "*Not found", + "required": "*{{fieldName}} is missing!", + "reset-password-failed": "Failed to reset password. Please try again.", + "signin-failed": "Signin failed. Please try again.", + "signup-failed": "Signup failed. Please try again.", + "taken": "*{{fieldName}} already exists!", + "usedToken": "*This token already used", + "username": "*{{fieldName}} accept underscore and letters only", + "verification-code-invalid": "This verification code is invalid", + "verification-code-length": "Verification code must be {{length}} digits", + "verification-failed": "Verification failed. Please try again.", + "verification-resend-failed": "Failed to resend verification code" + }, "exciting-updates": "Exciting Updates", "feedback": "Feedback", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Translation font size" }, "footer": { - "description": "Quran.com is a Sadaqah Jariyah. We hope to make it easy for everyone to read, study, and learn The Noble Quran. The Noble Quran has many names including Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr, and Al-Noor.", + "description": "Quran.com is a trusted platform used by millions worldwide to read, search, listen to, and reflect on the Quran in multiple languages. It provides translations, tafsir, recitations, word-by-word translation, and tools for deeper study, making the Quran accessible to everyone.

As a Sadaqah Jariyah, Quran.com is dedicated to helping people connect deeply with the Quran. Supported by Quran.Foundation, a 501(c)(3) non-profit organization, Quran.com continues to grow as a free and valuable resource for all, Alhamdullilah”", "hiring": "We're hiring! Join the QuranFoundation team and contribute to our mission. Apply now!", "rights": "All Rights Reserved", - "title": "Read, study, and learn The Noble Quran." + "title": "Read, Listen, Search, and Reflect on the Quran" }, "form": { "body": "Body", "code": "Verification Code", + "confirm-password": "Confirm Password", "email": "Email", "firstName": "First Name", "lastName": "Last Name", - "title": "Title" + "password": "Password", + "title": "Title", + "username": "Username", + "verification-code": "Verification Code" }, "from": "From", + "fundraising-share-title": "Share Quran.com Fundraising", "fundraising-sticky-banner": { "cta": "Donate", "title": "Give during the best days!" @@ -217,6 +252,7 @@ "learn-more": "Learn more", "learning-plans": "Learning Plans", "less": "Less", + "lessons": "Lessons", "loading": "Loading", "login": "Login", "logout": "Logout", @@ -250,6 +286,7 @@ "off": "Off", "oldest": "Oldest", "on": "On", + "our-projects": "Our Projects", "page": "Page", "pages": "Pages", "pagination-summary": "{{currentResultNumber}}-{{endOfResultNumber}} of {{totalNumberOfResults}} search results", @@ -272,6 +309,7 @@ "privacy": "Privacy", "product-updates": "Product Updates", "profile": "Profile", + "projects-desc": "Non-profit projects owned, managed, or sponsored by Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "Quran Radio", @@ -287,6 +325,7 @@ "reciters": "Reciters", "reflect": "Reflect", "reflections": "Reflections", + "reflections-and-lessons": "Reflections & Lessons", "remove": "Remove", "rename": "Rename", "retry": "Retry", @@ -296,10 +335,12 @@ "save-to-collection": "Save to Collection", "search-for": "Search for '{{searchQuery}}'", "search-results": "{{count}} search results", + "search-results-no-count": "Search Results", "search": { "filters": "Filters", "hint": "Try searching for", "jump-to": "Jump To", + "more-results": "More results", "no-results": "No results found", "no-results-suggestion": "We could not find any matching search results for \"{{searchQuery}}\". try searching for a different keyword.", "popular": "Popular searches", @@ -340,8 +381,10 @@ "search-juz": "Search Juz", "search-page": "Search Page", "search-surah": "Search Surah", + "search-verse": "Search Verse", "try-navigating-with": "Tip: try navigating with" }, + "sign-in": "Sign in", "sitemap": "Sitemap", "sort": { "ascending": "Ascending", @@ -362,10 +405,6 @@ "tafsirs-desc": "Read various Tafsirs of Ayah {{ayahNumber}} of Surah {{surahName}} by trusted Tafsir scholars", "title": "Tafsir" }, - "tarteel": { - "app": "Tarteel app", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Terms and Conditions", "theme": "Theme", "themes": { @@ -400,9 +439,9 @@ "view": "View", "voice": { "ask-permission": "Please enable microphone permission to start using Voice Search", - "error": "An error has occurred, please try again later. Or download the ", - "no-permission": "It looks like you do not have the microphone permissions enabled. Please enable the microphone permissions and try again or download the ", - "not-supported": "It looks like your browser does not support microphone. Please try a different browser or download the ", + "error": "An error has occurred, please try again later.", + "no-permission": "It looks like you do not have the microphone permissions enabled. Please enable the microphone permissions and try again.", + "not-supported": "It looks like your browser does not support microphone. Please try a different browser.", "suggest": "Please begin reciting and your verse will appear.", "suggest-subtitle": "Recite any verse in Arabic, and the verse will appear", "suggest-title": "Recite now", diff --git a/locales/en/developers.json b/locales/en/developers.json index b9b2037125..e379a19514 100644 --- a/locales/en/developers.json +++ b/locales/en/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Quran.com team", - "header": "Development Help", - "issues-cta": "Should you have any questions or want to contact maintainers, just write an issue. We will get back to you as soon as we can, insha'Allah.", - "issues-guide": "Typically we use <0>Github projects<\/0> as the source for what to work on next, what's coming up and what bugs exist that need to be solved. For example <1>this url<\/1> has list of bugs, things we need help with, and upcoming features.", - "main-desc": "Thank you for your interest in helping us develop Quran.com and its projects. We are excited to work with you!", - "projects": { - "all": "We have a number of projects all hosted on Github. You can find them all <0>here<\/0>. But to outline them:", - "q-android": "<0>Quran Android<\/0> - written in Kotlin and Java.", - "q-api": "<0>Quran.com API<\/0> - written in Ruby on Rails.", - "q-api-docs": "<0>Quran.com API Docs<\/0> - Our API docs portal.", - "q-audio": "<0>Quranic Audio<\/0> and <1>Quranic Audio mobile apps<\/1>", - "q-audio-segments": "<0>Quran Audio Segments<\/0>", - "q-ios": "<0>Quran iOS<\/0> - written in Swift.", - "q-next": "<0>Quran.com Frontend<\/0> - written in Next.js.", - "q-v2": "<0>Quran.com<\/0> - written in Ruby on Rails." - }, - "sub-main-desc": "We are a team of developers, designers, product managers and thinkers working in collaboration with the <0>Tarteel<\/0> team to deliver the best online Quran reading experience. Alhamdulilah we have been blessed to work for some great companies around the world - and feel that this is the least we can do to help our Ummah move forward in learning and studying their religion. Working on Quran.com is very gratifying and may Allah reward us all (and reward you) for our efforts.", - "thanks": "We look forward your contribution!" -} \ No newline at end of file + "footer": "- Quran.com team", + "header": "Development Help", + "issues-cta": "Should you have any questions or want to contact maintainers, just write an issue. We will get back to you as soon as we can, insha'Allah.", + "issues-guide": "Typically we use <0>Github projects as the source for what to work on next, what's coming up and what bugs exist that need to be solved. For example <1>this url has list of bugs, things we need help with, and upcoming features.", + "main-desc": "Thank you for your interest in helping us develop Quran.com and its projects. We are excited to work with you!", + "projects": { + "all": "We have a number of projects all hosted on Github. You can find them all <0>here. But to outline them:", + "q-android": "<0>Quran Android - written in Kotlin and Java.", + "q-api": "<0>Quran.com API - written in Ruby on Rails.", + "q-api-docs": "<0>Quran.com API Docs - Our API docs portal.", + "q-audio": "<0>Quranic Audio and <1>Quranic Audio mobile apps", + "q-audio-segments": "<0>Quran Audio Segments", + "q-ios": "<0>Quran iOS - written in Swift.", + "q-next": "<0>Quran.com Frontend - written in Next.js.", + "q-v2": "<0>Quran.com - written in Ruby on Rails." + }, + "thanks": "We look forward your contribution!" +} diff --git a/locales/en/home.json b/locales/en/home.json index 407d7d407e..74f0e49eaf 100644 --- a/locales/en/home.json +++ b/locales/en/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Achieve Your Quran Goals", + "begin": "Begin", + "chapters-and-verses": "Chapters and Verses", + "continue-read": "Continue Reading", + "explore-topics": "Explore Topics", + "first-time-reading": "New to the Quran? Start here", + "know-someone": "Grow with us this Ramadan", + "learning-plan": "Learning Plans", + "listen-to-radio": "Listen to Quran Radio", + "my-quran": "My Quran", + "navigate-quran": "Navigate Quran", "no-bookmarks": "You do not have any bookmarks yet", "no-recently-read": "You do not have any reading sessions yet", "noble-quran": "The Noble Quran", + "popular": "Popular", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Quran Growth Journey" }, - "ramadan-activities-cta": "Follow the Global Quranic Calendar<\/b> for weekly readings, inspiring podcasts, and a call to reflect!<\/link>", + "qr-community": "Read today’s featured Verses and Reflections", + "ramadan-activities-cta": "Follow the Global Quranic Calendar for weekly readings, inspiring podcasts, and a call to reflect!", + "ramadan": { + "header": "Tools to Deepen Your Connection with the Quran", + "title": "Ready for Ramadan?" + }, "read-juz": "Read Juz", "recently-read": "Recently Read", - "revelation-order-disclaimer": "This view shows the chronological order of Surahs in the Quran based on when they were revealed to the Prophet Muhammad ﷺ<\/hover>. The chronology is a subject of scholarly opinion and some Surahs were revealed in parts at different times. The ordering here is based on the work of Tanzil.net<\/link>. [Note: the compiled Mushaf order from al-Fatiha to al-Nas is a matter of consensus.]", + "revelation-order-disclaimer": "This view shows the chronological order of Surahs in the Quran based on when they were revealed to the Prophet Muhammad . The chronology is a subject of scholarly opinion and some Surahs were revealed in parts at different times. The ordering here is based on the work of Tanzil.net. [Note: the compiled Mushaf order from al-Fatiha to al-Nas is a matter of consensus.]", + "see-more-learning-plans": "See More", + "set-custom-goal": "Set a Goal", + "share-quran": { + "description": "Help spread the Quran to new learners", + "title": "Share the Quran!" + }, + "start-read": "Start Reading", + "stay-consistent": "Track Streaks, Create Custom Goals, Stay Consistent", "tab": { "bookmarks": "Bookmarks", "popular": "Popular" diff --git a/locales/en/learn.json b/locales/en/learn.json index 3fb7616e06..845d28d216 100644 --- a/locales/en/learn.json +++ b/locales/en/learn.json @@ -24,19 +24,24 @@ "feedback-success": "Thank you for your feedback!", "your-feedback": "Your Feedback" }, + "help-about-reflection": "Help about reflection feature", "learn-duration": "Duration", + "learn-more": "Learn more", "learning-plan-material": "Learning Plan Material", "learning-plan-meta-desc": "This Learning Plan will help transform the way you engage with the Quran, begin your journey today!", "learning-plans-desc": "Boost your knowledge with easy-to-follow lessons that keep you growing in your journey with the Quran.

Start a Learning Plan today! Your progress is tracked until you reach the finish line.", - "learning-plans-meta-desc": "Quran.com’s Learning Plans will help transform the way you engage with the Quran. Explore our collection of curated lessons and begin your journey today!", + "learning-plans-meta-desc": "Quran.com's Learning Plans will help transform the way you engage with the Quran. Explore our collection of curated lessons and begin your journey today!", "mark-complete": "Mark as completed", "mark-complete-success": "Lesson has been marked as complete successfully!", "next-lesson": "Next Lesson", "not-enrolled": "You are not enrolled in the Learning Plan yet.", "prev-lesson": "Previous Lesson", + "reflection-description-1": "Clicking \"Add Reflection\" will take you to QuranReflect, a platform for sharing personal reflections on the Quran. Unlike Tafsir (scholarly interpretation), reflections are personal insights and experiences related to the verses.", + "reflection-description-2": "If you post publicly, your reflection will be reviewed by the moderation team and become visible to the QuranReflect community.", "start-learning": "Start Learning", "tabs": { "main": "Main Details", "syllabus": "Syllabus" - } + }, + "what-happens-when-you-click-add-reflection": "What happens when you click \"Add Reflection\"?" } diff --git a/locales/en/login.json b/locales/en/login.json index ca038199c6..47ddb8bc3b 100644 --- a/locales/en/login.json +++ b/locales/en/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Awaiting Confirmation", + "back": "Back", + "back-to-login": "Back to Login", + "check-email-title": "Check email to complete sign up", + "confirm": "Confirm", + "confirm-new-password-placeholder": "Confirm new password", + "confirm-password-placeholder": "Confirm password", + "continue": "Continue", "continue-apple": "Continue with Apple", "continue-email": "Continue with Email", "continue-facebook": "Continue with Facebook", "continue-google": "Continue with Google", - "email-placeholder": "Email Address", + "email-placeholder": "Email address", + "error": { + "email-required": "Email is missing!", + "invalid-credentials": "Invalid Email or password", + "invalid-email": "Invalid Email Format!", + "login-failed": "Login failed. Please try again.", + "password-required": "Password is missing!" + }, + "errors": { + "account-banned": "Sorry, Your account is banned. Contact Quran.Foundation", + "badRequest": "*Invalid request", + "banned": "*Sorry, Your account is banned. Contact Quran.Foundation", + "confirm": "*Confirm password doesn't match the password", + "email": "*Invalid Email Format!", + "exactLength": "*Value must be exact length", + "expiredToken": "*This token is expired", + "forgot-password-failed": "Failed to send password reset email. Please try again.", + "immutable": "*This value cannot be changed", + "invalid": "*This {{fieldName}} is invalid", + "invalidEmailOrPassword": "*Invalid email or password", + "max": "*{{fieldName}} must be less than or equal to {{max}} digits", + "min": "*{{fieldName}} must be more than or equal to {{min}} digits", + "name": "*{{fieldName}} should be letters and numbers only", + "notFound": "*Not found", + "required": "*{{fieldName}} is missing!", + "reset-password-failed": "Failed to reset password. Please try again.", + "signin-failed": "Signin failed. Please try again.", + "signup-failed": "Signup failed. Please try again.", + "taken": "*{{fieldName}} already exists!", + "usedToken": "*This token already used", + "username": "*{{fieldName}} accept underscore and letters only", + "verification-code-invalid": "This verification code is invalid", + "verification-code-length": "Verification code must be {{length}} digits", + "verification-failed": "Verification failed. Please try again.", + "verification-resend-failed": "Failed to resend verification code" + }, "feature-1": "Track your goals", "feature-2": "Maintain reading streaks", "feature-3": "Create collections", "feature-4": "Sync your data across browsers", "feature-5": "And more!", - "feature-6": "New! Notes & Reflections", - "login-cta": "Log-in or Sign up now:", + "feature-6": "New! Notes & Reflections", + "first-name-placeholder": "First Name", + "forgot-password": "Forgot password", + "forgot-password-description": "Enter your email address and we'll send you instructions to reset your password.", + "forgot-password-success": "Password reset email sent! Please check your inbox.", + "forgot-password-title": "Forgot password?", + "last-name-placeholder": "Last Name", + "login-cta": "Sign in or Sign up now:", "login-error": { "AuthenticationError": "Authentication failed. Please try again later", + "BannedUserError": "Sorry, Your account is banned. Contact Quran.Foundation.", "TokenExpiredError": "You have been logged out, please login again." }, "login-title": "Login to Quran.com", + "new-password-placeholder": "New password", "other-options": "Other Login Options", + "password-placeholder": "Password", + "password-reset-success": "Password reset successfully!", + "password-rules": { + "lowercase": "At least one lowercase letter", + "max-length": "Max 20 characters", + "min-length": "Min 8 characters", + "number": "At least one number", + "special": "At least one special character (!@#$%^&*_-)", + "uppercase": "At least one uppercase letter" + }, "privacy-policy": "Protecting your privacy is our priority – By signing up, you consent to our Privacy Policy and Terms and conditions.", - "verify-code": "Verify that the provided security code matches the following text:" + "quran-text": "Quran", + "quran-title": "Quran.com", + "reflect-feature-1": "Reflect on the Quran", + "reflect-feature-2": "Join Groups", + "reflect-feature-3": "Interact with others", + "reflect-feature-4": "And more!", + "reset-password": "Reset Password", + "reset-password-success": "Password reset successfully!", + "set-new-password": "Set a new password", + "sign-in": "Sign in", + "sign-in-or-sign-up": "Sign in or Sign up", + "sign-up": "Sign up", + "unified-registration-1": "The unified registration of ", + "unified-registration-2": "Quran.Foundation", + "unified-registration-3": ". You will have access to the following websites ", + "unified-registration-4": "through your sign in details.", + "username-placeholder": "Username", + "verification-code-instruction": "Please enter the code provided in the email to complete sign up", + "verification-code-resend": "Resend email", + "verification-code-resend-countdown": "Resend verification email in {{seconds}} sec...", + "verification-code-sent": "Verification code sent!", + "verification-code-sent-to": "We just sent an email to", + "verification-code-spam-note": "Didn't receive an email? Check your spam folder", + "verify-code": "Verify that the provided security code matches the following text:", + "welcome-description-1": "The unified registration of", + "welcome-description-2": ".Foundation", + "welcome-description-3": "You will have access to the following websites through your sign in details.", + "welcome-title": "Welcome to" } diff --git a/locales/en/onboarding.json b/locales/en/onboarding.json index 525dd5fef1..43ba0b417c 100644 --- a/locales/en/onboarding.json +++ b/locales/en/onboarding.json @@ -87,10 +87,6 @@ "description": "Choose from a variety of translations in multiple languages. Tip: Compare translations by selecting multiple options", "title": "Translations" }, - "voice-search": { - "description": "Tap the mic icon and recite the verse you are searching for. Quick Tip! To discover where someone is reciting (Eg. Taraweeh prayers), tap the mic icon. After one or two verses are detected, press stop to find the location", - "title": "Voice Search (Tarteel)" - }, "wbw-audio": { "description": "Select this option to listen to every word individually by simply clicking on the word!", "title": "Listen to the word-by-word transliteration by clicking on word" diff --git a/locales/en/question.json b/locales/en/question.json index d0251a2465..32015af410 100644 --- a/locales/en/question.json +++ b/locales/en/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Questions and Answers related to ", - "question": "Question" + "question": "Question", + "questions-meta-desc": "Explore trusted answers to deepen your understanding of the Quran." } diff --git a/locales/en/quick-links.json b/locales/en/quick-links.json index 852ac1c5ce..930dbb1ec9 100644 --- a/locales/en/quick-links.json +++ b/locales/en/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "About The Quran", "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jesus in the Quran", "kahf": "Al Kahf", "mulk": "Al Mulk", "muzzammil": "Al Muzzammil", @@ -8,5 +9,6 @@ "rahman": "Ar-Rahman", "sunnah": "Verses about the Sunnah", "waqiah": "Al Waqi'ah", + "what-is-ramadan": "What is Ramadan?", "yaseen": "Yaseen" } diff --git a/locales/en/quran-reader.json b/locales/en/quran-reader.json index c353f98b50..5dbeb69868 100644 --- a/locales/en/quran-reader.json +++ b/locales/en/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Beginning of Hizb", "include-translator": "Include translator name?", "juz-beginning": "Beginning of Juz", + "lessons-desc": "Read and share Quranic lessons of Ayah {{ayahNumber}} of Surah {{surahName}}", + "lessons-disclaimer": "Lessons are personal insights and interpretations of the Quran. They are not meant to be taken as authoritative.", + "lessons-not-available": "There are no reviewed lessons for this ayah", "mad-2": "Normal madd (2)", "mad-2-4-6": "Separated madd (2/4/6)", "mad-4-5": "Connected madd (4/5)", diff --git a/locales/en/radio.json b/locales/en/radio.json index 26381d717e..4901756ee0 100644 --- a/locales/en/radio.json +++ b/locales/en/radio.json @@ -1,26 +1,27 @@ { - "change": "Change", - "curated-station": { - "juz-amma": { - "description": "Listen to the final Juz of the Quran", - "title": "Juz Amma" - }, - "popular-recitations": { - "description": "Daily curated feed of recitations", - "title": "Popular Recitations" - }, - "surah-al-kahf": { - "description": "Listen to Surah Alkahf on repeat", - "title": "Surah Al-Kahf" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "The Surahs from a curation of reciters", - "title": "Yaseen, Al-Waqiah, Al-Mulk" - } + "change": "Change", + "curated-station": { + "juz-amma": { + "description": "Listen to the final Juz of the Quran", + "title": "Juz Amma" }, - "curated-stations": "Curated Stations", - "pause-radio": "Pause Radio", - "play-radio": "Play Radio", - "radio-desc": "Listen to non-stop beautiful recitation of the Holy Quran by various reciters.", - "reciter-stations": "Reciter Stations" -} \ No newline at end of file + "popular-recitations": { + "description": "Daily curated feed of recitations", + "title": "Popular Recitations" + }, + "surah-al-kahf": { + "description": "Listen to Surah Alkahf on repeat", + "title": "Surah Al-Kahf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "The Surahs from a curation of reciters", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Curated Stations", + "pause-radio": "Pause Radio", + "play-radio": "Play Radio", + "radio-desc": "Listen to non-stop beautiful recitation of the Holy Quran by various reciters.", + "reciter-stations": "Reciter Stations", + "station": "Station" +} diff --git a/locales/en/reading-goal.json b/locales/en/reading-goal.json index 2db41d02c5..f29690330a 100644 --- a/locales/en/reading-goal.json +++ b/locales/en/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Continue Reading", - "continuous": { - "description": "Your goal will calculate your progress over a duration of days", - "title": "Over a duration" - }, - "create-plan": "Create plan", - "create-reading-goal": "Create Goal", - "daily-progress": "Daily Progress", - "daily": { - "description": "Your goal will reset every day", - "title": "Daily goal" - }, - "day-x": "Day {{day}}", - "days": "Days", - "duration": "Duration (days)", - "ending-chapter": "Ending Surah", - "ending-verse": "Ending Ayah", - "examples-subtitle": "Here is a list of common goals. You can also create your own goal.", - "examples-title": "Pick a preset goal or create your own", - "examples": { - "custom": { - "description": "Set a custom goal that suits you", - "title": "Custom" - }, - "khatm": { - "description": "A classic Khatm goal. Read 1 Juz a day", - "title": "Read the Quran in 30 days" - }, - "time": { - "description": "A simple beginner-friendly goal", - "title": "Read 10 minutes a day" - }, - "year": { - "description": "Read the Quran at your own pace over the next year", - "title": "Read the Quran in a year" - } - }, - "frequency-tab": { - "description": "Should your goal reset every day or every number of days? Don't worry, we will track your progress regardless of the frequency you choose.", - "title": "Choose a frequency for your goal" - }, - "goal-done": { - "description": "Any additional reading will still be recorded", - "title": "You completed today's goal" - }, - "goal-target": { - "description": "How much time, pages, or verses should you read to complete your goal?", - "title": "Set a target for your goal" - }, - "goal-type": { - "description": "Should your goal be based on time, pages, or a custom range (i.e., 3 Juzs of the Quran)?", - "title": "Choose a criteria for your goal" - }, - "goal-types": { - "pages": { - "description": "Your goal will be based on pages", - "title": "Pages" - }, - "range": { - "description": "Your goal will be based on a custom range of verses (this can be a Surah, a Juz, or even the whole Quran)", - "title": "Custom range" - }, - "time": { - "description": "Your goal will be based on time", - "title": "Time" - } - }, - "plus-x-more-days": { - "one": "+{{days}} more day", - "other": "+{{days}} more days" - }, - "preview-schedule": { - "description": "This is how your goal will look like. You can always change it later.", - "title": "Here is a preview of your schedule" - }, - "progress": { - "complete": "Today's goal is complete 🎉", - "goal-complete": "Your whole goal is complete 🎉", - "pages-goal": "read {{pages}} pages of the Quran", - "range-goal": "read {{from}} to {{to}}", - "time-goal": "read {{time}} of the Quran" - }, - "reading-goal": "Reading Goal", - "reading-goal-description": "Do you find it challenging to maintain consistency with your Quran reading goals?Quran Growth Journey is a dynamic feature developed to help you remain consistent on your journey with the Quran. Whether you aim to read 10 minutes a day, complete a Juz in a month, or finish the entire Quran in a year, etc., Quran.com can now help you set a custom goal and keep track of your daily reading streaks, while adjusting as you make progress. It is completely free to use and we hope it will help you stay motivated to reach your goal!", - "reading-goal-label": "You're on a", - "reading-goal-title": "Introducing Quran Growth Journey", - "recommended": "Recommended", - "remaining": "Remaining for today", - "remaining-days": { - "one": "{{days}} day remaining", - "other": "{{days}} days remaining" - }, - "set-reading-goal-success": "Your reading goal has been set successfully.", - "start-journey": "Start your journey!", - "start-reading": "Start Reading", - "starting-chapter": "Starting Surah", - "starting-verse": "Starting Ayah", - "streak": "Streak", - "streak-definition": "A streak is the number of consecutive days you have read the Quran.", - "timeline-meaning": "What does your timeline mean?", - "timeline-states": { - "checked": "You have completed your goal", - "filled": "You have read something but not enough to complete your goal", - "none": "You haven't read anything yet on that day", - "stroked": "You haven't read anything today" - }, - "todays-goal": "Today's Goal", - "view-progress": "View Progress", - "week-progress": "This week's progress", - "x-days": { - "one": "{{days}} day", - "other": "{{days}} days" - }, - "x-days-streak": "{{days}} day streak", - "x-hours": { - "one": "{{hours}} hour", - "other": "{{hours}} hours" - }, - "x-minutes": { - "one": "{{minutes}} minute", - "other": "{{minutes}} minutes" - }, - "x-pages": { - "one": "{{pages}} page", - "other": "{{pages}} pages" - }, - "x-seconds": { - "one": "{{seconds}} second", - "other": "{{seconds}} seconds" + "continue-reading": "Continue Reading", + "continuous": { + "description": "Your goal will calculate your progress over a duration of days", + "title": "Over a duration" + }, + "create-plan": "Create plan", + "create-reading-goal": "Create Goal", + "daily-progress": "Daily Progress", + "daily-progress-completed": "Completed! 🎉", + "daily": { + "description": "Your goal will reset every day", + "title": "Daily goal" + }, + "day-x": "Day {{day}}", + "days": "Days", + "duration": "Duration (days)", + "ending-chapter": "Ending Surah", + "ending-verse": "Ending Ayah", + "examples-subtitle": "Here is a list of common goals. You can also create your own goal.", + "examples-title": "Pick a preset goal or create your own", + "examples": { + "custom": { + "description": "Set a custom goal that suits you", + "title": "Custom" + }, + "khatm": { + "description": "A classic Khatm goal. Read 1 Juz a day", + "title": "Read the Quran in 30 days" + }, + "time": { + "description": "A simple beginner-friendly goal", + "title": "Read 10 minutes a day" + }, + "year": { + "description": "Read the Quran at your own pace over the next year", + "title": "Read the Quran in a year" + } + }, + "frequency-tab": { + "description": "Should your goal reset every day or every number of days? Don't worry, we will track your progress regardless of the frequency you choose.", + "title": "Choose a frequency for your goal" + }, + "goal-completed": "Goal Completed! 🎉 ", + "goal-done": { + "description": "Any additional reading will still be recorded", + "title": "You completed today's goal" + }, + "goal-target": { + "description": "How much time, pages, or verses should you read to complete your goal?", + "title": "Set a target for your goal" + }, + "goal-type": { + "description": "Should your goal be based on time, pages, or a custom range (i.e., 3 Juzs of the Quran)?", + "title": "Choose a criteria for your goal" + }, + "goal-types": { + "pages": { + "description": "Your goal will be based on pages", + "title": "Pages" + }, + "range": { + "description": "Your goal will be based on a custom range of verses (this can be a Surah, a Juz, or even the whole Quran)", + "title": "Custom range" + }, + "time": { + "description": "Your goal will be based on time", + "title": "Time" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} more day", + "other": "+{{days}} more days" + }, + "preview-schedule": { + "description": "This is how your goal will look like. You can always change it later.", + "title": "Here is a preview of your schedule" + }, + "progress": { + "complete": "Today's goal is complete 🎉", + "goal-complete": "Your whole goal is complete 🎉", + "pages-goal": "read {{pages}} pages of the Quran", + "range-goal": "read {{from}} to {{to}}", + "time-goal": "read {{time}} of the Quran" + }, + "reading-goal": "Reading Goal", + "reading-goal-description": "Do you find it challenging to maintain consistency with your Quran reading goals?

Quran Growth Journey is a dynamic feature developed to help you remain consistent on your journey with the Quran. Whether you aim to read 10 minutes a day, complete a Juz in a month, or finish the entire Quran in a year, etc., Quran.com can now help you set a custom goal and keep track of your daily reading streaks, while adjusting as you make progress. It is completely free to use and we hope it will help you stay motivated to reach your goal!", + "reading-goal-label": "You're on a", + "reading-goal-title": "Introducing Quran Growth Journey", + "recommended": "Recommended", + "remaining": "Remaining for today", + "remaining-base": "Remaining", + "remaining-days": { + "one": "

{{days}}

day remaining", + "other": "

{{days}}

days remaining" + }, + "set-a-new-goal": "Set a new Goal", + "set-reading-goal-success": "Your reading goal has been set successfully.", + "start-journey": "Start your journey!", + "start-reading": "Start Reading", + "starting-chapter": "Starting Surah", + "starting-verse": "Starting Ayah", + "streak": "Streak", + "streak-definition": "A streak is the number of consecutive days you have read the Quran.", + "timeline-meaning": "What does your timeline mean?", + "timeline-states": { + "checked": "You have completed your goal", + "filled": "You have read something but not enough to complete your goal", + "none": "You haven't read anything yet on that day", + "stroked": "You haven't read anything today" + }, + "todays-goal": "Today's Goal", + "view-progress": "View Progress", + "week-progress": "This week's progress", + "x-days": { + "one": "{{days}} day", + "other": "{{days}} days" + }, + "x-days-streak": "

{{days}}

day streak", + "x-hours": { + "one": "{{hours}} hour", + "other": "{{hours}} hours" + }, + "x-minutes": { + "one": "{{minutes}} minute", + "other": "{{minutes}} minutes" + }, + "x-pages": { + "one": "{{pages}} page", + "other": "{{pages}} pages" + }, + "x-seconds": { + "one": "{{seconds}} second", + "other": "{{seconds}} seconds" + } +} diff --git a/locales/en/support.json b/locales/en/support.json index 9d822f6040..629cb24f38 100644 --- a/locales/en/support.json +++ b/locales/en/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Please report this bug <0>here<\/0> and we will fix this bug ASAP inshAllah.", - "bug-q": "I found a translation bug, where do I file it?", - "developer-a": "Please see <0>developers page<\/0> for more info.", - "developer-q": "I'm a developer. How can I contribute?", - "donate-a": "Firstly, we really appreciate your interest to contribute. Please visit <0>this<\/0> link", - "donate-q": "How can I donate?", - "download-a": "Unfortunately, no. We do not provide functionality to download our website or the Quran to your computer yet. You can, however install our mobile app for offline reading.", - "download-q": "Can I download the Quran.com to my computer?", - "fiqh-a": "Quran.com is an online reading, listening and studying tool. The team behind Quran.com is made up of software engineers, designers, and product managers. Unfortunately, that is the limitation of our skill set we do not have scholars, imams or sheikhs as part of the team to assist with Islamic, Fiqh or Fatwa related questions. We try to refrain from answering any of those questions and advise you speak to your local imam at a mosque or to a sheikh.", - "fiqh-q": "Islamic\/ Fiqh \/ Fatwa related questions", - "header": "Help and Feedback", - "main-desc": "Please check the FAQ to see if your question has been already answered. If needed you can <0>contact us<\/0> & we'll do our best to get back to you as soon as possible, but just so you know we're a small team so please be nice.", - "mobile-a": "Yes! Please visit our <0>mobile apps page<\/0> for more info.", - "mobile-q": "Does Quran.com have mobile app?", - "other-languages-a": "To change your preferred language, there is a drop down on the top right corner on each page (top left corner on right-to-left languages). Use this dropdown to choose your preferred language.", - "other-languages-q": "Can I browse site in other languages?", - "reciters-a": "Submit more info about this reciter <0>here<\/0>", - "reciters-q": "Adding more reciters", - "site-down-a": "That's not good! If the site is not working at all or perhaps you see a white screen with text 'Sorry, something went wrong', we appreciate it if you can report it <0>here<\/0> .", - "site-down-q": "The site is not working, how do I tell you?", - "support": "Support", - "tafsir-a": "Yes, we do have some Tafsirs. Click on icon shown beside each ayah, then click on tafisrs. App will show you list of available tafsirs. Click on the tafsir you want to read.", - "tafsir-q": "Is Tafsir available?", - "translations-a": "Open a new issue <0>here<\/0> with all the detail, link to translation and we'll try our best to add this.", - "translations-q": "Add another translations" -} \ No newline at end of file + "bug-a": "Please report this bug <0>here and we will fix this bug ASAP inshAllah.", + "bug-q": "I found a translation bug, where do I file it?", + "developer-a": "Please see <0>developers page for more info.", + "developer-q": "I'm a developer. How can I contribute?", + "donate-a": "Firstly, we really appreciate your interest to contribute. Please visit <0>this link", + "donate-q": "How can I donate?", + "download-a": "Unfortunately, no. We do not provide functionality to download our website or the Quran to your computer yet. You can, however install our mobile app for offline reading.", + "download-q": "Can I download the Quran.com to my computer?", + "header": "Help and Feedback", + "main-desc": "Please check the FAQ to see if your question has been already answered. If needed you can <0>contact us & we'll do our best to get back to you as soon as possible, but just so you know we're a small team so please be nice.", + "mobile-a": "Yes! Please visit <0>Quran for Android or <1>Quran iOS to download the Apps", + "mobile-q": "Does Quran.com have mobile app?", + "other-languages-a": "To change your preferred language, there is a drop down on the top right corner on each page (top left corner on right-to-left languages). Use this dropdown to choose your preferred language.", + "other-languages-q": "Can I browse site in other languages?", + "reciters-a": "Submit more info about this reciter <0>here", + "reciters-q": "Adding more reciters", + "site-down-a": "That's not good! If the site is not working at all or perhaps you see a white screen with text 'Sorry, something went wrong', we appreciate it if you can report it <0>here .", + "site-down-q": "The site is not working, how do I tell you?", + "support": "Support", + "tafsir-a": "Yes, we do have some Tafsirs. Click on icon shown beside each ayah, then click on tafisrs. App will show you list of available tafsirs. Click on the tafsir you want to read.", + "tafsir-q": "Is Tafsir available?", + "translations-a": "Open a new issue <0>here with all the detail, link to translation and we'll try our best to add this.", + "translations-q": "Add another translations" +} diff --git a/locales/es/about-quran.json b/locales/es/about-quran.json new file mode 100644 index 0000000000..7e83ccf9ed --- /dev/null +++ b/locales/es/about-quran.json @@ -0,0 +1,5 @@ +{ + "about-quran-cta": "Empieza a leer el Corán", + "about-quran-desc": "¿Qué es el Corán? Encuentra respuestas a preguntas clave y consejos sobre cómo explorarlo", + "about-the-quran": "Acerca del Corán" +} diff --git a/locales/es/about.json b/locales/es/about.json new file mode 100644 index 0000000000..0fb670e6f9 --- /dev/null +++ b/locales/es/about.json @@ -0,0 +1,42 @@ +{ + "credits": { + "desc": "Extendemos nuestro agradecimiento a todos aquellos que han apoyado y contribuido a este proyecto, ayudando a que el Corán sea accesible a millones de personas en todo el mundo.", + "lokalize": "<0>Lokalize: un sistema de traducción asistido por computadora que se centra en la productividad y la garantía de calidad y proporciona un flujo de trabajo de localización perfecto.", + "quran-align": "<0>Collin Fair: Una herramienta para producir una segmentación con precisión de palabras de la recitación coránica grabada.", + "quran-complex": "<0>QuranComplex: El Glorioso Complejo de Impresión del Corán Rey Fahd es líder en el servicio al Glorioso Corán y sus Ciencias, traduciendo sus Significados y salvaguardando el Texto Coránico de la distorsión, a través del uso óptimo de tecnologías avanzadas en el campo de la impresión, grabaciones de audio, publicaciones electrónicas y aplicaciones digitales.", + "quran-enc": "<0>QuranEnc: Un portal que ofrece traducciones gratuitas y confiables de los significados y exégesis del noble Corán en muchos idiomas del mundo.", + "tanzil": "<0>Tanzil: un proyecto coránico internacional cuyo objetivo es proporcionar un texto coránico preciso y altamente verificado.", + "tarteel": "<0>Tarteel: una aplicación de memorización del Corán impulsada por IA. Está diseñada para ayudarte a memorizar de forma más inteligente, ya sea que estés buscando un versículo, haciendo un seguimiento de tu progreso o siguiendo tu recitación.", + "title": "Créditos", + "vercel": "<0>Vercel: es una plataforma de implementación y colaboración para desarrolladores frontend que pone al desarrollador frontend en primer lugar, brindándole herramientas integrales para crear sitios web y aplicaciones de alto rendimiento.", + "zekr": "<0>Zekr: una herramienta de estudio del Corán en plataforma abierta para navegar e investigar sobre el Corán." + }, + "global-effort": { + "desc": "Millones de personas de todo el mundo confían en Quran.com como su principal recurso digital sobre el Corán. Ya sea que vengan a recitar, reflexionar, memorizar o estudiar, comparten un propósito común: un deseo sincero de conectarse con las palabras de Alá. \\n A medida que continuamos creciendo, mantenemos nuestro compromiso de garantizar que Quran.com siga siendo un espacio confiable, accesible y bellamente diseñado para cualquiera que busque interactuar con el Corán.", + "title": "Un esfuerzo global" + }, + "key-features": { + "desc": "Quran.com está diseñado para brindar soporte en cada etapa del aprendizaje del Corán, desde la lectura y la memorización hasta el estudio y la reflexión. Nuestras funciones incluyen:", + "features": [ + "Interfaz del Corán fácil de usar: una experiencia de lectura limpia e intuitiva en cualquier dispositivo.", + "Varias traducciones y tafsir: acceso a traducciones en varios idiomas, junto con tafsir.", + "Recitaciones de audio: escuche recitaciones de alta calidad de Qaris de renombre mundial, con la posibilidad de seguirlas palabra por palabra.", + "Búsqueda y navegación avanzadas: encuentre versículos instantáneamente por tema o palabras clave en todo el Corán.", + "Marcadores y notas de Ayah: guarde versículos y escriba reflexiones personales para referencia posterior.", + "Integración de QuranReflect: interactúe con una comunidad global a través de reflexiones y conocimientos compartidos por académicos e individuos.", + "Seguimiento del progreso de lectura y objetivos: realice un seguimiento de sus objetivos diarios y su historial de lectura.", + "API para desarrolladores: acceso gratuito a contenido y funciones para impulsar aplicaciones islámicas e I+D.", + "Y mucho más, Alhamdullilah." + ], + "title": "Características y ofertas principales" + }, + "main-description": "Desde su fundación en 1995, Quran.com se ha comprometido a hacer que el Corán esté disponible para todos de una manera clara, auténtica y fácil de entender. Todos los días, millones de personas en todo el mundo recurren a Quran.com para leer, escuchar, estudiar y reflexionar sobre el Corán, ya sean estudiantes de toda la vida, académicos o recién comenzando su camino.", + "our-mission": { + "desc": "El Corán está destinado a ser leído, comprendido y reflexionado. Nuestra misión es eliminar las barreras de acceso y empoderar a las personas y las comunidades proporcionando una experiencia coránica fiable, bien diseñada y profundamente enriquecedora. Nuestro objetivo es servir como una fuente de confianza para todo aquel que desee interactuar con el Corán, guiados por los principios de precisión, claridad y sinceridad.", + "title": "Nuestra misión" + }, + "who-we-are": { + "desc": "Quran.com es un waqf (fondo de donación) creado como fideicomiso público para garantizar que el Corán siga siendo accesible para todos, de forma gratuita y sin intereses comerciales. Está gestionado por Quran.Foundation, una organización sin ánimo de lucro 501(c)(3), que sostiene y desarrolla Quran.com como parte de su misión de proporcionar recursos coránicos auténticos y de alta calidad al mundo. Nuestro compromiso es servir al Corán y a sus lectores con excelencia, sinceridad y responsabilidad.", + "title": "Quienes somos" + } +} diff --git a/locales/es/apps.json b/locales/es/apps.json new file mode 100644 index 0000000000..75343df775 --- /dev/null +++ b/locales/es/apps.json @@ -0,0 +1,3 @@ +{ + "quran-desc": "De la mano de los desarrolladores principales de Quran.com, llega la hermosa y libre de publicidad aplicación mushaf para iOS y Android. Ahora es más fácil leer el Corán en cualquier lugar, memorizarlo y escuchar a tus recitadores favoritos." +} diff --git a/locales/es/chapter.json b/locales/es/chapter.json new file mode 100644 index 0000000000..a8b7776a29 --- /dev/null +++ b/locales/es/chapter.json @@ -0,0 +1,4 @@ +{ + "meta-description": "Lee y escucha la Sura {{transliteratedName}}. La Sura fue revelada en {{revelationPlace}}, ordenada {{chapterOrder}} en el Corán. El título de la Sura significa \" {{translatedName}} \" en {{localeName}} y consta de {{versesCount}} versículos.", + "ranges-meta-desc": "Lee y escucha desde la aleya {{rangeFrom}} hasta la aleya {{rangeTo}}." +} diff --git a/locales/es/collection.json b/locales/es/collection.json new file mode 100644 index 0000000000..0ba533a10e --- /dev/null +++ b/locales/es/collection.json @@ -0,0 +1,23 @@ +{ + "all-saved-verses": "Todos los versos guardados", + "alphabetical": "A-Z", + "back-to-collection-list": "Volver al listado de colecciones", + "collapse-all": "Contraer todos los versos", + "collection-list-empty": "La lista de colecciones está vacía. Aún no has creado ninguna colección.", + "collections": "Colecciones", + "delete-bookmark": { + "subtitle": "¿Estás seguro de que deseas eliminar {{bookmarkName}} de la colección {{collectionName}}?", + "title": "Eliminar marcador" + }, + "delete-collection": { + "subtitle": "¿Estás seguro de que deseas eliminar la colección {{collectionName}}?", + "title": "Eliminar colección" + }, + "empty": "La colección está vacía", + "expand-all": "Expandir todos los versículos", + "go-to-ayah": "Ir a la aleya", + "load-more": "Cargar más", + "recently-added": "Añadido recientemente", + "recently-updated": "Actualizado recientemente", + "verse-key": "Número de capítulo y versículo" +} diff --git a/locales/es/common.json b/locales/es/common.json new file mode 100644 index 0000000000..7468b70fab --- /dev/null +++ b/locales/es/common.json @@ -0,0 +1,416 @@ +{ + "about": "Sobre nosotros", + "allow": "Permitir", + "and": "y", + "announcements": { + "auth-onboarding": { + "data-sync": { + "action": "Próximo", + "description": "Ya sea que uses Quran.com en tu teléfono o en tu computadora portátil, tus marcadores, los últimos versículos leídos y tus preferencias estarán disponibles.", + "title": "Sus datos se sincronizarán

en todos los dispositivos" + }, + "feedback": { + "action": "Está bien, lo entiendo.", + "description": "Gracias por utilizar Quran.com y nos encantaría conocer tus comentarios en feedback.quran.com ", + "title": "Queremos escuchar tus pensamientos" + }, + "quran-foundation-link": { + "action": "Siguiente", + "description": "Utiliza tu nombre de usuario en Quran.com para acceder a QuranReflect.com, una próspera comunidad global dedicada a la reflexión coránica.", + "title": "¡Utiliza tu cuenta en todas las aplicaciones de Quran.Foundation!" + }, + "quran-growth-journey": { + "action": "Siguiente", + "description": "Mantén tu racha de lectura del Corán y avanza hacia tus metas mientras desarrollas nuevos hábitos.", + "title": "¡Comienza tu viaje de crecimiento en el Corán!" + }, + "welcome": { + "action": "Ver novedades", + "title": "Bienvenido a Quran.com

Cuenta de usuario" + } + }, + "collections-announcement": { + "slide-1": { + "description": "¡Estamos muy contentos de anunciar que ahora puedes agrupar marcadores en \"colecciones\"!

  • Agrega tantas colecciones como quieras
  • Agrega un marcador a una o más colecciones
  • ¡Y más!
  • ", + "title": "¡Las colecciones de marcadores están aquí!" + } + } + }, + "aria": { + "change-settings": "Cambiar configuración", + "drawer-close": "Cerrar ventana desplegable.", + "msg-close": "Cerrar mensaje", + "nav-drawer-open": "Abrir la ventana de navegación desplegable.", + "play-surah": "Reproducir Sura {{surahName}}", + "select-lng": "Seleccione idioma", + "sidebar-nav-close": "Cerrar barra lateral de navegación" + }, + "audio": { + "auto-scroll": { + "off": "Apagado", + "on": "Encendido", + "title": "Desplazamiento automático" + }, + "displaying": "Mostrando", + "exp-tip": " Cambiar el contenido que se muestra en

    Configuración > Palabra por palabra ", + "exp-tip-no-select": " Marca la opción de visualización de información sobre herramientas y selecciona la opción

    Traducción y/o Transliteración


    en Configuración > Palabra por palabra para

    habilitar esta función. ", + "experience": "Experiencia", + "play": "Reproducir audio", + "playback-normal": "Normal", + "playback-speed": "Velocidad de reproducción", + "playback-speed-unit": "x", + "player": { + "close-audio-player": "Cerrar reproductor de audio", + "currently-playing": "Actualmente se está reproduciendo", + "delay-verse": "Pausa entre versos", + "download": "Descargar", + "full-surah": "Sura completa", + "manage-repeat-settings": "Administrar configuraciones de repetición", + "mismatch": "Haz clic en \"Comenzar de nuevo\" si en su lugar deseas reproducir {{currentReadingChapter}}.", + "pause": "Pausar", + "pause-audio": "Pausa el audio", + "play": "Reproducir", + "play-audio": "Reproducir audio", + "play-range": "Rango de reproducción", + "previous-ayah": "Aleya anterior", + "repeat-1-verse": "Repetir verso", + "repeat-settings": "Ajustes de repetición", + "repeat-verse": "Repetir cada verso", + "search-verse": "Buscar por verso", + "single-verse": "Verso único", + "start-over": "Iniciar de nuevo", + "start-playing": "Empezar a reproducir", + "stop-repeating": "Dejar de repetir", + "times": "veces", + "verses-range": "Gama de versos", + "volume-control": "Control del volumen." + }, + "repeat-moved": "Los ajustes de repetición se han trasladado al reproductor de audio. Haz clic en el icono <0> para acceder a ellos", + "select-reciter": "Seleccionar recitador", + "speed": "Velocidad", + "title": "Audio" + }, + "ayah": "Aleya", + "ayahs": "Aleyas", + "beta": "Beta", + "bookmark": "Marcar", + "bookmarked": "Marcado como favorito", + "both": "Ambas", + "cancel": "Cancelar", + "click-here": "Haz clic aquí", + "close": "Cerrar", + "command-bar": { + "navigations": "Navegaciones", + "no-nav-results": "Sin resultados de navegación", + "placeholder": "¿Qué quieres leer?", + "recent-navigations": "Navegaciones recientes", + "search-by-voice": "Búsqueda por voz", + "try-navigating": "Intenta navegar a" + }, + "community": { + "cta": "Únete a la comunidad", + "header": "Únete a la comunidad QDC de constructores y tecnólogos musulmanes.", + "sub-header": "Regístrate en el Discord de Quran.com para particilar y colaborar en la comunidad líder en la construcción de tecnología islámica.", + "title": "Comunidad" + }, + "complete-sign-up": "Completa tu registro", + "consents": { + "communication": { + "body": "🚀 Potencia tu progreso a través de notificaciones personalizadas sobre el progreso de tus objetivos, el mantenimiento de las rachas y la mejora del uso de nuestras funciones actuales.



    ¿Podemos mantenerte informado a través del correo electrónico y otros canales? Tú tienes el control: puedes ajustar estas preferencias en cualquier momento en la configuración de tu cuenta.



    Simplemente selecciona \"Permitir\" para recibir recordatorios inspiradores o \"Ahora no\" para rechazarlos.", + "header": "¡Nos encantaría ayudar a mantenerte comprometido y constante en tu viaje de crecimiento del Corán! 📖🌟" + } + }, + "continue": "Continuar", + "copied": "Copiado", + "copied-to-clipboard": "Copiado al portapapeles", + "copy": "Copiar", + "counter": { + "decrease": "Disminuir", + "increase": "Aumentar" + }, + "default-description": "El Corán traducido a muchos idiomas en una interfaz sencilla y fácil de usar", + "delete": "Borrar", + "developers": "Desarrolladores", + "display": "Mostrar", + "donate": "Donar", + "donate_monthly": "Donar mensualmente", + "donate_once": "Dona una vez", + "edit": "Editar", + "email-verification": { + "check-spam": "¿No has recibido el correo electrónico de verificación? Revisa tu bandeja de entrada de correo no deseado", + "email-sent": "Acabamos de enviar un correo electrónico a {{email}} ", + "email-verification": "Verificación de correo electrónico", + "resend-email": "Reenviar correo electrónico", + "resend-email-in": "Reenviar correo electrónico de verificación en {{remainingTime}} segundos...", + "verify-code": "Código de verificación" + }, + "end-year-donate": "Termina el 2024 con Sadaqah ❤️", + "error": { + "MediaVersesRangeLimitExceeded": "Solo puedes seleccionar hasta {{limit}} aleyas a la vez. Selecciona una secuencia más pequeña.", + "bookmark-sync": "El marcador no está sincronizado.", + "email-login-fail": "No se pudo iniciar sesión con el correo electrónico. Inténtalo nuevamente.", + "general": "Algo salió mal. Inténtalo de nuevo.", + "offline": "Parece que perdiste la conexión. Verifícala y vuelve a intentarlo.", + "pref-persist-fail": "No se pudo sincronizar tu configuración a la nube.", + "ranges-no-value": "La secuencia de inicio y final deben tener un valor", + "ranges-too-many-verses": "\\n*Máximo {{maxNumberOfVerses}} aleyas", + "ranges-wrong-order": "El verso de inicio debe estar antes del verso final" + }, + "exciting-updates": "Actualizaciones emocionantes", + "feedback": "Retroalimentación", + "fonts": { + "15_lines": "15 líneas", + "16_lines": "16 líneas", + "code_v1": "King Fahad Complex V1", + "code_v2": "King Fahad Complex V2", + "font-size": "Tamaño de fuente", + "lines": "Líneas", + "qcf-desc": "Las fuentes King Fahad Complex (V1 y V2) generan una mejor calidad pero toman más en cargar.", + "qcf-v4-desc": "Las fuentes Tajweed se creó con Easy Quran - Dar Al Marifa Tajweed Mushaf y King Fahad Glorious Quran Printing Complex (KFGQPC) - Uthmanic Hafs V4 Fonts después de recibir el permiso de ambos.", + "qpc_uthmani_hafs": "QPC Uthmani Hafs", + "quran-font": "Fuente del Corán", + "quran-font-size": "Tamaño de fuente del Corán", + "tajweed": "Tajwid", + "tajweed-desc": "La fuente de Tajwid muestra un Mushaf de color Tajwid. Puedes leer más sobre las reglas de color de Tajwid <0> aquí ", + "tajweed_v4": "King Fahad Complex V4", + "text_indopak": "IndoPak", + "text_uthmani": "Uthmani", + "translation-font-size": "Tamaño de fuente de la traducción" + }, + "footer": { + "description": "Quran.com es una organización sin fines de lucro. Esperamos que sea fácil para todos leer, estudiar y aprender el Noble Corán. El Noble Corán tiene muchos nombres, entre ellos Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr y Al-Noor.", + "hiring": "¡Estamos contratando! Únete al equipo de QuranFoundation y contribuye a nuestra misión. Postúlate ahora ", + "rights": "Reservados todos los derechos", + "title": "Lee, estudia y aprende el Noble Corán." + }, + "form": { + "body": "Cuerpo", + "code": "Código de verificación", + "email": "Correo electrónico", + "firstName": "Nombre", + "lastName": "Apellido", + "title": "Título" + }, + "from": "De", + "fundraising-sticky-banner": { + "cta": "Donar", + "title": "¡Dona durante los mejores días!" + }, + "fundraising": { + "description": "Las donaciones mensuales nos ayudan a mejorar Quran.com y sostener las operaciones para que nos centremos menos en la recaudación de fondos y más en crear impacto.", + "title": "Conviértete en donante mensual" + }, + "hear-it-pronounced": "Haz clic en las palabras coránicas y escucha la pronunciación", + "help": "Ayuda", + "hizb": "Hizb", + "home": "Inicio", + "hours": "Horas", + "inline": "En línea", + "input": { + "clear": "Borrar" + }, + "juz": "Juz", + "language": "Idioma", + "languages": "Idiomas", + "learn-more": "Más información", + "learning-plans": "Planes de aprendizaje", + "less": "Menos", + "loading": "Cargando", + "login": "Acceso", + "logout": "Cerrar sesión", + "meccan": "Meca", + "medinan": "Medina", + "menu": "Menú", + "minutes": "Minutos", + "mobile-apps": "Aplicaciones Móviles", + "mode": "Modo", + "more": "Más", + "my-learning-plans": "Mis planes de aprendizaje", + "navigate": "Navegar", + "network": "Comunidad", + "new": "¡Nuevo!", + "newest": "Más recientes", + "next": "Siguiente", + "next-ayah": "Aleya siguiente", + "no": "No", + "no-notifications": "No hay notificaciones todavía.", + "none": "Ninguna", + "not-now": "Ahora no.", + "notes": { + "title": "Mis notas y reflexiones" + }, + "notification-settings": "Configuración de notificaciones.", + "notification": { + "mark-all-as-read": "Marcar todo como leído.", + "mark-as-read": "Marcar como leído" + }, + "notifications": "Notificaciones", + "off": "Apagado", + "oldest": "Más antiguas", + "on": "Encendido", + "page": "Página", + "pages": "Páginas", + "pagination-summary": "{{currentResultNumber}}{{endOfResultNumber}} de {{totalNumberOfResults}} resultados de búsqueda", + "pbuh": "Las bendiciones de Alá sean con él", + "popular-links": "Enlaces populares", + "popup": { + "companion-title": "Querido Compañero del Corán,", + "footnote": "Las donaciones mensuales nos permiten centrarnos menos en la recaudación de fondos.", + "text-1": "Estamos comprometidos a servir al mundo el conocimiento y la tecnología coránica, siempre de forma gratuita.", + "text-2": "La oportunidad perfecta para la caridad continua (Sadaqa Jariyah). Invierte en tu Más Allá como donante mensual (o solo una vez).", + "title": "¡Dona durante los mejores días!" + }, + "powered-by": "Desarrollado por", + "prepare-hearts": { + "cta": "Más información", + "title": "¡Seguimos adelante después del Ramadán!" + }, + "prev": "Anterior", + "previous-ayah": "Aleya anterior", + "privacy": "Privacidad", + "product-updates": "Actualizaciones de productos", + "profile": "Perfil", + "q-reflect": "QuranReflect", + "quran-com": "Quran.com", + "quran-radio": "Radio Coránica", + "reading-history": "Historial de lectura", + "reading-preference": { + "reading": "Lectura", + "translation": "Traducción" + }, + "recitation": "Recitación", + "reciter": "Recitador", + "reciter-summary": "(Con autorización del Centro Tafsir)", + "reciters": "Recitadores", + "reflect": "Reflexionar", + "reflections": "Reflexiones.", + "remove": "Eliminar", + "rename": "Renombrar", + "retry": "Reintentar", + "revelation_order": "Orden de revelación", + "rub": "Rub el Hizb", + "save": "Guardar", + "save-to-collection": "Guardar en la colección", + "search-for": "Buscar ' {{searchQuery}} '", + "search-results": "{{count}} resultados de búsqueda", + "search": { + "filters": "Filtros", + "hint": "Intenta buscar", + "jump-to": "Saltar a", + "no-results": "No se encontraron resultados", + "no-results-suggestion": "No pudimos encontrar ningún resultado de búsqueda coincidente con \" {{searchQuery}} \". Intenta buscar una palabra clave diferente.", + "popular": "Búsquedas populares", + "recent": "Búsquedas recientes", + "results": "Resultados", + "show-all": "Mostrar todos los resultados", + "switch-mode": "Cambiar a búsqueda avanzada", + "title": "Buscar" + }, + "seconds": "Segundos", + "see-new": "Mira que hay de nuevo.", + "settings": { + "no-tafsir-selected": "No se ha seleccionado ningún tafsir", + "no-translation-selected": "No se ha seleccionado ninguna traducción", + "reading-experience": "Experiencia de lectura", + "reset": "Reiniciar", + "reset-cta": "Reiniciar configuración", + "reset-notif": "Su configuración se ha restablecido a la predeterminada.", + "search-reciter": "Buscar recitador", + "search-tafsirs": "Buscar Tafsirs", + "search-translations": "Buscar traducciones", + "selected-reciter": "Recitador seleccionado", + "selected-tafsirs": "Tafsirs seleccionados", + "selected-translations": "Traducciones seleccionadas", + "show-tooltip-when-playing-audio": "Mostrar información sobre herramientas al reproducir audio", + "title": "Configuración", + "tooltip-playing-audio-helper": "Mostrar la traducción de palabras en la información sobre herramientas mientras se reproduce la aleya", + "value-and-other": "{{value}} y {{othersCount}} otros", + "value-and-others": "{{value}} y {{othersCount}} más", + "wbw-helper": "Muestra la traducción o transliteración directamente debajo de la palabra", + "word-tooltip-helper": "Mostrar la traducción o transliteración al pasar el cursor o hacer clic en la palabra" + }, + "share": "Compartir", + "shared": "¡El enlace ha sido copiado al portapapeles!", + "show-more": "Mostrar más", + "sidebar": { + "search-hizb": "Buscar Hizb", + "search-juz": "Buscar Juz", + "search-page": "Página de búsqueda", + "search-surah": "Buscar sura", + "try-navigating-with": "Consejo: prueba a navegar con" + }, + "sitemap": "Mapa del sitio web", + "sort": { + "ascending": "Ascendente", + "by": "Ordenar por", + "descending": "Descendiente" + }, + "style": "Estilo", + "submit": "Enviar", + "subscribe": "Suscribirse.", + "subscribed": "Suscrito.", + "surah": "Sura", + "tafsir": { + "font-size": "Tamaño de fueste del tafsir", + "group-message": "Estás leyendo un tafsir para el grupo de versículos {{from}} hasta {{to}}", + "no-text": "{{tafsirName}} no está disponible para el verso actual.", + "surah": "Tafsir de la sura", + "tafsir-desc": "Lee {{tafsirName}} para la aleya {{verseNumber}} de la Surah {{surahName}}", + "tafsirs-desc": "Lee varios Tafsirs de la aleya {{ayahNumber}} de Surah {{surahName}} por eruditos de Tafsir confiables", + "title": "Tafsir" + }, + "terms-and-conditions": "Términos y condiciones", + "theme": "Modo", + "themes": { + "auto": "Automático", + "dark": "Oscuro", + "light": "Claro", + "sepia": "Sepia", + "system": "Sistema", + "system-desc": "Automáticamente el sistema se adapta a la configuración clara u oscura." + }, + "to": "A", + "tooltip": "Herramientas emergentes", + "tooltip-trans-lang": "Idioma de la información sobre herramientas", + "trans-lang": "Idioma de traducción", + "translation": "Traducción", + "translations": "Traducciones", + "transliteration": "Transliteración", + "type": "Tipo", + "unavailable": "No está disponible en este momento.", + "undo": "Deshacer", + "validation": { + "invalid-email": "{{field}} debe ser una dirección de correo electrónico válida", + "invalid-field": "Por favor, introduzca un valor válido {{field}}", + "maximum-length": "{{field}} no puede exceder {{value}} caracteres", + "minimum-length": "{{field}} debe tener al menos {{value}} caracteres", + "required-field": "{{field}} es obligatorio" + }, + "verse": "Versículo", + "verse-bookmark-removed": "¡Marcador de verso eliminado!", + "verse-bookmarked": "¡Verso marcado!", + "verses": "Versos", + "view": "Ver", + "voice": { + "ask-permission": "Habilita el permiso del micrófono para comenzar a utilizar la búsqueda por voz.", + "error": "Se ha producido un error, inténtalo de nuevo más tarde. O descarga Tarteel App.", + "no-permission": "Parece que no tienes los permisos del micrófono habilitados. Habilita los permisos del micrófono e inténtalo de nuevo o descarga Tarteel App.", + "not-supported": "Parece que tu navegador no admite el micrófono. Prueba con otro navegador o descarga Tarteel App.", + "suggest": "Por favor comienza a recitar y tu verso aparecerá.", + "suggest-subtitle": "Recita cualquier verso en árabe y el verso aparecerá.", + "suggest-title": "Recita ahora", + "voice-search-powered-by": "Búsqueda por voz con tecnología de" + }, + "wbw": "Palabra por palabra", + "wbw-lang-summary": "Fuente de la traducción palabra por palabra: {{source}} . Esta fuente es independiente de la selección de la traducción del verso.", + "wbw-trans-lang": "Palabra por palabra Idioma", + "wbw-translation": "Traducción palabra por palabra", + "wbw-transliteration": "Transliteración palabra por palabra", + "word-click": { + "no-audio": "Sin audio", + "play-audio": "Reproducir audio", + "title": "Clic de palabra" + }, + "word-tooltip": "Información sobre herramientas de Word", + "yes": "Sí" +} diff --git a/locales/es/developers.json b/locales/es/developers.json new file mode 100644 index 0000000000..322c499468 --- /dev/null +++ b/locales/es/developers.json @@ -0,0 +1,19 @@ +{ + "footer": "Equipo Quran.com", + "header": "Ayuda para el desarrollo", + "issues-cta": "Si tienes alguna pregunta o quieres contactar a los encargados del mantenimiento, simplemente escribe un problema. Te responderemos lo antes posible, insha'Allah.", + "issues-guide": "Normalmente, utilizamos <0>proyectos de Github como fuente para saber en qué trabajar a continuación, qué se viene y qué errores existen que deben solucionarse. Por ejemplo, <1>esta URL contiene una lista de errores, cosas con las que necesitamos ayuda y características futuras.", + "main-desc": "Agradecemos tu interés en ayudar al desarrollo de los proyectos de Quran.com. ¡Nos emociona trabajar contigo!", + "projects": { + "all": "Contamos con varios proyectos alojados en Github. Puedes encontrarlos todos aquí. A continuación, te los detallamos:", + "q-android": "<0>Quran Android - escrito en Kotlin y Java.", + "q-api": "< 0 > API de Quran.com < /0 > - escrito en Ruby on Rails.", + "q-api-docs": "<0>Documentación de la API de Quran.com: Nuestro portal de documentación de API.", + "q-audio": "< 0 > Audio coránico < /0 > y < 1 > Aplicaciones móviles de audio coránico. < /1 >", + "q-audio-segments": "< 0 > Segmentos de audio del Corán. < /0 >", + "q-ios": "<0>Corán iOS - escrito en Swift.", + "q-next": "<0>Quran.com Frontend - escrito en Next.js.", + "q-v2": "< 0 > Quran.com < /0 > - escrito en Ruby on Rails." + }, + "thanks": "¡Esperamos tu contribución!" +} diff --git a/locales/es/error.json b/locales/es/error.json new file mode 100644 index 0000000000..4b818c4151 --- /dev/null +++ b/locales/es/error.json @@ -0,0 +1,6 @@ +{ + "go-back": "Volver", + "if-persist": "Por favor, si el problema continua", + "report-cta": "reporta un error", + "title": "Lo siento, algo salió mal." +} diff --git a/locales/es/home.json b/locales/es/home.json new file mode 100644 index 0000000000..3b9f2e3bcd --- /dev/null +++ b/locales/es/home.json @@ -0,0 +1,66 @@ +{ + "achieve-quran-goals": "Alcanza tus objetivos coránicos", + "begin": "Comenzar", + "chapters-and-verses": "Capítulos y versículos", + "continue-read": "Continuar leyendo", + "explore-topics": "Explorar temas", + "first-time-reading": "¿Es nuevo en el Corán? Comience aquí ", + "know-someone": "Crece con nosotros este Ramadán ", + "learning-plan": "Planes de aprendizaje", + "listen-to-radio": "Escuchar la radio del Corán", + "my-quran": "Mi Corán", + "navigate-quran": "Navegar por el Corán", + "no-bookmarks": "No tienes favoritos aún", + "no-recently-read": "Aún no tienes ninguna sesión de lectura.", + "noble-quran": "El Noble Corán", + "popular": "Popular", + "qgj": { + "learning-plans": { + "cta": { + "all-plans": "Ver todos los planes", + "my-plans": "Mis planes" + }, + "desc": { + "logged-in": "¿Alguna vez comenzaste un programa de aprendizaje y te saliste a mitad de camino? Los planes de aprendizaje se dividen en partes manejables y hacemos un seguimiento de tu progreso hasta que llegas a la meta. Explora nuestra oferta actual de cursos hoy mismo", + "logged-in-no-plans": "¿Alguna vez comenzaste un programa de aprendizaje y te saliste a mitad de camino? Los planes de aprendizaje se dividen en partes manejables y hacemos un seguimiento de tu progreso hasta que llegas a la meta. Explora nuestra oferta actual de cursos hoy mismo", + "logged-out": "¿Alguna vez comenzaste un programa de aprendizaje y te saliste a mitad de camino? Los planes de aprendizaje se dividen en partes manejables y hacemos un seguimiento de tu progreso hasta que llegas a la meta. Explora nuestra oferta actual de cursos hoy mismo" + }, + "title": "Planes de aprendizaje" + }, + "quran-reading-goals": { + "desc": { + "logged-out": "¿Quieres leer 10 minutos al día, completar un Juz en un mes o terminar el Corán entero en un año? Es fácil crear un objetivo personalizado y hacer un seguimiento de tu progreso." + }, + "title": "Objetivos de lectura del Corán personalizados" + }, + "title": "Viaje de crecimiento del Corán" + }, + "qr-community": "Lea los versículos y reflexiones destacados de hoy", + "ramadan-activities-cta": " ¡Sigue el Calendario Coránico Global para obtener lecturas semanales, podcasts inspiradores y un llamado a la reflexión! ", + "ramadan": { + "header": "Herramientas para profundizar su conexión con el Corán", + "title": "¿Listo para el Ramadán?" + }, + "read-juz": "Leer Juz", + "recently-read": "Leído recientemente", + "revelation-order-disclaimer": "Esta vista muestra el orden cronológico de las suras del Corán según el momento en que fueron reveladas al profeta Muhammad . La cronología es un tema de opinión académica y algunas suras fueron reveladas en partes en diferentes momentos. El orden que se muestra aquí se basa en el trabajo de Tanzil.net . [Nota: el orden de las suras compiladas desde al-Fatiha hasta al-Nas es una cuestión de consenso.]", + "see-more-learning-plans": "Ver más", + "set-custom-goal": "Establezca una meta", + "share-quran": { + "description": "Ayude a difundir el Corán entre los nuevos estudiantes", + "title": "¡Comparte el Corán!" + }, + "start-read": "Empezar a leer", + "stay-consistent": "Realice un seguimiento de sus rachas, cree objetivos personalizados y manténgase constante", + "tab": { + "bookmarks": "Favoritos", + "popular": "Populares" + }, + "view-all-bookmarks": "Ver todos los marcadores", + "voice": { + "trigger": "Acceso rápido" + }, + "welcome": { + "title": "¡Es el mes del Corán! Ayuda a millones de usuarios a acceder a la guía del Corán." + } +} diff --git a/locales/es/learn.json b/locales/es/learn.json new file mode 100644 index 0000000000..ecd592f5c2 --- /dev/null +++ b/locales/es/learn.json @@ -0,0 +1,47 @@ +{ + "about-author": "Acerca del autor", + "add-reflection": "Añadir reflexión.", + "all-learning-plans": "Todos los planes de aprendizaje", + "author": "Autor", + "back-to-learning-plan": "Volver al plan de aprendizaje", + "back-to-learning-plans": "Volver a los planes de aprendizaje", + "category": "Categoría", + "coming-soon": "Muy pronto...", + "completed": "Terminado", + "continue-learning": "Continúa aprendiendo.", + "contributors": "Colaboradores", + "day": "Día", + "description": "Descripción", + "duration-daily": "Cada lección corta toma menos de {{dailyMins}} minutos para completarse {{days}} lecciones en total", + "empty-learning-plans": "Aún no estás inscrito en ningún Plan de aprendizaje .", + "enroll": "Inscríbete", + "enroll-success": "¡Felicitaciones, has agregado {{title}} a tu lista!", + "enrolled": "Inscrito", + "feedback": { + "add-feedback": "Añadir comentarios", + "desc": "¡Felicitaciones! Has completado el plan de aprendizaje ' {{courseName}} '.

    Revisa el plan de aprendizaje y comparte tus comentarios para ayudarnos a mejorar el contenido.", + "feedback-placeholder": "Escribe tu opinión", + "feedback-success": "¡Gracias por tus comentarios!", + "your-feedback": "Tu opinión" + }, + "help-about-reflection": "Ayuda sobre la función de reflexión", + "learn-duration": "Duración.", + "learn-more": "Más información", + "learning-plan-material": "Material del plan de aprendizaje", + "learning-plan-meta-desc": "¡Este plan de aprendizaje te ayudará a transformar la forma en que interactúas con el Corán!. ¡Comienza tu viaje hoy!.", + "learning-plans-desc": "Aumenta tus conocimientos con lecciones fáciles de seguir que te ayudarán a seguir creciendo en tu camino con el Corán.

    Comienza un plan de aprendizaje hoy mismo! se hará un seguimiento de tu progreso hasta que llegues a la meta.", + "learning-plans-meta-desc": "Los planes de aprendizaje de Quran.com te ayudarán a transformar la forma en que interactúas con el Corán. ¡Explora nuestra colección de selectas lecciones y comienza tu viaje hoy mismo!", + "mark-complete": "Marcar como completado", + "mark-complete-success": "¡La lección ha sido marcada como completada con éxito!", + "next-lesson": "Próxima lección", + "not-enrolled": "Aún no estás inscrito en el Plan de aprendizaje .", + "prev-lesson": "Lección anterior", + "reflection-description-1": "Al hacer clic en \"Agregar reflexión\", accederá a QuranReflect, una plataforma para compartir reflexiones personales sobre el Corán. A diferencia del Tafsir (interpretación académica), las reflexiones son puntos de vista y experiencias personales relacionados con los versículos.", + "reflection-description-2": "Si publica públicamente, su reflexión será revisada por el equipo de moderación y será visible para la comunidad QuranReflect.", + "start-learning": "Empieza a aprender.", + "tabs": { + "main": "Detalles principales", + "syllabus": "Programa de estudios" + }, + "what-happens-when-you-click-add-reflection": "¿Qué sucede cuando haces clic en \"Agregar reflexión\"?" +} diff --git a/locales/es/login.json b/locales/es/login.json new file mode 100644 index 0000000000..f19de88b32 --- /dev/null +++ b/locales/es/login.json @@ -0,0 +1,110 @@ +{ + "awaiting-confirmation": "Esperando confirmación", + "back": "Atrás", + "back-to-login": "Volver al inicio de sesión", + "check-email-title": "Consulte el correo electrónico para completar el registro", + "confirm": "Confirmar", + "confirm-new-password-placeholder": "Confirmar nueva contraseña", + "confirm-password-placeholder": "Confirmar Contraseña", + "continue": "Continuar", + "continue-apple": "Continuar con Apple", + "continue-email": "Continuar con correo electrónico", + "continue-facebook": "Continuar con Facebook", + "continue-google": "Continuar con Google", + "email-placeholder": "Dirección de correo electrónico", + "error": { + "email-required": "¡Falta el correo electrónico!", + "invalid-credentials": "Correo electrónico o contraseña no válidos", + "invalid-email": "¡Formato de correo electrónico no válido!", + "login-failed": "Error al iniciar sesión. Inténtalo de nuevo.", + "password-required": "¡Falta la contraseña!" + }, + "errors": { + "account-banned": "Lo sentimos, tu cuenta está bloqueada. Contacta con Quran.Foundation", + "badRequest": "*Solicitud no válida", + "banned": "*Lo sentimos, tu cuenta está bloqueada. Contacta con Quran.Foundation", + "confirm": "*Confirmar contraseña no coincide con la contraseña", + "email": "*¡Formato de correo electrónico no válido!", + "exactLength": "*El valor debe ser la longitud exacta", + "expiredToken": "*Este token ha expirado", + "forgot-password-failed": "No se pudo enviar el correo electrónico de restablecimiento de contraseña. Inténtelo nuevamente.", + "immutable": "*Este valor no se puede cambiar", + "invalid": "*Este {{fieldName}} no es válido", + "invalidEmailOrPassword": "*Correo electrónico o contraseña no válidos", + "max": "* {{fieldName}} debe ser menor o igual a {{max}} dígitos", + "min": "* {{fieldName}} debe ser mayor o igual a {{min}} dígitos", + "name": "* {{fieldName}} debe contener solo letras y números", + "notFound": "*Extraviado", + "required": "* ¡Falta {{fieldName}}!", + "reset-password-failed": "No se pudo restablecer la contraseña. Inténtalo nuevamente.", + "signin-failed": "Error al iniciar sesión. Inténtalo de nuevo.", + "signup-failed": "Error al registrarse. Inténtalo de nuevo.", + "taken": "* ¡ {{fieldName}} ya existe!", + "usedToken": "*Este token ya se utilizó", + "username": "* {{fieldName}} acepta solo guiones bajos y letras", + "verification-code-invalid": "Este código de verificación no es válido", + "verification-code-length": "El código de verificación debe tener {{length}} dígitos", + "verification-failed": "Error en la verificación. Inténtalo de nuevo.", + "verification-resend-failed": "No se pudo reenviar el código de verificación" + }, + "feature-1": "Seguimiento de sus objetivos", + "feature-2": "Mantener rachas de lectura", + "feature-3": "Crear colecciones", + "feature-4": "Sincroniza tus datos en todos los navegadores", + "feature-5": "¡Y más!", + "feature-6": " ¡Nuevo! Notas y reflexiones.", + "first-name-placeholder": "Nombre de pila", + "forgot-password": "Has olvidado tu contraseña", + "forgot-password-description": "Ingrese su dirección de correo electrónico y le enviaremos instrucciones para restablecer su contraseña.", + "forgot-password-success": "¡Correo electrónico de restablecimiento de contraseña enviado! Por favor, revise su bandeja de entrada.", + "forgot-password-title": "¿Has olvidado tu contraseña?", + "last-name-placeholder": "Apellido", + "login-cta": "Inicia sesión o regístrate ahora:", + "login-error": { + "AuthenticationError": "Error de autenticación. Inténtalo de nuevo más tarde.", + "BannedUserError": "Lo sentimos, tu cuenta está bloqueada. Contacta con Quran.Foundation.", + "TokenExpiredError": "Se ha cerrado la sesión, vuelve a iniciar sesión." + }, + "login-title": "Iniciar sesión en Quran.com", + "new-password-placeholder": "Nueva contraseña", + "other-options": "Otras opciones de inicio de sesión", + "password-placeholder": "Contraseña", + "password-reset-success": "¡Contraseña restablecida exitosamente!", + "password-rules": { + "lowercase": "Al menos una letra minúscula", + "max-length": "Máximo 20 caracteres", + "min-length": "Mínimo 8 caracteres", + "number": "Al menos un numero", + "special": "Al menos un carácter especial (!@#$%^&*_-)", + "uppercase": "Al menos una letra mayúscula" + }, + "privacy-policy": "Proteger tu privacidad es nuestra prioridad: al registrarte, aceptas nuestra Política de privacidad y Términos y condiciones .", + "quran-text": "Corán", + "quran-title": "Corán.com", + "reflect-feature-1": "Reflexiona sobre el Corán", + "reflect-feature-2": "Unirse a grupos", + "reflect-feature-3": "Interactuar con otros", + "reflect-feature-4": "¡Y más!", + "reset-password": "Restablecer contraseña", + "reset-password-success": "¡Contraseña restablecida exitosamente!", + "set-new-password": "Establecer una nueva contraseña", + "sign-in": "Iniciar sesión", + "sign-in-or-sign-up": "Iniciar sesión o Registrarse", + "sign-up": "Inscribirse", + "unified-registration-1": "El registro unificado de ", + "unified-registration-2": "Fundación Corán", + "unified-registration-3": "Tendrás acceso a los siguientes sitios web ", + "unified-registration-4": "A través de sus datos de inicio de sesión.", + "username-placeholder": "Nombre de usuario", + "verification-code-instruction": "Ingrese el código provisto en el correo electrónico para completar el registro.", + "verification-code-resend": "Reenviar correo electrónico", + "verification-code-resend-countdown": "Reenviar correo electrónico de verificación en {{seconds}} segundos...", + "verification-code-sent": "¡Código de verificación enviado!", + "verification-code-sent-to": "Acabamos de enviar un correo electrónico a", + "verification-code-spam-note": "¿No has recibido ningún correo electrónico? Revisa tu carpeta de correo no deseado", + "verify-code": "Verifique que el código de seguridad proporcionado coincida con el siguiente texto:", + "welcome-description-1": "El registro unificado de", + "welcome-description-2": ".Base", + "welcome-description-3": "Tendrá acceso a los siguientes sitios web a través de sus datos de inicio de sesión.", + "welcome-title": "Bienvenido a" +} diff --git a/locales/es/media.json b/locales/es/media.json new file mode 100644 index 0000000000..4b58892d2f --- /dev/null +++ b/locales/es/media.json @@ -0,0 +1,31 @@ +{ + "background-opacity": "Fondo y opacidad del texto", + "border-color-size": "Color y tamaño del margen", + "centre": "Centrado", + "collapse": "Contraer lista", + "copied": "Copiado", + "copy-link": "Copiar enlace", + "count": "{{count}}", + "deselect": "Quitar selección", + "download-image": "Descargar imagen", + "download-share": "Descargar/Compartir", + "download-video": "Descargar video", + "justified": "Justificado", + "landscape": "Horizontal", + "limit": " / {{limit}}", + "maker-meta-desc": "Quran Media Maker es una herramienta gratuita para crear hermosos videos y capturas de pantalla de versículos del Corán. Comparte tu fe e inspira a otros.", + "maker-title": "Creador de videos del Corán: crea impresionantes videos e imágenes del Corán.", + "max-ayahs": "10 aleyas máximo", + "monthly-balance": "Saldo mensual", + "orientation": "Orientación", + "portrait": "Vertical", + "render-image": "Tomar una captura de pantalla", + "render-video": "Exportar", + "reset-defaults": "¿Reiniciar a configuración estándar?", + "style": "Tipo de fuente del Quran", + "text-color": "Color del texto", + "title": "Generar y compartir vídeos del Corán", + "to": "de", + "verse-key": "Capítulo y número de versículo, por ejemplo 2:255", + "video-picker": "Vídeo de fondo" +} diff --git a/locales/es/notes.json b/locales/es/notes.json new file mode 100644 index 0000000000..ee0f911a0b --- /dev/null +++ b/locales/es/notes.json @@ -0,0 +1,62 @@ +{ + "add-another-note": "Añadir otra nota", + "body-placeholder": "Utiliza este espacio para guardar notas generales o escribir una reflexión.", + "checkbox-refl-intro": { + "checkbox": { + "desc": "
  • Publicar significa que tu reflexión será compartida en QuranReflect bajo tu nombre, donde será revisada por el equipo de moderación y visible para la comunidad de QuranReflect.
  • Una vez que tu publicación sea revisada y aprobada o promovida por nuestro equipo de moderación, podrás recibir notificaciones de Me gusta, comentarios y seguidores. Al iniciar sesión en QuranReflect, puedes actualizar tu configuración de notificaciones para adaptarla a tus preferencias.
  • Puedes ver tus notas y reflexiones publicadas en tu perfil de inicio de sesión de Quran.com en la sección “Mis notas y reflexiones”, o iniciar sesión en QuranReflect usando tu correo electrónico de inicio de sesión de Quran.com.
  • ", + "title": "¿Qué pasa si selecciono este apartado?" + }, + "post-button": "¿Qué sucede cuando publico en QuranReflect?", + "qr-intro": "QuranReflect, junto con Quran.com, es parte de la familia Quran.Foundation. Es una plataforma social para compartir reflexiones personales sobre el Corán, animando a los usuarios a interiorizar sus mensajes y compartir ideas que inspiren cambios positivos. A diferencia del tafsir, que es una interpretación académica, las reflexiones son pensamientos y experiencias personales relacionadas con los versículos. Las publicaciones de los usuarios en QuranReflect son revisadas y moderadas por un equipo calificado, que ayudará a garantizar la calidad del contenido y las normas de etiqueta al interactuar con el Corán, y empoderará a los usuarios a compartir comentarios y destacando comentarios valiosos, fomentando así una comunidad espiritualmente edificante y centrada en el Corán. Obtén más información: Quranreflect.com/faq ", + "title": "¿Qué es QuranReflect y qué pasa si selecciono este apartado?" + }, + "click-to-see-more": "Haz clic para ver más", + "delete-note": "Eliminar nota", + "delete-note-modal": { + "subtitle": "¿Estás seguro de que deseas eliminar la nota?", + "title": "Borrar nota." + }, + "delete-success": "La nota ha sido eliminada con éxito", + "empty-notes": "No se encontraron notas.", + "empty-reflections": "No se encontraron reflexiones.", + "export-success": "La nota se ha publicado en tu cuenta de QuranReflect con éxito", + "new-note-reflc-intro": { + "reflc-prompts": { + "deeper": { + "desc": "
  • ¿Se menciona algún nombre de Alá y cómo se relaciona con el versículo?
  • ¿Qué palabras o aspectos lingüísticos te llamaron la atención?
  • ¿Puedes establecer conexiones con el contexto del versículo, otros versículos coránicos, hadices o eventos?
  • ", + "title": "Perspectivas a más profundidad:" + }, + "personal": { + "desc": "
  • ¿De qué manera te ha inspirado o conmovido este versículo?
  • ¿Se mencionan cualidades o acciones que puedas mejorar?
  • ¿Hay alguna promesa o advertencia/prohibición que puedas aplicar a tu vida?
  • ¿Tienes una historia personal relacionada con este versículo?
  • ¿Qué cambios quieres hacer basándote en este versículo y cómo puedes tú o alguien más implementarlos de manera práctica?
  • ", + "title": "Preguntas de reflexiones personales:" + }, + "title": "Apuntes para la reflexión" + }, + "title": "¿Necesitas ayuda para reflexionar sobre el Corán? Aprende más", + "what-is-reflc": { + "desc": "Reflexionar o meditar sobre el Corán implica leer o escuchar atentamente las palabras de Alá, involucrarse con sus significados y permitir que nos afecte y nos cambie para mejor. Esto se conoce como \"Tadabbur\". El Tafsir, en cambio, es una interpretación académica del Corán, que proporciona explicaciones detalladas de sus versículos basadas en fuentes clásicas y análisis académicos. Mientras que el Tafsir está reservado para los eruditos, Alá ﷻ pide a todos que participen en Tadabbur (Corán 38:29 , 47:24 , 4:82 , y muchos más).



    Los usuarios pueden guardar sus notas y reflexiones personales de forma privada. A menudo, nuestras reflexiones pueden resonar profundamente a los demás, lo que ayuda a su conexión con el Corán y su relación con Alá ﷻ. Por eso, los usuarios tienen la opción de compartir sus reflexiones en QuranReflect como parte de nuestros esfuerzos por ayudar a las personas a crecer juntas en su camino. Para obtener más información, visita: QuranReflect.com/faq y Cinco puntos de vista para reflexionar sobre el Corán ", + "title": "¿Qué es una reflexión?" + } + }, + "note": "Nota", + "notes-and-reflcs": "Notas y reflexiones", + "post-on-qr": "Publicación en QuranReflect", + "posted-reflections": "Reflexiones publicadas", + "private-notes": "Notas", + "qr-tooltip": " QuranReflect es una plataforma social para compartir reflexiones sobre el Corán. Conéctate en torno al Corán, conéctate con lo que importa. ", + "reflections-intro": { + "line-1": "Para ver e interactuar con los comentarios, interactuar con la comunidad y más, visita QuranReflect.com .", + "line-2": "Puedes iniciar sesión en tu cuenta de QuranReflect vinculada iniciando sesión o registrándote con el mismo correo electrónico de Quran.com utilizado en tu inicio de sesión.", + "line-3": "El contenido que no sea apto para el público será ocultado o eliminado. Los usuarios que publiquen contenido inapropiado serán bloqueados.", + "title": "Obtén más información sobre las reflexiones publicadas" + }, + "save-post-to-qr": "Guardar y publicar en QuranReflect", + "save-privately": "Guardar en privado.", + "save-publish-failed": "La nota se guardó correctamente pero no se pudo publicar.", + "save-success": "La nota se ha guardado correctamente.", + "share-to-qr": "Compartir en QuranReflect.com", + "share-to-qr-desc": "Compartir como {{name}} . La audiencia son usuarios de QuranReflect ", + "update-publish-failed": "La nota se actualizó correctamente pero no se pudo publicar", + "update-success": "La nota se ha actualizado correctamente.", + "view-on-qr": "Ver en QuranReflect" +} diff --git a/locales/es/notification-settings.json b/locales/es/notification-settings.json new file mode 100644 index 0000000000..9ba8f72010 --- /dev/null +++ b/locales/es/notification-settings.json @@ -0,0 +1,22 @@ +{ + "all-notifications": "Todas las notificaciones.", + "channels-notifications": "Canales de notificaciones.", + "channels": { + "chat": "Chat.", + "email": "Correo electrónico.", + "in_app": "En la aplicación.", + "push": "Notificaciones emergentes", + "sms": "Mensaje de texto." + }, + "notif-settings-not-enabled": "La configuración de notificaciones no está habilitada.", + "notif-update-success": "¡Tu configuración de notificaciones se ha actualizado correctamente!.", + "tabs": { + "categories-settings": "Configuración de categorías.", + "global-settings": "Configuración global." + }, + "tags": { + "learning-plans": "Planes de aprendizaje.", + "qgj": "Camino de crecimiento con el Corán.", + "streaks": "Rachas." + } +} diff --git a/locales/es/onboarding.json b/locales/es/onboarding.json new file mode 100644 index 0000000000..8e1716cdf8 --- /dev/null +++ b/locales/es/onboarding.json @@ -0,0 +1,103 @@ +{ + "checklist": { + "1": "Herramientas de la página de inicio.", + "2": "Personaliza tu configuración", + "3": "Enriquece tu experiencia de lectura de la aleya.", + "4": "Funciones personalizadas." + }, + "finish": "Finalizar.", + "onboarding-checklist": "Lista de inducción.", + "onboarding-title": "¡Maximiza tu experiencia en Quran.com!

    Comienza tu recorrido ahora:", + "previous": "Anterior.", + "skip": "Saltar.", + "steps": { + "3-dot-menu": { + "description": "Haz clic en el menú de 3 puntos para descubrir opciones para copiar, marcar y repetir versículos. Descubre una variedad de opciones para repetir versículos.", + "title": "Menú de 3 puntos." + }, + "ayah-reflection": { + "description": "Lee reflexiones (tadabbur) de eruditos, estudiantes de conocimiento y gente común que te ayudarán a desarrollar una conexión más personal con el Corán.", + "title": "Lee reflexiones de la aleya." + }, + "ayah-tafsir": { + "description": "Explora el Tafsir de una aleya, ofrece información detallada para mejorar tu comprensión a medida que lees. (El Tafsir puede agruparse para varios versículos cuando sea apropiado).", + "title": "Lee el tafsir de la aleya." + }, + "font-size": { + "description": "Personaliza tu experiencia leyendo el Corán con los tamaños de fuentes fáciles de ajustar para tu comodidad.", + "title": "Tamaño de fuente" + }, + "font-style": { + "description": "Las opciones incluyen Uthmani - King Fahad Complex v1, Uthmani - King Fahad Complex v2, Uthmani QPC Hafs, Indopak 15 lines e Indopak 16 lines.", + "title": "Elige tu escritura preferida para la lectura" + }, + "inline-wbw": { + "description": "Mira la traducción de cada palabra en una línea (debajo de la palabra) o en una burbuja sobre la palabra mientras escuchas el Corán.", + "title": "Mostrar la traducción palabra por palabra en línea (debajo de la palabra) o mostrar la información sobre las herramientas." + }, + "juz": { + "description": "Ver el Corán por juz", + "title": "Ver el Corán por juz" + }, + "listen": { + "description": "Inicia el reproductor de audio para escuchar la recitación.", + "title": "Escucha una sura o una aleya." + }, + "login": { + "description": "Inicia sesión y guarda la configuración en todos los dispositivos y obtén acceso a funciones adicionales.", + "title": "Iniciar sesión." + }, + "quran-radio": { + "description": "Escucha Radio Coránica: sintoniza el Corán sin publicidad.", + "title": "Radio Coránica." + }, + "reading-sessions": { + "description": "Revisa fácilmente tu viaje coránico con un vistazo a tu historial de lectura personalizado con seguimiento de los versículos que has explorado en Quran.com.", + "title": "Ver el historial de lectura." + }, + "reading-view": { + "description": "Ver el Corán en modo de lectura mushaf.", + "title": "Modo de lectura." + }, + "search-bar": { + "description": "Usa nuestra barra de búsqueda para encontrar los versículos, suras, palabras clave, juz y temas que estés buscando.", + "title": "Barra de búsqueda." + }, + "select-reciter": { + "description": "¡Personaliza tu experiencia auditiva al seleccionar el recitador que más te guste escuchar!", + "title": "Selecciona entre una variedad de recitadores para escuchar." + }, + "settings": { + "description": "Ajusta tus preferencias", + "title": "Configuración" + }, + "streak": { + "description": "Establece metas de lectura personalizadas, realiza un seguimiento de tu progreso y desarrolla un hábito de lectura coránica constante con nuestras funciones de planes y rachas de lectura.", + "title": "Realiza un seguimiento de las rachas de lectura y los planes de lectura." + }, + "surah-info": { + "description": "Obtén información sobre cada sura, ubicada al comienzo de cada sura para tu conveniencia.", + "title": "Lee acerca de la sura." + }, + "theme": { + "description": "Elige tu modo de vista favorita - Claro, sepia u oscuro - para una experiencia de lectura del Corán cómoda y personalizada.", + "title": "Lee el Corán en modo claro, sepia u oscuro." + }, + "translations": { + "description": "Elige entre una variedad de traducciones en varios idiomas. Consejo: selecciona varias opciones para comparar las traducciones.", + "title": "Traducciones." + }, + "wbw-audio": { + "description": "¡Selecciona esta opción para escuchar cada palabra individualmente simplemente haciendo clic en la palabra!", + "title": "Haz clic en la palabra para escuchar la transliteración palabra por palabra." + }, + "wbw-translation": { + "description": "Mira el significado de cada palabra mientras lees o escuchas el Corán para ayudarte a mejorar tu vocabulario coránico.", + "title": "Leer traducción palabra por palabra" + }, + "wbw-transliteration": { + "description": "Mira la transliteración de cada palabra para ayudarte en tu viaje de lectura del Corán.", + "title": "Leer transliteración palabra por palabra" + } + } +} diff --git a/locales/es/privacy.json b/locales/es/privacy.json new file mode 100644 index 0000000000..3470414f65 --- /dev/null +++ b/locales/es/privacy.json @@ -0,0 +1,48 @@ +{ + "communication": { + "desc": "Podremos utilizar su dirección de correo electrónico para enviarte actualizaciones importantes, boletines informativos o notificaciones relacionadas con nuestros servicios, contenidos, etc. Tendrás la posibilidad de darte de baja de estas comunicaciones en cualquier momento.", + "title": "Comunicación" + }, + "contact-us": { + "desc": "Si tienes alguna pregunta, inquietud o solicitud con respecto a esta Política de privacidad o al manejo de tu información personal, comunícate con nosotros <0>aquí. Al utilizar nuestro sitio web, reconoces que has leído y comprendido esta Política de privacidad y aceptas la recopilación, el uso y la divulgación de tu información personal según lo descrito.", + "title": "Contáctanos" + }, + "cookies": { + "desc": "Quran.com utiliza cookies para mejorar tu experiencia de navegación, proporcionar contenido personalizado y analizar el tráfico del sitio web. Al acceder y utilizar nuestro sitio web, aceptas el uso de cookies de acuerdo con esta Política de privacidad.

  • Tipos de cookies que utilizamos:
  • Cookies necesarias: estas cookies son esenciales para el correcto funcionamiento de nuestro sitio web y permiten funciones básicas, como la navegación de páginas y el acceso a áreas seguras. No recopilan ninguna información de identificación personal. Sin estas cookies, es posible que algunas partes del sitio web no funcionen correctamente. Cookies analíticas y de rendimiento: utilizamos estas cookies para recopilar información sobre cómo los visitantes utilizan nuestro sitio web, incluido el número de visitantes, las páginas que visitan y el tiempo que pasan en cada página. Estos datos nos ayudan a analizar y mejorar el rendimiento y la funcionalidad de nuestro sitio web. Estas cookies no te identifican personalmente; todos los datos son agregados y anónimos. ", + "title": "Uso de Cookies" + }, + "data-analysis": { + "desc": "Utilizamos Google Analytics para garantizar que el sitio siga funcionando como se espera y para saber qué funciones priorizar, etc. Esta información es anónima y no la relacionamos con ningún individuo en particular.", + "title": "Análisis de datos" + }, + "data-deletion": { + "desc": "Para garantizar tu privacidad y el control de tu información personal, ofrecemos un proceso de eliminación de cuenta sencillo. Cuando elijas eliminar tu cuenta, todos los datos personales asociados se eliminarán de forma automática y permanente de nuestros sistemas. Puedes iniciar la eliminación de la cuenta accediendo a tu página de perfil. Una vez iniciada la eliminación, tus datos personales se eliminarán de forma segura de nuestros servidores en un plazo de tiempo razonable.", + "title": "Eliminación de datos" + }, + "data-protection": { + "desc": " El derecho de acceso: Tienes derecho a solicitar a la Quran Foundation copias de tus datos personales. Podemos cobrarte una pequeña tarifa por este servicio.

    El derecho de rectificación: Tienes derecho a solicitar que la Quran Foundation corrija cualquier información que considere inexacta. También tienes derecho a solicitar a la Quran Foundation que complete la información que consideres incompleta.

    El derecho de borrado: Tiene derecho a solicitar que la Quran Foundation borre tus datos personales, bajo ciertas condiciones.

    El derecho a restringir el procesamiento: Tiene derecho a solicitar que la Quran Foundation restrinja el procesamiento de tus datos personales, bajo ciertas condiciones.

    El derecho a oponerse al procesamiento : Tienes derecho a oponerte al procesamiento de tus datos personales por parte de la Quran Foundation, bajo ciertas condiciones.

    El derecho a la portabilidad de datos : Tienes derecho a solicitar que la Quran Foundation transfiera los datos que hemos recopilado a otra organización, o directamente a usted, bajo ciertas condiciones.", + "title": "Derechos de protección de datos" + }, + "data-security": { + "desc": "Tomamos las medidas adecuadas para proteger tu información personal contra accesos, alteraciones, divulgaciones o destrucción no autorizados. Utilizamos protocolos de seguridad estándar de la industria y empleamos medidas de seguridad físicas, electrónicas y administrativas para garantizar la confidencialidad e integridad de tus datos.", + "title": "Seguridad de datos" + }, + "data-sharing": { + "desc": "No vendemos, intercambiamos ni alquilamos tu información personal a terceros.", + "title": "Intercambio de datos" + }, + "info-collection": { + "desc": "Recopilamos cierta información personal de los usuarios que eligen crear una cuenta en Quran.com. Esta información puede incluir:

    Dirección de correo electrónico : Recopilamos tu dirección de correo electrónico para facilitar el proceso de creación de la cuenta y para fines de comunicación relacionados con tu cuenta, incluida la recuperación de la cuenta y las notificaciones de seguridad.", + "title": "Recopilación de información" + }, + "log-data": { + "desc": "Recopilamos información que tu navegador envía cada vez que visitas nuestro Servicio (“Datos de registro”). Estos Datos de registro pueden incluir información como la dirección de Protocolo de Internet (“IP”) de tu computadora, el tipo de navegador, la versión del navegador, las páginas de nuestro Servicio que visitas, la hora y la fecha de tu visita, el tiempo que pasas en esas páginas y otras estadísticas.", + "title": "Datos de registro" + }, + "main-privacy-desc": "Quran Foundation, Inc. (que incluye Quran.com) es una organización sin fines de lucro 501(c)(3) que se esfuerza por empoderar a todos los seres humanos para que se beneficien del Corán. Quran Foundation, Inc. valora y respeta la privacidad de todos nuestros usuarios.", + "personal-info-use": { + "desc": "Utilizamos la información personal que recopilamos para los siguientes fines:
  • Creación y gestión de cuentas : Tu dirección de correo electrónico se utiliza para crear y gestionar tu cuenta en nuestro sitio web. Te permite iniciar sesión, acceder a tu configuración y almacenar tus marcadores e historial de lectura.
  • Personalización : Podemos utilizar tu historial de lectura para proporcionar recomendaciones y sugerencias personalizadas en función de tus preferencias e intereses.
  • ", + "title": "Uso de información personal" + }, + "privacy-header": "Política de privacidad" +} diff --git a/locales/es/product-updates.json b/locales/es/product-updates.json new file mode 100644 index 0000000000..0cd75dd141 --- /dev/null +++ b/locales/es/product-updates.json @@ -0,0 +1,3 @@ +{ + "localization-message": "Estás viendo esta página en español. Estamos trabajando en traducirla. Disculpa las molestias." +} diff --git a/locales/es/profile.json b/locales/es/profile.json new file mode 100644 index 0000000000..019d4310a9 --- /dev/null +++ b/locales/es/profile.json @@ -0,0 +1,10 @@ +{ + "delete-account": "Eliminar cuenta", + "delete-confirmation": { + "action-text": "Entiendo la consecuencia, elimina mi cuenta", + "confirmation-text": "eliminar mi cuenta", + "instruction-text": "Por favor, escriba {{text}} para confirmar", + "subtitle": "Esta acción no se puede deshacer. Eliminará permanentemente tu cuenta, tus marcadores guardados, tus sesiones de lectura y todos tus datos.", + "title": "¿Estás completamente seguro?" + } +} diff --git a/locales/es/question.json b/locales/es/question.json new file mode 100644 index 0000000000..9c26fe3f82 --- /dev/null +++ b/locales/es/question.json @@ -0,0 +1,5 @@ +{ + "q-and-a": "Preguntas y respuestas relacionadas con ", + "question": "Pregunta", + "questions-meta-desc": "Explore respuestas confiables para profundizar su comprensión del Corán." +} diff --git a/locales/es/quick-links.json b/locales/es/quick-links.json new file mode 100644 index 0000000000..58cfc52721 --- /dev/null +++ b/locales/es/quick-links.json @@ -0,0 +1,14 @@ +{ + "about-quran": "Acerca del Corán", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jesús en el Corán", + "kahf": "Al-Kahf", + "mulk": "Al Mulk", + "muzzammil": "Al Muzzammil", + "qr": "Únete al Ramadán de Reflexión", + "rahman": "Ar-Rahman", + "sunnah": "Versículos sobre la Sunnah", + "waqiah": "Al Waqiah", + "what-is-ramadan": "¿Qué es el Ramadán?", + "yaseen": "Yasin" +} diff --git a/locales/es/quran-reader.json b/locales/es/quran-reader.json new file mode 100644 index 0000000000..40bced22c4 --- /dev/null +++ b/locales/es/quran-reader.json @@ -0,0 +1,92 @@ +{ + "add-collection": "Agregar colección", + "advanced-copy": "Copia avanzada ", + "aria": { + "read-ayah-refls": "Leer las reflexiones de la aleya", + "read-tafsirs": "Leer Tafsirs de aleyas" + }, + "ayatul-kursi": "Ayatul Kursi", + "back-to-ayah": "Volver a la aleya", + "copy-arabic": "Texto árabe (texto utmani)", + "copy-footnote-q": "¿También copiar notas a pie de página?", + "copy-success": "El texto se ha copiado correctamente en el portapapeles.", + "copy-text": "Copiar texto", + "copy-verse": "Copiar texto", + "cpy-link": "Copiar enlace", + "current-verse": "Verso actual", + "download-copy": "Si desea descargar un archivo de texto.", + "edgham": "Letra silenciada", + "ekhfa": "Ghuna/ikhfa´", + "font": "Fuente árabe para copiar", + "font-placeholder": "Seleccione una fuente", + "font-tooltip": "Las fuentes King Fahad V1 y V2 estarán en Unicode.", + "footnote": "Nota al pie", + "footnote-dl": "
    Dual
    En el idioma árabe hay una forma para verbos y pronombres cuando se dirige a dos personas.", + "footnote-pl": "Plural", + "footnote-sg": "Singular", + "full-surah-cta": "Leer sura completa", + "generate-media": "Genera video o imagen", + "go-ayah": "Ir a la aleya", + "hizb-beginning": "Comienzo de Hizb", + "include-translator": "¿Incluir el nombre del traductor?", + "juz-beginning": "Comienzo del juz", + "lessons-desc": "Lea y comparta las lecciones coránicas de Ayah {{ayahNumber}} de Surah {{surahName}}", + "lessons-disclaimer": "Las lecciones son reflexiones e interpretaciones personales del Corán y no deben tomarse como una referencia oficial.", + "lessons-not-available": "No hay lecciones revisadas para esta aleya", + "mad-2": "Madd normal (2)", + "mad-2-4-6": "Madd separada (2/4/6)", + "mad-4-5": "Madd conectada (4/5)", + "mad-6": "Madd necesaria (6)", + "new-collection-name": "Nuevo nombre de la colección", + "next-hizb": "Hizb siguiente", + "next-juz": "Juz siguiente", + "next-page": "Página siguiente", + "next-rub": "Rub el Hizb siguiente", + "next-surah": "Sura siguiente", + "posted-in": "Publicado en", + "prev-ayah": "Aleya anterior", + "prev-hizb": "Hizb anterior", + "prev-juz": "Juz anterior", + "prev-page": "Página anterior", + "prev-rub": "Rub el Hizb anterior", + "prev-surah": "Sura anterior", + "q-and-a": { + "answer": "Respuesta", + "clarification": "Clarificación", + "community": "Comunidad", + "explore_answers": "Explorar respuestas", + "explore_answers_tooltip": "'Explorar respuestas' es una lista seleccionada de preguntas reflexivas y notas esenciales relacionadas con versículos específicos que mejorarán su comprensión y conexión con el Corán.", + "questions": "Preguntas", + "references": "Referencias", + "summary": "Resumen", + "tafsir": "Tafsir" + }, + "qalqala": "Qalqala (eco)", + "query-param-message": "Estás viendo la configuración de lectura preseleccionada. <0>Descartar para ver la configuración actual o <1>Guardar para actualizar la configuración", + "ramadan-of-reflection": "Únase a QuranReflect \"Ramadán de reflexión\"", + "read-more-quran-reflect": "Leer más en QuranReflect", + "referencing": "Referencias", + "reflection-disclaimer": "Las reflexiones son perspectivas personales (revisadas por su calidad) y no deben tomarse como autorizadas.", + "reflection-not-available": "No hay reflexiones revisadas para esta aleya", + "reflections-desc": "Lee y comparte reflexiones coránicas de la aleya {{ayahNumber}} de la sura {{surahName}}", + "remove-bookmark": "Quitar favorito", + "removed-from": "Eliminado de {{collectionName}}", + "revelation-order-notice": "Nota: estás navegando por el Corán según el orden de la revelación. Haz clic aquí para volver al orden predeterminado.", + "rub-beginning": "Comienzo de Rub el Hizb", + "save-to": "Guardar en...", + "saved-to": "Guardado en {{collectionName}}", + "see-less": "Ver menos", + "see-more": "Ver más", + "select-range": "Selección de aleyas consecutivas", + "share-your-reflection": "Comparte tu reflexión sobre esta aleya", + "surah-beginning": "Comienzo de la sura", + "surah-info": "Información de la sura", + "tafkhim": "Tafkhim (pesada)", + "tafsirs": "Tafsires", + "tajweed-colors": "Colores de Tajweed.", + "text-copied": "¡El texto ha sido copiado al portapapeles!", + "trans-change": "Cambiar", + "translation-by": "Traducción por", + "verses-range": "Gama de versos", + "view-on-quran-reflect": "Ver en QuranReflect" +} diff --git a/locales/es/quranic-calendar.json b/locales/es/quranic-calendar.json new file mode 100644 index 0000000000..40ee003759 --- /dev/null +++ b/locales/es/quranic-calendar.json @@ -0,0 +1,35 @@ +{ + "hero": { + "line-1": "El Calendario Coránico Global es un programa de lectura diseñado para fomentar la lectura reflexiva de todo el Corán desde el final de un Ramadán hasta el comienzo del siguiente. Te animamos a que te tomes un tiempo para comprender y reflexionar sobre los versículos para que puedas lograr una conexión más profunda y sincera." + }, + "interact-with-post": "Interactúa con esta publicación en QuranReflect.", + "islamic-months": { + "1": "Muharram.", + "2": "Safar.", + "3": "Rabi' al-Awwal.", + "4": "Rabi' ath-Thani.", + "5": "Jumada al-Awwal.", + "6": "Jumada ath-Thani.", + "7": "Rájab.", + "8": "Shabán.", + "9": "Ramadán.", + "10": "Shawwal.", + "11": "Dhu al-Qaidah.", + "12": "Dhu al-Hijjah." + }, + "join-qc": { + "line-1": "Estamos en la semana {{weekNumber}} del calendario Coránico.", + "line-2": " ¡Únete a nosotros para la lectura de esta semana incluso si es su primera vez! " + }, + "join-quranic-calendar": "Suscríbete para recibir actualizaciones y recursos a través de QuranReflect.", + "join-quranic-calendar-success": "¡Te has unido al Club del Libro Divino con éxito!", + "quranic-calendar": "El Calendario Coránico Global.", + "reading-options": { + "default-settings": "Leer con mi configuración predeterminada.", + "en-and-ar": "Leer en español y árabe.", + "en-only": "Leer solo en español." + }, + "supplemental-resources": "Recursos de apoyo.", + "today": "La fecha de hoy es: {{day}} de {{month}} de {{year}} , {{gregorianDate}}. ", + "week-title": "Semana {{weekNumber}} ( {{month}} ) que abarca los versículos {{rangeStart}} al {{rangeEnd}}." +} diff --git a/locales/es/radio.json b/locales/es/radio.json new file mode 100644 index 0000000000..7e29e5aa29 --- /dev/null +++ b/locales/es/radio.json @@ -0,0 +1,27 @@ +{ + "change": "Cambiar", + "curated-station": { + "juz-amma": { + "description": "Escuche el Juz final del Corán", + "title": "Juz Amma" + }, + "popular-recitations": { + "description": "Fuente de recitaciones seleccionada diariamente", + "title": "Recitaciones populares" + }, + "surah-al-kahf": { + "description": "Escuche Surah Alkahf repetidamente", + "title": "Sura Al-Kahf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Las suras de una selección de recitadores", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Estaciones seleccionadas", + "pause-radio": "Pausar la radio", + "play-radio": "Reproducir radio", + "radio-desc": "Escucha la hermosa recitación ininterrumpida del Sagrado Corán por varios recitadores.", + "reciter-stations": "Estaciones de recitación", + "station": "Estación" +} diff --git a/locales/es/ramadan-activities.json b/locales/es/ramadan-activities.json new file mode 100644 index 0000000000..fd8efa8d9a --- /dev/null +++ b/locales/es/ramadan-activities.json @@ -0,0 +1,4 @@ +{ + "ramadan-activities": "Actividades de Ramadán.", + "ramadan-activities-desc": "Mejora tu experiencia en Ramadán con nuestros programas y funciones seleccionados para una conexión más profunda con el Corán. ¡Explora nuestras actividades de Ramadán en Quran.com hoy mismo!" +} diff --git a/locales/es/reading-goal.json b/locales/es/reading-goal.json new file mode 100644 index 0000000000..ffff71dca7 --- /dev/null +++ b/locales/es/reading-goal.json @@ -0,0 +1,136 @@ +{ + "continue-reading": "Continuar leyendo", + "continuous": { + "description": "Tu objetivo calculará tu progreso a lo largo de una serie de días.", + "title": "Durante un período de tiempo" + }, + "create-plan": "Crear plan", + "create-reading-goal": "Crear una meta", + "daily-progress": "Progreso diario", + "daily-progress-completed": "¡Completado! 🎉", + "daily": { + "description": "Tu objetivo se reiniciará cada día", + "title": "Objetivo diario" + }, + "day-x": "Día {{day}}", + "days": "Días", + "duration": "Duración (días)", + "ending-chapter": "Sura final", + "ending-verse": "Aleya final", + "examples-subtitle": "A continuación se muestra una lista de objetivos comunes. También puedes crear tu propio objetivo.", + "examples-title": "Elige un objetivo preestablecido o crea el tuyo propio", + "examples": { + "custom": { + "description": "Establezca un objetivo personalizado que se adapte a usted", + "title": "Personalización" + }, + "khatm": { + "description": "Un objetivo clásico de Khatm. Leer 1 Juz al día", + "title": "Lee el Corán en 30 días" + }, + "time": { + "description": "Un objetivo sencillo y apto para principiantes", + "title": "Leer 10 minutos al día" + }, + "year": { + "description": "Lee el Corán a tu propio ritmo durante el próximo año", + "title": "Leer el Corán en un año" + } + }, + "frequency-tab": { + "description": "¿Tu objetivo debería reiniciarse todos los días o cada cierto número de días? No te preocupes, haremos un seguimiento de tu progreso independientemente de la frecuencia que elijas.", + "title": "Elige una frecuencia para tu objetivo" + }, + "goal-completed": "¡Objetivo cumplido! 🎉 ", + "goal-done": { + "description": "Cualquier lectura adicional seguirá siendo registrada.", + "title": "Completaste el objetivo de hoy." + }, + "goal-target": { + "description": "¿Cuánto tiempo, páginas o versículos debes leer para completar tu objetivo?", + "title": "Establece un objetivo para tu meta" + }, + "goal-type": { + "description": "¿Tu objetivo debe basarse en el tiempo, las páginas o una parte personalizada (es decir, 3 Juzs del Corán)?", + "title": "Elige un criterio para tu objetivo" + }, + "goal-types": { + "pages": { + "description": "Tu objetivo se basará en páginas.", + "title": "Páginas" + }, + "range": { + "description": "Tu objetivo se basará en un rango personalizado de versículos (puede ser una Sura, un Juz o incluso el Corán completo).", + "title": "Parte personalizada" + }, + "time": { + "description": "Tu objetivo se basará en el tiempo.", + "title": "Tiempo" + } + }, + "plus-x-more-days": { + "one": " +{{days}} más día", + "other": " +{{days}} más días" + }, + "preview-schedule": { + "description": "Así es como se verá tu objetivo. Siempre puedes cambiarlo más adelante.", + "title": "Aquí tienes una vista previa de tu horario." + }, + "progress": { + "complete": "El objetivo de hoy está cumplido 🎉", + "goal-complete": "Todo tu objetivo está cumplido 🎉", + "pages-goal": "leer {{pages}} página(s) del Corán", + "range-goal": "leer {{from}} hasta {{to}}", + "time-goal": "leer {{time}} del Corán" + }, + "reading-goal": "Objetivo de lectura", + "reading-goal-description": "¿Le resulta difícil mantener la constancia en sus objetivos de lectura del Corán?

    Quran Growth Journey es una función dinámica desarrollada para ayudarlo a mantenerse constante en su camino con el Corán. Ya sea que su objetivo sea leer 10 minutos al día, completar un Juz en un mes o terminar todo el Corán en un año, etc., Quran.com ahora puede ayudarlo a establecer un objetivo personalizado y realizar un seguimiento de sus lecturas diarias, mientras realiza ajustes a medida que avanza. ¡Es completamente gratuito y esperamos que lo ayude a mantenerse motivado para alcanzar su objetivo!", + "reading-goal-label": "Estás en un", + "reading-goal-title": "Presentando el viaje de crecimiento del Corán", + "recommended": "Recomendado", + "remaining": "Quedando por hoy", + "remaining-base": "Restante", + "remaining-days": { + "one": "{{days}} día que queda", + "other": " {{days}} días que quedan" + }, + "set-a-new-goal": "Establezca una nueva meta", + "set-reading-goal-success": "Tu objetivo de lectura se ha establecido con éxito.", + "start-journey": "¡Comienza tu viaje!", + "start-reading": "Empezar a leer", + "starting-chapter": "Sura inicial", + "starting-verse": "Aleya inicial", + "streak": "Racha", + "streak-definition": "Una racha es el número de días consecutivos que has leído el Corán.", + "timeline-meaning": "¿Qué significa tu línea de tiempo?", + "timeline-states": { + "checked": "Has completado tu objetivo", + "filled": "Leíste algo pero no lo suficiente para completar tu objetivo.", + "none": "No has leído nada todavía.", + "stroked": "No has leído nada hoy" + }, + "todays-goal": "El objetivo de hoy", + "view-progress": "Ver progreso", + "week-progress": "Progreso de esta semana", + "x-days": { + "one": " {{days}} día", + "other": "{{days}} días" + }, + "x-days-streak": "{{days}} racha de días", + "x-hours": { + "one": "{{hours}} hora\\n", + "other": " {{hours}} horas" + }, + "x-minutes": { + "one": "{{minutes}} minuto\\n", + "other": "{{minutes}} minutos" + }, + "x-pages": { + "one": "{{pages}} página\\n", + "other": " {{pages}} páginas" + }, + "x-seconds": { + "one": "{{seconds}} segundo\\n", + "other": " {{seconds}} segundos\\n" + } +} diff --git a/locales/es/reading-progress.json b/locales/es/reading-progress.json new file mode 100644 index 0000000000..defe101331 --- /dev/null +++ b/locales/es/reading-progress.json @@ -0,0 +1,31 @@ +{ + "add": "Agregar", + "add-data-success": "Tus datos de lectura se han añadido correctamente.", + "delete-goal": { + "action": "Eliminar objetivo", + "confirmation": { + "action-text": "Entiendo la consecuencia, eliminar mi objetivo.", + "confirmation-text": "eliminar mi objetivo", + "instruction-text": "Por favor, escribe {{text}} para confirmar", + "subtitle": "Esta acción no se puede deshacer. Eliminará tu objetivo de forma permanente y dejaremos de hacer un seguimiento de tu progreso.", + "title": "¿Está seguro?" + }, + "success": "Tu objetivo de lectura ha sido eliminado exitosamente." + }, + "edit-goal": { + "action": "Editar objetivo", + "subtitle": "Volveremos a calcular tu progreso en función del nuevo objetivo.", + "success": "Su objetivo de lectura se ha actualizado correctamente.", + "title": "Edita tu objetivo de lectura" + }, + "history": "Historial de lectura", + "history-for": "Historial de lectura de {{date}}", + "manage-goal": "Gestiona tu objetivo de lectura", + "manually-add": "Agregar lecturas manualmente", + "no-reading-history-for": "No hay historial de lectura para {{date}}", + "reading-progress-header": "Tu progreso", + "reading-progress-streak": "Racha", + "reading-time": "Tiempo de lectura", + "seconds-read-tooltip": "Este es el tiempo que has dedicado a leer las aleyas que has introducido. Lo rellenamos automáticamente con la velocidad de lectura media en Quran.com, pero puedes anularlo con tu tiempo de lectura real.", + "you-read": "Leíste:" +} diff --git a/locales/es/reciter.json b/locales/es/reciter.json new file mode 100644 index 0000000000..141c3770fb --- /dev/null +++ b/locales/es/reciter.json @@ -0,0 +1,8 @@ +{ + "copy-link": "Copiar enlace", + "quran-reciters": "Recitadores del Corán", + "read": "Leer", + "reciter-desc": "Escucha y descargua la hermosa recitación del Sagrado Corán de {{reciterName}}.", + "reciters-desc": "Escucha y descargua hermosas recitaciones del Sagrado Corán de varios recitadores.", + "search-chapter": "Buscar capítulo" +} diff --git a/locales/es/search.json b/locales/es/search.json new file mode 100644 index 0000000000..ff08807f74 --- /dev/null +++ b/locales/es/search.json @@ -0,0 +1,12 @@ +{ + "default-translations": "Traducciones predeterminadas", + "filter": "filtrar", + "language-filter-label": "Buscar todas las traducciones de un idioma", + "language-select": "Selecciona un idioma", + "reset": "reiniciar", + "search": "Buscar", + "search-desc": "Busca en el recopilatorio del Sagrado Corán y sus traducciones utilizando un motor de búsqueda multilingüe potente y altamente preciso.", + "search-title": "Buscar ' {{searchQuery}} '", + "searching-translations": "Buscando traducciones", + "translation-select": "Seleccionar una traducción" +} diff --git a/locales/es/support.json b/locales/es/support.json new file mode 100644 index 0000000000..4c3ba73de7 --- /dev/null +++ b/locales/es/support.json @@ -0,0 +1,25 @@ +{ + "bug-a": "Por favor reporta este error <0>aquí y lo solucionaremos lo antes posible inshAllah.", + "bug-q": "Encontré un error de traducción, ¿dónde lo reporto?", + "developer-a": "Consulta la <0>página de desarrolladores para obtener más información.", + "developer-q": "Soy desarrollador. ¿Cómo puedo contribuir?", + "donate-a": "En primer lugar, agradecemos mucho tu interés en colaborar. Visita <0>este enlace", + "donate-q": "¿Cómo puedo donar?", + "download-a": "Lamentablemente, no. Aún no ofrecemos la posibilidad de descargar nuestro sitio web o el Corán a tu computadora. Sin embargo, puedes instalar nuestra aplicación móvil para leer sin conexión.", + "download-q": "¿Puedo descargar Quran.com a mi computadora?", + "header": "Ayuda y retroalimentación", + "main-desc": "Verifica las preguntas frecuentes para ver si tu pregunta ya ha sido respondida. Si es necesario, puedes <0>contactarnos y haremos lo mejor en responderte tan pronto como sea posible, sin embargo ten en cuenta que somos un equipo pequeño así que sé paciente. ", + "mobile-a": "¡Sí! Visita <0>Corán para Android o <1>Corán para iOS para descargar las aplicaciones.", + "mobile-q": "¿Quran.com tiene aplicación móvil?", + "other-languages-a": "Para cambiar el idioma preferido, hay un menú desplegable en la esquina superior derecha de cada página (esquina superior izquierda en los idiomas que se leen de derecha a izquierda). Utiliza este menú desplegable para elegir tu idioma preferido.", + "other-languages-q": "¿Puedo navegar por el sitio en otros idiomas?", + "reciters-a": "Envía más información sobre este recitador <0>aquí", + "reciters-q": "Añadiendo más recitadores", + "site-down-a": "¡Eso no es bueno! Si el sitio no funciona en absoluto o tal vez ves una pantalla blanca con el texto \"Lo sentimos, algo salió mal\", te agradeceríamos que lo informes <0>aquí.", + "site-down-q": "El sitio no funciona, ¿cómo te lo digo?", + "support": "Apoyo", + "tafsir-a": "Sí, tenemos algunos Tafsirs. Haz clic en el ícono que se muestra junto a cada aleya y luego haga clic en Tafisrs. La aplicación te mostrará una lista de los Tafsirs disponibles. Haz clic en el Tafsir que desea leer.", + "tafsir-q": "¿Está disponible el Tafsir?", + "translations-a": "Abra un nuevo número <0>aquí con todos los detalles, el enlace a la traducción y haremos todo lo posible para agregarlo.", + "translations-q": "Añadir otra traducción" +} diff --git a/locales/es/surah-info.json b/locales/es/surah-info.json new file mode 100644 index 0000000000..54f8122ab5 --- /dev/null +++ b/locales/es/surah-info.json @@ -0,0 +1,6 @@ +{ + "go-to-surah": "Ir a la sura", + "madinah": "Medina", + "makkah": "La Meca", + "revelation-place": "Lugar de revelación" +} diff --git a/locales/es_US/common.json b/locales/es_US/common.json deleted file mode 100644 index 400ba9791d..0000000000 --- a/locales/es_US/common.json +++ /dev/null @@ -1,419 +0,0 @@ -{ - "about": "Sobre nosotros", - "allow": "Permitir", - "and": "", - "announcements": { - "auth-onboarding": { - "data-sync": { - "action": "", - "description": "", - "title": "" - }, - "feedback": { - "action": "", - "description": "", - "title": "" - }, - "quran-foundation-link": { - "action": "Siguiente", - "description": "Utiliza tu nombre de usuario en Quran.com para acceder a QuranReflect.com, una próspera comunidad global dedicada a la reflexión coránica.", - "title": "¡Utiliza tu cuenta en todas las aplicaciones de Quran.Foundation!" - }, - "quran-growth-journey": { - "action": "Siguiente", - "description": "Mantén tu racha de lectura del Corán y avanza hacia tus metas mientras desarrollas nuevos hábitos.", - "title": "¡Comienza tu viaje de crecimiento en el Corán!" - }, - "welcome": { - "action": "", - "title": "" - } - }, - "collections-announcement": { - "slide-1": { - "description": "", - "title": "" - } - } - }, - "aria": { - "change-settings": "", - "drawer-close": "", - "msg-close": "", - "nav-drawer-open": "", - "play-surah": "", - "select-lng": "", - "sidebar-nav-close": "" - }, - "audio": { - "auto-scroll": { - "off": "Apagado", - "on": "", - "title": "Desplazamiento automático" - }, - "displaying": "", - "exp-tip": "", - "exp-tip-no-select": "", - "experience": "", - "play": "Reproducir audio", - "playback-normal": "", - "playback-speed": "", - "playback-speed-unit": "", - "player": { - "close-audio-player": "", - "currently-playing": "Actualmente se está reproduciendo", - "delay-verse": "", - "download": "", - "full-surah": "", - "manage-repeat-settings": "", - "mismatch": "Haz clic en \"Comenzar de nuevo\" si en su lugar deseas reproducir {{currentReadingChapter}}.", - "pause": "", - "pause-audio": "", - "play": "", - "play-audio": "", - "play-range": "", - "previous-ayah": "", - "repeat-1-verse": "", - "repeat-settings": "", - "repeat-verse": "", - "search-verse": "", - "single-verse": "", - "start-over": "", - "start-playing": "", - "stop-repeating": "", - "times": "", - "verses-range": "", - "volume-control": "Control del volumen." - }, - "repeat-moved": "", - "select-reciter": "", - "speed": "", - "title": "" - }, - "ayah": "", - "ayahs": "", - "beta": "Beta", - "bookmark": "", - "bookmarked": "", - "both": "Ambas", - "cancel": "Cancelar", - "click-here": "Haz clic aquí", - "close": "Cerrar", - "command-bar": { - "navigations": "Navegaciones", - "no-nav-results": "Sin resultados de navegación", - "placeholder": "", - "powered-by": "", - "recent-navigations": "", - "search-by-voice": "", - "try-navigating": "Intenta navegar a" - }, - "community": { - "cta": "Únete a la comunidad", - "header": "Únete a la comunidad QDC de constructores y tecnólogos musulmanes.", - "sub-header": "Regístrate en el Discord de Quran.com para particilar y colaborar en la comunidad líder en la construcción de tecnología islámica.", - "title": "Comunidad" - }, - "complete-sign-up": "", - "consents": { - "communication": { - "body": "🚀 Potencia tu progreso a través de notificaciones personalizadas sobre el progreso de tus objetivos, el mantenimiento de las rachas y la mejora del uso de nuestras funciones actuales.



    ¿Podemos mantenerte informado a través del correo electrónico y otros canales? Tú tienes el control: puedes ajustar estas preferencias en cualquier momento en la configuración de tu cuenta.



    Simplemente selecciona \"Permitir\" para recibir recordatorios inspiradores o \"Ahora no\" para rechazarlos.", - "header": "¡Nos encantaría ayudar a mantenerte comprometido y constante en tu viaje de crecimiento del Corán! 📖🌟" - } - }, - "continue": "", - "copied": "", - "copied-to-clipboard": "", - "copy": "", - "counter": { - "decrease": "", - "increase": "" - }, - "default-description": "", - "delete": "Borrar", - "developers": "Desarrolladores", - "display": "", - "donate": "", - "donate_monthly": "", - "donate_once": "", - "edit": "Editar", - "email-verification": { - "check-spam": "", - "email-sent": "", - "email-verification": "", - "resend-email": "", - "resend-email-in": "", - "verify-code": "" - }, - "error": { - "MediaVersesRangeLimitExceeded": "Solo puedes seleccionar hasta {{limit}} aleyas a la vez. Selecciona una secuencia más pequeña.", - "bookmark-sync": "", - "email-login-fail": "", - "general": "Algo salió mal. Inténtalo de nuevo.", - "offline": "Parece que perdiste la conexión. Verifícala y vuelve a intentarlo.", - "pref-persist-fail": "", - "ranges-no-value": "La secuencia de inicio y final deben tener un valor", - "ranges-too-many-verses": "\\n*Máximo {{maxNumberOfVerses}} aleyas", - "ranges-wrong-order": "El verso de inicio debe estar antes del verso final" - }, - "exciting-updates": "Actualizaciones emocionantes", - "feedback": "Retroalimentación", - "fonts": { - "15_lines": "15 líneas", - "16_lines": "16 líneas", - "code_v1": "King Fahad Complex V1", - "code_v2": "King Fahad Complex V2", - "font-size": "Tamaño de fuente", - "lines": "Líneas", - "qcf-desc": "Las fuentes King Fahad Complex (V1 y V2) generan una mejor calidad pero toman más en cargar.", - "qcf-v4-desc": "Las fuentes Tajweed se creó con Easy Quran - Dar Al Marifa Tajweed Mushaf y King Fahad Glorious Quran Printing Complex (KFGQPC) - Uthmanic Hafs V4 Fonts después de recibir el permiso de ambos.", - "qpc_uthmani_hafs": "QPC Uthmani Hafs", - "quran-font": "Fuente del Corán", - "quran-font-size": "Tamaño de fuente del Corán", - "tajweed": "", - "tajweed-desc": "", - "tajweed_v4": "King Fahad Complex V4", - "text_indopak": "IndoPak", - "text_uthmani": "Uthmani", - "translation-font-size": "Tamaño de fuente de la traducción" - }, - "footer": { - "description": "", - "hiring": "", - "rights": "", - "title": "" - }, - "form": { - "body": "Cuerpo", - "code": "", - "email": "", - "firstName": "", - "lastName": "", - "title": "Título" - }, - "from": "", - "fundraising-sticky-banner": { - "cta": "", - "title": "¡Dona durante los mejores días!" - }, - "fundraising": { - "description": "Las donaciones mensuales nos ayudan a mejorar Quran.com y sostener las operaciones para que nos centremos menos en la recaudación de fondos y más en crear impacto.", - "title": "" - }, - "hear-it-pronounced": "", - "help": "Ayuda", - "hizb": "Hizb", - "home": "Inicio", - "hours": "Horas", - "inline": "", - "input": { - "clear": "Borrar" - }, - "juz": "Juz", - "language": "", - "languages": "", - "learn-more": "", - "learning-plans": "Planes de aprendizaje", - "less": "", - "loading": "", - "login": "", - "logout": "", - "meccan": "", - "medinan": "", - "menu": "Menú", - "minutes": "Minutos", - "mobile-apps": "Aplicaciones Móviles", - "mode": "Modo", - "more": "", - "my-learning-plans": "Mis planes de aprendizaje", - "navigate": "", - "network": "Comunidad", - "new": "¡Nuevo!", - "newest": "Más recientes", - "next": "Siguiente", - "next-ayah": "", - "no": "", - "no-notifications": "No hay notificaciones todavía.", - "none": "Ninguna", - "not-now": "Ahora no.", - "notes": { - "title": "Mis notas y reflexiones" - }, - "notification-settings": "Configuración de notificaciones.", - "notification": { - "mark-all-as-read": "Marcar todo como leído.", - "mark-as-read": "Marcar como leído" - }, - "notifications": "Notificaciones", - "off": "", - "oldest": "Más antiguas", - "on": "", - "page": "", - "pages": "", - "pagination-summary": "{{currentResultNumber}}{{endOfResultNumber}} de {{totalNumberOfResults}} resultados de búsqueda", - "pbuh": "", - "popular-links": "", - "popup": { - "footnote": "", - "text-1": "", - "text-2": "La oportunidad perfecta para la caridad continua (Sadaqa Jariyah). Invierte en tu Más Allá como donante mensual (o solo una vez).", - "title": "¡Dona durante los mejores días!" - }, - "powered-by": "", - "prepare-hearts": { - "cta": "Más información", - "title": "¡Seguimos adelante después del Ramadán!" - }, - "prev": "Anterior", - "previous-ayah": "", - "privacy": "Privacidad", - "product-updates": "", - "profile": "", - "q-reflect": "", - "quran-com": "Quran.com", - "quran-radio": "", - "reading-history": "", - "reading-preference": { - "reading": "Lectura", - "translation": "" - }, - "recitation": "", - "reciter": "Recitador", - "reciter-summary": "", - "reciters": "", - "reflect": "", - "reflections": "Reflexiones.", - "remove": "Eliminar", - "rename": "", - "retry": "Reintentar", - "revelation_order": "", - "rub": "", - "save": "Guardar", - "save-to-collection": "", - "search-for": "", - "search-results": "", - "search": { - "filters": "Filtros", - "hint": "Intenta buscar", - "jump-to": "Saltar a", - "no-results": "No se encontraron resultados", - "no-results-suggestion": "No pudimos encontrar ningún resultado de búsqueda coincidente con \" {{searchQuery}} \". Intenta buscar una palabra clave diferente.", - "popular": "Búsquedas populares", - "recent": "Búsquedas recientes", - "results": "Resultados", - "show-all": "Mostrar todos los resultados", - "switch-mode": "Cambiar a búsqueda avanzada", - "title": "Buscar" - }, - "seconds": "Segundos", - "see-new": "Mira que hay de nuevo.", - "settings": { - "no-tafsir-selected": "", - "no-translation-selected": "", - "reading-experience": "Experiencia de lectura", - "reset": "Reiniciar", - "reset-cta": "Reiniciar configuración", - "reset-notif": "", - "search-reciter": "", - "search-tafsirs": "", - "search-translations": "", - "selected-reciter": "", - "selected-tafsirs": "", - "selected-translations": "", - "show-tooltip-when-playing-audio": "", - "title": "Configuración", - "tooltip-playing-audio-helper": "", - "value-and-other": "", - "value-and-others": "", - "wbw-helper": "", - "word-tooltip-helper": "" - }, - "share": "", - "shared": "", - "show-more": "Mostrar más", - "sidebar": { - "search-hizb": "", - "search-juz": "", - "search-page": "", - "search-surah": "", - "try-navigating-with": "" - }, - "sitemap": "Mapa del sitio web", - "sort": { - "ascending": "Ascendente", - "by": "", - "descending": "Descendiente" - }, - "style": "Estilo", - "submit": "", - "subscribe": "Suscribirse.", - "subscribed": "Suscrito.", - "surah": "Sura", - "tafsir": { - "font-size": "Tamaño de fueste del tafsir", - "group-message": "", - "no-text": "", - "surah": "Tafsir de la sura", - "tafsir-desc": "", - "tafsirs-desc": "", - "title": "Tafsir" - }, - "tarteel": { - "app": "Aplicación Tarteel", - "name": "Tarteel.ai" - }, - "terms-and-conditions": "Términos y condiciones", - "theme": "Modo", - "themes": { - "auto": "", - "dark": "Oscuro", - "light": "Claro", - "sepia": "Sepia", - "system": "Sistema", - "system-desc": "Automáticamente el sistema se adapta a la configuración clara u oscura." - }, - "to": "", - "tooltip": "Herramientas emergentes", - "tooltip-trans-lang": "", - "trans-lang": "", - "translation": "Traducción", - "translations": "Traducciones", - "transliteration": "Transliteración", - "type": "Tipo", - "unavailable": "No está disponible en este momento.", - "undo": "", - "validation": { - "invalid-email": "", - "invalid-field": "", - "maximum-length": "{{field}} no puede exceder {{value}} caracteres", - "minimum-length": "{{field}} debe tener al menos {{value}} caracteres", - "required-field": "" - }, - "verse": "", - "verse-bookmark-removed": "", - "verse-bookmarked": "", - "verses": "", - "view": "Ver", - "voice": { - "ask-permission": "Habilita el permiso del micrófono para comenzar a utilizar la búsqueda por voz.", - "error": "Se ha producido un error, inténtalo de nuevo más tarde. O descarga Tarteel App.", - "no-permission": "Parece que no tienes los permisos del micrófono habilitados. Habilita los permisos del micrófono e inténtalo de nuevo o descarga Tarteel App.", - "not-supported": "Parece que tu navegador no admite el micrófono. Prueba con otro navegador o descarga Tarteel App.", - "suggest": "", - "suggest-subtitle": "", - "suggest-title": "", - "voice-search-powered-by": "" - }, - "wbw": "Palabra por palabra", - "wbw-lang-summary": "", - "wbw-trans-lang": "", - "wbw-translation": "", - "wbw-transliteration": "", - "word-click": { - "no-audio": "", - "play-audio": "", - "title": "" - }, - "word-tooltip": "", - "yes": "Sí" -} diff --git a/locales/es_US/login.json b/locales/es_US/login.json deleted file mode 100644 index 76a4dec3e7..0000000000 --- a/locales/es_US/login.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "awaiting-confirmation": "", - "continue-apple": "", - "continue-email": "", - "continue-facebook": "", - "continue-google": "", - "email-placeholder": "", - "feature-1": "", - "feature-2": "", - "feature-3": "", - "feature-4": "", - "feature-5": "¡Y más!", - "feature-6": " Nuevo! Notas y reflexiones.", - "login-cta": "", - "login-error": { - "AuthenticationError": "", - "TokenExpiredError": "" - }, - "login-title": "", - "other-options": "", - "privacy-policy": "", - "verify-code": "" -} diff --git a/locales/fa/about.json b/locales/fa/about.json index 24c09050e3..1781b8df94 100644 --- a/locales/fa/about.json +++ b/locales/fa/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "این پروژه بدون بسیاری از کتابخانه ها و پروژه های منبع باز که استفاده کرده ایم امکان پذیر نبود:", - "lokalize": "<0> Lokalize <\/0> : یک سیستم ترجمه به کمک رایانه که بر بهره وری و تضمین کیفیت تمرکز دارد و گردش کار محلی سازی یکپارچه را ارائه می دهد.", - "quran-align": "<0> Collin Fair <\/0> : ابزاری برای تولید تقسیم بندی دقیق کلمه از تلاوت ضبط شده قرآن.", - "quran-complex": "<0> مجتمع قرآنی <\/0> : مجتمع چاپ قرآن مجید ملک فهد پیشرو در خدمت به قرآن و علوم آن، ترجمه معانی آن و حفظ متون قرآن از تحریف با استفاده بهینه از فن آوری های پیشرفته در زمینه چاپ، ضبط صدا، انتشارات الکترونیکی و برنامه های کاربردی دیجیتال.", - "quran-enc": "<0> QuranEnc <\/0> : پورتالی است که دارای ترجمه های رایگان و معتبر از معانی و تفاسیر قرآن کریم به بسیاری از زبان های جهان است.", - "tanzil": "<0> تنزیل <\/0> : یک پروژه قرآنی بین المللی با هدف ارائه یک متن قرآن دقیق با تأیید بالا.", - "title": "وام", - "vercel": "<0> Vercel <\/0> : یک پلتفرم استقرار و همکاری برای توسعه دهندگان فرانت اند است که توسعه دهندگان فرانت اند را در اولویت قرار می دهد و ابزارهای جامعی برای ساخت وب سایت ها و برنامه های کاربردی با کارایی بالا در اختیار آنها قرار می دهد.", - "zekr": "<0> ذکر <\/0> : یک ابزار قرآن پژوهی پلت فرم باز برای مرور و تحقیق در قرآن" - }, - "main-description": "Quran.com در سال 1995 تأسیس شد. هدف این وب سایت آسان کردن خواندن، مطالعه و یادگیری قرآن برای همه است. این پروژه منبع باز است و به عنوان یک همکاری بین اعضای اصلی تیم و تیم <0> Tarteel <\/0> ." -} \ No newline at end of file + "credits": { + "desc": "ما از همه کسانی که در این پروژه حمایت کرده اند و در دسترسی به قرآن برای میلیون ها نفر در سراسر جهان کمک کرده اند تشکر می کنیم.", + "lokalize": "<0>Lokalize: یک سیستم ترجمه به کمک رایانه که بر بهره وری و تضمین کیفیت تمرکز دارد و یک گردش کار محلی سازی یکپارچه را ارائه می دهد.", + "quran-align": "<0>نمایشگاه کالینی: ابزاری برای تولید بخش بندی دقیق کلمه از تلاوت ضبط شده قرآن.", + "quran-complex": "<0>مجتمع قرآن: مجتمع چاپ قرآن مجید ملک فهد با استفاده بهینه از فناوری های پیشرفته در زمینه چاپ، ضبط صوت، نشر الکترونیک و کاربردهای دیجیتال، پیشرو در خدمت به قرآن و علوم آن، ترجمه معانی آن و حفظ متون قرآنی از تحریف است.", + "quran-enc": "<0>QuranEnc: پورتالی که دارای ترجمه رایگان و قابل اعتماد معانی و تفاسیر قرآن کریم به بسیاری از زبان‌های جهان است.", + "tanzil": "<0>تنزیل: یک پروژه قرآنی بین‌المللی با هدف ارائه یک متن قرآن دقیق با تأیید صحت بالا.", + "tarteel": "<0>Tarteel: یک برنامه حفظ قرآن با هوش مصنوعی. این طراحی شده است تا به شما کمک کند تا باهوش‌تر به خاطر بسپارید، چه در حال جستجوی یک آیه باشید، چه پیشرفت خود را دنبال کنید یا همراه با تلاوت خود دنبال کنید.", + "title": "اعتبارات", + "vercel": "<0>Vercel: یک پلت فرم استقرار و همکاری برای توسعه دهندگان فرانت اند است که توسعه دهندگان فرانت اند را در اولویت قرار می دهد و ابزارهای جامعی را برای ساخت وب سایت ها و برنامه های کاربردی با کارایی بالا در اختیار آنها قرار می دهد.", + "zekr": "<0>ذکر: یک ابزار قرآن پژوهی برای مرور و تحقیق در قرآن" + }, + "global-effort": { + "desc": "میلیون‌ها نفر از سراسر جهان به Quran.com به عنوان منبع اصلی قرآن دیجیتال خود متکی هستند. خواه برای تلاوت، تأمل، حفظ یا مطالعه بیایند، هدف مشترکی دارند: میل خالصانه برای ارتباط با کلمات خدا. \\n همچنان که به رشد خود ادامه می‌دهیم، متعهد می‌شویم اطمینان حاصل کنیم که Quran.com فضایی قابل اعتماد، در دسترس و به زیبایی طراحی شده برای هر کسی که به دنبال تعامل با قرآن است باقی بماند.", + "title": "یک تلاش جهانی" + }, + "key-features": { + "desc": "Quran.com برای پشتیبانی از هر مرحله از تعامل با قرآن طراحی شده است - از خواندن و حفظ تا مطالعه و تفکر. ویژگی های ما عبارتند از:", + "features": [ + "رابط کاربر پسند قرآن - یک تجربه خواندن تمیز و شهودی در هر دستگاه.", + "ترجمه های متعدد و تفسیر - دسترسی به ترجمه ها به چندین زبان، همراه با تفسیر.", + "تلاوت های صوتی - به تلاوت های با کیفیت بالا از قاریان مشهور جهان با قابلیت دنبال کردن کلمه به کلمه گوش دهید.", + "جستجو و پیمایش پیشرفته - آیات را فوراً بر اساس موضوع یا کلمات کلیدی در سراسر قرآن بیابید.", + "نشانه گذاری و یادداشت آیه - آیات را ذخیره کنید و بازتاب های شخصی را برای مرجع بعدی بنویسید.", + "ادغام قرآن بازتاب - با یک جامعه جهانی از طریق تفکرات و بینش های به اشتراک گذاشته شده توسط دانشمندان و افراد درگیر شوید.", + "خواندن ردیابی پیشرفت و اهداف - اهداف روزانه و تاریخچه خواندن خود را پیگیری کنید", + "APIs for Developers – دسترسی رایگان به محتوا و ویژگی‌ها برای تقویت برنامه‌های اسلامی و تحقیق و توسعه.", + "و خیلی بیشتر الحمدلله." + ], + "title": "ویژگی ها و پیشنهادات کلیدی" + }, + "main-description": "Quran.com از زمان تأسیس خود در سال 1995 متعهد شده است که قرآن را به گونه ای واضح، معتبر و آسان در دسترس همگان قرار دهد. هر روز، میلیون‌ها نفر در سراسر جهان برای خواندن، گوش دادن، مطالعه و تأمل در قرآن به Quran.com مراجعه می‌کنند – چه دانشجوی مادام العمر باشند، چه دانش‌آموز یا تازه سفر خود را آغاز کرده‌اند.", + "our-mission": { + "desc": "قرآن برای خواندن، فهمیدن و تأمل در آن است. مأموریت ما رفع موانع دسترسی و توانمندسازی افراد و جوامع با ارائه یک تجربه قرآنی قابل اعتماد، طراحی شده و عمیقاً غنی است. هدف ما این است که به عنوان یک منبع قابل اعتماد برای هر کسی که به دنبال تعامل با قرآن است، با هدایت اصول دقت، وضوح و صداقت خدمت کنیم.", + "title": "ماموریت ما" + }, + "who-we-are": { + "desc": "Quran.com یک وقف (وقف) است که به عنوان یک امانت عمومی تأسیس شده است تا اطمینان حاصل شود که قرآن برای همه، رایگان و بدون منافع تجاری قابل دسترسی است. این موسسه توسط Quran.Foundation، یک سازمان غیرانتفاعی 501(c)(3) مدیریت می‌شود، که Quran.com را به عنوان بخشی از مأموریت خود برای ارائه منابع قرآنی با کیفیت بالا و معتبر به جهان حفظ و توسعه می‌دهد. تعهد ما خدمت به قرآن و قاریان آن با تعالی، اخلاص و مسئولیت است.", + "title": "ما که هستیم" + } +} diff --git a/locales/fa/apps.json b/locales/fa/apps.json index 839336f71b..8f38b316d9 100644 --- a/locales/fa/apps.json +++ b/locales/fa/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "توسط توسعه دهندگان اصلی Quran.com، برنامه های زیبا و بدون تبلیغات مصحف iOS و اندروید ارائه شده است. اکنون خواندن قرآن در حال حرکت، حفظ آن و گوش دادن به قاریان مورد علاقه خود آسانتر شده است.", - "tarteel-desc": "Tarteel اولین برنامه قرآنی است که از ابزارهای هوش مصنوعی برای تعامل با تلاوت شما و برجسته کردن اشتباهات استفاده می کند. تارتیل یک همراه قرآن با صدا در کف دستان شما، به طور شهودی کار می کند تا به شما کمک کند قرآن را با اطمینان بخوانید، تلاوت کنید، حفظ کنید و بفهمید! <0><\/0><0><\/0> تارتیل مفتخر است که یکی از توسعه دهندگان اصلی Quran.com و همچنین عضوی از هیئت مدیره آنها است." -} \ No newline at end of file + "quran-desc": "توسط توسعه دهندگان اصلی Quran.com، برنامه های زیبا و بدون تبلیغات مصحف iOS و اندروید ارائه شده است. اکنون خواندن قرآن در حال حرکت، حفظ آن و گوش دادن به قاریان مورد علاقه خود آسانتر شده است." +} diff --git a/locales/fa/common.json b/locales/fa/common.json index d3463067d1..8f68611650 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "ناوبری ها", "no-nav-results": "هیچ نتیجه ناوبری وجود ندارد", - "placeholder": "میخواهی چی بخوانی؟", - "powered-by": "جستجوی صوتی ارائه شده توسط Tarteel.ai", + "placeholder": "در قرآن جستجو کن...", "recent-navigations": "پیمایش های اخیر", "search-by-voice": "جستجوی صوتی", "try-navigating": "سعی کنید به" @@ -122,9 +121,11 @@ } }, "continue": "ادامه هید", + "contribute-to-our-mission": "به ماموریت ما کمک کنید", "copied": "کپی شده است", "copied-to-clipboard": "در کلیپ بورد کپی شد", "copy": "کپی", + "copylink": "لینک را کپی کنید", "counter": { "decrease": "نزول کردن", "increase": "افزایش دادن" @@ -134,6 +135,7 @@ "developers": "توسعه دهندگان", "display": "نمایش دادن", "donate": "اهدا کنید", + "donate-now": "اکنون اهدا کنید", "donate_monthly": "ماهانه اهدا کنید", "donate_once": "یکبار اهدا کنید", "edit": "ویرایش کنید", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*حداکثر {{maxNumberOfVerses}} آیات", "ranges-wrong-order": "آیه شروع باید قبل از آیه پایانی باشد." }, + "errors": { + "account-banned": "با عرض پوزش، حساب شما مسدود شده است. با قرآن.بنیاد تماس بگیرید", + "badRequest": "*درخواست نامعتبر", + "banned": "*با عرض پوزش، حساب شما مسدود شده است. با قرآن.بنیاد تماس بگیرید", + "confirm": "*تأیید رمز عبور با رمز عبور مطابقت ندارد", + "email": "*فرمت ایمیل نامعتبر است!", + "exactLength": "*مقدار باید دقیقاً طول داشته باشد", + "expiredToken": "*این توکن منقضی شده است", + "forgot-password-failed": "ایمیل بازنشانی رمز عبور ارسال نشد. لطفا دوباره امتحان کنید.", + "immutable": "*این مقدار قابل تغییر نیست", + "invalid": "*این {{fieldName}} نامعتبر است", + "invalidEmailOrPassword": "*ایمیل یا رمز عبور نامعتبر است", + "max": "* {{fieldName}} باید کمتر یا مساوی با {{max}} رقم باشد", + "min": "* {{fieldName}} باید بیشتر یا مساوی با {{min}} رقم باشد", + "name": "* {{fieldName}} باید فقط حروف و اعداد باشد", + "notFound": "* یافت نشد", + "required": "* {{fieldName}} وجود ندارد!", + "reset-password-failed": "بازنشانی رمز عبور انجام نشد. لطفا دوباره امتحان کنید.", + "signin-failed": "ورود ناموفق بود. لطفا دوباره امتحان کنید.", + "signup-failed": "ثبت نام انجام نشد. لطفا دوباره امتحان کنید.", + "taken": "* {{fieldName}} از قبل وجود دارد!", + "usedToken": "*این نشانه قبلاً استفاده شده است", + "username": "* {{fieldName}} فقط زیرخط و حروف را می پذیرد", + "verification-code-invalid": "این کد تأیید نامعتبر است", + "verification-code-length": "کد تأیید باید {{length}} رقم باشد", + "verification-failed": "تأیید ناموفق بود. لطفا دوباره امتحان کنید.", + "verification-resend-failed": "کد تأیید مجدد ارسال نشد" + }, "exciting-updates": "به روز رسانی های هیجان انگیز", "feedback": "بازخورد", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "اندازه فونت ترجمه" }, "footer": { - "description": "Quran.com یک جریه صدقه است. امیدواریم بتوانیم خواندن، مطالعه و یادگیری قرآن کریم را برای همگان آسان کنیم. قرآن کریم دارای نام های فراوانی از جمله القرآن الکریم، الکتاب، الفرقان، الماویثه، الذکر و النور است.", + "description": "Quran.com یک پلتفرم قابل اعتماد است که میلیون ها نفر در سراسر جهان از آن برای خواندن، جستجو، گوش دادن و تأمل در قرآن به چندین زبان استفاده می کنند. ترجمه، تفسیر، تلاوت، ترجمه کلمه به کلمه و ابزارهایی برای مطالعه عمیق تر فراهم می کند و قرآن را در دسترس همگان قرار می دهد.

    به عنوان یک صدقه جریه، Quran.com به مردم کمک می کند تا عمیقاً با قرآن ارتباط برقرار کنند. با حمایت Quran.Foundation، یک سازمان غیرانتفاعی 501(c)(3)، Quran.com به عنوان یک منبع رایگان و ارزشمند برای همه، الحمدلله به رشد خود ادامه می دهد.", "hiring": "ما استخدام می کنیم! به تیم قرآن بنیاد بپیوندید و به ماموریت ما کمک کنید. اکنون درخواست دهید! ", "rights": "تمامی حقوق محفوظ است", - "title": "قرآن کریم را بخوانید، مطالعه کنید و یاد بگیرید." + "title": "قرآن بخوانید، گوش دهید، جستجو کنید و در قرآن فکر کنید" }, "form": { "body": "بدن", "code": "کد تایید", + "confirm-password": "رمز عبور را تایید کنید", "email": "پست الکترونیک", "firstName": "نام کوچک", "lastName": "نام خانوادگی", - "title": "عنوان" + "password": "رمز عبور", + "title": "عنوان", + "username": "نام کاربری", + "verification-code": "کد تایید" }, "from": "از جانب", + "fundraising-share-title": "قران دات کام را به اشتراک بگذارید", "fundraising-sticky-banner": { "cta": "اهدا کنید", "title": "در بهترین روزها هدیه دهید!" @@ -217,6 +252,7 @@ "learn-more": "بیشتر بدانید", "learning-plans": "برنامه های یادگیری", "less": "کمتر", + "lessons": "درس ها", "loading": "بارگذاری", "login": "وارد شدن", "logout": "خروج", @@ -250,6 +286,7 @@ "off": "خاموش", "oldest": "قدیمی ترین", "on": "بر", + "our-projects": "پروژه های ما", "page": "صفحه", "pages": "صفحات", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} از {{totalNumberOfResults}} نتایج جستجو", @@ -272,6 +309,7 @@ "privacy": "حریم خصوصی", "product-updates": "به روز رسانی محصول", "profile": "مشخصات", + "projects-desc": "پروژه های غیرانتفاعی تحت مالکیت، مدیریت یا حمایت مالی قرآن", "q-reflect": "قرآن انعکاس", "quran-com": "قرآن دات کام", "quran-radio": "رادیو قرآن", @@ -287,6 +325,7 @@ "reciters": "قاریان", "reflect": "منعکس کنید", "reflections": "بازتاب ها", + "reflections-and-lessons": "بازتاب ها و درس ها", "remove": "برداشتن", "rename": "تغییر نام دهید", "retry": "دوباره امتحان کنید", @@ -296,10 +335,12 @@ "save-to-collection": "ذخیره در مجموعه", "search-for": "جستجوی \"{{searchQuery}}\"", "search-results": "{{count}} نتایج جستجو", + "search-results-no-count": "نتایج جستجو", "search": { "filters": "فیلترها", "hint": "سعی کنید جستجو کنید", "jump-to": "پرش به", + "more-results": "نتایج بیشتر", "no-results": "نتیجه ای پیدا نشد", "no-results-suggestion": "هیچ نتیجه جستجوی منطبقی برای \" {{searchQuery}} \" پیدا نکردیم. سعی کنید کلمه کلیدی دیگری را جستجو کنید.", "popular": "جستجوهای محبوب", @@ -340,8 +381,10 @@ "search-juz": "جستجوی Juz", "search-page": "صفحه جستجو", "search-surah": "جستجو در سوره", + "search-verse": "جستجو در آیه", "try-navigating-with": "نکته: سعی کنید با آن پیمایش کنید" }, + "sign-in": "وارد شوید", "sitemap": "نقشه سایت", "sort": { "ascending": "صعودی", @@ -362,10 +405,6 @@ "tafsirs-desc": "تفسیرهای مختلف آیات {{ayahNumber}} سوره {{surahName}} توسط تفسیرگران مورد اعتماد را بخوانید.", "title": "تفسیر" }, - "tarteel": { - "app": "اپلیکیشن تارتیل", - "name": "Tarteel.ai" - }, "terms-and-conditions": "شرایط و ضوابط", "theme": "سبک نمایش", "themes": { @@ -400,9 +439,9 @@ "view": "چشم انداز", "voice": { "ask-permission": "لطفاً مجوز میکروفون را برای شروع استفاده از جستجوی صوتی فعال کنید", - "error": "خطایی رخ داده است، لطفاً بعداً دوباره امتحان کنید. یا دانلود کنید", - "no-permission": "به نظر می رسد مجوز میکروفون را فعال ندارید. لطفاً مجوزهای میکروفون را فعال کنید و دوباره امتحان کنید یا آن را دانلود کنید", - "not-supported": "به نظر می رسد مرورگر شما از میکروفون پشتیبانی نمی کند. لطفاً مرورگر دیگری را امتحان کنید یا آن را دانلود کنید", + "error": "خطایی رخ داده است، لطفاً بعداً دوباره امتحان کنید.", + "no-permission": "به نظر می رسد مجوز میکروفون را فعال ندارید. لطفاً مجوزهای میکروفون را فعال کرده و دوباره امتحان کنید.", + "not-supported": "به نظر می رسد مرورگر شما از میکروفون پشتیبانی نمی کند. لطفا مرورگر دیگری را امتحان کنید.", "suggest": "لطفا شروع به تلاوت کنید و آیه شما ظاهر می شود.", "suggest-subtitle": "هر آیه ای را به زبان عربی بخوانید، آیه ظاهر می شود", "suggest-title": "الان بخون", diff --git a/locales/fa/developers.json b/locales/fa/developers.json index 185f68c2d0..7b154fb87e 100644 --- a/locales/fa/developers.json +++ b/locales/fa/developers.json @@ -1,20 +1,19 @@ { - "footer": "- تیم Quran.com", - "header": "کمک به توسعه", - "issues-cta": "اگر سؤالی دارید یا می خواهید با نگهبانان تماس بگیرید، فقط یک مسئله را بنویسید! انشاءالله در اسرع وقت با شما تماس خواهیم گرفت.", - "issues-guide": "ما معمولاً از <0> پروژه های Github <\/0> به عنوان منبعی استفاده می کنیم که در آینده روی چه چیزی کار کنیم، چه چیزی در راه است و چه اشکالاتی وجود دارد که باید حل شوند. به عنوان مثال <1> این آدرس اینترنتی <\/1> دارای لیستی از اشکالات، چیزهایی است که برای آنها به کمک نیاز داریم و ویژگی های آینده.", - "main-desc": "Asalamu Alykom، اولاً از علاقه شما برای کمک به ما در توسعه Quran.com و پروژه های آن بسیار سپاسگزاریم. ما برای همکاری با شما هیجان زده هستیم!", - "projects": { - "all": "ما تعدادی پروژه داریم که همه در Github میزبانی می شوند. می توانید همه آنها را <0> اینجا <\/0> . اما برای تشریح آنها:", - "q-android": "<0> قرآن اندروید <\/0>", - "q-api": "<0> Quran.com API <\/0> - نوشته شده در Ruby on Rails.", - "q-api-docs": "<0> Quran.com API Docs <\/0> - پورتال اسناد API ما.", - "q-audio": "<0> صدای قرآنی <\/0> و <1> برنامه های موبایل صوتی قرآنی <\/1>", - "q-audio-segments": "<0> بخش های صوتی قرآن <\/0>", - "q-ios": "<0> قرآن iOS <\/0>", - "q-next": "<0> Quran.com Frontend <\/0> - نوشته شده در Next.js.", - "q-v2": "<0> Quran.com <\/0> - نوشته شده در Ruby on Rails." - }, - "sub-main-desc": "ما تیمی متشکل از توسعه دهندگان، طراحان، مدیران محصول و متفکران هستیم که به صورت داوطلبانه در Quran.com کار می کنیم. الحمدلله ما این سعادت را داشته ایم که برای برخی از شرکت های بزرگ در سیلیکون ولی، تورنتو و امارات متحده عربی کار می کنیم - و ما احساس می کنیم که این کمترین کاری است که می توانیم انجام دهیم تا به امت خود کمک کنیم تا در یادگیری و مطالعه دین خود پیشرفت کنند. کار در سایت Quran.com بسیار خوشحال کننده است و خداوند به همه ما اجر دهد (و به شما پاداش دهد) برای زحمات ما.", - "thanks": "با تشکر برای خواندن! مشتاقانه منتظرم تا ببینم شما در حال اجرای کدی هستید!" -} \ No newline at end of file + "footer": "- تیم Quran.com", + "header": "کمک به توسعه", + "issues-cta": "اگر سؤالی دارید یا می خواهید با نگهبانان تماس بگیرید، فقط یک مسئله را بنویسید! انشاءالله در اسرع وقت با شما تماس خواهیم گرفت.", + "issues-guide": "ما معمولاً از <0> پروژه های Github به عنوان منبعی استفاده می کنیم که در آینده روی چه چیزی کار کنیم، چه چیزی در راه است و چه اشکالاتی وجود دارد که باید حل شوند. به عنوان مثال <1> این آدرس اینترنتی دارای لیستی از اشکالات، چیزهایی است که برای آنها به کمک نیاز داریم و ویژگی های آینده.", + "main-desc": "Asalamu Alykom، اولاً از علاقه شما برای کمک به ما در توسعه Quran.com و پروژه های آن بسیار سپاسگزاریم. ما برای همکاری با شما هیجان زده هستیم!", + "projects": { + "all": "ما تعدادی پروژه داریم که همه در Github میزبانی می شوند. می توانید همه آنها را <0> اینجا . اما برای تشریح آنها:", + "q-android": "<0> قرآن اندروید ", + "q-api": "<0> Quran.com API - نوشته شده در Ruby on Rails.", + "q-api-docs": "<0> Quran.com API Docs - پورتال اسناد API ما.", + "q-audio": "<0> صدای قرآنی و <1> برنامه های موبایل صوتی قرآنی ", + "q-audio-segments": "<0> بخش های صوتی قرآن ", + "q-ios": "<0> قرآن iOS ", + "q-next": "<0> Quran.com Frontend - نوشته شده در Next.js.", + "q-v2": "<0> Quran.com - نوشته شده در Ruby on Rails." + }, + "thanks": "با تشکر برای خواندن! مشتاقانه منتظرم تا ببینم شما در حال اجرای کدی هستید!" +} diff --git a/locales/fa/home.json b/locales/fa/home.json index d1db52e0b3..d3ac9af02c 100644 --- a/locales/fa/home.json +++ b/locales/fa/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "به اهداف قرآنی خود دست یابید", + "begin": "شروع کنید", + "chapters-and-verses": "سوره ها و آیات", + "continue-read": "به خواندن ادامه دهید", + "explore-topics": "موضوعات را کاوش کنید", + "first-time-reading": "تازه با قرآن؟ از اینجا شروع کنید ", + "know-someone": "با ما در این رمضان رشد کنید", + "learning-plan": "برنامه های یادگیری", + "listen-to-radio": "رادیو قرآن را بشنوید", + "my-quran": "قرآن من", + "navigate-quran": "در قرآن سیر کنید", "no-bookmarks": "شما هنوز هیچ نشانکی ندارید", "no-recently-read": "شما هنوز هیچ جلسه خواندنی ندارید", "noble-quran": "قرآن کریم", + "popular": "محبوب", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "سیر رشد قرآن" }, - "ramadan-activities-cta": " برای خواندن هفتگی، پادکست های الهام بخش، و دعوت به تفکر، تقویم جهانی قرآنی <\/b> را دنبال کنید! <\/link>", + "qr-community": "آیات و بازتاب های برجسته امروز را بخوانید", + "ramadan-activities-cta": " برای خواندن هفتگی، پادکست های الهام بخش، و دعوت به تفکر، تقویم جهانی قرآنی را دنبال کنید! ", + "ramadan": { + "header": "ابزاری برای تعمیق ارتباط با قرآن", + "title": "برای ماه رمضان آماده اید؟" + }, "read-juz": "جزء را بخوانید", "recently-read": "اخیرا خوانده شده است", - "revelation-order-disclaimer": "این دیدگاه ترتیب زمانی سوره های قرآن را بر اساس زمان نازل شده بر پیامبر اسلام ﷺ<\/hover> نشان می دهد. گاهشماری موضوع مورد نظر علما است و برخی از سوره ها در زمان های مختلف در قسمت هایی نازل شده است. سفارش در اینجا بر اساس کار Tanzil.net<\/link> است. [توجه: دستور مصحف تدوین شده از فاتحه به الناس، مورد اجماع است.]", + "revelation-order-disclaimer": "این دیدگاه ترتیب زمانی سوره های قرآن را بر اساس زمان نازل شده بر پیامبر اسلام نشان می دهد. گاهشماری موضوع مورد نظر علما است و برخی از سوره ها در زمان های مختلف در قسمت هایی نازل شده است. سفارش در اینجا بر اساس کار Tanzil.net است. [توجه: دستور مصحف تدوین شده از فاتحه به الناس، مورد اجماع است.]", + "see-more-learning-plans": "بیشتر ببینید", + "set-custom-goal": "یک هدف تعیین کنید", + "share-quran": { + "description": "کمک به گسترش قرآن به نوآموزان", + "title": "قرآن را به اشتراک بگذارید" + }, + "start-read": "شروع به خواندن کنید", + "stay-consistent": "رگه ها را دنبال کنید، اهداف سفارشی ایجاد کنید، ثابت بمانید", "tab": { "bookmarks": "نشانک ها", "popular": "محبوب" diff --git a/locales/fa/learn.json b/locales/fa/learn.json index 74c4273467..c3d6938825 100644 --- a/locales/fa/learn.json +++ b/locales/fa/learn.json @@ -24,7 +24,9 @@ "feedback-success": "با تشکر از شما برای بازخورد شما!", "your-feedback": "بازخورد شما" }, + "help-about-reflection": "راهنمایی در مورد ویژگی بازتاب", "learn-duration": "مدت زمان", + "learn-more": "بیشتر بدانید", "learning-plan-material": "مواد برنامه آموزشی", "learning-plan-meta-desc": "این طرح یادگیری به تغییر نحوه تعامل شما با قرآن کمک می کند، سفر خود را از امروز آغاز کنید!", "learning-plans-desc": "دانش خود را با درس های آسانی که باعث رشد شما در سفر با قرآن می شود، تقویت کنید.

    از همین امروز یک برنامه آموزشی را شروع کنید! پیشرفت شما تا رسیدن به خط پایان پیگیری می شود.", @@ -34,9 +36,12 @@ "next-lesson": "درس بعدی", "not-enrolled": "شما هنوز در طرح یادگیری ثبت نام نکرده اید.", "prev-lesson": "درس قبلی", + "reflection-description-1": "با کلیک بر روی \"افزودن انعکاس\" به QuranReflect، بستری برای به اشتراک گذاشتن تفکرات شخصی در مورد قرآن می روید. تاملات بر خلاف تفسیر، بینش ها و تجربیات شخصی مربوط به آیات است.", + "reflection-description-2": "اگر به صورت عمومی پست کنید، بازتاب شما توسط تیم نظارت بررسی می شود و برای جامعه قرآن رفلکت قابل مشاهده خواهد بود.", "start-learning": "شروع به یادگیری", "tabs": { "main": "جزئیات اصلی", "syllabus": "سرفصل دروس" - } + }, + "what-happens-when-you-click-add-reflection": "وقتی روی \"افزودن بازتاب\" کلیک می کنید چه اتفاقی می افتد؟" } diff --git a/locales/fa/login.json b/locales/fa/login.json index 6f930f6976..09a10cc39a 100644 --- a/locales/fa/login.json +++ b/locales/fa/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "در انتظار تأیید", + "back": "برگشت", + "back-to-login": "بازگشت به ورود", + "check-email-title": "برای تکمیل ثبت نام ایمیل را چک کنید", + "confirm": "تایید کنید", + "confirm-new-password-placeholder": "رمز عبور جدید را تایید کنید", + "confirm-password-placeholder": "رمز عبور را تایید کنید", + "continue": "ادامه دهید", "continue-apple": "با اپل ادامه دهید", "continue-email": "با ایمیل ادامه دهید", "continue-facebook": "با فیس بوک ادامه دهید", "continue-google": "با گوگل ادامه دهید", "email-placeholder": "آدرس ایمیل", + "error": { + "email-required": "ایمیل گم شده است!", + "invalid-credentials": "ایمیل یا رمز عبور نامعتبر است", + "invalid-email": "قالب ایمیل نامعتبر است!", + "login-failed": "ورود ناموفق بود. لطفا دوباره امتحان کنید.", + "password-required": "رمز عبور گم شده است!" + }, + "errors": { + "account-banned": "با عرض پوزش، حساب شما مسدود شده است. با قرآن.بنیاد تماس بگیرید", + "badRequest": "*درخواست نامعتبر", + "banned": "*با عرض پوزش، حساب شما مسدود شده است. با قرآن.بنیاد تماس بگیرید", + "confirm": "*تأیید رمز عبور با رمز عبور مطابقت ندارد", + "email": "*فرمت ایمیل نامعتبر است!", + "exactLength": "*مقدار باید دقیقاً طول داشته باشد", + "expiredToken": "*این توکن منقضی شده است", + "forgot-password-failed": "ایمیل بازنشانی رمز عبور ارسال نشد. لطفا دوباره امتحان کنید.", + "immutable": "*این مقدار قابل تغییر نیست", + "invalid": "*این {{fieldName}} نامعتبر است", + "invalidEmailOrPassword": "*ایمیل یا رمز عبور نامعتبر است", + "max": "* {{fieldName}} باید کمتر یا مساوی با {{max}} رقم باشد", + "min": "* {{fieldName}} باید بیشتر یا مساوی با {{min}} رقم باشد", + "name": "* {{fieldName}} باید فقط حروف و اعداد باشد", + "notFound": "* یافت نشد", + "required": "* {{fieldName}} وجود ندارد!", + "reset-password-failed": "بازنشانی رمز عبور انجام نشد. لطفا دوباره امتحان کنید.", + "signin-failed": "ورود ناموفق بود. لطفا دوباره امتحان کنید.", + "signup-failed": "ثبت نام انجام نشد. لطفا دوباره امتحان کنید.", + "taken": "* {{fieldName}} از قبل وجود دارد!", + "usedToken": "*این نشانه قبلاً استفاده شده است", + "username": "* {{fieldName}} فقط زیرخط و حروف را می پذیرد", + "verification-code-invalid": "این کد تأیید نامعتبر است", + "verification-code-length": "کد تأیید باید {{length}} رقم باشد", + "verification-failed": "تأیید ناموفق بود. لطفا دوباره امتحان کنید.", + "verification-resend-failed": "کد تأیید مجدد ارسال نشد" + }, "feature-1": "اهداف خود را دنبال کنید", "feature-2": "رگه های خواندن را حفظ کنید", "feature-3": "مجموعه ایجاد کنید", "feature-4": "داده های خود را در مرورگرها همگام سازی کنید", "feature-5": "و بیشتر!", "feature-6": " جدید! یادداشت ها و بازتاب ها", + "first-name-placeholder": "نام", + "forgot-password": "رمز عبور را فراموش کرده اید", + "forgot-password-description": "آدرس ایمیل خود را وارد کنید و ما دستورالعمل هایی را برای بازنشانی رمز عبور برای شما ارسال خواهیم کرد.", + "forgot-password-success": "ایمیل بازنشانی رمز عبور ارسال شد! لطفا صندوق ورودی خود را بررسی کنید.", + "forgot-password-title": "رمز عبور را فراموش کرده اید؟", + "last-name-placeholder": "نام خانوادگی", "login-cta": "اکنون وارد شوید یا ثبت نام کنید:", "login-error": { "AuthenticationError": "احراز هویت ناموفق بود. لطفاً بعداً دوباره امتحان کنید", + "BannedUserError": "با عرض پوزش، حساب شما مسدود شده است. با قرآن.بنیاد تماس بگیرید.", "TokenExpiredError": "شما از سیستم خارج شده اید، لطفا دوباره وارد شوید." }, "login-title": "وارد سایت Quran.com شوید", + "new-password-placeholder": "رمز عبور جدید", "other-options": "سایر گزینه های ورود", + "password-placeholder": "رمز عبور", + "password-reset-success": "رمز عبور با موفقیت بازنشانی شد!", + "password-rules": { + "lowercase": "حداقل یک حرف کوچک", + "max-length": "حداکثر 20 کاراکتر", + "min-length": "حداقل 8 کاراکتر", + "number": "حداقل یک عدد", + "special": "حداقل یک نویسه خاص (!@#$%^&*_-)", + "uppercase": "حداقل یک حرف بزرگ" + }, "privacy-policy": "حفاظت از حریم خصوصی شما اولویت ما است - با ثبت نام، با خط مشی رازداری و شرایط و ضوابط ما موافقت می کنید.", - "verify-code": "بررسی کنید که کد امنیتی ارائه شده با متن زیر مطابقت دارد:" + "quran-text": "قرآن", + "quran-title": "قرآن دات کام", + "reflect-feature-1": "در قرآن تدبر کن", + "reflect-feature-2": "به گروه ها بپیوندید", + "reflect-feature-3": "با دیگران تعامل داشته باشید", + "reflect-feature-4": "و بیشتر!", + "reset-password": "بازنشانی رمز عبور", + "reset-password-success": "رمز عبور با موفقیت بازنشانی شد!", + "set-new-password": "یک رمز عبور جدید تنظیم کنید", + "sign-in": "وارد شوید", + "sign-in-or-sign-up": "وارد شوید یا ثبت نام کنید", + "sign-up": "ثبت نام کنید", + "unified-registration-1": "ثبت یکپارچه از ", + "unified-registration-2": "قرآن.بنیاد", + "unified-registration-3": ". شما به وب سایت های زیر دسترسی خواهید داشت ", + "unified-registration-4": "از طریق جزئیات ثبت نام شما", + "username-placeholder": "نام کاربری", + "verification-code-instruction": "لطفا کد ارائه شده در ایمیل را برای تکمیل ثبت نام وارد کنید", + "verification-code-resend": "ارسال مجدد ایمیل", + "verification-code-resend-countdown": "ارسال مجدد ایمیل تأیید در {{seconds}} ثانیه...", + "verification-code-sent": "کد تایید ارسال شد!", + "verification-code-sent-to": "ما فقط یک ایمیل به", + "verification-code-spam-note": "ایمیلی دریافت نکردید؟ پوشه اسپم خود را بررسی کنید", + "verify-code": "بررسی کنید که کد امنیتی ارائه شده با متن زیر مطابقت دارد:", + "welcome-description-1": "ثبت یکپارچه از", + "welcome-description-2": ".بنیاد", + "welcome-description-3": "از طریق جزئیات ورود خود به وب سایت های زیر دسترسی خواهید داشت.", + "welcome-title": "خوش آمدید به" } diff --git a/locales/fa/onboarding.json b/locales/fa/onboarding.json index d6ddf56600..8e3f8d3c6a 100644 --- a/locales/fa/onboarding.json +++ b/locales/fa/onboarding.json @@ -87,10 +87,6 @@ "description": "از بین انواع ترجمه به چندین زبان انتخاب کنید. نکته: ترجمه ها را با انتخاب چند گزینه مقایسه کنید", "title": "ترجمه ها" }, - "voice-search": { - "description": "روی آیکون میکروفون ضربه بزنید و آیه مورد نظر خود را بخوانید. اشاره کوتاه! برای کشف محل خواندن شخصی (مثلاً نماز تراویح)، روی نماد میکروفون ضربه بزنید. پس از شناسایی یک یا دو آیه، توقف را فشار دهید تا مکان را پیدا کنید", - "title": "جستجوی صوتی (Tarteel)" - }, "wbw-audio": { "description": "این گزینه را برای گوش دادن به هر کلمه به صورت جداگانه با کلیک کردن بر روی کلمه انتخاب کنید!", "title": "با کلیک بر روی کلمه به نویسه گردانی کلمه به کلمه گوش دهید" diff --git a/locales/fa/question.json b/locales/fa/question.json index fceb4f9cfa..f3ce9c9688 100644 --- a/locales/fa/question.json +++ b/locales/fa/question.json @@ -1,4 +1,5 @@ { "q-and-a": "پرسش و پاسخ مربوط به ", - "question": "سوال" + "question": "سوال", + "questions-meta-desc": "برای تعمیق درک خود از قرآن، پاسخ های مورد اعتماد را بررسی کنید." } diff --git a/locales/fa/quick-links.json b/locales/fa/quick-links.json index b785466baa..4380145347 100644 --- a/locales/fa/quick-links.json +++ b/locales/fa/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "درباره قرآن", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "به رمضان انعکاس بپیوندید", - "rahman": "Surah Ar-Rahman", - "sunnah": "آیاتی درباره سنت", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "درباره قرآن", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "عیسی در قرآن", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "به رمضان انعکاس بپیوندید", + "rahman": "Surah Ar-Rahman", + "sunnah": "آیاتی درباره سنت", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "ماه رمضان چیست؟", + "yaseen": "Surah Yaseen" +} diff --git a/locales/fa/quran-reader.json b/locales/fa/quran-reader.json index fde6f76cb4..28be2c3e3d 100644 --- a/locales/fa/quran-reader.json +++ b/locales/fa/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "آغاز حزب", "include-translator": "نام مترجم درج شود؟", "juz-beginning": "آغاز جزء", + "lessons-desc": "درس های قرآنی آیه {{ayahNumber}} سوره {{surahName}} بخوانید و به اشتراک بگذارید.", + "lessons-disclaimer": "دروس، بینش شخصی و تفسیر قرآن است. قرار نیست آنها به عنوان معتبر تلقی شوند.", + "lessons-not-available": "هیچ درس بررسی شده ای برای این آیه وجود ندارد", "mad-2": "ماد 2 ثانیه", "mad-2-4-6": "مجاز Maad 2 یا 4 یا 6 ثانیه", "mad-4-5": "ماد لازم 4 یا 5 ثانیه", diff --git a/locales/fa/radio.json b/locales/fa/radio.json index d32dba1df3..adf31c5798 100644 --- a/locales/fa/radio.json +++ b/locales/fa/radio.json @@ -1,26 +1,27 @@ { - "change": "تغییر دادن", - "curated-station": { - "juz-amma": { - "description": "جملات پایانی قرآن را بشنوید", - "title": "جوز اما" - }, - "popular-recitations": { - "description": "فید تنظیم شده روزانه از تلاوت ها", - "title": "تلاوت های مردمی" - }, - "surah-al-kahf": { - "description": "سوره الکهف را با تکرار بشنوید", - "title": "سوره کهف" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "سوره هایی از جمع قاریان", - "title": "یاسین، الواقعه، الملک" - } + "change": "تغییر دادن", + "curated-station": { + "juz-amma": { + "description": "جملات پایانی قرآن را بشنوید", + "title": "جزء اما" }, - "curated-stations": "ایستگاه های انتخاب شده", - "pause-radio": "مکث رادیو", - "play-radio": "پخش رادیو", - "radio-desc": "به تلاوت زیبای قرآن کریم توسط قاریان مختلف بدون وقفه گوش دهید.", - "reciter-stations": "ایستگاه های تلاوت" -} \ No newline at end of file + "popular-recitations": { + "description": "فید تنظیم شده روزانه از تلاوت ها", + "title": "تلاوت های مردمی" + }, + "surah-al-kahf": { + "description": "سوره الکهف را با تکرار بشنوید", + "title": "سوره کهف" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "سوره هایی از جمع قاریان", + "title": "یاسین، الواقعه، الملک" + } + }, + "curated-stations": "ایستگاه های انتخاب شده", + "pause-radio": "مکث رادیو", + "play-radio": "پخش رادیو", + "radio-desc": "به تلاوت زیبای قرآن کریم توسط قاریان مختلف بدون وقفه گوش دهید.", + "reciter-stations": "ایستگاه های تلاوت", + "station": "ایستگاه" +} diff --git a/locales/fa/reading-goal.json b/locales/fa/reading-goal.json index 6e56095ff4..f210c17f4b 100644 --- a/locales/fa/reading-goal.json +++ b/locales/fa/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "به خواندن ادامه دهید", - "continuous": { - "description": "هدف شما پیشرفت شما را در طی چند روز محاسبه می کند", - "title": "بیش از یک مدت" - }, - "create-plan": "طرح ایجاد کنید", - "create-reading-goal": "ایجاد هدف", - "daily-progress": "پیشرفت روزانه", - "daily": { - "description": "هدف شما هر روز بازنشانی خواهد شد", - "title": "هدف روزانه" - }, - "day-x": "روز {{day}}", - "days": "روزها", - "duration": "مدت زمان (روزها)", - "ending-chapter": "پایان سوره", - "ending-verse": "پایان آیه", - "examples-subtitle": "در اینجا لیستی از اهداف مشترک آورده شده است. شما همچنین می توانید هدف خود را ایجاد کنید.", - "examples-title": "یک هدف از پیش تعیین شده انتخاب کنید یا هدف خود را ایجاد کنید", - "examples": { - "custom": { - "description": "یک هدف سفارشی که مناسب شماست تعیین کنید", - "title": "سفارشی" - }, - "khatm": { - "description": "یک هدف کلاسیک خاتم. روزی 1 جوز بخوانید", - "title": "قرآن را در 30 روز بخوانید" - }, - "time": { - "description": "یک هدف ساده برای مبتدیان", - "title": "روزی 10 دقیقه مطالعه کنید" - }, - "year": { - "description": "در سال آینده با سرعت خود قرآن بخوانید", - "title": "قرآن را در یک سال بخوانید" - } - }, - "frequency-tab": { - "description": "آیا هدف شما باید هر روز بازنشانی شود یا هر تعداد روز؟ نگران نباشید، ما پیشرفت شما را بدون توجه به فرکانس انتخابی شما پیگیری می کنیم.", - "title": "یک فرکانس برای هدف خود انتخاب کنید" - }, - "goal-done": { - "description": "هر گونه خواندن اضافی همچنان ثبت خواهد شد", - "title": "شما هدف امروز را تکمیل کردید" - }, - "goal-target": { - "description": "برای تکمیل هدفتان چقدر زمان، صفحات یا آیات باید بخوانید؟", - "title": "برای هدف خود هدف تعیین کنید" - }, - "goal-type": { - "description": "آیا هدف شما باید بر اساس زمان، صفحات یا محدوده سفارشی (یعنی 3 جز قرآن) باشد؟", - "title": "معیاری برای هدف خود انتخاب کنید" - }, - "goal-types": { - "pages": { - "description": "هدف شما بر اساس صفحات خواهد بود", - "title": "صفحات" - }, - "range": { - "description": "هدف شما بر اساس طیفی از آیات سفارشی خواهد بود (این می تواند یک سوره، یک جز یا حتی کل قرآن باشد)", - "title": "محدوده سفارشی" - }, - "time": { - "description": "هدف شما بر اساس زمان خواهد بود", - "title": "زمان" - } - }, - "plus-x-more-days": { - "one": "+{{days}} روز دیگر", - "other": "+{{days}} روز دیگر" - }, - "preview-schedule": { - "description": "هدف شما اینگونه خواهد بود. همیشه می توانید بعداً آن را تغییر دهید.", - "title": "در اینجا پیش نمایشی از برنامه شما است" - }, - "progress": { - "complete": "هدف امروز کامل شد🎉", - "goal-complete": "تمام هدف شما کامل است 🎉", - "pages-goal": "{{pages}} صفحه قرآن را بخوانید", - "range-goal": "خواندن {{from}} به {{to}}", - "time-goal": "{{time}} قرآن را بخوانید" - }, - "reading-goal": "هدف خواندن", - "reading-goal-description": "آیا حفظ سازگاری با اهداف قرائت قرآن برای شما چالش برانگیز است؟ سیر رشد قرآن یک ویژگی پویا است که به شما کمک می کند در سفر خود با قرآن ثابت قدم بمانید. چه بخواهید روزی 10 دقیقه بخوانید، یک جز را در یک ماه کامل کنید، یا تمام قرآن را در یک سال تمام کنید و غیره، Quran.com اکنون می تواند به شما کمک کند تا یک هدف سفارشی تعیین کنید و رگه های مطالعه روزانه خود را پیگیری کنید، در حالی که با پیشرفت شما تنظیم می شود. استفاده از آن کاملا رایگان است و امیدواریم به شما کمک کند تا برای رسیدن به هدف خود انگیزه داشته باشید!", - "reading-goal-label": "شما روی یک", - "reading-goal-title": "معرفی سیر رشد قرآن", - "recommended": "توصیه شده", - "remaining": "باقی مانده برای امروز", - "remaining-days": { - "one": "{{days}} روز باقی مانده است", - "other": "{{days}} روز باقی مانده است" - }, - "set-reading-goal-success": "هدف خواندن شما با موفقیت تنظیم شده است.", - "start-journey": "سفر خود را آغاز کنید!", - "start-reading": "شروع به خواندن کنید", - "starting-chapter": "شروع سوره", - "starting-verse": "شروع آیه", - "streak": "خط", - "streak-definition": "رگه به تعداد روزهای متوالی قرآن می گویند.", - "timeline-meaning": "جدول زمانی شما به چه معناست؟", - "timeline-states": { - "checked": "شما هدف خود را کامل کرده اید", - "filled": "شما چیزی خوانده اید اما برای تکمیل هدفتان کافی نیست", - "none": "تو آن روز هنوز چیزی نخوانده ای", - "stroked": "امروز چیزی نخوانده ای" - }, - "todays-goal": "هدف امروز", - "view-progress": "مشاهده پیشرفت", - "week-progress": "پیشرفت این هفته", - "x-days": { - "one": "{{days}} روز", - "other": "{{days}} روز" - }, - "x-days-streak": "{{days}} رگه روز", - "x-hours": { - "one": "{{hours}} ساعت", - "other": "{{hours}} ساعت" - }, - "x-minutes": { - "one": "{{minutes}} دقیقه", - "other": "{{minutes}} دقیقه" - }, - "x-pages": { - "one": "{{pages}} صفحه", - "other": "{{pages}} صفحه" - }, - "x-seconds": { - "one": "{{seconds}} ثانیه", - "other": "{{seconds}} ثانیه" + "continue-reading": "به خواندن ادامه دهید", + "continuous": { + "description": "هدف شما پیشرفت شما را در طی چند روز محاسبه می کند", + "title": "بیش از یک مدت" + }, + "create-plan": "طرح ایجاد کنید", + "create-reading-goal": "ایجاد هدف", + "daily-progress": "پیشرفت روزانه", + "daily-progress-completed": "تکمیل شد! 🎉", + "daily": { + "description": "هدف شما هر روز بازنشانی خواهد شد", + "title": "هدف روزانه" + }, + "day-x": "روز {{day}}", + "days": "روزها", + "duration": "مدت زمان (روزها)", + "ending-chapter": "پایان سوره", + "ending-verse": "پایان آیه", + "examples-subtitle": "در اینجا لیستی از اهداف مشترک آورده شده است. شما همچنین می توانید هدف خود را ایجاد کنید.", + "examples-title": "یک هدف از پیش تعیین شده انتخاب کنید یا هدف خود را ایجاد کنید", + "examples": { + "custom": { + "description": "یک هدف سفارشی که مناسب شماست تعیین کنید", + "title": "سفارشی" + }, + "khatm": { + "description": "یک هدف کلاسیک خاتم. روزی 1 جزء بخوانید", + "title": "قرآن را در 30 روز بخوانید" + }, + "time": { + "description": "یک هدف ساده برای مبتدیان", + "title": "روزی 10 دقیقه مطالعه کنید" + }, + "year": { + "description": "در سال آینده با سرعت خود قرآن بخوانید", + "title": "قرآن را در یک سال بخوانید" + } + }, + "frequency-tab": { + "description": "آیا هدف شما باید هر روز بازنشانی شود یا هر تعداد روز؟ نگران نباشید، ما پیشرفت شما را بدون توجه به فرکانس انتخابی شما پیگیری می کنیم.", + "title": "یک فرکانس برای هدف خود انتخاب کنید" + }, + "goal-completed": "هدف تکمیل شد! 🎉 ", + "goal-done": { + "description": "هر گونه خواندن اضافی همچنان ثبت خواهد شد", + "title": "شما هدف امروز را تکمیل کردید" + }, + "goal-target": { + "description": "برای تکمیل هدفتان چقدر زمان، صفحات یا آیات باید بخوانید؟", + "title": "برای هدف خود هدف تعیین کنید" + }, + "goal-type": { + "description": "آیا هدف شما باید بر اساس زمان، صفحات یا محدوده سفارشی (یعنی 3 جز قرآن) باشد؟", + "title": "معیاری برای هدف خود انتخاب کنید" + }, + "goal-types": { + "pages": { + "description": "هدف شما بر اساس صفحات خواهد بود", + "title": "صفحات" + }, + "range": { + "description": "هدف شما بر اساس طیفی از آیات سفارشی خواهد بود (این می تواند یک سوره، یک جز یا حتی کل قرآن باشد)", + "title": "محدوده سفارشی" + }, + "time": { + "description": "هدف شما بر اساس زمان خواهد بود", + "title": "زمان" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} روز دیگر", + "other": "+{{days}} روز دیگر" + }, + "preview-schedule": { + "description": "هدف شما اینگونه خواهد بود. همیشه می توانید بعداً آن را تغییر دهید.", + "title": "در اینجا پیش نمایشی از برنامه شما است" + }, + "progress": { + "complete": "هدف امروز کامل شد🎉", + "goal-complete": "تمام هدف شما کامل است 🎉", + "pages-goal": "{{pages}} صفحه قرآن را بخوانید", + "range-goal": "خواندن {{from}} به {{to}}", + "time-goal": "{{time}} قرآن را بخوانید" + }, + "reading-goal": "هدف خواندن", + "reading-goal-description": "آیا حفظ سازگاری با اهداف قرائت قرآن برای شما چالش برانگیز است؟

    سیر رشد قرآن یک ویژگی پویا است که به شما کمک می کند در سفر خود با قرآن ثابت قدم بمانید. چه بخواهید روزی 10 دقیقه بخوانید، یک جز را در یک ماه کامل کنید، یا کل قرآن را در یک سال ختم کنید و غیره، Quran.com اکنون می تواند به شما کمک کند تا یک هدف سفارشی تعیین کنید و رگه های خواندن روزانه خود را پیگیری کنید، در حالی که با پیشرفت خود تنظیم می کنید. استفاده از آن کاملا رایگان است و امیدواریم به شما کمک کند تا برای رسیدن به هدف خود انگیزه داشته باشید!", + "reading-goal-label": "شما روی یک", + "reading-goal-title": "معرفی سیر رشد قرآن", + "recommended": "توصیه شده", + "remaining": "باقی مانده برای امروز", + "remaining-base": "باقی مانده است", + "remaining-days": { + "one": "{{days}} روز باقی مانده است", + "other": "{{days}} روز باقی مانده است" + }, + "set-a-new-goal": "یک هدف جدید تعیین کنید", + "set-reading-goal-success": "هدف خواندن شما با موفقیت تنظیم شده است.", + "start-journey": "سفر خود را آغاز کنید!", + "start-reading": "شروع به خواندن کنید", + "starting-chapter": "شروع سوره", + "starting-verse": "شروع آیه", + "streak": "خط", + "streak-definition": "رگه به تعداد روزهای متوالی قرآن می گویند.", + "timeline-meaning": "جدول زمانی شما به چه معناست؟", + "timeline-states": { + "checked": "شما هدف خود را کامل کرده اید", + "filled": "شما چیزی خوانده اید اما برای تکمیل هدفتان کافی نیست", + "none": "تو آن روز هنوز چیزی نخوانده ای", + "stroked": "امروز چیزی نخوانده ای" + }, + "todays-goal": "هدف امروز", + "view-progress": "مشاهده پیشرفت", + "week-progress": "پیشرفت این هفته", + "x-days": { + "one": "{{days}} روز", + "other": "{{days}} روز" + }, + "x-days-streak": "{{days}} رگه روز", + "x-hours": { + "one": "{{hours}} ساعت", + "other": "{{hours}} ساعت" + }, + "x-minutes": { + "one": "{{minutes}} دقیقه", + "other": "{{minutes}} دقیقه" + }, + "x-pages": { + "one": "{{pages}} صفحه", + "other": "{{pages}} صفحه" + }, + "x-seconds": { + "one": "{{seconds}} ثانیه", + "other": "{{seconds}} ثانیه" + } +} diff --git a/locales/fa/support.json b/locales/fa/support.json index 712923a636..ec25dbb7ee 100644 --- a/locales/fa/support.json +++ b/locales/fa/support.json @@ -1,27 +1,25 @@ { - "bug-a": "لطفاً این اشکال را <0> اینجا <\/0> و انشاءالله در اسرع وقت این اشکال را برطرف خواهیم کرد.", - "bug-q": "من یک اشکال ترجمه پیدا کردم، کجا باید آن را ثبت کنم؟", - "developer-a": "لطفاً برای اطلاعات بیشتر به <0> صفحه توسعه دهندگان <\/0>", - "developer-q": "من یک توسعه دهنده هستم. چگونه می توانم مشارکت کنم؟", - "donate-a": "اولا، ما واقعاً از علاقه شما برای مشارکت قدردانی می کنیم. لطفاً به <0> این <\/0> پیوند مراجعه کنید", - "donate-q": "چگونه می توانم اهدا کنم؟", - "download-a": "متاسفانه نه. ما هنوز قابلیتی برای دانلود وب سایت یا قرآن خود در رایانه شما ارائه نکرده ایم. با این حال، می توانید برنامه تلفن همراه ما را برای خواندن آفلاین نصب کنید.", - "download-q": "آیا می توانم Quran.com را در رایانه خود دانلود کنم؟", - "fiqh-a": "Quran.com یک ابزار آنلاین خواندن، گوش دادن و مطالعه است. تیم سازنده Quran.com متشکل از مهندسان نرم افزار، طراحان و مدیران محصول است. متأسفانه، این محدودیت مجموعه مهارت ما است، ما علما، امامان یا شیوخ را به عنوان بخشی از تیم نداریم تا در مورد سؤالات مربوط به اسلام، فقه یا فتوا کمک کنند. ما سعی می کنیم از پاسخ دادن به هر یک از این سؤالات خودداری کنیم و به شما توصیه می کنیم با امام محل خود در مسجد یا با یک شیخ صحبت کنید.", - "fiqh-q": "سوالات مربوط به اسلام \/ فقه \/ فتوا", - "header": "راهنما و بازخورد", - "main-desc": "لطفاً سؤالات متداول را بررسی کنید تا ببینید آیا سؤال شما قبلاً پاسخ داده شده است یا خیر. در صورت نیاز می توانید <0> با ما تماس بگیرید <\/0> و ما تمام تلاش خود را می کنیم تا در اسرع وقت با شما تماس بگیریم، اما فقط به این دلیل که بدانید ما یک تیم کوچک هستیم، لطفاً خوب رفتار کنید.", - "mobile-a": "آره! لطفاً برای اطلاعات بیشتر به <0> صفحه برنامه های تلفن همراه <\/0>", - "mobile-q": "آیا Quran.com اپلیکیشن موبایل دارد؟", - "other-languages-a": "برای تغییر زبان دلخواه خود، یک کشویی در گوشه سمت راست بالای هر صفحه وجود دارد (گوشه سمت چپ بالا در زبان‌های راست به چپ). از این منوی کشویی برای انتخاب زبان دلخواه خود استفاده کنید.", - "other-languages-q": "آیا می توانم سایت را به زبان های دیگر مرور کنم؟", - "reciters-a": "اطلاعات بیشتر درباره این قاری <0> اینجا <\/0>", - "reciters-q": "افزودن قاریان بیشتر", - "site-down-a": "این خوب نیست! اگر سایت اصلاً کار نمی کند یا ممکن است صفحه سفیدی با متن \"متاسفم، مشکلی پیش آمد\" مشاهده کردید، اگر بتوانید آن را <0> اینجا <\/0> گزارش دهید، سپاسگزاریم.", - "site-down-q": "سایت کار نمیکنه چطوری بهتون بگم؟", - "support": "پشتیبانی", - "tafsir-a": "بله، ما چند تفسیر داریم. روی نماد نشان داده شده در کنار هر آیه کلیک کنید، سپس بر روی تفسیر کلیک کنید. برنامه لیستی از تفسیرهای موجود را به شما نشان می دهد. بر روی تفسیری که می خواهید بخوانید کلیک کنید.", - "tafsir-q": "آیا تفسیر موجود است؟", - "translations-a": "یک شماره جدید <0> اینجا <\/0> با تمام جزئیات باز کنید، به ترجمه پیوند دهید و ما تمام تلاش خود را می کنیم تا این را اضافه کنیم.", - "translations-q": "ترجمه دیگری اضافه کنید" -} \ No newline at end of file + "bug-a": "لطفاً این اشکال را <0> اینجا و انشاءالله در اسرع وقت این اشکال را برطرف خواهیم کرد.", + "bug-q": "من یک اشکال ترجمه پیدا کردم، کجا باید آن را ثبت کنم؟", + "developer-a": "لطفاً برای اطلاعات بیشتر به <0> صفحه توسعه دهندگان ", + "developer-q": "من یک توسعه دهنده هستم. چگونه می توانم مشارکت کنم؟", + "donate-a": "اولا، ما واقعاً از علاقه شما برای مشارکت قدردانی می کنیم. لطفاً به <0> این پیوند مراجعه کنید", + "donate-q": "چگونه می توانم اهدا کنم؟", + "download-a": "متاسفانه نه. ما هنوز قابلیتی برای دانلود وب سایت یا قرآن خود در رایانه شما ارائه نکرده ایم. با این حال، می توانید برنامه تلفن همراه ما را برای خواندن آفلاین نصب کنید.", + "download-q": "آیا می توانم Quran.com را در رایانه خود دانلود کنم؟", + "header": "راهنما و بازخورد", + "main-desc": "لطفاً سؤالات متداول را بررسی کنید تا ببینید آیا سؤال شما قبلاً پاسخ داده شده است یا خیر. در صورت نیاز می توانید <0> با ما تماس بگیرید و ما تمام تلاش خود را می کنیم تا در اسرع وقت با شما تماس بگیریم، اما فقط به این دلیل که بدانید ما یک تیم کوچک هستیم، لطفاً خوب رفتار کنید.", + "mobile-a": "بله! لطفاً برای دانلود برنامه‌ها به <0>قرآن برای اندروید یا <1>قرآن iOS مراجعه کنید", + "mobile-q": "آیا Quran.com اپلیکیشن موبایل دارد؟", + "other-languages-a": "برای تغییر زبان دلخواه خود، یک کشویی در گوشه سمت راست بالای هر صفحه وجود دارد (گوشه سمت چپ بالا در زبان‌های راست به چپ). از این منوی کشویی برای انتخاب زبان دلخواه خود استفاده کنید.", + "other-languages-q": "آیا می توانم سایت را به زبان های دیگر مرور کنم؟", + "reciters-a": "اطلاعات بیشتر درباره این قاری <0> اینجا ", + "reciters-q": "افزودن قاریان بیشتر", + "site-down-a": "این خوب نیست! اگر سایت اصلاً کار نمی کند یا ممکن است صفحه سفیدی با متن \"متاسفم، مشکلی پیش آمد\" مشاهده کردید، اگر بتوانید آن را <0> اینجا گزارش دهید، سپاسگزاریم.", + "site-down-q": "سایت کار نمیکنه چطوری بهتون بگم؟", + "support": "پشتیبانی", + "tafsir-a": "بله، ما چند تفسیر داریم. روی نماد نشان داده شده در کنار هر آیه کلیک کنید، سپس بر روی تفسیر کلیک کنید. برنامه لیستی از تفسیرهای موجود را به شما نشان می دهد. بر روی تفسیری که می خواهید بخوانید کلیک کنید.", + "tafsir-q": "آیا تفسیر موجود است؟", + "translations-a": "یک شماره جدید <0> اینجا با تمام جزئیات باز کنید، به ترجمه پیوند دهید و ما تمام تلاش خود را می کنیم تا این را اضافه کنیم.", + "translations-q": "ترجمه دیگری اضافه کنید" +} diff --git a/locales/fr/about.json b/locales/fr/about.json index 15bba97d95..6a27b2ddae 100644 --- a/locales/fr/about.json +++ b/locales/fr/about.json @@ -1,14 +1,42 @@ { "credits": { - "desc": "Ce projet n'aurait pas été possible sans les nombreuses bibliothèques et projets open source que nous avons utilisés :", - "lokalize": "<0>Lokalize : Un système de traduction assistée par ordinateur qui met l'accent sur la productivité et l'assurance qualité et fournit un flux de travail de localisation transparent.", - "quran-align": "<0>Collin Fair : Un outil pour produire une segmentation précise des mots de la récitation Coranique enregistrée.", - "quran-complex": "<0>QuranComplex : King Fahd Glorious Qur'an Printing Complex est un chef de file au service du Glorieux Coran et de ses sciences, en traduisant ses significations et en protégeant le texte Coranique de la distorsion, grâce à l'utilisation optimale de technologies de pointe dans le domaine de l'impression, des enregistrements audio, de l'édition électronique et des applications numériques.", - "quran-enc": "<0>QuranEnc : Un portail proposant des traductions gratuites et fiables des significations et des exégèses du Coran dans de nombreuses langues du monde.", - "tanzil": "<0>Tanzil : Un projet Coranique international visant à fournir un texte Coranique précis hautement vérifié.", + "desc": "Nous adressons nos remerciements à tous ceux qui ont soutenu et contribué à ce projet, contribuant ainsi à rendre le Coran accessible à des millions de personnes dans le monde.", + "lokalize": "<0>Lokalize : un système de traduction assistée par ordinateur qui met l'accent sur la productivité et l'assurance qualité et fournit un flux de travail de localisation transparent.", + "quran-align": "<0>Collin Fair : un outil permettant de produire une segmentation précise au mot près de la récitation coranique enregistrée.", + "quran-complex": "<0>QuranComplex : Le complexe d'impression du Coran glorieux du roi Fahd est un leader dans le service du Coran glorieux et de ses sciences, la traduction de ses significations et la protection du texte coranique contre toute distorsion, grâce à l'utilisation optimale de technologies avancées dans le domaine de l'impression, des enregistrements audio, de l'édition électronique et des applications numériques.", + "quran-enc": "<0>QuranEnc : Un portail proposant des traductions gratuites et fiables des significations et des exégèses du noble Coran dans de nombreuses langues du monde.", + "tanzil": "<0>Tanzil : un projet coranique international visant à fournir un texte coranique précis et hautement vérifié.", + "tarteel": "<0>Tarteel : une application de mémorisation du Coran alimentée par l'IA. Elle est conçue pour vous aider à mémoriser plus intelligemment, que vous recherchiez un verset, que vous suiviez vos progrès ou que vous suiviez votre récitation.", "title": "Crédits", - "vercel": "<0>Vercel: est une plate-forme de déploiement et de collaboration pour les développeurs front-end, qui leurs donne la priorité en leur fournissant des outils complets pour créer des sites Web et des applications hautes performances.", - "zekr": "<0>Zekr : Un outil d'étude du Coran sur une plateforme ouverte pour la navigation et la recherche sur le Coran" + "vercel": "<0>Vercel : est une plateforme de déploiement et de collaboration pour les développeurs front-end qui place le développeur front-end au premier plan, en lui offrant des outils complets pour créer des sites Web et des applications hautes performances.", + "zekr": "<0>Zekr : un outil d'étude du Coran à plateforme ouverte pour parcourir et rechercher le Coran" }, - "main-description": "Quran.com a été fondé en 1995. Le site Web vise à faciliter la lecture, l'étude et l'apprentissage du Coran pour tous. Le projet est open source et est construit comme une collaboration entre les membres de l'équipe principale et l'équipe <0>Tarteel ." + "global-effort": { + "desc": "Des millions de personnes du monde entier comptent sur Quran.com comme principale ressource numérique du Coran. Qu'ils viennent pour réciter, réfléchir, mémoriser ou étudier, ils partagent un objectif commun : un désir sincère de se connecter aux paroles d'Allah. \\n Alors que nous continuons à nous développer, nous restons déterminés à faire en sorte que Quran.com reste un espace fiable, accessible et magnifiquement conçu pour quiconque cherche à s'engager avec le Coran.", + "title": "Un effort mondial" + }, + "key-features": { + "desc": "Quran.com est conçu pour accompagner chaque étape de l'apprentissage du Coran, de la lecture et de la mémorisation à l'étude et à la réflexion. Nos fonctionnalités comprennent :", + "features": [ + "Interface conviviale du Coran – Une expérience de lecture claire et intuitive sur n’importe quel appareil.", + "Traductions multiples et Tafsir – Accès aux traductions dans plusieurs langues, ainsi qu'au tafsir.", + "Récitations audio – Écoutez des récitations de haute qualité de Qaris de renommée mondiale, avec la possibilité de suivre mot par mot.", + "Recherche et navigation avancées – Trouvez instantanément des versets par sujet ou par mots-clés dans tout le Coran.", + "Signet et notes sur les versets – Enregistrez des versets et écrivez des réflexions personnelles pour référence ultérieure.", + "Intégration QuranReflect – Engagez-vous avec une communauté mondiale à travers des réflexions et des idées partagées par des universitaires et des particuliers.", + "Suivi des progrès et objectifs de lecture – Suivez vos objectifs quotidiens et votre historique de lecture", + "API pour les développeurs – Accès gratuit au contenu et aux fonctionnalités pour alimenter les applications islamiques et la R&D.", + "Et bien plus encore, Alhamdullilah." + ], + "title": "Principales caractéristiques et offres" + }, + "main-description": "Depuis sa création en 1995, Quran.com s'est engagé à rendre le Coran accessible à tous d'une manière claire, authentique et facile à comprendre. Chaque jour, des millions de personnes dans le monde entier se tournent vers Quran.com pour lire, écouter, étudier et réfléchir sur le Coran, qu'ils soient des étudiants de longue date, des érudits ou qu'ils commencent tout juste leur parcours.", + "our-mission": { + "desc": "Le Coran est destiné à être lu, compris et médité. Notre mission est de supprimer les obstacles à l’accès et de responsabiliser les individus et les communautés en offrant une expérience coranique fiable, bien conçue et profondément enrichissante. Notre objectif est de servir de source fiable pour quiconque cherche à s’engager avec le Coran, guidé par les principes d’exactitude, de clarté et de sincérité.", + "title": "Notre mission" + }, + "who-we-are": { + "desc": "Quran.com est un waqf (fonds de dotation), créé en tant que fiducie publique pour garantir que le Coran reste accessible à tous, gratuitement et sans intérêts commerciaux. Il est géré par Quran.Foundation, une organisation à but non lucratif 501(c)(3), qui soutient et développe Quran.com dans le cadre de sa mission de fournir au monde des ressources coraniques authentiques et de haute qualité. Notre engagement est de servir le Coran et ses lecteurs avec excellence, sincérité et responsabilité.", + "title": "Qui sommes-nous" + } } diff --git a/locales/fr/apps.json b/locales/fr/apps.json index ef67e5e38f..29280c22d3 100644 --- a/locales/fr/apps.json +++ b/locales/fr/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Les développeurs de Quran.com ont conçus de belles applications de mushaf, sans publicité, pour iOS et Android. Il est désormais plus facile de lire, écouter et mémoriser le Coran en déplacement.", - "tarteel-desc": "Tarteel est la première application du Coran à utiliser des outils d'intelligence artificielle pour interagir avec votre récitation et mettre en évidence les erreurs. Un compagnon du Coran guidé par la voix dans la paume de vos mains, Tarteel fonctionne intuitivement pour vous aider à lire, réciter, mémoriser et comprendre le Coran en toute confiance ! <0><0>Tarteel est fier d'être un développeur principal de Quran.com ainsi qu'un membre de leur conseil d'administration." + "quran-desc": "Les développeurs de Quran.com ont conçus de belles applications de mushaf, sans publicité, pour iOS et Android. Il est désormais plus facile de lire, écouter et mémoriser le Coran en déplacement." } diff --git a/locales/fr/common.json b/locales/fr/common.json index f78ea03d9f..58d3d96c2b 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigations", "no-nav-results": "Aucun résultat de navigation", - "placeholder": "Que veux-tu lire ?", - "powered-by": "Recherche vocale optimisée par Tarteel.ai", + "placeholder": "Rechercher dans le Coran...", "recent-navigations": "Navigations récentes", "search-by-voice": "Recherche vocale", "try-navigating": "Essayez de naviguer vers" @@ -122,9 +121,11 @@ } }, "continue": "Continuer", + "contribute-to-our-mission": "Contribuez à notre mission", "copied": "Copié", "copied-to-clipboard": "Copié dans le presse-papier", "copy": "Copier", + "copylink": "Copier le lien", "counter": { "decrease": "Diminuer", "increase": "Augmenter" @@ -134,6 +135,7 @@ "developers": "Développeurs", "display": "Afficher", "donate": "Faire un don", + "donate-now": "Faire un don maintenant", "donate_monthly": "Faire un don mensuel", "donate_once": "Faire un don", "edit": "Modifier", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} Ayahs", "ranges-wrong-order": "L'Ayah de départ doit être avant l'Ayah de fin." }, + "errors": { + "account-banned": "Désolé, votre compte est banni. Contactez Quran.Foundation", + "badRequest": "*Demande invalide", + "banned": "*Désolé, votre compte est banni. Contactez Quran.Foundation", + "confirm": "*Le mot de passe de confirmation ne correspond pas au mot de passe", + "email": "*Format d'e-mail non valide !", + "exactLength": "*La valeur doit être la longueur exacte", + "expiredToken": "*Ce jeton est expiré", + "forgot-password-failed": "Impossible d'envoyer l'e-mail de réinitialisation du mot de passe. Veuillez réessayer.", + "immutable": "*Cette valeur ne peut pas être modifiée", + "invalid": "*Ce champ {{fieldName}} n'est pas valide", + "invalidEmailOrPassword": "*E-mail ou mot de passe invalide", + "max": "* {{fieldName}} doit être inférieur ou égal à {{max}} chiffres", + "min": "* {{fieldName}} doit être supérieur ou égal à {{min}} chiffres", + "name": "* {{fieldName}} doit être composé uniquement de lettres et de chiffres", + "notFound": "*Non trouvé", + "required": "* {{fieldName}} est manquant !", + "reset-password-failed": "Impossible de réinitialiser le mot de passe. Veuillez réessayer.", + "signin-failed": "La connexion a échoué. Veuillez réessayer.", + "signup-failed": "L'inscription a échoué. Veuillez réessayer.", + "taken": "* {{fieldName}} existe déjà !", + "usedToken": "*Ce jeton a déjà été utilisé", + "username": "* {{fieldName}} accepte uniquement les traits de soulignement et les lettres", + "verification-code-invalid": "Ce code de vérification n'est pas valide", + "verification-code-length": "Le code de vérification doit contenir {{length}} chiffres", + "verification-failed": "La vérification a échoué. Veuillez réessayer.", + "verification-resend-failed": "Impossible de renvoyer le code de vérification" + }, "exciting-updates": "Des mises à jour passionnantes", "feedback": "Avis", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Taille de la police de traduction" }, "footer": { - "description": "Quran.com est une Sadaqah Jariyah. Nous espérons faciliter la lecture, l'étude et l'apprentissage du Coran pour tous. Le Coran a de nombreux noms dont Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr et Al-Noor.", + "description": "Quran.com est une plateforme de confiance utilisée par des millions de personnes dans le monde pour lire, rechercher, écouter et réfléchir sur le Coran en plusieurs langues. Elle propose des traductions, des tafsir, des récitations, des traductions mot à mot et des outils pour une étude plus approfondie, rendant le Coran accessible à tous.

    En tant que Sadaqah Jariyah, Quran.com se consacre à aider les gens à se connecter profondément au Coran. Soutenu par Quran.Foundation, une organisation à but non lucratif 501(c)(3), Quran.com continue de se développer en tant que ressource gratuite et précieuse pour tous, Alhamdullilah”", "hiring": "Nous recrutons ! Rejoignez l'équipe de QuranFoundation et contribuez à notre mission. Postulez maintenant ! ", "rights": "Tous droits réservés", - "title": "Lisez, étudiez et apprenez le Coran." + "title": "Lisez, écoutez, recherchez et réfléchissez sur le Coran" }, "form": { "body": "Corps", "code": "Code de vérification", + "confirm-password": "Confirmez le mot de passe", "email": "E-mail", "firstName": "Prénom", "lastName": "Nom de famille", - "title": "Titre" + "password": "Mot de passe", + "title": "Titre", + "username": "Nom d'utilisateur", + "verification-code": "Le code de vérification" }, "from": "De", + "fundraising-share-title": "Partager la collecte de fonds de Quran.com", "fundraising-sticky-banner": { "cta": "Faire un don", "title": "Donnez pendant les meilleurs jours !" @@ -217,6 +252,7 @@ "learn-more": "En savoir plus", "learning-plans": "Plans d'apprentissage", "less": "Moins", + "lessons": "Cours", "loading": "Chargement", "login": "Se connecter", "logout": "Se déconnecter", @@ -250,6 +286,7 @@ "off": "Désactivé", "oldest": "Le plus ancien", "on": "Activé", + "our-projects": "Nos projets", "page": "Page", "pages": "Pages", "pagination-summary": "{{currentResultNumber}}-{{endOfResultNumber}} sur {{totalNumberOfResults}} résultats de recherche", @@ -272,6 +309,7 @@ "privacy": "Confidentialité", "product-updates": "Mises à jour du produit", "profile": "Profil", + "projects-desc": "Projets à but non lucratif détenus, gérés ou sponsorisés par Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "Quran Radio", @@ -287,6 +325,7 @@ "reciters": "Récitateurs", "reflect": "Méditer", "reflections": "Réflexions", + "reflections-and-lessons": "Réflexions et leçons", "remove": "Supprimer", "rename": "Renommer", "retry": "Réessayer", @@ -296,10 +335,12 @@ "save-to-collection": "Enregistrer dans la collection", "search-for": "Rechercher '{{searchQuery}}'", "search-results": "{{count}} résultats de recherche", + "search-results-no-count": "Résultats de la recherche", "search": { "filters": "Filtres", "hint": "Essayez de rechercher", "jump-to": "Sauter à", + "more-results": "Plus de résultats", "no-results": "Aucun résultat trouvé", "no-results-suggestion": "Nous n'avons trouvé aucun résultat de recherche pour \"{{searchQuery}}\". Essayez de rechercher un mot-clé différent.", "popular": "Recherches populaires", @@ -340,8 +381,10 @@ "search-juz": "Rechercher le Juz", "search-page": "Rechercher la page", "search-surah": "Recherche la Sourate", + "search-verse": "Recherche de vers", "try-navigating-with": "Astuce: essayez de naviguer avec" }, + "sign-in": "Se connecter", "sitemap": "Plan du site (sitemap)", "sort": { "ascending": "Croissant", @@ -362,10 +405,6 @@ "tafsirs-desc": "Lisez divers Tafsirs de l'Ayah {{ayahNumber}} de la Sourate {{surahName}} par des savants du Tafsir de confiance", "title": "Tafsir" }, - "tarteel": { - "app": "Application Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Termes et conditions", "theme": "Thème", "themes": { @@ -400,13 +439,13 @@ "view": "Vue", "voice": { "ask-permission": "Veuillez activer l'autorisation du microphone pour commencer à utiliser la recherche vocale", - "error": "Un erreur est survenue, veuillez réessayer plus tard. Ou télécharger ", - "no-permission": "Il semble que vous n'ayez pas activé les autorisations de microphone. Veuillez activer les autorisations du microphone et réessayer ou télécharger ", - "not-supported": "Il semble que votre navigateur ne supporte pas le microphone. Veuillez essayer un autre navigateur ou télécharger ", + "error": "Une erreur s'est produite, veuillez réessayer ultérieurement.", + "no-permission": "Il semble que les autorisations du microphone ne soient pas activées. Veuillez activer les autorisations du microphone et réessayer.", + "not-supported": "Il semble que votre navigateur ne prenne pas en charge le microphone. Veuillez essayer un autre navigateur.", "suggest": "Veuillez commencer à réciter et votre Ayah apparaîtra.", "suggest-subtitle": "Récitez n'importe quelle Ayah en arabe, et l'Ayah apparaîtra", "suggest-title": "Récitez maintenant", - "voice-search-powered-by": "Recherche vocale propulsée par" + "voice-search-powered-by": "Recherche vocale optimisée par" }, "wbw": "Mot par mot", "wbw-lang-summary": "Source de la traduction mot à mot: {{source}}. Cette source est indépendante de la sélection de la traduction des Ayahs.", diff --git a/locales/fr/developers.json b/locales/fr/developers.json index c5ca2a434a..60b7fcf24e 100644 --- a/locales/fr/developers.json +++ b/locales/fr/developers.json @@ -15,6 +15,5 @@ "q-next": "<0>Quran.com Frontend - écrit en Next.js.", "q-v2": "<0>Quran.com - écrit en Ruby on Rails." }, - "sub-main-desc": "Nous sommes une équipe de développeurs, de designers, de chefs de produits et d'ingénieurs travaillant bénévolement sur Quran.com. Alhamdulillah, nous avons eu la chance de travailler pour de grandes entreprises dans la Silicon Valley, à Toronto et aux Émirats arabes unis - et nous pensons que c'est le moins que nous puissions faire pour aider notre Ummah à progresser dans l'apprentissage et l'étude de leur religion. Travailler sur Quran.com est très gratifiant; qu'Allah nous récompense tous (et vous récompense) pour nos efforts.", "thanks": "Nous attendons avec impatience votre contribution !" } diff --git a/locales/fr/home.json b/locales/fr/home.json index 88443bc611..dd8d5937fd 100644 --- a/locales/fr/home.json +++ b/locales/fr/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Atteignez vos objectifs coraniques", + "begin": "Commencer", + "chapters-and-verses": "Chapitres et versets", + "continue-read": "Continuer la lecture", + "explore-topics": "Explorer les sujets", + "first-time-reading": "Vous débutez avec le Coran ? Commencez ici ", + "know-someone": "Grandissez avec nous ce Ramadan ", + "learning-plan": "Plans d'apprentissage", + "listen-to-radio": "Écouter la radio du Coran", + "my-quran": "Mon Coran", + "navigate-quran": "Naviguer dans le Coran", "no-bookmarks": "Vous n'avez pas encore de favoris", "no-recently-read": "Vous n'avez pas encore de séance de lecture", "noble-quran": "Le Noble Coran", + "popular": "Populaire", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Voyage de Développement Spirituel avec le Coran" }, + "qr-community": "Lisez les versets et les réflexions du jour", "ramadan-activities-cta": " Suivez le Calendrier Coranique mondial pour des lectures hebdomadaires, des podcasts inspirants et un appel à la réflexion ! ", + "ramadan": { + "header": "Des outils pour approfondir votre connexion avec le Coran", + "title": "Prêt pour le Ramadan ?" + }, "read-juz": "Lire Juz", "recently-read": "Lu récemment", "revelation-order-disclaimer": "Cette vue montre l'ordre chronologique des Sourates dans le Coran en fonction du moment où elles ont été révélées au Prophète Muhammad . La chronologie est un sujet d'opinion scientifique et certaines Sourates ont été révélées en parties à des moments différents. L'ordre est basé sur le travail de Tanzil.net. [Remarque : l'ordre du Mushaf (entre les Sourates Al-Fatiha et Al-Nas) est une question de consensus.]", + "see-more-learning-plans": "Voir plus", + "set-custom-goal": "Fixer un objectif", + "share-quran": { + "description": "Aidez à diffuser le Coran aux nouveaux apprenants", + "title": "Partagez le Coran !" + }, + "start-read": "Commencer à lire", + "stay-consistent": "Suivez vos séquences, créez des objectifs personnalisés et restez cohérent", "tab": { "bookmarks": "Favoris", "popular": "Populaire" diff --git a/locales/fr/learn.json b/locales/fr/learn.json index 1b9f443350..559fbf18ec 100644 --- a/locales/fr/learn.json +++ b/locales/fr/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Merci pour votre avis !", "your-feedback": "Vos avis" }, + "help-about-reflection": "Aide sur la fonction de réflexion", "learn-duration": "Durée", + "learn-more": "Apprendre encore plus", "learning-plan-material": "Contenu du Plan d’Apprentissage", "learning-plan-meta-desc": "Ce Plan d'Apprentissage vous aidera à transformer votre engagement avec Coran. Commencez votre voyage dès aujourd'hui !", "learning-plans-desc": "Améliorez vos connaissances avec des leçons faciles à suivre qui vous permettront de progresser dans votre voyage avec le Coran.

    Commencez un Plan d'Apprentissage dès aujourd'hui ! Votre progression est suivie jusqu'à ce que vous atteigniez la ligne d'arrivée.", @@ -34,9 +36,12 @@ "next-lesson": "Leçon suivante", "not-enrolled": "Vous n'êtes pas encore inscrit(e) au Plan d'Apprentissage.", "prev-lesson": "Leçon précédente", + "reflection-description-1": "En cliquant sur « Ajouter une réflexion », vous serez redirigé vers QuranReflect, une plateforme de partage de réflexions personnelles sur le Coran. Contrairement au Tafsir (interprétation savante), les réflexions sont des idées et des expériences personnelles liées aux versets.", + "reflection-description-2": "Si vous publiez publiquement, votre réflexion sera examinée par l'équipe de modération et deviendra visible pour la communauté QuranReflect.", "start-learning": "Commencer l'apprentissage", "tabs": { "main": "Détails principaux", "syllabus": "Programme" - } + }, + "what-happens-when-you-click-add-reflection": "Que se passe-t-il lorsque vous cliquez sur « Ajouter une réflexion » ?" } diff --git a/locales/fr/login.json b/locales/fr/login.json index c98b2ac458..247789e347 100644 --- a/locales/fr/login.json +++ b/locales/fr/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "En attente de confirmation", + "back": "Dos", + "back-to-login": "Retour à la connexion", + "check-email-title": "Vérifiez votre e-mail pour terminer l'inscription", + "confirm": "Confirmer", + "confirm-new-password-placeholder": "Confirmer le nouveau mot de passe", + "confirm-password-placeholder": "Confirmez le mot de passe", + "continue": "Continuer", "continue-apple": "Continuer avec Apple", "continue-email": "Continuer avec l'e-mail", "continue-facebook": "Continuer avec Facebook", "continue-google": "Continuer avec Google", "email-placeholder": "Adresse e-mail", + "error": { + "email-required": "L'e-mail est manquant !", + "invalid-credentials": "Email ou mot de passe invalide", + "invalid-email": "Format d'e-mail non valide !", + "login-failed": "La connexion a échoué. Veuillez réessayer.", + "password-required": "Le mot de passe est manquant !" + }, + "errors": { + "account-banned": "Désolé, votre compte est banni. Contactez Quran.Foundation", + "badRequest": "*Demande invalide", + "banned": "*Désolé, votre compte est banni. Contactez Quran.Foundation", + "confirm": "*Le mot de passe de confirmation ne correspond pas au mot de passe", + "email": "*Format d'e-mail non valide !", + "exactLength": "*La valeur doit être la longueur exacte", + "expiredToken": "*Ce jeton est expiré", + "forgot-password-failed": "Impossible d'envoyer l'e-mail de réinitialisation du mot de passe. Veuillez réessayer.", + "immutable": "*Cette valeur ne peut pas être modifiée", + "invalid": "*Ce champ {{fieldName}} n'est pas valide", + "invalidEmailOrPassword": "*E-mail ou mot de passe invalide", + "max": "* {{fieldName}} doit être inférieur ou égal à {{max}} chiffres", + "min": "* {{fieldName}} doit être supérieur ou égal à {{min}} chiffres", + "name": "* {{fieldName}} doit être composé uniquement de lettres et de chiffres", + "notFound": "*Non trouvé", + "required": "* {{fieldName}} est manquant !", + "reset-password-failed": "Impossible de réinitialiser le mot de passe. Veuillez réessayer.", + "signin-failed": "La connexion a échoué. Veuillez réessayer.", + "signup-failed": "L'inscription a échoué. Veuillez réessayer.", + "taken": "* {{fieldName}} existe déjà !", + "usedToken": "*Ce jeton a déjà été utilisé", + "username": "* {{fieldName}} accepte uniquement les traits de soulignement et les lettres", + "verification-code-invalid": "Ce code de vérification n'est pas valide", + "verification-code-length": "Le code de vérification doit contenir {{length}} chiffres", + "verification-failed": "La vérification a échoué. Veuillez réessayer.", + "verification-resend-failed": "Impossible de renvoyer le code de vérification" + }, "feature-1": "Suivez vos objectifs", "feature-2": "Maintenez des séries de lecture", "feature-3": "Créez des collections", "feature-4": "Synchronisez vos données sur tous les navigateurs", "feature-5": "Et plus encore !", "feature-6": " Nouveau ! Notes et réflexions", + "first-name-placeholder": "Prénom", + "forgot-password": "Mot de passe oublié", + "forgot-password-description": "Saisissez votre adresse e-mail et nous vous enverrons des instructions pour réinitialiser votre mot de passe.", + "forgot-password-success": "Un e-mail de réinitialisation de mot de passe a été envoyé ! Veuillez vérifier votre boîte de réception.", + "forgot-password-title": "Mot de passe oublié ?", + "last-name-placeholder": "Nom de famille", "login-cta": "Connectez-vous ou Inscrivez-vous maintenant:", "login-error": { "AuthenticationError": "Authentification échouée. Veuillez réessayer plus tard", + "BannedUserError": "Désolé, votre compte est banni. Contactez Quran.Foundation.", "TokenExpiredError": "Vous avez été déconnecté(e), veuillez vous reconnecter." }, "login-title": "Se connecter à Quran.com", + "new-password-placeholder": "Nouveau mot de passe", "other-options": "Autres options de connexion", + "password-placeholder": "Mot de passe", + "password-reset-success": "Réinitialisation du mot de passe réussie !", + "password-rules": { + "lowercase": "Au moins une lettre minuscule", + "max-length": "Max 20 caractères", + "min-length": "Minimum 8 caractères", + "number": "Au moins un numéro", + "special": "Au moins un caractère spécial (!@#$%^&*_-)", + "uppercase": "Au moins une lettre majuscule" + }, "privacy-policy": "La protection de votre vie privée est notre priorité. En vous inscrivant, vous acceptez notre Politique de confidentialité et Conditions générales .", - "verify-code": "Vérifiez que le code de sécurité fourni correspond au texte suivant :" + "quran-text": "Coran", + "quran-title": "Coran.com", + "reflect-feature-1": "Réfléchir au Coran", + "reflect-feature-2": "Rejoindre des groupes", + "reflect-feature-3": "Interagir avec les autres", + "reflect-feature-4": "Et plus encore !", + "reset-password": "Réinitialiser le mot de passe", + "reset-password-success": "Réinitialisation du mot de passe réussie !", + "set-new-password": "Définir un nouveau mot de passe", + "sign-in": "Se connecter", + "sign-in-or-sign-up": "Connectez-vous ou inscrivez-vous", + "sign-up": "S'inscrire", + "unified-registration-1": "L'enregistrement unifié des ", + "unified-registration-2": "Coran.Fondation", + "unified-registration-3": ". Vous aurez accès aux sites Web suivants ", + "unified-registration-4": "via vos identifiants de connexion.", + "username-placeholder": "Nom d'utilisateur", + "verification-code-instruction": "Veuillez saisir le code fourni dans l'e-mail pour terminer l'inscription", + "verification-code-resend": "Renvoyer l'e-mail", + "verification-code-resend-countdown": "Renvoyer l'e-mail de vérification dans {{seconds}} secondes...", + "verification-code-sent": "Code de vérification envoyé !", + "verification-code-sent-to": "Nous venons d'envoyer un e-mail à", + "verification-code-spam-note": "Vous n'avez pas reçu d'e-mail ? Vérifiez votre dossier spam", + "verify-code": "Vérifiez que le code de sécurité fourni correspond au texte suivant :", + "welcome-description-1": "L'enregistrement unifié des", + "welcome-description-2": ".Fondation", + "welcome-description-3": "Vous aurez accès aux sites Web suivants grâce à vos informations de connexion.", + "welcome-title": "Bienvenue à" } diff --git a/locales/fr/onboarding.json b/locales/fr/onboarding.json index 110b35825e..d6566e5ecc 100644 --- a/locales/fr/onboarding.json +++ b/locales/fr/onboarding.json @@ -87,10 +87,6 @@ "description": "Choisissez parmi une variété de traductions dans plusieurs langues. Astuce : Comparez les traductions en sélectionnant plusieurs options", "title": "Traductions" }, - "voice-search": { - "description": "Appuyez sur l'icône du micro et récitez l'Ayah que vous recherchez. Petit conseil ! Pour découvrir où quelqu'un récite (ex. les prières Taraweeh), appuyez sur l'icône du micro. Après qu'une ou deux Ayahs soient détectés, appuyez sur stop pour trouver l'emplacement", - "title": "Recherche vocale (Tarteel)" - }, "wbw-audio": { "description": "Sélectionnez cette option pour écouter chaque mot individuellement en cliquant simplement sur le mot !", "title": "Écouter la translittération mot à mot en cliquant sur le mot" diff --git a/locales/fr/question.json b/locales/fr/question.json index 1948b67051..6f34575895 100644 --- a/locales/fr/question.json +++ b/locales/fr/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Questions et réponses liées à ", - "question": "Question" + "question": "Question", + "questions-meta-desc": "Explorez des réponses fiables pour approfondir votre compréhension du Coran." } diff --git a/locales/fr/quick-links.json b/locales/fr/quick-links.json index e5b94564ba..cd47b69f90 100644 --- a/locales/fr/quick-links.json +++ b/locales/fr/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "À propos du Coran", "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jésus dans le Coran", "kahf": "Al Kahf", "mulk": "Al Mulk", "muzzammil": "Al Muzzammil", @@ -8,5 +9,6 @@ "rahman": "Ar-Rahman", "sunnah": "Ayahs sur la Sunnah", "waqiah": "Al Waqi'ah", + "what-is-ramadan": "Qu'est-ce que le Ramadan ?", "yaseen": "Yaseen" } diff --git a/locales/fr/quran-reader.json b/locales/fr/quran-reader.json index 87e253f6e7..0debac09e9 100644 --- a/locales/fr/quran-reader.json +++ b/locales/fr/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Début du Hizb", "include-translator": "Inclure le nom du traducteur ?", "juz-beginning": "Début du Juz", + "lessons-desc": "Lisez et partagez les leçons coraniques de l'Ayah {{ayahNumber}} de la Sourate {{surahName}}", + "lessons-disclaimer": "Les leçons sont des réflexions et des interprétations personnelles du Coran. Elles ne sont pas censées être considérées comme faisant autorité.", + "lessons-not-available": "Il n'y a pas de leçons révisées pour ce verset", "mad-2": "Maad 2 secondes", "mad-2-4-6": "Maad autorisé 2 ou 4 ou 6 secondes", "mad-4-5": "Maad nécessaire 4 ou 5 secondes", diff --git a/locales/fr/radio.json b/locales/fr/radio.json index 776e7cca18..55001cc175 100644 --- a/locales/fr/radio.json +++ b/locales/fr/radio.json @@ -22,5 +22,6 @@ "pause-radio": "Mettre la radio en pause", "play-radio": "Écouter la radio", "radio-desc": "Écouter la belle récitation non-stop du Saint Coran par divers récitateurs.", - "reciter-stations": "Stations de récitateurs" + "reciter-stations": "Stations de récitateurs", + "station": "Gare" } diff --git a/locales/fr/reading-goal.json b/locales/fr/reading-goal.json index 699d226271..bc7760af19 100644 --- a/locales/fr/reading-goal.json +++ b/locales/fr/reading-goal.json @@ -7,6 +7,7 @@ "create-plan": "Créer un plan", "create-reading-goal": "Définir un objectif", "daily-progress": "Progression quotidienne", + "daily-progress-completed": "Terminé ! 🎉", "daily": { "description": "Votre objectif sera réinitialisé chaque jour", "title": "Objectif quotidien" @@ -40,6 +41,7 @@ "description": "Votre objectif doit-il être réinitialisé quotidiennement, ou bien après un certain nombre de jours ? Ne vous inquiétez pas, nous suivrons vos progrès quelle que soit la fréquence que vous choisissez.", "title": "Choisissez une fréquence pour votre objectif" }, + "goal-completed": "Objectif atteint ! 🎉 ", "goal-done": { "description": "Toute lecture supplémentaire sera enregistrée", "title": "Vous avez atteint l'objectif du jour" @@ -82,13 +84,17 @@ "time-goal": "lire {{time}} du Coran" }, "reading-goal": "Objectif de lecture", + "reading-goal-description": "Trouvez-vous difficile de maintenir la cohérence avec vos objectifs de lecture du Coran ?

    Quran Growth Journey est une fonctionnalité dynamique développée pour vous aider à rester cohérent dans votre parcours avec le Coran. Que vous souhaitiez lire 10 minutes par jour, terminer un Juz en un mois ou terminer l'intégralité du Coran en un an, etc., Quran.com peut désormais vous aider à définir un objectif personnalisé et à suivre vos séquences de lecture quotidiennes, tout en vous adaptant à mesure que vous progressez. Son utilisation est entièrement gratuite et nous espérons qu'elle vous aidera à rester motivé pour atteindre votre objectif !", "reading-goal-label": "Vous êtes sur un(e)", + "reading-goal-title": "Présentation du Quran Growth Journey", "recommended": "Recommandé", "remaining": "Reste pour aujourd'hui", + "remaining-base": "Restant", "remaining-days": { "one": "{{days}} jour restant", "other": "{{days}} jours restants" }, + "set-a-new-goal": "Définir un nouvel objectif", "set-reading-goal-success": "Votre objectif de lecture a été défini avec succès.", "start-journey": "Commencez votre voyage !", "start-reading": "Commencer la lecture", diff --git a/locales/fr/support.json b/locales/fr/support.json index 712b3a7125..44c9894370 100644 --- a/locales/fr/support.json +++ b/locales/fr/support.json @@ -7,11 +7,9 @@ "donate-q": "Comment puis-je faire un don ?", "download-a": "Malheureusement non. Nous ne proposons pas encore de fonctionnalité pour télécharger notre site Web ou le Coran sur votre ordinateur. Vous pouvez cependant installer notre application mobile pour une lecture hors ligne.", "download-q": "Puis-je télécharger Quran.com sur mon ordinateur ?", - "fiqh-a": "Quran.com est un outil de lecture, d'écoute et d'étude en ligne du Coran. L'équipe derrière Quran.com est composée d'ingénieurs logiciels, de concepteurs et de chefs de produit. Malheureusement, c'est la limitation de nos compétences. Nous n'avons pas d'érudits, d'imams ou de cheikhs dans l'équipe pour aider avec les questions liées à l'Islam, au Fiqh ou à la Fatwa. Ainsi, nous ne répondons pas à de tels questionnement, et vous conseillons de parler à votre imam local dans une mosquée ou à un cheikh.", - "fiqh-q": "Questions liées à l'Islam / Fiqh / Fatwa", "header": "Aide et avis", "main-desc": "Veuillez consulter la FAQ pour voir si votre question a déjà reçu une réponse. Si besoin, vous pouvez <0>nous contacter et nous ferons de notre mieux pour vous répondre dans les plus brefs délais. Notez tout de même que nous sommes une petite équipe, alors soyez indulgent.", - "mobile-a": "Oui! Veuillez visiter notre <0>page d'applications mobiles pour plus d'informations.", + "mobile-a": "Oui ! Veuillez visiter <0>Quran pour Android ou <1>Quran iOS pour télécharger les applications", "mobile-q": "Y a-t-il une application mobile de Quran.com ?", "other-languages-a": "Pour changer votre langue préférée, il y a un menu déroulant dans le coin supérieur droit de chaque page (coin supérieur gauche sur les langues de droite à gauche). Utilisez cette liste déroulante pour choisir votre langue préférée.", "other-languages-q": "Puis-je consulter Quran.com dans d'autres langues ?", diff --git a/locales/id/about.json b/locales/id/about.json index 750977c8da..3e6d3cbbf9 100644 --- a/locales/id/about.json +++ b/locales/id/about.json @@ -1,14 +1,42 @@ { "credits": { - "desc": "Projek ini tidak mungkin terjadi tanpa adanya banyak sumber perpustakaan terbuka dan rujukan projek yang lain yang telah kami gunakan:", - "lokalize": "<0> Lokalize : Sistem terjemahan berbantuan komputer yang berfokus pada produktivitas dan jaminan kualitas serta menyediakan alur kerja pelokalan yang mulus.", - "quran-align": "<0> Collin Fair : Alat untuk menghasilkan segmentasi kata yang tepat dari rekaman bacaan Al-Qur'an.", - "quran-complex": "<0> QuranComplex : Kompleks Percetakan Al-Qur'an King Fahd adalah panutan dalam menyajikan Al-Qur'an dan Ilmu-ilmunya, menerjemahkan maknanya, dan menjaga Teks Al-Qur'an dari distorsi, melalui penggunaan teknologi canggih di bidang percetakan, rakaman audio, penerbitan elektronik dan aplikasi digital secara optimal.", - "quran-enc": "<0> QuranEnc : Sebuah portal yang menampilkan terjemahan gratis dan terpercaya dari makna dan tafsir Al-Qur'an yang mulia dalam banyak bahasa dunia.", - "tanzil": "<0> Tanzil : Sebuah proyek Al-Qur'an internasional yang bertujuan untuk menyediakan teks Al-Qur'an yang akurat dengan verifikasi yang sangat ketat.", - "title": "Penghargaan", - "vercel": "<0> Vercel : ialah platform penggunaan dan kerjasama untuk para Front-End Developer yang mengutamakan pembangunan Front-End Development , memberi mereka alat yang komprehensif untuk membina website dan aplikasi yang andal.", - "zekr": "<0> Zekr : Platform belajar Qur'an yang terbuka untuk menelusuri dan mengulangkaji al-Qur'an" - }, - "main-description": "Quran.com didirikan pada tahun 1995. Website ini bertujuan untuk memberikan kemudahan bagi siapa saja untuk membaca, mempelajari, dan memahami Al-Qur'an. Projek ini adalah sumber terbuka (open source project) dan merupakan kolaborasi antara anggota tim Inti dan <0> tim Tarteel ." + "desc": "Kami menyampaikan rasa terima kasih kepada semua pihak yang telah mendukung dan berkontribusi pada proyek ini, membantu menjadikan Al-Quran dapat diakses oleh jutaan orang di seluruh dunia.", + "lokalize": "<0>Lokalize: Sistem penerjemahan berbantuan komputer yang berfokus pada produktivitas dan jaminan kualitas serta menyediakan alur kerja pelokalan yang lancar.", + "quran-align": "<0>Collin Fair: Alat untuk menghasilkan segmentasi kata yang tepat dari rekaman bacaan Al-Qur'an.", + "quran-complex": "<0>QuranComplex: Kompleks Percetakan Al-Qur'an Agung Raja Fahd merupakan pelopor dalam penyajian Al-Qur'an Agung dan Ilmu Pengetahuannya, penerjemahan Maknanya, dan penjagaan Teks Al-Qur'an dari distorsi, melalui pemanfaatan teknologi canggih secara optimal di bidang percetakan, rekaman audio, penerbitan elektronik, dan aplikasi digital.", + "quran-enc": "<0>QuranEnc: Sebuah portal yang menyajikan terjemahan makna dan tafsir Al-Quran yang mulia dalam berbagai bahasa dunia secara gratis dan terpercaya.", + "tanzil": "<0>Tanzil: Sebuah proyek Al-Quran internasional yang bertujuan untuk menyediakan teks Al-Quran yang akurat dan terverifikasi.", + "tarteel": "<0>Tarteel: Aplikasi menghafal Al-Quran yang didukung AI. Aplikasi ini dirancang untuk membantu Anda menghafal dengan lebih cerdas, baik saat mencari ayat, melacak kemajuan, atau mengikuti bacaan Anda.", + "title": "Kredit", + "vercel": "<0>Vercel: adalah platform kolaborasi dan penerapan bagi pengembang frontend yang mengutamakan pengembang frontend, memberi mereka alat komprehensif untuk membangun situs web dan aplikasi berkinerja tinggi.", + "zekr": "<0>Zekr: Alat studi Al-Quran platform terbuka untuk menelusuri dan meneliti Al-Quran" + }, + "global-effort": { + "desc": "Jutaan orang dari seluruh dunia mengandalkan Quran.com sebagai sumber utama Al-Quran digital mereka. Baik mereka datang untuk membaca, merenung, menghafal, atau belajar, mereka memiliki tujuan yang sama: keinginan tulus untuk terhubung dengan firman Allah. \\n Seiring dengan pertumbuhan kami, kami tetap berkomitmen untuk memastikan bahwa Quran.com tetap menjadi tempat yang tepercaya, mudah diakses, dan dirancang dengan indah bagi siapa pun yang ingin terlibat dengan Al-Quran.", + "title": "Upaya Global" + }, + "key-features": { + "desc": "Quran.com dirancang untuk mendukung setiap tahap keterlibatan dengan Al-Quran—mulai dari membaca dan menghafal hingga belajar dan merenung. Fitur-fitur kami meliputi:", + "features": [ + "Antarmuka Al-Quran yang Mudah Digunakan– Pengalaman membaca yang bersih dan intuitif di perangkat apa pun.", + "Berbagai Terjemahan & Tafsir – Akses ke terjemahan dalam berbagai bahasa, beserta tafsir.", + "Bacaan Audio – Dengarkan bacaan berkualitas tinggi dari Qaris ternama dunia, dengan kemampuan mengikuti kata demi kata.", + "Pencarian & Navigasi Lanjutan – Temukan ayat-ayat secara instan berdasarkan topik atau kata kunci di seluruh Al-Quran.", + "Penanda dan Catatan Ayat – Menyimpan ayat dan menulis renungan pribadi untuk referensi nanti.", + "Integrasi QuranReflect – Berinteraksi dengan komunitas global melalui refleksi dan wawasan yang dibagikan oleh para cendekiawan dan individu.", + "Pelacakan Kemajuan Membaca dan Tujuan – Lacak tujuan harian dan riwayat membaca Anda", + "API untuk Pengembang – Akses gratis ke konten dan fitur untuk mendukung aplikasi Islam dan R&D.", + "Dan masih banyak lagi, Alhamdulillah." + ], + "title": "Fitur & Penawaran Utama" + }, + "main-description": "Sejak didirikan pada tahun 1995, Quran.com telah berkomitmen untuk menyediakan Al-Quran bagi semua orang dengan cara yang jelas, autentik, dan mudah dipahami. Setiap hari, jutaan orang di seluruh dunia beralih ke Quran.com untuk membaca, mendengarkan, mempelajari, dan merenungkan Al-Quran—baik mereka yang sudah lama belajar, sarjana, atau baru memulai perjalanan mereka.", + "our-mission": { + "desc": "Al-Quran dimaksudkan untuk dibaca, dipahami, dan direnungkan. Misi kami adalah menghilangkan hambatan untuk mengakses dan memberdayakan individu dan masyarakat dengan menyediakan pengalaman Al-Quran yang andal, dirancang dengan baik, dan sangat memperkaya. Kami bertujuan untuk menjadi sumber tepercaya bagi siapa pun yang ingin terlibat dengan Al-Quran, dipandu oleh prinsip-prinsip akurasi, kejelasan, dan ketulusan.", + "title": "Misi Kami" + }, + "who-we-are": { + "desc": "Quran.com adalah wakaf (dana abadi), yang didirikan sebagai amanah publik untuk memastikan bahwa Al-Quran tetap dapat diakses oleh semua orang, tanpa biaya dan tanpa kepentingan komersial. Situs ini dikelola oleh Quran.Foundation, sebuah organisasi nirlaba 501(c)(3), yang mendukung dan mengembangkan Quran.com sebagai bagian dari misinya untuk menyediakan sumber daya Al-Quran yang berkualitas tinggi dan autentik bagi dunia. Komitmen kami adalah untuk melayani Al-Quran dan para pembacanya dengan keunggulan, ketulusan, dan tanggung jawab.", + "title": "Siapakah Kami" + } } diff --git a/locales/id/apps.json b/locales/id/apps.json index 7df1d2346a..41b890fb9a 100644 --- a/locales/id/apps.json +++ b/locales/id/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Oleh developer inti Quran.com, hadir juga aplikasi mushaf iOS dan Android yang indah dan bebas iklan. Sekarang menjadi lebih mudah untuk membaca Al-Qur'an saat bepergian, menghafalnya dan mendengarkan qari favorit Anda.", - "tarteel-desc": "Tarteel adalah aplikasi Qur'an pertama yang menggunakan AI untuk berinteraksi dengan bacaan Anda dan menyoroti kesalahan. Sebagai pendamping-Qur'an-yang dipicu-suara dalam genggaman, Tarteel bekerja secara intuitif untuk membantu Anda membaca, melafalkan, menghafal dan memahami Qur'an dengan percaya diri! <0><0> Tarteel bangga menjadi pengembang inti Quran.com sekaligus anggota dewan tata kelola mereka." + "quran-desc": "Oleh developer inti Quran.com, hadir juga aplikasi mushaf iOS dan Android yang indah dan bebas iklan. Sekarang menjadi lebih mudah untuk membaca Al-Qur'an saat bepergian, menghafalnya dan mendengarkan qari favorit Anda." } diff --git a/locales/id/common.json b/locales/id/common.json index 4f07925c99..4c9db55514 100644 --- a/locales/id/common.json +++ b/locales/id/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigasi", "no-nav-results": "Tidak ada hasil navigasi", - "placeholder": "Apa yang ingin Anda baca?", - "powered-by": "Pencarian suara didukung oleh Tarteel.ai", + "placeholder": "Carilah di Al-Quran...", "recent-navigations": "Navigasi terbaru", "search-by-voice": "Cari dengan suara", "try-navigating": "Coba navigasikan ke" @@ -122,9 +121,11 @@ } }, "continue": "Melanjutkan", + "contribute-to-our-mission": "Berkontribusi pada misi kami", "copied": "disalin", "copied-to-clipboard": "Disalin ke papan klip", "copy": "Salinan", + "copylink": "Salin tautan", "counter": { "decrease": "Mengurangi", "increase": "Meningkatkan" @@ -134,6 +135,7 @@ "developers": "Pengembang", "display": "Tampilan", "donate": "Menyumbang", + "donate-now": "Donasi sekarang", "donate_monthly": "Donasi setiap bulan", "donate_once": "Donasi satu kali", "edit": "Sunting", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Jumlah ayat maksimum {{maxNumberOfVerses}} ayat", "ranges-wrong-order": "Bait pembuka harus sebelum bait penutup." }, + "errors": { + "account-banned": "Maaf, akun Anda diblokir. Hubungi Yayasan Quran", + "badRequest": "*Permintaan tidak valid", + "banned": "*Maaf, akun Anda diblokir. Hubungi Yayasan Quran", + "confirm": "*Konfirmasi kata sandi tidak cocok dengan kata sandi", + "email": "*Format Email Salah!", + "exactLength": "*Nilai harus memiliki panjang yang tepat", + "expiredToken": "*Token ini sudah kadaluarsa", + "forgot-password-failed": "Gagal mengirim email pengaturan ulang kata sandi. Silakan coba lagi.", + "immutable": "*Nilai ini tidak dapat diubah", + "invalid": "* {{fieldName}} ini tidak valid", + "invalidEmailOrPassword": "*Email atau kata sandi tidak valid", + "max": "* {{fieldName}} harus kurang dari atau sama dengan {{max}} digit", + "min": "* {{fieldName}} harus lebih dari atau sama dengan {{min}} digit", + "name": "* {{fieldName}} harus berupa huruf dan angka saja", + "notFound": "*Tidak ditemukan", + "required": "* {{fieldName}} hilang!", + "reset-password-failed": "Gagal mengatur ulang kata sandi. Silakan coba lagi.", + "signin-failed": "Gagal masuk. Silakan coba lagi.", + "signup-failed": "Pendaftaran gagal. Silakan coba lagi.", + "taken": "* {{fieldName}} sudah ada!", + "usedToken": "*Token ini sudah digunakan", + "username": "* {{fieldName}} hanya menerima garis bawah dan huruf", + "verification-code-invalid": "Kode verifikasi ini tidak valid", + "verification-code-length": "Kode verifikasi harus {{length}} digit", + "verification-failed": "Verifikasi gagal. Silakan coba lagi.", + "verification-resend-failed": "Gagal mengirim ulang kode verifikasi" + }, "exciting-updates": "Pembaruan Menarik", "feedback": "Beri Masukan", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Ukuran font terjemahan" }, "footer": { - "description": "Quran.com adalah Sadaqah Jariyah. Kami berharap setiap orang dapat membaca, mempelajari, dan memahami Al-Quran dengan lebih mudah. Al-Qur'an Mulia mempunyai banyak nama di antaranya Al-Qur'an Al-Karim, Al-Kitab, Al-Furqan, Al-Maw'itha, Al-Zikir, dan Al-Nur.", + "description": "Quran.com adalah platform tepercaya yang digunakan oleh jutaan orang di seluruh dunia untuk membaca, mencari, mendengarkan, dan merenungkan Al-Quran dalam berbagai bahasa. Platform ini menyediakan terjemahan, tafsir, bacaan, terjemahan kata demi kata, dan berbagai alat untuk mempelajari Al-Quran lebih dalam, sehingga Al-Quran dapat diakses oleh semua orang.

    Sebagai Sadaqah Jariyah, Quran.com didedikasikan untuk membantu orang-orang terhubung secara mendalam dengan Al-Quran. Didukung oleh Quran.Foundation, sebuah organisasi nirlaba 501(c)(3), Quran.com terus berkembang sebagai sumber informasi gratis dan berharga bagi semua orang, Alhamdulillah”", "hiring": "Kami sedang merekrut! Bergabunglah dengan tim QuranFoundation dan berkontribusi pada misi kami. Daftar sekarang! ", "rights": "Hak Cipta Terlindungi", - "title": "Baca, pelajari, dan pahami Al-Qur'an Mulia." + "title": "Baca, Dengarkan, Cari, dan Renungkan Al-Quran" }, "form": { "body": "Tubuh", "code": "Kode verifikasi", + "confirm-password": "Konfirmasi Kata Sandi", "email": "Email", "firstName": "Nama depan", "lastName": "Nama keluarga", - "title": "Judul" + "password": "Kata sandi", + "title": "Judul", + "username": "Nama belakang", + "verification-code": "Kode Verifikasi" }, "from": "Dari", + "fundraising-share-title": "Bagikan Penggalangan Dana Quran.com", "fundraising-sticky-banner": { "cta": "Menyumbang", "title": "Menyumbang di hari-hari terbaik!" @@ -217,6 +252,7 @@ "learn-more": "Pelajari lebih lanjut", "learning-plans": "Rencana Pembelajaran", "less": "Kurang", + "lessons": "Pelajaran", "loading": "Memuat", "login": "Login", "logout": "Logout", @@ -250,6 +286,7 @@ "off": "Mati", "oldest": "Paling Lama", "on": "Hidup", + "our-projects": "Proyek Kami", "page": "Halaman", "pages": "halaman-halaman", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} dari {{totalNumberOfResults}} hasil pencarian", @@ -272,6 +309,7 @@ "privacy": "Kerahasiaan", "product-updates": "Pengkinian Produk", "profile": "Profil", + "projects-desc": "Proyek nirlaba yang dimiliki, dikelola, atau disponsori oleh Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "Radio Qur'an", @@ -287,6 +325,7 @@ "reciters": "Qari", "reflect": "Mencerminkan", "reflections": "Refleksi", + "reflections-and-lessons": "Refleksi dan Pelajaran", "remove": "Keluarkan", "rename": "Ganti nama", "retry": "Coba Lagi", @@ -296,10 +335,12 @@ "save-to-collection": "Simpan ke Koleksi", "search-for": "Cari '{{searchQuery}}'", "search-results": "{{count}} hasil penelusuran", + "search-results-no-count": "Hasil Pencarian", "search": { "filters": "Filter", "hint": "Coba cari", "jump-to": "Langsung Ke", + "more-results": "Hasil lebih lanjut", "no-results": "Tidak ada hasil yang ditemukan", "no-results-suggestion": "Kami tidak dapat menemukan hasil pencarian yang cocok untuk \" {{searchQuery}} \". coba menggunakan kata kunci yang berbeda.", "popular": "Pencarian Populer", @@ -340,8 +381,10 @@ "search-juz": "Cari Juz", "search-page": "Cari Halaman", "search-surah": "Cari Surah", + "search-verse": "Pencarian Ayat", "try-navigating-with": "Tips: coba navigasi dengan" }, + "sign-in": "Masuk", "sitemap": "Peta situs", "sort": { "ascending": "menaik", @@ -362,10 +405,6 @@ "tafsirs-desc": "Baca berbagai Tafsir Ayat {{ayahNumber}} Surah {{SurahName}} oleh ulama Tafsir terpercaya", "title": "tafsir" }, - "tarteel": { - "app": "Aplikasi Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "syarat dan Ketentuan", "theme": "Tema", "themes": { @@ -400,13 +439,13 @@ "view": "Melihat", "voice": { "ask-permission": "Mohon izin mikrofon untuk mulai menggunakan Pencarian Suara", - "error": "Terjadi kesalahan, coba lagi nanti. Atau unduh", - "no-permission": "Sepertinya Anda tidak mengaktifkan izin menggunakan mikrofon. Harap aktifkan izin mikrofon dan coba lagi atau unduh", - "not-supported": "Sepertinya browser Anda tidak mendukung mikrofon. Silakan coba browser lain atau unduh", + "error": "Telah terjadi kesalahan, coba lagi nanti.", + "no-permission": "Sepertinya Anda tidak mengaktifkan izin mikrofon. Harap aktifkan izin mikrofon dan coba lagi.", + "not-supported": "Sepertinya browser Anda tidak mendukung mikrofon. Coba browser lain.", "suggest": "Baca ayatnya, maka ayat akan mulai muncul", "suggest-subtitle": "Baca ayat apa saja dalam bahasa Arab, dan ayat itu akan muncul", "suggest-title": "Baca sekarang", - "voice-search-powered-by": "Pencarian Suara dipersembahkan oleh" + "voice-search-powered-by": "Pencarian Suara Didukung oleh" }, "wbw": "Kata per kata", "wbw-lang-summary": "Sumber terjemahan kata per kata: {{source}} . Sumber ini tidak tergantung pada pemilihan terjemahan ayat.", diff --git a/locales/id/developers.json b/locales/id/developers.json index 3bc56ea0c8..9f702cdbed 100644 --- a/locales/id/developers.json +++ b/locales/id/developers.json @@ -15,6 +15,5 @@ "q-next": "<0> Quran.com Frontend - ditulis dalam Next.js.", "q-v2": "<0> Quran.com - ditulis di Ruby on Rails." }, - "sub-main-desc": "Kami adalah tim pengembang, desainer, manajer produk, dan pemikir yang bekerja di Quran.com secara sukarela. Alhamdulilah kami telah diberi peluang untuk bekerja di beberapa perusahaan besar di Silicon Valley, Toronto dan UEA - dan kami merasa bahwa ini adalah setidaknya yang dapat kami lakukan untuk membantu umat kami bergerak maju dalam belajar dan mempelajari agama mereka. Bekerja di Quran.com sangat memuaskan dan semoga Allah membalas kita semua (dan membalas Anda) atas usaha kita.", "thanks": "Terima kasih sudah membaca! selanjutnya berharap untuk melihat Anda melakukan beberapa kode!" } diff --git a/locales/id/home.json b/locales/id/home.json index f83eacfaf1..9cbbc0cc78 100644 --- a/locales/id/home.json +++ b/locales/id/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Capailah Tujuan Anda dalam Membaca Al Quran", + "begin": "Mulai", + "chapters-and-verses": "Bab dan Ayat", + "continue-read": "Lanjutkan Membaca", + "explore-topics": "Jelajahi Topik", + "first-time-reading": "Baru mengenal Al-Quran? Mulai di sini ", + "know-someone": "Berkembang bersama kami Ramadhan ini", + "learning-plan": "Rencana Pembelajaran", + "listen-to-radio": "Dengarkan Radio Al-Quran", + "my-quran": "Al Quran saya", + "navigate-quran": "Navigasi Al-Quran", "no-bookmarks": "Anda belum memiliki penanda apa pun", "no-recently-read": "Anda belum memiliki sesi membaca apa pun", "noble-quran": "Al-Qur'an yang mulia", + "popular": "Populer", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Perjalanan Kemajuan ber-Qur'an" }, - "ramadan-activities-cta": " Ikuti Kalender Al-Quran Global <\/b> untuk bacaan mingguan, podcast yang menginspirasi, dan ajakan untuk berefleksi! <\/link>", + "qr-community": "Baca Ayat dan Renungan Pilihan Hari Ini", + "ramadan-activities-cta": " Ikuti Kalender Al-Quran Global untuk bacaan mingguan, podcast yang menginspirasi, dan ajakan untuk berefleksi! ", + "ramadan": { + "header": "Alat untuk Memperdalam Hubungan Anda dengan Al-Quran", + "title": "Siap untuk Ramadan?" + }, "read-juz": "Baca Juz", "recently-read": "Baru-baru ini dibaca", - "revelation-order-disclaimer": "Tampilan ini menunjukkan urutan kronologis Surah-Surah dalam Al-Qur'an berdasarkan waktu turunnya kepada Nabi Muhammad ﷺ <\/hover>. Kronologi ini merupakan bahasan pendapat ilmiah dan beberapa Surah diturunkan dalam beberapa bagian pada waktu-waktu yang berbeda. Urutan di sini didasarkan pada karya Tanzil.net <\/link> . [Catatan: urutan Mushaf yang disusun dari al-Fatihah hingga al-Nas adalah sebuah kesepakatan.]", + "revelation-order-disclaimer": "Tampilan ini menunjukkan urutan kronologis Surah-Surah dalam Al-Qur'an berdasarkan waktu turunnya kepada Nabi Muhammad . Kronologi ini merupakan bahasan pendapat ilmiah dan beberapa Surah diturunkan dalam beberapa bagian pada waktu-waktu yang berbeda. Urutan di sini didasarkan pada karya Tanzil.net . [Catatan: urutan Mushaf yang disusun dari al-Fatihah hingga al-Nas adalah sebuah kesepakatan.]", + "see-more-learning-plans": "Lihat Lebih Banyak", + "set-custom-goal": "Tetapkan Tujuan", + "share-quran": { + "description": "Bantu sebarkan Al Quran ke pelajar baru", + "title": "Bagikan Al-Quran!" + }, + "start-read": "Mulai Membaca", + "stay-consistent": "Lacak Rekor, Buat Sasaran Khusus, Tetap Konsisten", "tab": { "bookmarks": "Penanda", "popular": "Populer" diff --git a/locales/id/learn.json b/locales/id/learn.json index 2ed2a7548f..4cc4987688 100644 --- a/locales/id/learn.json +++ b/locales/id/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Terima kasih atas masukan Anda!", "your-feedback": "Masukan Anda" }, + "help-about-reflection": "Bantuan tentang fitur refleksi", "learn-duration": "Durasi", + "learn-more": "Pelajari lebih lanjut", "learning-plan-material": "Materi Rencana Pembelajaran", "learning-plan-meta-desc": "Rencana Pembelajaran ini akan membantu mengubah cara Anda berinteraksi dengan Al-Qur'an, mulailah perjalanan Anda hari ini!", "learning-plans-desc": "Tingkatkan pengetahuan Anda dengan pelajaran yang mudah diikuti yang membuat Anda terus berkembang dalam perjalanan Anda dengan Al-Qur'an.

    Mulai Rencana Pembelajaran hari ini! Kemajuan Anda dilacak hingga Anda mencapai garis finis.", @@ -34,9 +36,12 @@ "next-lesson": "Pelajaran Berikutnya", "not-enrolled": "Anda belum terdaftar dalam Rencana Pembelajaran .", "prev-lesson": "Pelajaran Sebelumnya", + "reflection-description-1": "Dengan mengeklik \"Tambahkan Refleksi\", Anda akan diarahkan ke QuranReflect, sebuah platform untuk berbagi refleksi pribadi tentang Al-Quran. Tidak seperti Tafsir (interpretasi ilmiah), refleksi adalah wawasan dan pengalaman pribadi yang terkait dengan ayat-ayat tersebut.", + "reflection-description-2": "Jika Anda memposting secara publik, refleksi Anda akan ditinjau oleh tim moderator dan menjadi terlihat oleh komunitas QuranReflect.", "start-learning": "Mulai Belajar", "tabs": { "main": "Detail Utama", "syllabus": "Silabus" - } + }, + "what-happens-when-you-click-add-reflection": "Apa yang terjadi ketika Anda mengeklik \"Tambahkan Refleksi\"?" } diff --git a/locales/id/login.json b/locales/id/login.json index 6e9919ba1c..9437bf5a33 100644 --- a/locales/id/login.json +++ b/locales/id/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Menunggu konfirmasi", + "back": "Kembali", + "back-to-login": "Kembali ke Login", + "check-email-title": "Periksa email untuk menyelesaikan pendaftaran", + "confirm": "Mengonfirmasi", + "confirm-new-password-placeholder": "Konfirmasi kata sandi baru", + "confirm-password-placeholder": "Konfirmasi kata sandi", + "continue": "Melanjutkan", "continue-apple": "Lanjutkan dengan Apple", "continue-email": "Lanjutkan dengan Email", "continue-facebook": "Lanjutkan dengan Facebook", "continue-google": "Lanjutkan dengan Google", "email-placeholder": "Alamat email", + "error": { + "email-required": "Email tidak ditemukan!", + "invalid-credentials": "Email atau kata sandi tidak valid", + "invalid-email": "Format Email Salah!", + "login-failed": "Gagal masuk. Silakan coba lagi.", + "password-required": "Kata sandi hilang!" + }, + "errors": { + "account-banned": "Maaf, akun Anda diblokir. Hubungi Yayasan Quran", + "badRequest": "*Permintaan tidak valid", + "banned": "*Maaf, akun Anda diblokir. Hubungi Yayasan Quran", + "confirm": "*Konfirmasi kata sandi tidak cocok dengan kata sandi", + "email": "*Format Email Salah!", + "exactLength": "*Nilai harus memiliki panjang yang tepat", + "expiredToken": "*Token ini sudah kadaluarsa", + "forgot-password-failed": "Gagal mengirim email pengaturan ulang kata sandi. Silakan coba lagi.", + "immutable": "*Nilai ini tidak dapat diubah", + "invalid": "* {{fieldName}} ini tidak valid", + "invalidEmailOrPassword": "*Email atau kata sandi tidak valid", + "max": "* {{fieldName}} harus kurang dari atau sama dengan {{max}} digit", + "min": "* {{fieldName}} harus lebih dari atau sama dengan {{min}} digit", + "name": "* {{fieldName}} harus berupa huruf dan angka saja", + "notFound": "*Tidak ditemukan", + "required": "* {{fieldName}} hilang!", + "reset-password-failed": "Gagal mengatur ulang kata sandi. Silakan coba lagi.", + "signin-failed": "Gagal masuk. Silakan coba lagi.", + "signup-failed": "Pendaftaran gagal. Silakan coba lagi.", + "taken": "* {{fieldName}} sudah ada!", + "usedToken": "*Token ini sudah digunakan", + "username": "* {{fieldName}} hanya menerima garis bawah dan huruf", + "verification-code-invalid": "Kode verifikasi ini tidak valid", + "verification-code-length": "Kode verifikasi harus {{length}} digit", + "verification-failed": "Verifikasi gagal. Silakan coba lagi.", + "verification-resend-failed": "Gagal mengirim ulang kode verifikasi" + }, "feature-1": "Lacak sasaran Anda", "feature-2": "Pertahankan pencapaian bacaan", "feature-3": "Buat koleksi", "feature-4": "Sinkronkan data Anda di semua browser", "feature-5": "Dan banyak lagi!", "feature-6": " Baru! Catatan & Refleksi", + "first-name-placeholder": "Nama depan", + "forgot-password": "Lupa kata sandi", + "forgot-password-description": "Masukkan alamat email Anda dan kami akan mengirimkan petunjuk untuk mengatur ulang kata sandi Anda.", + "forgot-password-success": "Email pengaturan ulang kata sandi telah terkirim! Silakan periksa kotak masuk Anda.", + "forgot-password-title": "Lupa kata sandi?", + "last-name-placeholder": "Nama Belakang", "login-cta": "Masuk atau Daftar sekarang:", "login-error": { "AuthenticationError": "Otentikasi gagal. Silakan coba lagi nanti", + "BannedUserError": "Maaf, akun Anda diblokir. Hubungi Quran.Foundation.", "TokenExpiredError": "Anda telah logout, silakan login kembali." }, "login-title": "Login ke Quran.com", + "new-password-placeholder": "Kata sandi baru", "other-options": "Pilihan Login yang Lain", + "password-placeholder": "Kata sandi", + "password-reset-success": "Reset kata sandi berhasil!", + "password-rules": { + "lowercase": "Setidaknya satu huruf kecil", + "max-length": "Maksimal 20 karakter", + "min-length": "Min 8 karakter", + "number": "Setidaknya satu nomor", + "special": "Setidaknya satu karakter khusus (!@#$%^&*_-)", + "uppercase": "Setidaknya satu huruf kapital" + }, "privacy-policy": "Melindungi privasi Anda adalah prioritas kami – Dengan mendaftar, Anda menyetujui Kebijakan Privasi dan Syarat dan Ketentuan kami.", - "verify-code": "Verifikasi bahwa kode keamanan yang diberikan cocok dengan teks berikut:" + "quran-text": "Al Quran", + "quran-title": "Quran.com", + "reflect-feature-1": "Renungkan Al Quran", + "reflect-feature-2": "Bergabung dengan Grup", + "reflect-feature-3": "Berinteraksi dengan orang lain", + "reflect-feature-4": "Dan masih banyak lagi!", + "reset-password": "Setel Ulang Kata Sandi", + "reset-password-success": "Reset kata sandi berhasil!", + "set-new-password": "Tetapkan kata sandi baru", + "sign-in": "Masuk", + "sign-in-or-sign-up": "Masuk atau Daftar", + "sign-up": "Mendaftar", + "unified-registration-1": "Pendaftaran terpadu ", + "unified-registration-2": "Yayasan Al Quran", + "unified-registration-3": "Anda akan memiliki akses ke situs web berikut ", + "unified-registration-4": "melalui rincian masuk Anda.", + "username-placeholder": "Nama belakang", + "verification-code-instruction": "Silakan masukkan kode yang diberikan dalam email untuk menyelesaikan pendaftaran", + "verification-code-resend": "Kirim ulang email", + "verification-code-resend-countdown": "Kirim ulang email verifikasi dalam {{seconds}} detik...", + "verification-code-sent": "Kode verifikasi telah terkirim!", + "verification-code-sent-to": "Kami baru saja mengirim email ke", + "verification-code-spam-note": "Tidak menerima email? Periksa folder spam Anda", + "verify-code": "Verifikasi bahwa kode keamanan yang diberikan cocok dengan teks berikut:", + "welcome-description-1": "Pendaftaran terpadu", + "welcome-description-2": ".Dasar", + "welcome-description-3": "Anda akan memiliki akses ke situs web berikut melalui rincian masuk Anda.", + "welcome-title": "Selamat Datang di" } diff --git a/locales/id/onboarding.json b/locales/id/onboarding.json index 92ba54315e..94e0e4088d 100644 --- a/locales/id/onboarding.json +++ b/locales/id/onboarding.json @@ -87,10 +87,6 @@ "description": "Pilih dari beragam terjemahan dalam berbagai bahasa. Tip: Bandingkan terjemahan dengan memilih beberapa opsi", "title": "Terjemahan" }, - "voice-search": { - "description": "Ketuk ikon mikrofon dan ucapkan ayat yang Anda cari. Tip Singkat! Untuk mengetahui ayat apa yang sedang dibaca seseorang (misalnya saat sholat Tarawih), ketuk ikon mikrofon. Setelah satu atau dua ayat terdeteksi, tekan stop untuk mencari lokasi ayatnya", - "title": "Pencarian Suara (Tarteel)" - }, "wbw-audio": { "description": "Pilih opsi ini untuk mendengarkan setiap kata satu per satu hanya dengan mengklik kata tersebut!", "title": "Dengarkan transliterasi kata per kata dengan mengklik kata" diff --git a/locales/id/question.json b/locales/id/question.json index 707aff67d8..cfe6db5afd 100644 --- a/locales/id/question.json +++ b/locales/id/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Pertanyaan dan Jawaban terkait ", - "question": "Pertanyaan" + "question": "Pertanyaan", + "questions-meta-desc": "Jelajahi jawaban tepercaya untuk memperdalam pemahaman Anda tentang Al-Quran." } diff --git a/locales/id/quick-links.json b/locales/id/quick-links.json index ae3ff8c913..8086744b27 100644 --- a/locales/id/quick-links.json +++ b/locales/id/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "Tentang Al-Qur'an", "ayat-ul-kursi": "Ayat Kursi", + "jesus-in-quran": "Yesus dalam Al Quran", "kahf": "Surah Al Kahfi", "mulk": "Surah Al Mulk", "muzzammil": "Surah Al Muzzammil", @@ -8,5 +9,6 @@ "rahman": "Surah Ar-Rahman", "sunnah": "Ayat tentang Sunnah", "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Apa itu Ramadan?", "yaseen": "Surah Yasin" } diff --git a/locales/id/quran-reader.json b/locales/id/quran-reader.json index 18141d1077..feb0d5185e 100644 --- a/locales/id/quran-reader.json +++ b/locales/id/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Awal Hizb", "include-translator": "Sertakan nama penterjemah?", "juz-beginning": "Awal Juz", + "lessons-desc": "Baca dan bagikan pelajaran Al-Quran dari Ayah {{ayahNumber}} dari Surah {{surahName}}", + "lessons-disclaimer": "Pelajaran-pelajaran ini merupakan wawasan dan interpretasi pribadi terhadap Al-Quran. Pelajaran-pelajaran ini tidak dimaksudkan untuk dianggap sebagai sumber yang sah.", + "lessons-not-available": "Tidak ada pelajaran yang diulas untuk ayat ini", "mad-2": "Maad 2 detik", "mad-2-4-6": "Diperbolehkan Maad 2 atau 4 atau 6 detik", "mad-4-5": "Diperlukan Maad 4 atau 5 detik", diff --git a/locales/id/radio.json b/locales/id/radio.json index 730da28b6a..6e9bf26c07 100644 --- a/locales/id/radio.json +++ b/locales/id/radio.json @@ -22,5 +22,6 @@ "pause-radio": "Hentikan Radio", "play-radio": "Putar Radio", "radio-desc": "Dengarkan bacaan indah Al-Qur'an oleh berbagai qari tanpa berhenti.", - "reciter-stations": "Saluran Qari" + "reciter-stations": "Saluran Qari", + "station": "Stasiun" } diff --git a/locales/id/reading-goal.json b/locales/id/reading-goal.json index dbaf8123da..7e4683ff3f 100644 --- a/locales/id/reading-goal.json +++ b/locales/id/reading-goal.json @@ -7,6 +7,7 @@ "create-plan": "Buat rencana", "create-reading-goal": "Buat Sasaran", "daily-progress": "Kemajuan Harian", + "daily-progress-completed": "Selesai! 🎉", "daily": { "description": "Sasaran Anda akan disetel ulang setiap hari", "title": "Sasaran harian" @@ -40,6 +41,7 @@ "description": "Apakah sasaran Anda akan diatur ulang setiap hari atau setiap beberapa hari? Jangan khawatir, kami akan melacak kemajuan Anda terlepas dari frekuensi yang Anda pilih.", "title": "Pilih frekuensi untuk sasaran Anda" }, + "goal-completed": "Sasaran tercapai! 🎉 ", "goal-done": { "description": "Bacaan tambahan apa pun akan tetap direkam", "title": "Anda mencapai sasaran hari ini" @@ -81,12 +83,16 @@ "time-goal": "baca Al-Qur'an {{time}}" }, "reading-goal": "Sasaran Membaca", + "reading-goal-description": "Apakah Anda merasa sulit untuk tetap konsisten dengan tujuan membaca Al-Quran Anda?

    Quran Growth Journey adalah fitur dinamis yang dikembangkan untuk membantu Anda tetap konsisten dalam perjalanan Anda dengan Al-Quran. Apakah Anda ingin membaca 10 menit sehari, menyelesaikan satu Juz dalam sebulan, atau menyelesaikan seluruh Al-Quran dalam setahun, dsb., Quran.com kini dapat membantu Anda menetapkan tujuan khusus dan melacak laju bacaan harian Anda, sambil menyesuaikannya saat Anda membuat kemajuan. Aplikasi ini sepenuhnya gratis untuk digunakan dan kami harap ini akan membantu Anda tetap termotivasi untuk mencapai tujuan Anda!", "reading-goal-label": "Anda berada di", + "reading-goal-title": "Memperkenalkan Perjalanan Pertumbuhan Al-Quran", "recommended": "Direkomendasikan", "remaining": "Sisa untuk hari ini", + "remaining-base": "Tersisa", "remaining-days": { "other": "{{days}} hari tersisa" }, + "set-a-new-goal": "Tetapkan Tujuan baru", "set-reading-goal-success": "Sasaran membaca Anda berhasil ditetapkan.", "start-journey": "Awali perjalanan Anda!", "start-reading": "Mulai Membaca", diff --git a/locales/id/support.json b/locales/id/support.json index d5b9a5e830..3df8a31854 100644 --- a/locales/id/support.json +++ b/locales/id/support.json @@ -7,11 +7,9 @@ "donate-q": "Bagaimana saya bisa berdonasi?", "download-a": "Sayangnya tidak ada. Kami belum menyediakan penggunaan untuk mengunduh situs web kami atau Quran ke komputer Anda. Namun, Anda dapat mengunduh aplikasi seluler kami untuk membaca offline.", "download-q": "Bisakah saya mengunduh Quran.com ke komputer saya?", - "fiqh-a": "Quran.com adalah alat membaca, mendengarkan, dan belajar online. Tim di belakang Quran.com terdiri dari insinyur perangkat lunak, perancang, dan manajer produk. Sayangnya, itu adalah keterbatasan keahlian kami, kami tidak memiliki ulama, imam atau syekh sebagai bagian dari tim untuk membantu dengan pertanyaan-pertanyaan terkait Islam, Fiqh atau Fatwa. Kami mencoba menahan diri untuk tidak menjawab pertanyaan-pertanyaan tersebut dan menyarankan Anda untuk berbicara dengan imam lokal Anda di masjid atau kepada seorang syekh.", - "fiqh-q": "Pertanyaan terkait Islam / Fiqh / Fatwa", "header": "Bantuan dan maklum balik anda", "main-desc": "Silakan periksa FAQ untuk melihat apakah pertanyaan Anda sudah dijawab. Jika perlu, Anda bisa <0> menghubungi kami & kami akan melakukan yang terbaik untuk menghubungi Anda sepantas mungkin, tetapi agar Anda tahu bahwa kami adalah tim kecil, jadi harap dapat bersabar.", - "mobile-a": "Ya! Sila kunjungi <0> halaman aplikasi digital kami untuk info lebih lanjut.", + "mobile-a": "Ya! Silakan kunjungi <0>Quran untuk Android atau <1>Quran iOS untuk mengunduh Aplikasi", "mobile-q": "Apakah Quran.com memiliki aplikasi seluler?", "other-languages-a": "Untuk mengubah bahasa pilihan Anda, ada drop-down-menu di sudut kanan atas pada setiap halaman (pojok kiri atas pada bahasa kanan-ke-kiri). Gunakan tarik-turun ini untuk memilih bahasa pilihan anda.", "other-languages-q": "Dapatkah saya menelusuri situs dalam bahasa lain?", diff --git a/locales/it/about.json b/locales/it/about.json index cd4ac711df..da76525e58 100644 --- a/locales/it/about.json +++ b/locales/it/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Questo progetto non sarebbe stato possibile senza le numerose librerie e progetti open source che abbiamo utilizzato:", - "lokalize": "<0> Lokalize <\/0> : un sistema di traduzione assistita da computer che si concentra sulla produttività e sul controllo della qualità e fornisce un flusso di lavoro di localizzazione senza interruzioni.", - "quran-align": "<0> Collin Fair <\/0> : Uno strumento per produrre una segmentazione precisa delle parole della recitazione coranica registrata.", - "quran-complex": "<0> QuranComplex <\/0> : King Fahd Glorious Qur'an Printing Complex è leader nel servire il glorioso Corano e le sue scienze, traducendo i suoi significati e salvaguardando il testo coranico dalla distorsione, attraverso l'uso ottimale di tecnologie avanzate nel campo della stampa, delle registrazioni audio, dell'editoria elettronica e delle applicazioni digitali.", - "quran-enc": "<0> QuranEnc <\/0> : Un portale con traduzioni gratuite e affidabili dei significati e delle esegesi del nobile Corano in molte lingue del mondo.", - "tanzil": "<0> Tanzil <\/0> : Un progetto coranico internazionale volto a fornire un testo coranico preciso e altamente verificato.", - "title": "Titoli di coda", - "vercel": "<0> Vercel <\/0> : è una piattaforma di distribuzione e collaborazione per sviluppatori frontend che mette al primo posto lo sviluppatore frontend, fornendo loro strumenti completi per creare siti Web e applicazioni ad alte prestazioni.", - "zekr": "<0> Zekr <\/0> : Uno strumento di studio del Corano a piattaforma aperta per la navigazione e la ricerca sul Corano" - }, - "main-description": "Quran.com è stato fondato nel 1995. Il sito web mira a rendere facile per chiunque leggere, studiare e imparare il Corano. Il progetto è open source ed è costruito come una collaborazione tra i membri del core team e il <0> team Tarteel <\/0> ." -} \ No newline at end of file + "credits": { + "desc": "Esprimiamo la nostra gratitudine a tutti coloro che hanno sostenuto e contribuito a questo progetto, contribuendo a rendere il Corano accessibile a milioni di persone in tutto il mondo.", + "lokalize": "<0>Lokalize: un sistema di traduzione assistita da computer che si concentra sulla produttività e sulla garanzia della qualità e fornisce un flusso di lavoro di localizzazione fluido.", + "quran-align": "<0>Collin Fair: Uno strumento per produrre una segmentazione precisa delle parole della recitazione coranica registrata.", + "quran-complex": "<0>QuranComplex: King Fahd Glorious Qur'an Printing Complex è leader nel servire il Glorioso Corano e le sue scienze, traducendone i significati e salvaguardando il testo coranico dalla distorsione, attraverso l'uso ottimale di tecnologie avanzate nel campo della stampa, delle registrazioni audio, dell'editoria elettronica e delle applicazioni digitali.", + "quran-enc": "<0>QuranEnc: Un portale che offre traduzioni gratuite e affidabili dei significati e delle esegesi del nobile Corano in molte lingue del mondo.", + "tanzil": "<0>Tanzil: un progetto coranico internazionale che mira a fornire un testo coranico preciso e altamente verificato.", + "tarteel": "<0>Tarteel: un'app di memorizzazione del Corano basata sull'intelligenza artificiale. È progettata per aiutarti a memorizzare in modo più intelligente, sia che tu stia cercando un versetto, monitorando i tuoi progressi o seguendo la tua recitazione.", + "title": "Crediti", + "vercel": "<0>Vercel: è una piattaforma di distribuzione e collaborazione per sviluppatori frontend che mette al primo posto gli sviluppatori frontend, offrendo loro strumenti completi per creare siti web e applicazioni ad alte prestazioni.", + "zekr": "<0>Zekr: uno strumento di studio del Corano a piattaforma aperta per la navigazione e la ricerca sul Corano" + }, + "global-effort": { + "desc": "Milioni di persone da tutto il mondo si affidano a Quran.com come principale risorsa digitale del Corano. Che vengano per recitare, riflettere, memorizzare o studiare, condividono uno scopo comune: un sincero desiderio di entrare in contatto con le parole di Allah. \\n Mentre continuiamo a crescere, rimaniamo impegnati a garantire che Quran.com rimanga uno spazio affidabile, accessibile e splendidamente progettato per chiunque cerchi di interagire con il Corano.", + "title": "Uno sforzo globale" + }, + "key-features": { + "desc": "Quran.com è progettato per supportare ogni fase dell'impegno con il Corano, dalla lettura e memorizzazione allo studio e alla riflessione. Le nostre funzionalità includono:", + "features": [ + "Interfaccia del Corano intuitiva: un'esperienza di lettura pulita e intuitiva su qualsiasi dispositivo.", + "Traduzioni multiple e Tafsir: accesso alle traduzioni in più lingue, insieme al tafsir.", + "Recitazioni audio: ascolta le recitazioni di alta qualità dei Qaris di fama mondiale, con la possibilità di seguire parola per parola.", + "Ricerca e navigazione avanzate: trova istantaneamente i versetti per argomento o parole chiave nell'intero Corano.", + "Segnalibri e note del versetto: salva i versetti e scrivi riflessioni personali per consultarli in seguito.", + "Integrazione di QuranReflect: interagisci con una comunità globale attraverso riflessioni e approfondimenti condivisi da studiosi e singoli individui.", + "Monitoraggio dei progressi e degli obiettivi di lettura: tieni traccia dei tuoi obiettivi giornalieri e della cronologia di lettura", + "API per sviluppatori: accesso gratuito a contenuti e funzionalità per potenziare app islamiche e ricerca e sviluppo.", + "E molto altro ancora, Alhamdullilah." + ], + "title": "Caratteristiche principali e offerte" + }, + "main-description": "Sin dalla sua fondazione nel 1995, Quran.com si è impegnata a rendere il Corano disponibile a tutti in un modo che sia chiaro, autentico e facile da usare. Ogni giorno, milioni di persone in tutto il mondo si rivolgono a Quran.com per leggere, ascoltare, studiare e riflettere sul Corano, che siano studenti da tutta la vita, studiosi o che abbiano appena iniziato il loro viaggio.", + "our-mission": { + "desc": "Il Corano è pensato per essere letto, compreso e riflettuto. La nostra missione è quella di rimuovere le barriere all'accesso e di dare potere a individui e comunità offrendo un'esperienza coranica affidabile, ben progettata e profondamente arricchente. Vogliamo essere una fonte affidabile per chiunque cerchi di impegnarsi con il Corano, guidati dai principi di accuratezza, chiarezza e sincerità.", + "title": "La nostra missione" + }, + "who-we-are": { + "desc": "Quran.com è un waqf (fondo di dotazione), istituito come trust pubblico per garantire che il Corano resti accessibile a tutti, gratuitamente e senza interessi commerciali. È gestito da Quran.Foundation, un'organizzazione non-profit 501(c)(3), che sostiene e sviluppa Quran.com come parte della sua missione di fornire risorse coraniche autentiche e di alta qualità al mondo. Il nostro impegno è quello di servire il Corano e i suoi lettori con eccellenza, sincerità e responsabilità.", + "title": "Chi siamo" + } +} diff --git a/locales/it/apps.json b/locales/it/apps.json index f84d4a8185..841d6f1c2e 100644 --- a/locales/it/apps.json +++ b/locales/it/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Dai principali sviluppatori di Quran.com, arriva la bella e senza pubblicità mushaf app iOS e Android. Ora è più facile leggere il Corano in movimento, memorizzarlo e ascoltare i tuoi recitatori preferiti.", - "tarteel-desc": "Tarteel è la prima app del Corano a utilizzare gli strumenti di intelligenza artificiale per interagire con la tua recitazione ed evidenziare gli errori. Un compagno del Corano guidato dalla voce nel palmo delle tue mani, Tarteel funziona in modo intuitivo per aiutarti a leggere, recitare, memorizzare e comprendere il Corano con sicurezza! <0><\/0><0><\/0> Tarteel è orgogliosa di essere uno sviluppatore principale di Quran.com e un membro del loro consiglio di amministrazione." -} \ No newline at end of file + "quran-desc": "Dai principali sviluppatori di Quran.com, arriva la bella e senza pubblicità mushaf app iOS e Android. Ora è più facile leggere il Corano in movimento, memorizzarlo e ascoltare i tuoi recitatori preferiti." +} diff --git a/locales/it/common.json b/locales/it/common.json index 40cea39725..bd2f65c763 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigazioni", "no-nav-results": "Nessun risultato di navigazione", - "placeholder": "Cosa vuoi leggere?", - "powered-by": "Ricerca vocale fornita da Tarteel.ai", + "placeholder": "Cerca nel Corano...", "recent-navigations": "Navigazioni recenti", "search-by-voice": "Ricerca vocale", "try-navigating": "Prova a navigare in" @@ -122,9 +121,11 @@ } }, "continue": "Continua", + "contribute-to-our-mission": "Contribuisci alla nostra missione", "copied": "copiato", "copied-to-clipboard": "Copiato negli appunti", "copy": "copia", + "copylink": "Copia il collegamento", "counter": { "decrease": "Diminuire", "increase": "Aumento" @@ -134,6 +135,7 @@ "developers": "Sviluppatori", "display": "Schermo", "donate": "Donare", + "donate-now": "Dona ora", "donate_monthly": "Dona mensilmente", "donate_once": "Dona una volta", "edit": "Modificare", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} versetti", "ranges-wrong-order": "Il verso iniziale deve precedere quello finale." }, + "errors": { + "account-banned": "Spiacenti, il tuo account è stato bannato. Contatta Quran.Foundation", + "badRequest": "*Richiesta non valida", + "banned": "*Spiacenti, il tuo account è stato bannato. Contatta Quran.Foundation", + "confirm": "*La password di conferma non corrisponde alla password", + "email": "*Formato email non valido!", + "exactLength": "*Il valore deve essere della lunghezza esatta", + "expiredToken": "*Questo token è scaduto", + "forgot-password-failed": "Impossibile inviare l'email di reimpostazione della password. Riprova.", + "immutable": "*Questo valore non può essere modificato", + "invalid": "*Questo {{fieldName}} non è valido", + "invalidEmailOrPassword": "*Email o password non valide", + "max": "* {{fieldName}} deve essere minore o uguale a {{max}} cifre", + "min": "* {{fieldName}} deve essere maggiore o uguale a {{min}} cifre", + "name": "* {{fieldName}} deve contenere solo lettere e numeri", + "notFound": "*Non trovato", + "required": "* {{fieldName}} mancante!", + "reset-password-failed": "Impossibile reimpostare la password. Riprova.", + "signin-failed": "Accesso non riuscito. Riprova.", + "signup-failed": "Registrazione non riuscita. Riprova.", + "taken": "* {{fieldName}} esiste già!", + "usedToken": "*Questo token è già stato utilizzato", + "username": "* {{fieldName}} accetta solo caratteri di sottolineatura e lettere", + "verification-code-invalid": "Questo codice di verifica non è valido", + "verification-code-length": "Il codice di verifica deve essere di {{length}} cifre", + "verification-failed": "Verifica non riuscita. Riprova.", + "verification-resend-failed": "Impossibile inviare nuovamente il codice di verifica" + }, "exciting-updates": "Aggiornamenti entusiasmanti", "feedback": "Feedback", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Dimensione del carattere della traduzione" }, "footer": { - "description": "Quran.com è un Sadaqah Jariyah. Speriamo di rendere facile per tutti la lettura, lo studio e l'apprendimento del Nobile Corano. Il Nobile Corano ha molti nomi tra cui Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr e Al-Noor.", + "description": "Quran.com è una piattaforma affidabile utilizzata da milioni di persone in tutto il mondo per leggere, cercare, ascoltare e riflettere sul Corano in più lingue. Fornisce traduzioni, tafsir, recitazioni, traduzione parola per parola e strumenti per uno studio più approfondito, rendendo il Corano accessibile a tutti.

    In quanto Sadaqah Jariyah, Quran.com si dedica ad aiutare le persone a connettersi profondamente con il Corano. Supportato da Quran.Foundation, un'organizzazione non-profit 501(c)(3), Quran.com continua a crescere come una risorsa gratuita e preziosa per tutti, Alhamdullilah”", "hiring": "Stiamo assumendo! Unisciti al team della QuranFoundation e contribuisci alla nostra missione. Candidati ora! ", "rights": "Tutti i diritti riservati", - "title": "Leggi, studia e impara Il Nobile Corano." + "title": "Leggi, ascolta, cerca e rifletti sul Corano" }, "form": { "body": "Corpo", "code": "Codice di verifica", + "confirm-password": "Conferma password", "email": "E-mail", "firstName": "Nome di battesimo", "lastName": "Cognome", - "title": "Titolo" + "password": "Password", + "title": "Titolo", + "username": "Nome utente", + "verification-code": "Codice di verifica" }, "from": "A partire dal", + "fundraising-share-title": "Condividi la raccolta fondi di Quran.com", "fundraising-sticky-banner": { "cta": "Donare", "title": "Regala nei giorni migliori!" @@ -217,6 +252,7 @@ "learn-more": "Scopri di più", "learning-plans": "Piani di apprendimento", "less": "Meno", + "lessons": "Lezioni", "loading": "Caricamento in corso", "login": "Login", "logout": "Disconnettersi", @@ -250,6 +286,7 @@ "off": "Spento", "oldest": "Il più antico", "on": "Sopra", + "our-projects": "I nostri progetti", "page": "Pagina", "pages": "Pagine", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} di {{totalNumberOfResults}} risultati di ricerca", @@ -272,6 +309,7 @@ "privacy": "Privacy", "product-updates": "Aggiornamenti del prodotto", "profile": "Profilo", + "projects-desc": "Progetti senza scopo di lucro posseduti, gestiti o sponsorizzati da Quran.Foundation", "q-reflect": "CoranoRiflesso", "quran-com": "Corano.com", "quran-radio": "Radio del Corano", @@ -287,6 +325,7 @@ "reciters": "Recitatori", "reflect": "Riflettere", "reflections": "Riflessi", + "reflections-and-lessons": "Riflessioni e lezioni", "remove": "Rimuovere", "rename": "Rinominare", "retry": "Riprova", @@ -296,10 +335,12 @@ "save-to-collection": "Salva nella raccolta", "search-for": "Cerca '{{searchQuery}}'", "search-results": "{{count}} risultati di ricerca", + "search-results-no-count": "Risultati della ricerca", "search": { "filters": "Filtri", "hint": "Prova a cercare", "jump-to": "Salta a", + "more-results": "Altri risultati", "no-results": "nessun risultato trovato", "no-results-suggestion": "Impossibile trovare risultati di ricerca corrispondenti per \" {{searchQuery}} \". prova a cercare una parola chiave diversa.", "popular": "Ricerche popolari", @@ -340,8 +381,10 @@ "search-juz": "Cerca Juz", "search-page": "Pagina di ricerca", "search-surah": "Cerca Sura", + "search-verse": "Cerca Versetto", "try-navigating-with": "Suggerimento: prova a navigare con" }, + "sign-in": "Registrazione", "sitemap": "Mappa del sito", "sort": { "ascending": "Ascendente", @@ -362,10 +405,6 @@ "tafsirs-desc": "Leggi vari Tafsir di Ayah {{ayahNumber}} di Sura {{surahName}} da parte di fidati studiosi di Tafsir", "title": "Tafsir" }, - "tarteel": { - "app": "App Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Termini e Condizioni", "theme": "Tema", "themes": { @@ -400,13 +439,13 @@ "view": "Visualizzazione", "voice": { "ask-permission": "Abilita l'autorizzazione del microfono per iniziare a utilizzare Ricerca vocale", - "error": "Si è verificato un errore, riprova più tardi. Oppure scarica il", - "no-permission": "Sembra che tu non abbia le autorizzazioni per il microfono abilitate. Abilita i permessi del microfono e riprova o scarica il", - "not-supported": "Sembra che il tuo browser non supporti il microfono. Si prega di provare un browser diverso o scaricare il", + "error": "Si è verificato un errore, riprova più tardi.", + "no-permission": "Sembra che non hai abilitato i permessi del microfono. Abilita i permessi del microfono e riprova.", + "not-supported": "Sembra che il tuo browser non supporti il microfono. Prova un altro browser.", "suggest": "Per favore, inizia a recitare e il tuo verso apparirà.", "suggest-subtitle": "Recita qualsiasi versetto in arabo e il versetto apparirà", "suggest-title": "Recita ora", - "voice-search-powered-by": "Ricerca vocale Powered by" + "voice-search-powered-by": "Ricerca vocale fornita da" }, "wbw": "Parola per parola", "wbw-lang-summary": "Fonte della traduzione parola per parola: {{source}} . Questa fonte è indipendente dalla selezione della traduzione in versi.", diff --git a/locales/it/developers.json b/locales/it/developers.json index 80389baba8..64f06b8566 100644 --- a/locales/it/developers.json +++ b/locales/it/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Corano.com squadra", - "header": "Aiuto allo sviluppo", - "issues-cta": "Se hai domande o vuoi contattare i manutentori, scrivi un problema! Ti risponderemo il prima possibile, inshAllah.", - "issues-guide": "In genere usiamo <0> progetti Github <\/0> come fonte su cosa lavorare dopo, cosa sta succedendo e quali bug esistono che devono essere risolti. Ad esempio <1> questo URL <\/1> contiene un elenco di bug, cose per cui abbiamo bisogno di aiuto e funzionalità imminenti.", - "main-desc": "Asalamu Alykom, In primo luogo, grazie mille per il tuo interesse ad aiutarci a sviluppare Quran.com e i suoi progetti. Siamo entusiasti di lavorare con te!", - "projects": { - "all": "Abbiamo un numero di progetti tutti ospitati su Github. Li trovate tutti <0> qui <\/0> . Ma per delinearli:", - "q-android": "<0> Corano Android <\/0>", - "q-api": "<0> API Quran.com <\/0> - scritto in Ruby on Rails.", - "q-api-docs": "<0> Documenti API di Quran.com <\/0> - Il nostro portale di documenti API.", - "q-audio": "<0> Quranic Audio <\/0> e <1> App mobile Quranic Audio <\/1>", - "q-audio-segments": "<0> Segmenti audio del Corano <\/0>", - "q-ios": "<0> Corano iOS <\/0>", - "q-next": "<0> Quran.com Frontend <\/0> - scritto in Next.js.", - "q-v2": "<0> Quran.com <\/0> - scritto in Ruby on Rails." - }, - "sub-main-desc": "Siamo un team di sviluppatori, designer, product manager e pensatori che lavorano su Quran.com su base volontaria. Alhamdulilah abbiamo avuto la fortuna di lavorare per alcune grandi aziende nella Silicon Valley, Toronto e negli Emirati Arabi Uniti - e riteniamo che questo sia il minimo che possiamo fare per aiutare la nostra Ummah ad andare avanti nell'apprendimento e nello studio della loro religione. Lavorare su Quran.com è molto gratificante e che Allah ci ricompensi tutti (e ti ricompensi) per i nostri sforzi.", - "thanks": "Grazie per aver letto! Non vedo l'ora di vederti commettere del codice!" -} \ No newline at end of file + "footer": "- Corano.com squadra", + "header": "Aiuto allo sviluppo", + "issues-cta": "Se hai domande o vuoi contattare i manutentori, scrivi un problema! Ti risponderemo il prima possibile, inshAllah.", + "issues-guide": "In genere usiamo <0> progetti Github come fonte su cosa lavorare dopo, cosa sta succedendo e quali bug esistono che devono essere risolti. Ad esempio <1> questo URL contiene un elenco di bug, cose per cui abbiamo bisogno di aiuto e funzionalità imminenti.", + "main-desc": "Asalamu Alykom, In primo luogo, grazie mille per il tuo interesse ad aiutarci a sviluppare Quran.com e i suoi progetti. Siamo entusiasti di lavorare con te!", + "projects": { + "all": "Abbiamo un numero di progetti tutti ospitati su Github. Li trovate tutti <0> qui . Ma per delinearli:", + "q-android": "<0> Corano Android ", + "q-api": "<0> API Quran.com - scritto in Ruby on Rails.", + "q-api-docs": "<0> Documenti API di Quran.com - Il nostro portale di documenti API.", + "q-audio": "<0> Quranic Audio e <1> App mobile Quranic Audio ", + "q-audio-segments": "<0> Segmenti audio del Corano ", + "q-ios": "<0> Corano iOS ", + "q-next": "<0> Quran.com Frontend - scritto in Next.js.", + "q-v2": "<0> Quran.com - scritto in Ruby on Rails." + }, + "thanks": "Grazie per aver letto! Non vedo l'ora di vederti commettere del codice!" +} diff --git a/locales/it/home.json b/locales/it/home.json index b6c64dfe59..58bfafb89e 100644 --- a/locales/it/home.json +++ b/locales/it/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Raggiungi i tuoi obiettivi del Corano", + "begin": "Inizio", + "chapters-and-verses": "Capitoli e versetti", + "continue-read": "Continua a leggere", + "explore-topics": "Esplora gli argomenti", + "first-time-reading": "Nuovo al Corano? Inizia qui ", + "know-someone": "Cresci con noi questo Ramadan ", + "learning-plan": "Piani di apprendimento", + "listen-to-radio": "Ascolta la radio del Corano", + "my-quran": "Il mio Corano", + "navigate-quran": "Navigare nel Corano", "no-bookmarks": "Non hai ancora nessun segnalibro", "no-recently-read": "Non hai ancora sessioni di lettura", "noble-quran": "Il Nobile Corano", + "popular": "Popolare", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Viaggio di crescita del Corano" }, - "ramadan-activities-cta": " Segui il Calendario coranico globale <\/b> per letture settimanali, podcast stimolanti e un invito a riflettere! <\/link>", + "qr-community": "Leggi i versetti e le riflessioni in evidenza oggi", + "ramadan-activities-cta": " Segui il Calendario coranico globale per letture settimanali, podcast stimolanti e un invito a riflettere! ", + "ramadan": { + "header": "Strumenti per approfondire la tua connessione con il Corano", + "title": "Pronti per il Ramadan?" + }, "read-juz": "Leggi Juz", "recently-read": "Letto di recente", - "revelation-order-disclaimer": "Questa visione mostra l'ordine cronologico delle sure nel Corano in base a quando furono rivelate al profeta Maometto ﷺ <\/hover> . La cronologia è oggetto di opinione accademica e alcune sure sono state rivelate in parti in tempi diversi. L'ordinamento qui si basa sul lavoro di Tanzil.net <\/link> . [Nota: l'ordine Mushaf compilato da al-Fatiha ad al-Nas è una questione di consenso.]", + "revelation-order-disclaimer": "Questa visione mostra l'ordine cronologico delle sure nel Corano in base a quando furono rivelate al profeta Maometto . La cronologia è oggetto di opinione accademica e alcune sure sono state rivelate in parti in tempi diversi. L'ordinamento qui si basa sul lavoro di Tanzil.net . [Nota: l'ordine Mushaf compilato da al-Fatiha ad al-Nas è una questione di consenso.]", + "see-more-learning-plans": "Vedi altro", + "set-custom-goal": "Stabilisci un obiettivo", + "share-quran": { + "description": "Aiuta a diffondere il Corano ai nuovi studenti", + "title": "Condividi il Corano!" + }, + "start-read": "Inizia a leggere", + "stay-consistent": "Tieni traccia delle serie, crea obiettivi personalizzati, mantieni la coerenza", "tab": { "bookmarks": "segnalibri", "popular": "Popolare" diff --git a/locales/it/learn.json b/locales/it/learn.json index 2f7198b873..98fe6cf352 100644 --- a/locales/it/learn.json +++ b/locales/it/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Grazie per il tuo feedback!", "your-feedback": "I tuoi commenti" }, + "help-about-reflection": "Aiuto sulla funzione di riflessione", "learn-duration": "Durata", + "learn-more": "Saperne di più", "learning-plan-material": "Materiale del piano di apprendimento", "learning-plan-meta-desc": "Questo piano di apprendimento ti aiuterà a trasformare il modo in cui interagisci con il Corano, inizia il tuo viaggio oggi!", "learning-plans-desc": "Migliora le tue conoscenze con lezioni facili da seguire che ti aiutano a crescere nel tuo viaggio con il Corano.

    Inizia un piano di apprendimento oggi stesso! I tuoi progressi vengono monitorati fino al raggiungimento del traguardo.", @@ -34,9 +36,12 @@ "next-lesson": "Prossima lezione", "not-enrolled": "Non sei ancora iscritto al Piano di apprendimento .", "prev-lesson": "Lezione precedente", + "reflection-description-1": "Cliccando su \"Aggiungi riflessione\" verrai indirizzato a QuranReflect, una piattaforma per condividere riflessioni personali sul Corano. A differenza del Tafsir (interpretazione accademica), le riflessioni sono intuizioni ed esperienze personali relative ai versetti.", + "reflection-description-2": "Se pubblichi un messaggio pubblico, la tua riflessione verrà esaminata dal team di moderazione e diventerà visibile alla comunità di QuranReflect.", "start-learning": "Inizia a imparare", "tabs": { "main": "Dettagli principali", "syllabus": "Programma" - } + }, + "what-happens-when-you-click-add-reflection": "Cosa succede quando clicchi su \"Aggiungi riflessione\"?" } diff --git a/locales/it/login.json b/locales/it/login.json index 246857468c..f013ca4b2a 100644 --- a/locales/it/login.json +++ b/locales/it/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "In attesa di conferma", + "back": "Indietro", + "back-to-login": "Torna al login", + "check-email-title": "Controlla l'email per completare la registrazione", + "confirm": "Confermare", + "confirm-new-password-placeholder": "Conferma la nuova password", + "confirm-password-placeholder": "Conferma password", + "continue": "Continuare", "continue-apple": "Continua con Apple", "continue-email": "Continua con E-mail", "continue-facebook": "Continua con Facebook", "continue-google": "Continua con Google", "email-placeholder": "Indirizzo e-mail", + "error": { + "email-required": "Email mancante!", + "invalid-credentials": "Email o password non valide", + "invalid-email": "Formato email non valido!", + "login-failed": "Accesso non riuscito. Riprova.", + "password-required": "Password mancante!" + }, + "errors": { + "account-banned": "Spiacenti, il tuo account è stato bannato. Contatta Quran.Foundation", + "badRequest": "*Richiesta non valida", + "banned": "*Spiacenti, il tuo account è stato bannato. Contatta Quran.Foundation", + "confirm": "*La password di conferma non corrisponde alla password", + "email": "*Formato email non valido!", + "exactLength": "*Il valore deve essere della lunghezza esatta", + "expiredToken": "*Questo token è scaduto", + "forgot-password-failed": "Impossibile inviare l'email di reimpostazione della password. Riprova.", + "immutable": "*Questo valore non può essere modificato", + "invalid": "*Questo {{fieldName}} non è valido", + "invalidEmailOrPassword": "*Email o password non valide", + "max": "* {{fieldName}} deve essere minore o uguale a {{max}} cifre", + "min": "* {{fieldName}} deve essere maggiore o uguale a {{min}} cifre", + "name": "* {{fieldName}} deve contenere solo lettere e numeri", + "notFound": "*Non trovato", + "required": "* {{fieldName}} mancante!", + "reset-password-failed": "Impossibile reimpostare la password. Riprova.", + "signin-failed": "Accesso non riuscito. Riprova.", + "signup-failed": "Registrazione non riuscita. Riprova.", + "taken": "* {{fieldName}} esiste già!", + "usedToken": "*Questo token è già stato utilizzato", + "username": "* {{fieldName}} accetta solo caratteri di sottolineatura e lettere", + "verification-code-invalid": "Questo codice di verifica non è valido", + "verification-code-length": "Il codice di verifica deve essere di {{length}} cifre", + "verification-failed": "Verifica non riuscita. Riprova.", + "verification-resend-failed": "Impossibile inviare nuovamente il codice di verifica" + }, "feature-1": "Tieni traccia dei tuoi obiettivi", "feature-2": "Mantieni le strisce di lettura", "feature-3": "Crea raccolte", "feature-4": "Sincronizza i tuoi dati tra i browser", "feature-5": "E altro ancora!", "feature-6": " Novità! Note e riflessioni", + "first-name-placeholder": "Nome di battesimo", + "forgot-password": "Ha dimenticato la password", + "forgot-password-description": "Inserisci il tuo indirizzo email e ti invieremo le istruzioni per reimpostare la password.", + "forgot-password-success": "Email di reimpostazione password inviata! Controlla la tua posta in arrivo.", + "forgot-password-title": "Ha dimenticato la password?", + "last-name-placeholder": "Cognome", "login-cta": "Accedi o Iscriviti ora:", "login-error": { "AuthenticationError": "Autenticazione fallita. Per favore riprova più tardi", + "BannedUserError": "Spiacenti, il tuo account è stato bannato. Contatta Quran.Foundation.", "TokenExpiredError": "Sei stato disconnesso, effettua nuovamente il login." }, "login-title": "Accedi a Corano.com", + "new-password-placeholder": "Nuova password", "other-options": "Altre opzioni di accesso", + "password-placeholder": "Password", + "password-reset-success": "Reimpostazione password riuscita!", + "password-rules": { + "lowercase": "Almeno una lettera minuscola", + "max-length": "Massimo 20 caratteri", + "min-length": "Minimo 8 caratteri", + "number": "Almeno un numero", + "special": "Almeno un carattere speciale (!@#$%^&*_-)", + "uppercase": "Almeno una lettera maiuscola" + }, "privacy-policy": "Proteggere la tua privacy è la nostra priorità: registrandoti, acconsenti alla nostra Informativa sulla privacy e Termini e condizioni .", - "verify-code": "Verifica che il codice di sicurezza fornito corrisponda al testo seguente:" + "quran-text": "Corano", + "quran-title": "Corano.com", + "reflect-feature-1": "Rifletti sul Corano", + "reflect-feature-2": "Unisciti ai gruppi", + "reflect-feature-3": "Interagire con gli altri", + "reflect-feature-4": "E molto altro ancora!", + "reset-password": "Reimposta password", + "reset-password-success": "Reimpostazione password riuscita!", + "set-new-password": "Imposta una nuova password", + "sign-in": "Registrazione", + "sign-in-or-sign-up": "Accedi o Registrati", + "sign-up": "Iscrizione", + "unified-registration-1": "La registrazione unificata di ", + "unified-registration-2": "Fondazione Corano", + "unified-registration-3": ". Avrai accesso ai seguenti siti web ", + "unified-registration-4": "tramite i tuoi dati di accesso.", + "username-placeholder": "Nome utente", + "verification-code-instruction": "Inserisci il codice fornito nell'e-mail per completare la registrazione", + "verification-code-resend": "Invia di nuovo l'email", + "verification-code-resend-countdown": "Invia nuovamente l'email di verifica tra {{seconds}} sec...", + "verification-code-sent": "Codice di verifica inviato!", + "verification-code-sent-to": "Abbiamo appena inviato un'e-mail a", + "verification-code-spam-note": "Non hai ricevuto un'email? Controlla la tua cartella spam", + "verify-code": "Verifica che il codice di sicurezza fornito corrisponda al testo seguente:", + "welcome-description-1": "La registrazione unificata di", + "welcome-description-2": ".Fondazione", + "welcome-description-3": "Tramite i tuoi dati di accesso avrai accesso ai seguenti siti web.", + "welcome-title": "Benvenuti a" } diff --git a/locales/it/onboarding.json b/locales/it/onboarding.json index e001f039ff..2e054630a7 100644 --- a/locales/it/onboarding.json +++ b/locales/it/onboarding.json @@ -87,10 +87,6 @@ "description": "Scegli tra una varietà di traduzioni in più lingue. Suggerimento: confronta le traduzioni selezionando più opzioni", "title": "Traduzioni" }, - "voice-search": { - "description": "Tocca l'icona del microfono e recita il versetto che stai cercando. Consiglio rapido! Per scoprire dove qualcuno sta recitando (ad esempio le preghiere di Taraweeh), tocca l'icona del microfono. Dopo aver rilevato uno o due versetti, premere stop per trovare la posizione", - "title": "Ricerca vocale (Tarteel)" - }, "wbw-audio": { "description": "Seleziona questa opzione per ascoltare ogni parola individualmente semplicemente cliccando sulla parola!", "title": "Ascolta la traslitterazione parola per parola cliccando sulla parola" diff --git a/locales/it/question.json b/locales/it/question.json index d739bdb5a3..fc02460455 100644 --- a/locales/it/question.json +++ b/locales/it/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Domande e risposte relative a ", - "question": "Domanda" + "question": "Domanda", + "questions-meta-desc": "Esplora risposte affidabili per approfondire la tua comprensione del Corano." } diff --git a/locales/it/quick-links.json b/locales/it/quick-links.json index 33fb667448..f9c94b258d 100644 --- a/locales/it/quick-links.json +++ b/locales/it/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "Informazioni sul Corano", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Unisciti al Ramadan della riflessione", - "rahman": "Surah Ar-Rahman", - "sunnah": "Versetti sulla Sunnah", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "Informazioni sul Corano", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Gesù nel Corano", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Unisciti al Ramadan della riflessione", + "rahman": "Surah Ar-Rahman", + "sunnah": "Versetti sulla Sunnah", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Cos'è il Ramadan?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/it/quran-reader.json b/locales/it/quran-reader.json index eddc3db879..527c4808c7 100644 --- a/locales/it/quran-reader.json +++ b/locales/it/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Inizio dell'Hizb", "include-translator": "Includere il nome del traduttore?", "juz-beginning": "Inizio di Juz", + "lessons-desc": "Leggi e condividi le lezioni coraniche del Versetto {{ayahNumber}} della Sura {{surahName}}", + "lessons-disclaimer": "Le lezioni sono intuizioni e interpretazioni personali del Corano. Non devono essere considerate autorevoli.", + "lessons-not-available": "Non ci sono lezioni riviste per questo ayah", "mad-2": "Maad 2 secondi", "mad-2-4-6": "Maad consentito 2 o 4 o 6 secondi", "mad-4-5": "Necessario Maad 4 o 5 secondi", diff --git a/locales/it/radio.json b/locales/it/radio.json index 0f52790295..fe33142de0 100644 --- a/locales/it/radio.json +++ b/locales/it/radio.json @@ -1,26 +1,27 @@ { - "change": "Modificare", - "curated-station": { - "juz-amma": { - "description": "Ascolta l'ultimo Juz del Corano", - "title": "Juz Amma" - }, - "popular-recitations": { - "description": "Feed quotidiano di recitazioni curato", - "title": "Recitazioni popolari" - }, - "surah-al-kahf": { - "description": "Ascolta Sura Alkahf a ripetizione", - "title": "Sura Al-Kahf" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "Le Sura da una cura di recitatori", - "title": "Yaseen, Al-Waqiah, Al-Mulk" - } + "change": "Modificare", + "curated-station": { + "juz-amma": { + "description": "Ascolta l'ultimo Juz del Corano", + "title": "Juz Amma" }, - "curated-stations": "Stazioni curate", - "pause-radio": "Metti in pausa la radio", - "play-radio": "Ascolta la radio", - "radio-desc": "Ascolta la bella recita ininterrotta del Sacro Corano da parte di vari recitatori.", - "reciter-stations": "Stazioni di recitazione" -} \ No newline at end of file + "popular-recitations": { + "description": "Feed quotidiano di recitazioni curato", + "title": "Recitazioni popolari" + }, + "surah-al-kahf": { + "description": "Ascolta Sura Alkahf a ripetizione", + "title": "Sura Al-Kahf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Le Sura da una cura di recitatori", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Stazioni curate", + "pause-radio": "Metti in pausa la radio", + "play-radio": "Ascolta la radio", + "radio-desc": "Ascolta la bella recita ininterrotta del Sacro Corano da parte di vari recitatori.", + "reciter-stations": "Stazioni di recitazione", + "station": "Stazione" +} diff --git a/locales/it/reading-goal.json b/locales/it/reading-goal.json index 3ffb35d15e..edc07770c1 100644 --- a/locales/it/reading-goal.json +++ b/locales/it/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Continua a leggere", - "continuous": { - "description": "Il tuo obiettivo calcolerà i tuoi progressi su una durata di giorni", - "title": "Per una durata" - }, - "create-plan": "Crea piano", - "create-reading-goal": "Crea obiettivo", - "daily-progress": "Progresso quotidiano", - "daily": { - "description": "Il tuo obiettivo verrà reimpostato ogni giorno", - "title": "Obiettivo giornaliero" - }, - "day-x": "Giorno {{day}}", - "days": "Giorni", - "duration": "Durata (giorni)", - "ending-chapter": "Sura finale", - "ending-verse": "Fine Ayah", - "examples-subtitle": "Ecco un elenco di obiettivi comuni. Puoi anche creare il tuo obiettivo.", - "examples-title": "Scegli un obiettivo preimpostato o creane uno tuo", - "examples": { - "custom": { - "description": "Imposta un obiettivo personalizzato adatto a te", - "title": "Costume" - }, - "khatm": { - "description": "Un classico gol di Khatm. Leggi 1 Juz al giorno", - "title": "Leggi il Corano in 30 giorni" - }, - "time": { - "description": "Un semplice obiettivo adatto ai principianti", - "title": "Leggi 10 minuti al giorno" - }, - "year": { - "description": "Leggi il Corano al tuo ritmo nel corso del prossimo anno", - "title": "Leggi il Corano in un anno" - } - }, - "frequency-tab": { - "description": "Il tuo obiettivo dovrebbe reimpostarsi ogni giorno o ogni numero di giorni? Non preoccuparti, monitoreremo i tuoi progressi indipendentemente dalla frequenza che scegli.", - "title": "Scegli una frequenza per il tuo obiettivo" - }, - "goal-done": { - "description": "Qualsiasi lettura aggiuntiva verrà comunque registrata", - "title": "Hai completato l'obiettivo di oggi" - }, - "goal-target": { - "description": "Quanto tempo, pagine o versi dovresti leggere per completare il tuo obiettivo?", - "title": "Stabilisci un obiettivo per il tuo obiettivo" - }, - "goal-type": { - "description": "Il tuo obiettivo dovrebbe essere basato su tempo, pagine o un intervallo personalizzato (ad esempio, 3 Juzs del Corano)?", - "title": "Scegli un criterio per il tuo obiettivo" - }, - "goal-types": { - "pages": { - "description": "Il tuo obiettivo sarà basato sulle pagine", - "title": "Pagine" - }, - "range": { - "description": "Il tuo obiettivo sarà basato su una gamma personalizzata di versi (può essere una Surah, un Juz o anche l'intero Corano)", - "title": "Gamma personalizzata" - }, - "time": { - "description": "Il tuo obiettivo sarà basato sul tempo", - "title": "Tempo" - } - }, - "plus-x-more-days": { - "one": "+{{days}} giorno in più", - "other": "+{{days}} giorni in più" - }, - "preview-schedule": { - "description": "Ecco come sarà il tuo obiettivo. Puoi sempre cambiarlo in seguito.", - "title": "Ecco un'anteprima del tuo programma" - }, - "progress": { - "complete": "L'obiettivo di oggi è completo 🎉", - "goal-complete": "Il tuo intero obiettivo è completo 🎉", - "pages-goal": "leggi {{pages}} pagine del Corano", - "range-goal": "leggi {{from}} a {{to}}", - "time-goal": "leggi {{time}} del Corano" - }, - "reading-goal": "Obiettivo di lettura", - "reading-goal-description": "Trovi difficile mantenere la coerenza con i tuoi obiettivi di lettura del Corano? Quran Growth Journey è una funzione dinamica sviluppata per aiutarti a rimanere coerente nel tuo viaggio con il Corano. Sia che tu miri a leggere 10 minuti al giorno, completare un Juz in un mese o finire l'intero Corano in un anno, ecc., Quran.com ora può aiutarti a impostare un obiettivo personalizzato e tenere traccia delle tue serie di letture quotidiane, mentre adattandosi man mano che si fanno progressi. È completamente gratuito e speriamo che ti aiuti a rimanere motivato a raggiungere il tuo obiettivo!", - "reading-goal-label": "Sei su un", - "reading-goal-title": "Presentazione del viaggio di crescita del Corano", - "recommended": "Consigliato", - "remaining": "Rimanendo per oggi", - "remaining-days": { - "one": "{{days}} giorno rimanente", - "other": "{{days}} giorni rimanenti" - }, - "set-reading-goal-success": "Il tuo obiettivo di lettura è stato impostato correttamente.", - "start-journey": "Inizia il tuo viaggio!", - "start-reading": "Inizia a leggere", - "starting-chapter": "Sura iniziale", - "starting-verse": "A partire Ayah", - "streak": "Strisciante", - "streak-definition": "Una striscia è il numero di giorni consecutivi in cui hai letto il Corano.", - "timeline-meaning": "Cosa significa la tua cronologia?", - "timeline-states": { - "checked": "Hai completato il tuo obiettivo", - "filled": "Hai letto qualcosa ma non abbastanza per completare il tuo obiettivo", - "none": "Non hai ancora letto niente quel giorno", - "stroked": "Non hai letto niente oggi" - }, - "todays-goal": "Obiettivo di oggi", - "view-progress": "Visualizza i progressi", - "week-progress": "I progressi di questa settimana", - "x-days": { - "one": "{{days}} giorno", - "other": "{{days}} giorni" - }, - "x-days-streak": "{{days}} serie di giorni", - "x-hours": { - "one": "{{hours}} ora", - "other": "{{hours}} ore" - }, - "x-minutes": { - "one": "{{minutes}} minuto", - "other": "{{minutes}} minuti" - }, - "x-pages": { - "one": "{{pages}} pagina", - "other": "{{pages}} pagine" - }, - "x-seconds": { - "one": "{{seconds}} secondo", - "other": "{{seconds}} secondi" + "continue-reading": "Continua a leggere", + "continuous": { + "description": "Il tuo obiettivo calcolerà i tuoi progressi su una durata di giorni", + "title": "Per una durata" + }, + "create-plan": "Crea piano", + "create-reading-goal": "Crea obiettivo", + "daily-progress": "Progresso quotidiano", + "daily-progress-completed": "Completato! 🎉", + "daily": { + "description": "Il tuo obiettivo verrà reimpostato ogni giorno", + "title": "Obiettivo giornaliero" + }, + "day-x": "Giorno {{day}}", + "days": "Giorni", + "duration": "Durata (giorni)", + "ending-chapter": "Sura finale", + "ending-verse": "Fine Ayah", + "examples-subtitle": "Ecco un elenco di obiettivi comuni. Puoi anche creare il tuo obiettivo.", + "examples-title": "Scegli un obiettivo preimpostato o creane uno tuo", + "examples": { + "custom": { + "description": "Imposta un obiettivo personalizzato adatto a te", + "title": "Costume" + }, + "khatm": { + "description": "Un classico gol di Khatm. Leggi 1 Juz al giorno", + "title": "Leggi il Corano in 30 giorni" + }, + "time": { + "description": "Un semplice obiettivo adatto ai principianti", + "title": "Leggi 10 minuti al giorno" + }, + "year": { + "description": "Leggi il Corano al tuo ritmo nel corso del prossimo anno", + "title": "Leggi il Corano in un anno" + } + }, + "frequency-tab": { + "description": "Il tuo obiettivo dovrebbe reimpostarsi ogni giorno o ogni numero di giorni? Non preoccuparti, monitoreremo i tuoi progressi indipendentemente dalla frequenza che scegli.", + "title": "Scegli una frequenza per il tuo obiettivo" + }, + "goal-completed": "Obiettivo raggiunto! 🎉 ", + "goal-done": { + "description": "Qualsiasi lettura aggiuntiva verrà comunque registrata", + "title": "Hai completato l'obiettivo di oggi" + }, + "goal-target": { + "description": "Quanto tempo, pagine o versi dovresti leggere per completare il tuo obiettivo?", + "title": "Stabilisci un obiettivo per il tuo obiettivo" + }, + "goal-type": { + "description": "Il tuo obiettivo dovrebbe essere basato su tempo, pagine o un intervallo personalizzato (ad esempio, 3 Juzs del Corano)?", + "title": "Scegli un criterio per il tuo obiettivo" + }, + "goal-types": { + "pages": { + "description": "Il tuo obiettivo sarà basato sulle pagine", + "title": "Pagine" + }, + "range": { + "description": "Il tuo obiettivo sarà basato su una gamma personalizzata di versi (può essere una Surah, un Juz o anche l'intero Corano)", + "title": "Gamma personalizzata" + }, + "time": { + "description": "Il tuo obiettivo sarà basato sul tempo", + "title": "Tempo" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} giorno in più", + "other": "+{{days}} giorni in più" + }, + "preview-schedule": { + "description": "Ecco come sarà il tuo obiettivo. Puoi sempre cambiarlo in seguito.", + "title": "Ecco un'anteprima del tuo programma" + }, + "progress": { + "complete": "L'obiettivo di oggi è completo 🎉", + "goal-complete": "Il tuo intero obiettivo è completo 🎉", + "pages-goal": "leggi {{pages}} pagine del Corano", + "range-goal": "leggi {{from}} a {{to}}", + "time-goal": "leggi {{time}} del Corano" + }, + "reading-goal": "Obiettivo di lettura", + "reading-goal-description": "Trovi difficile mantenere la coerenza con i tuoi obiettivi di lettura del Corano?

    Quran Growth Journey è una funzionalità dinamica sviluppata per aiutarti a rimanere coerente nel tuo percorso con il Corano. Che tu voglia leggere 10 minuti al giorno, completare un Juz in un mese o finire l'intero Corano in un anno, ecc., Quran.com può ora aiutarti a stabilire un obiettivo personalizzato e a tenere traccia delle tue serie di letture quotidiane, adattandoti man mano che fai progressi. È completamente gratuito e speriamo che ti aiuti a rimanere motivato per raggiungere il tuo obiettivo!", + "reading-goal-label": "Sei su un", + "reading-goal-title": "Introduzione al percorso di crescita del Corano", + "recommended": "Consigliato", + "remaining": "Rimanendo per oggi", + "remaining-base": "Rimanente", + "remaining-days": { + "one": "{{days}} giorno rimanente", + "other": "{{days}} giorni rimanenti" + }, + "set-a-new-goal": "Imposta un nuovo obiettivo", + "set-reading-goal-success": "Il tuo obiettivo di lettura è stato impostato correttamente.", + "start-journey": "Inizia il tuo viaggio!", + "start-reading": "Inizia a leggere", + "starting-chapter": "Sura iniziale", + "starting-verse": "A partire Ayah", + "streak": "Strisciante", + "streak-definition": "Una striscia è il numero di giorni consecutivi in cui hai letto il Corano.", + "timeline-meaning": "Cosa significa la tua cronologia?", + "timeline-states": { + "checked": "Hai completato il tuo obiettivo", + "filled": "Hai letto qualcosa ma non abbastanza per completare il tuo obiettivo", + "none": "Non hai ancora letto niente quel giorno", + "stroked": "Non hai letto niente oggi" + }, + "todays-goal": "Obiettivo di oggi", + "view-progress": "Visualizza i progressi", + "week-progress": "I progressi di questa settimana", + "x-days": { + "one": "{{days}} giorno", + "other": "{{days}} giorni" + }, + "x-days-streak": "{{days}} serie di giorni", + "x-hours": { + "one": "{{hours}} ora", + "other": "{{hours}} ore" + }, + "x-minutes": { + "one": "{{minutes}} minuto", + "other": "{{minutes}} minuti" + }, + "x-pages": { + "one": "{{pages}} pagina", + "other": "{{pages}} pagine" + }, + "x-seconds": { + "one": "{{seconds}} secondo", + "other": "{{seconds}} secondi" + } +} diff --git a/locales/it/support.json b/locales/it/support.json index 66614a4368..dcb27785f9 100644 --- a/locales/it/support.json +++ b/locales/it/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Si prega di segnalare questo bug <0> qui <\/0> e risolveremo questo bug al più presto inshAllah.", - "bug-q": "Ho trovato un bug di traduzione, dove lo archivio?", - "developer-a": "Si prega di vedere <0> pagina degli sviluppatori <\/0> per maggiori informazioni.", - "developer-q": "Sono uno sviluppatore. Come posso contribuire?", - "donate-a": "Innanzitutto, apprezziamo molto il tuo interesse a contribuire. Si prega di visitare <0> questo <\/0> link", - "donate-q": "Come posso donare?", - "download-a": "Sfortunatamente no. Non forniamo ancora funzionalità per scaricare il nostro sito Web o il Corano sul tuo computer. Puoi comunque installare la nostra app mobile per la lettura offline.", - "download-q": "Posso scaricare il Quran.com sul mio computer?", - "fiqh-a": "Quran.com è uno strumento di lettura, ascolto e studio online. Il team dietro Quran.com è composto da ingegneri del software, designer e product manager. Sfortunatamente, questa è la limitazione del nostro set di abilità, non abbiamo studiosi, imam o sceicchi come parte del team per assistere con questioni relative all'Islam, al Fiqh o alla Fatwa. Cerchiamo di astenerci dal rispondere a una qualsiasi di queste domande e ti consigliamo di parlare con il tuo imam locale in una moschea o con uno sceicco.", - "fiqh-q": "Domande relative all'Islam \/ Fiqh \/ Fatwa", - "header": "Aiuto e feedback", - "main-desc": "Controlla le FAQ per vedere se la tua domanda ha già ricevuto risposta. Se necessario, puoi <0> contattarci <\/0> e faremo del nostro meglio per risponderti il prima possibile, ma solo per sapere che siamo una piccola squadra, quindi per favore sii gentile.", - "mobile-a": "Sì! Visita la nostra <0> pagina delle app mobili <\/0> per maggiori informazioni.", - "mobile-q": "Quran.com ha un'app mobile?", - "other-languages-a": "Per cambiare la tua lingua preferita, c'è un menu a tendina nell'angolo in alto a destra di ogni pagina (angolo in alto a sinistra nelle lingue da destra a sinistra). Usa questo menu a discesa per scegliere la tua lingua preferita.", - "other-languages-q": "Posso navigare nel sito in altre lingue?", - "reciters-a": "Invia maggiori informazioni su questo recitante <0> qui <\/0>", - "reciters-q": "Aggiunta di più recitatori", - "site-down-a": "Questo non è buono! Se il sito non funziona affatto o forse vedi una schermata bianca con il testo \"Siamo spiacenti, qualcosa è andato storto\", ti ringraziamo se puoi segnalarlo <0> qui <\/0> .", - "site-down-q": "Il sito non funziona, come te lo dico?", - "support": "Supporto", - "tafsir-a": "Sì, abbiamo dei Tafsir. Fare clic sull'icona mostrata accanto a ogni ayah, quindi fare clic su tafisrs. L'app ti mostrerà l'elenco dei tafsir disponibili. Fare clic sul tafsir che si desidera leggere.", - "tafsir-q": "Tafsir è disponibile?", - "translations-a": "Apri un nuovo numero <0> qui <\/0> con tutti i dettagli, il link alla traduzione e faremo del nostro meglio per aggiungerlo.", - "translations-q": "Aggiungi altre traduzioni" -} \ No newline at end of file + "bug-a": "Si prega di segnalare questo bug <0> qui e risolveremo questo bug al più presto inshAllah.", + "bug-q": "Ho trovato un bug di traduzione, dove lo archivio?", + "developer-a": "Si prega di vedere <0> pagina degli sviluppatori per maggiori informazioni.", + "developer-q": "Sono uno sviluppatore. Come posso contribuire?", + "donate-a": "Innanzitutto, apprezziamo molto il tuo interesse a contribuire. Si prega di visitare <0> questo link", + "donate-q": "Come posso donare?", + "download-a": "Sfortunatamente no. Non forniamo ancora funzionalità per scaricare il nostro sito Web o il Corano sul tuo computer. Puoi comunque installare la nostra app mobile per la lettura offline.", + "download-q": "Posso scaricare il Quran.com sul mio computer?", + "header": "Aiuto e feedback", + "main-desc": "Controlla le FAQ per vedere se la tua domanda ha già ricevuto risposta. Se necessario, puoi <0> contattarci e faremo del nostro meglio per risponderti il prima possibile, ma solo per sapere che siamo una piccola squadra, quindi per favore sii gentile.", + "mobile-a": "Sì! Visita <0>Quran per Android o <1>Quran iOS per scaricare le app", + "mobile-q": "Quran.com ha un'app mobile?", + "other-languages-a": "Per cambiare la tua lingua preferita, c'è un menu a tendina nell'angolo in alto a destra di ogni pagina (angolo in alto a sinistra nelle lingue da destra a sinistra). Usa questo menu a discesa per scegliere la tua lingua preferita.", + "other-languages-q": "Posso navigare nel sito in altre lingue?", + "reciters-a": "Invia maggiori informazioni su questo recitante <0> qui ", + "reciters-q": "Aggiunta di più recitatori", + "site-down-a": "Questo non è buono! Se il sito non funziona affatto o forse vedi una schermata bianca con il testo \"Siamo spiacenti, qualcosa è andato storto\", ti ringraziamo se puoi segnalarlo <0> qui .", + "site-down-q": "Il sito non funziona, come te lo dico?", + "support": "Supporto", + "tafsir-a": "Sì, abbiamo dei Tafsir. Fare clic sull'icona mostrata accanto a ogni ayah, quindi fare clic su tafisrs. L'app ti mostrerà l'elenco dei tafsir disponibili. Fare clic sul tafsir che si desidera leggere.", + "tafsir-q": "Tafsir è disponibile?", + "translations-a": "Apri un nuovo numero <0> qui con tutti i dettagli, il link alla traduzione e faremo del nostro meglio per aggiungerlo.", + "translations-q": "Aggiungi altre traduzioni" +} diff --git a/locales/ms/about.json b/locales/ms/about.json index 7054796f8b..4ce72feceb 100644 --- a/locales/ms/about.json +++ b/locales/ms/about.json @@ -1,14 +1,42 @@ { "credits": { - "desc": "Projek ini tidak mungkin dapat dilakukan dan dihasilkan tanpa adanya perpustakaan sumber terbuka dan juga rujukan daripada projek sedia-ada yang lain yang telah kami gunakan:", - "lokalize": "<0> Lokalize : Sistem terjemahan berbantukan komputer yang memberi fokus kepada produktiviti dan jaminan kualiti serta menyediakan aliran kerja setempatan (Lokalize) yang lancar.", - "quran-align": "<0> Collin Fair : Alat untuk menghasilkan segmen bacaan Al-Quran yang direkodkan dengan tepat.", - "quran-complex": "<0> : Kompleks Percetakan Al-Quran King Fahd adalah peneraju dalam mempersembahkan Al-Quran dan Ilmunya, terjemahan maknanya dan menjaga Teks Al-Quran daripada penyelewengan, melalui penggunaan optimum teknologi canggih dalam bidang percetakan, rakaman audio, penerbitan elektronik dan aplikasi digital.", - "quran-enc": "<0> QuranEnc : Sebuah portal yang memaparkan terjemahan percuma yang boleh dipercayai bagi maksud dan tafsir Al-Quran yang mulia dalam pelbagai bahasa dunia.", - "tanzil": "<0> Tanzil : Projek al-Quran antarabangsa yang bertujuan untuk menyediakan teks al-Quran yang tulen dan tepat.", - "title": "Kredit (Penghargaan)", - "vercel": "<0> Vercel : ialah platform penggunaan dan kerjasama untuk para Front-End Developer yang mengutamakan pembangunan Front-End Development , memberi mereka alatan yang komprehensif untuk membina tapak web dan aplikasi berprestasi tinggi.", - "zekr": "<0> Zekr : Pentas terbuka untuk mempelajari, menyemak dan menyelidik serta mengulangkaji al-Quran" - }, - "main-description": "Quran.com telah diasaskan pada tahun 1995. Laman web ini bertujuan untuk memudahkan sesiapa sahaja membaca, mempelajari dan memahami al-Quran. Projek ini adalah sumber terbuka (Open Source Project) dan dibina dengan kerjasama diantara ahli pasukan Teras dan <0> ahli pasukan Tarteel ." + "desc": "Kami mengucapkan terima kasih kepada semua pihak yang telah menyokong dan menyumbang kepada projek ini, membantu menjadikan Al-Quran boleh diakses oleh jutaan orang di seluruh dunia.", + "lokalize": "<0>Lokalikan: Sistem terjemahan berbantukan komputer yang memfokuskan pada produktiviti dan jaminan kualiti serta menyediakan aliran kerja penyetempatan yang lancar.", + "quran-align": "<0>Collin Fair: Alat untuk menghasilkan segmentasi bacaan Al-Quran yang direkodkan dengan tepat.", + "quran-complex": "<0>Kompleks Quran: Kompleks Percetakan Al-Quran King Fahd adalah peneraju dalam melayani Al-Quran dan Ilmunya, menterjemah Maknanya, dan menjaga Teks Al-Quran daripada penyelewengan, melalui penggunaan teknologi canggih secara optimum dalam bidang percetakan, rakaman audio, penerbitan elektronik dan aplikasi digital.", + "quran-enc": "<0>QuranEnc: Sebuah portal yang memaparkan terjemahan percuma dan boleh dipercayai bagi maksud dan tafsir Al-Quran yang mulia dalam banyak bahasa dunia.", + "tanzil": "<0>Tanzil: Projek al-Quran antarabangsa yang bertujuan untuk menyediakan teks al-Quran yang sangat disahkan.", + "tarteel": "<0>Tarteel: Aplikasi hafazan al-Quran dikuasakan AI. Ia direka untuk membantu anda menghafal dengan lebih bijak, sama ada anda sedang mencari ayat, menjejaki kemajuan anda atau mengikuti bacaan anda.", + "title": "Kredit", + "vercel": "<0>Vercel: ialah platform penggunaan dan kerjasama untuk pembangun bahagian hadapan yang mengutamakan pembangun bahagian hadapan, memberikan mereka alatan yang komprehensif untuk membina tapak web dan aplikasi berprestasi tinggi.", + "zekr": "<0>Zekr: Alat belajar al-Quran platform terbuka untuk menyemak imbas dan menyelidik al-Quran" + }, + "global-effort": { + "desc": "Berjuta-juta orang dari seluruh dunia bergantung pada Quran.com sebagai sumber Al-Quran digital utama mereka. Sama ada mereka datang untuk membaca, merenung, menghafal, atau belajar, mereka berkongsi tujuan yang sama: keinginan yang ikhlas untuk berhubung dengan firman Allah. \\n Semasa kami terus berkembang, kami tetap komited untuk memastikan Quran.com kekal sebagai ruang yang dipercayai, boleh diakses dan direka dengan cantik untuk sesiapa sahaja yang ingin melibatkan diri dengan al-Quran.", + "title": "Satu Usaha Global" + }, + "key-features": { + "desc": "Quran.com direka untuk menyokong setiap peringkat penglibatan dengan Al-Quran—daripada membaca dan menghafal hinggalah kepada kajian dan refleksi. Ciri-ciri kami termasuk:", + "features": [ + "Antara Muka Al-Quran Mesra Pengguna– Pengalaman membaca yang bersih dan intuitif pada sebarang peranti.", + "Pelbagai Terjemahan & Tafsir – Akses kepada terjemahan dalam pelbagai bahasa, bersama dengan tafsir.", + "Bacaan Audio – Dengarkan bacaan berkualiti tinggi daripada Qari yang terkenal di dunia, dengan keupayaan untuk mengikuti perkataan demi perkataan.", + "Carian & Navigasi Terperinci – Cari ayat dengan serta-merta mengikut topik atau kata kunci di seluruh al-Quran.", + "Penanda Buku & Nota Ayah – Simpan ayat dan tulis refleksi peribadi untuk rujukan kemudian.", + "Integrasi QuranReflect – Terlibat dengan komuniti global melalui refleksi dan pandangan yang dikongsi oleh ulama dan individu.", + "Penjejakan dan Matlamat Kemajuan Membaca – Jejaki matlamat harian anda dan sejarah bacaan", + "API untuk Pembangun – Akses percuma kepada kandungan dan ciri untuk memperkasakan apl dan R&D Islamik.", + "Dan banyak lagi, Alhamdullilah." + ], + "title": "Ciri & Tawaran Utama" + }, + "main-description": "Sejak penubuhannya pada tahun 1995, Quran.com telah komited untuk menyediakan al-Quran kepada semua orang dengan cara yang jelas, tulen dan mudah untuk berinteraksi. Setiap hari, berjuta-juta orang di seluruh dunia beralih ke Quran.com untuk membaca, mendengar, mengkaji dan merenung al-Quran—sama ada mereka pelajar sepanjang hayat, ulama, atau baru memulakan perjalanan mereka.", + "our-mission": { + "desc": "Al-Quran dimaksudkan untuk dibaca, difahami, dan direnungkan. Misi kami adalah untuk menghapuskan halangan untuk mengakses dan memperkasakan individu dan komuniti dengan menyediakan pengalaman al-Quran yang boleh dipercayai, direka bentuk dengan baik dan memperkaya secara mendalam. Kami berhasrat untuk berfungsi sebagai sumber yang dipercayai bagi sesiapa yang ingin melibatkan diri dengan al-Quran, berpandukan prinsip ketepatan, kejelasan dan keikhlasan.", + "title": "Misi Kami" + }, + "who-we-are": { + "desc": "Quran.com ialah wakaf (wakaf), ditubuhkan sebagai amanah awam untuk memastikan al-Quran kekal boleh diakses oleh semua, secara percuma dan tanpa kepentingan komersial. Ia diuruskan oleh Quran.Foundation, sebuah organisasi bukan untung 501(c)(3), yang mengekalkan dan membangunkan Quran.com sebagai sebahagian daripada misinya untuk menyediakan sumber al-Quran yang berkualiti tinggi dan tulen kepada dunia. Komitmen kami adalah untuk melayani al-Quran dan pembacanya dengan cemerlang, ikhlas, dan bertanggungjawab.", + "title": "Siapa Kita" + } } diff --git a/locales/ms/apps.json b/locales/ms/apps.json index 718bbd56ce..cec5d93f79 100644 --- a/locales/ms/apps.json +++ b/locales/ms/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Oleh developer utama Quran.com, dioersembahkan aplikasi iOS dan Android mushaf yang sempurna dan bebas daripada iklan. Ia memudahkan anda membaca al-Quran, menghafalnya dan mendengar qari kegemaran anda di mana sahaja anda berada.", - "tarteel-desc": "Tarteel ialah aplikasi Al-Quran pertama yang menggunakan alatan AI untuk berinteraksi dengan bacaan anda dan mengawasi kesilapan dalam pembacaan. Apikasi Al-Quran yang berasakan suara; mudah pakai, Tarteel berfungsi secara intuitif untuk membantu anda membaca, membaca, menghafal dan memahami Al-Quran dengan yakin! <0><0> Tarteel berbangga menjadi pembangun teras Quran.com serta ahli lembaga tadbir urus mereka." + "quran-desc": "Oleh developer utama Quran.com, dioersembahkan aplikasi iOS dan Android mushaf yang sempurna dan bebas daripada iklan. Ia memudahkan anda membaca al-Quran, menghafalnya dan mendengar qari kegemaran anda di mana sahaja anda berada." } diff --git a/locales/ms/common.json b/locales/ms/common.json index a57f850e9c..711adac70f 100644 --- a/locales/ms/common.json +++ b/locales/ms/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigasi", "no-nav-results": "Tiada hasil navigasi", - "placeholder": "Apa yang anda mahu baca?", - "powered-by": "Carian suara dikuasakan oleh Tarteel.ai", + "placeholder": "Carilah Al-Quran...", "recent-navigations": "Navigasi terkini", "search-by-voice": "Cari melalui suara", "try-navigating": "Cuba navigasi ke" @@ -122,9 +121,11 @@ } }, "continue": "Teruskan", + "contribute-to-our-mission": "Menyumbang kepada misi kami", "copied": "Selesai salin", "copied-to-clipboard": "Disalin ke papan keratan", "copy": "Salin", + "copylink": "Salin pautan", "counter": { "decrease": "Mengurang", "increase": "Meningkat" @@ -134,6 +135,7 @@ "developers": "Pemaju (Developers)", "display": "Paparan", "donate": "Derma", + "donate-now": "Derma sekarang", "donate_monthly": "Derma bulanan", "donate_once": "Derma sekali", "edit": "Sunting", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} Ayah", "ranges-wrong-order": "Ayat permulaan hendaklah sebelum ayat akhir." }, + "errors": { + "account-banned": "Maaf, Akaun anda dilarang. Hubungi Quran.Foundation", + "badRequest": "*Permintaan tidak sah", + "banned": "*Maaf, Akaun anda dilarang. Hubungi Quran.Foundation", + "confirm": "*Sahkan kata laluan tidak sepadan dengan kata laluan", + "email": "*Format E-mel Tidak Sah!", + "exactLength": "*Nilai mestilah panjang tepat", + "expiredToken": "*Token ini telah tamat tempoh", + "forgot-password-failed": "Gagal menghantar e-mel tetapan semula kata laluan. Sila cuba lagi.", + "immutable": "*Nilai ini tidak boleh diubah", + "invalid": "* {{fieldName}} ini tidak sah", + "invalidEmailOrPassword": "*E-mel atau kata laluan tidak sah", + "max": "* {{fieldName}} mestilah kurang daripada atau sama dengan {{max}} digit", + "min": "* {{fieldName}} mestilah lebih daripada atau sama dengan {{min}} digit", + "name": "* {{fieldName}} hendaklah huruf dan nombor sahaja", + "notFound": "*Tidak dijumpai", + "required": "* {{fieldName}} tiada!", + "reset-password-failed": "Gagal menetapkan semula kata laluan. Sila cuba lagi.", + "signin-failed": "Log masuk gagal. Sila cuba lagi.", + "signup-failed": "Pendaftaran gagal. Sila cuba lagi.", + "taken": "* {{fieldName}} sudah wujud!", + "usedToken": "*Token ini sudah digunakan", + "username": "* {{fieldName}} terima garis bawah dan huruf sahaja", + "verification-code-invalid": "Kod pengesahan ini tidak sah", + "verification-code-length": "Kod pengesahan mestilah {{length}} digit", + "verification-failed": "Pengesahan gagal. Sila cuba lagi.", + "verification-resend-failed": "Gagal menghantar semula kod pengesahan" + }, "exciting-updates": "Kemas Kini Menarik", "feedback": "Maklum balas", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Saiz fon terjemahan" }, "footer": { - "description": "Quran.com adalah Sadaqah Jariyah. Kami berharap agar kami dapat memudahkan semua orang dapat membaca, mempelajari dan memahami erti Al-Quran. Al-Quran yang mulia mempunyai banyak nama antaranya Al-Quran Al-Kareem, Al-Kitab, Al-Furqan, Al-Maw'itha, Al-Zikir, dan Al-Nur.", + "description": "Quran.com ialah platform dipercayai yang digunakan oleh berjuta-juta orang di seluruh dunia untuk membaca, mencari, mendengar dan merenung Al-Quran dalam pelbagai bahasa. Ia menyediakan terjemahan, tafsir, bacaan, terjemahan perkataan demi perkataan, dan alat untuk kajian yang lebih mendalam, menjadikan al-Quran boleh diakses oleh semua orang.

    Sebagai Sadaqah Jariyah, Quran.com berdedikasi untuk membantu orang ramai berhubung secara mendalam dengan al-Quran. Disokong oleh Quran.Foundation, sebuah organisasi bukan untung 501(c)(3), Quran.com terus berkembang sebagai sumber percuma dan berharga untuk semua, Alhamdullilah”", "hiring": "Kami ada jawatan kosong untuk di penuhi! Sertai pasukan QuranFoundation dan menyumbang kepada misi kami. Mohon sekarang! ", "rights": "Hak cipta terpelihara", - "title": "Baca, kaji dan pelajari Al-Quran." + "title": "Baca, Dengar, Cari, dan Renungkan Al-Quran" }, "form": { "body": "Badan", "code": "Kod pengesahan", + "confirm-password": "Sahkan Kata Laluan", "email": "E-mel", "firstName": "Nama pertama", "lastName": "Nama terakhir", - "title": "Tajuk" + "password": "Kata laluan", + "title": "Tajuk", + "username": "Nama pengguna", + "verification-code": "Kod Pengesahan" }, "from": "Dari", + "fundraising-share-title": "Kongsi Pengumpulan Dana Quran.com", "fundraising-sticky-banner": { "cta": "Derma", "title": "Berikan pada hari-hari terbaik!" @@ -217,6 +252,7 @@ "learn-more": "Ketahui lebih lanjut", "learning-plans": "Rancangan Pembelajaran", "less": "Kurang", + "lessons": "Pelajaran", "loading": "Sedang dimuat ", "login": "Log masuk", "logout": "Log keluar", @@ -250,6 +286,7 @@ "off": "Tutup", "oldest": "Terdahulu", "on": "Pasang", + "our-projects": "Projek Kami", "page": "Halaman", "pages": "Muka Surat", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} daripada {{totalNumberOfResults}} hasil carian", @@ -272,6 +309,7 @@ "privacy": "Privasi", "product-updates": "Kemas kini produk", "profile": "Profil", + "projects-desc": "Projek bukan untung yang dimiliki, diurus atau ditaja oleh Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "Radio Al-Quran", @@ -287,6 +325,7 @@ "reciters": "Qari", "reflect": "Renungkan", "reflections": "Renungan", + "reflections-and-lessons": "Refleksi & Pengajaran", "remove": "Keluarkan", "rename": "Namakan semula", "retry": "Cuba lagi (Retry)", @@ -296,10 +335,12 @@ "save-to-collection": "Simpan ke Koleksi", "search-for": "Cari '{{searchQuery}}'", "search-results": "{{count}} hasil carian", + "search-results-no-count": "Hasil Carian", "search": { "filters": "Penapis", "hint": "Cuba cari", "jump-to": "Lompat Ke", + "more-results": "Lagi hasil", "no-results": "Tiada keputusan dijumpai", "no-results-suggestion": "Kami tidak dapat mencari sebarang hasil carian yang sepadan untuk \" {{searchQuery}} \". cuba cari kata kunci lain.", "popular": "Carian popular", @@ -340,8 +381,10 @@ "search-juz": "Cari Juzuk", "search-page": "Halaman Carian", "search-surah": "Cari Surah", + "search-verse": "Ayat Carian", "try-navigating-with": "Nasihat: cuba navigasi dengan" }, + "sign-in": "Log masuk", "sitemap": "Peta laman", "sort": { "ascending": "Menaik", @@ -362,10 +405,6 @@ "tafsirs-desc": "Baca pelbagai Tafsir Ayah {{ayahNumber}} Surah {{surahName}} oleh ulama Tafsir yang dipercayai", "title": "Tafsir" }, - "tarteel": { - "app": "Aplikasi Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Terma dan Syarat", "theme": "Tema", "themes": { @@ -400,13 +439,13 @@ "view": "Lihat", "voice": { "ask-permission": "Sila benarkan pemasangan mikrofon untuk mula menggunakan Carian Suara", - "error": "Kesilapan telah berlaku. Sila cuba sebentar lagi. Atau muat turun", - "no-permission": "Nampaknya anda tidak memberi kebenaran kepada pemasangan mikrofon. Sila benarkan pemasangan mikrofon dan cuba lagi sekali atau muat turun", - "not-supported": "Nampaknya web anda tidak menyokong mikrofon. Sila cuba web lain atau muat turun", + "error": "Ralat telah berlaku, sila cuba sebentar lagi.", + "no-permission": "Nampaknya anda tidak mempunyai kebenaran mikrofon didayakan. Sila dayakan kebenaran mikrofon dan cuba lagi.", + "not-supported": "Nampaknya penyemak imbas anda tidak menyokong mikrofon. Sila cuba pelayar lain.", "suggest": "Mulakan bacaan anda, ayat pilihan itu akan muncul", "suggest-subtitle": "Bacalah mana-mana ayat dalam bahasa Arab dan ayat itu akan muncul", "suggest-title": "Mula bacaan anda", - "voice-search-powered-by": "Enjin carian suara dihasilkan oleh" + "voice-search-powered-by": "Carian Suara Dikuasakan oleh" }, "wbw": "Per kata", "wbw-lang-summary": "Sumber terjemahan per kata: {{source}} . Sumber ini bebas daripada pilihan terjemahan ayat.", diff --git a/locales/ms/developers.json b/locales/ms/developers.json index 50051d155a..212176f641 100644 --- a/locales/ms/developers.json +++ b/locales/ms/developers.json @@ -15,6 +15,5 @@ "q-next": "<0> Quran.com Frontend - ditulis dalam Next.js.", "q-v2": "<0> Quran.com - ditulis dalam Ruby on Rails." }, - "sub-main-desc": "Kami adalah pasukan pembangun, pereka bentuk, pengurus produk dan pemikir yang bekerja di Quran.com secara sukarela. Alhamdulilah kami telah bekerja untuk beberapa syarikat hebat di Silicon Valley, Toronto dan UAE - dan ini adalah satu jihad untuk membantu Ummah dalam menuntut ilmu agama. Bergabung dengan Quran.com adalah usaha yang sangat memuaskan. Moga Allah memberi ganjaran atas usaha kita bersama.", "thanks": "Terima kasih kerana membaca! Kami teruja untuk melihat anda menyampaikan beberapa kod!" } diff --git a/locales/ms/home.json b/locales/ms/home.json index a6372fff44..728de257a4 100644 --- a/locales/ms/home.json +++ b/locales/ms/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Capai Matlamat Al-Quran Anda", + "begin": "Mulakan", + "chapters-and-verses": "Surah dan Ayat", + "continue-read": "Teruskan Membaca", + "explore-topics": "Terokai Topik", + "first-time-reading": "Baru kenal Al-Quran? Mulakan di sini ", + "know-someone": "Tumbuh bersama kami Ramadan ini", + "learning-plan": "Rancangan Pembelajaran", + "listen-to-radio": "Dengar Radio Al-Quran", + "my-quran": "Al-Quran saya", + "navigate-quran": "Navigasi Quran", "no-bookmarks": "Anda belum mempunyai sebarang penanda halaman", "no-recently-read": "Anda belum mempunyai sebarang bacaan", "noble-quran": "Al-Quran Karim", + "popular": "Popular", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Kembara Pertumbuhan Al-Quran" }, - "ramadan-activities-cta": " Ikuti Kalendar Al-Quran Global <\/b> untuk bacaan mingguan, podcast yang memberi inspirasi dan panggilan untuk merenung! <\/link>", + "qr-community": "Baca Ayat dan Renungan yang ditampilkan hari ini", + "ramadan-activities-cta": " Ikuti Kalendar Al-Quran Global untuk bacaan mingguan, podcast yang memberi inspirasi dan panggilan untuk merenung! ", + "ramadan": { + "header": "Alat untuk Memperdalam Hubungan Anda dengan Al-Quran", + "title": "Bersedia untuk Ramadan?" + }, "read-juz": "Baca Juz", "recently-read": "Bacaan Terkini", - "revelation-order-disclaimer": "Pandangan ini menunjukkan susunan kronologi Surah dalam al-Quran berdasarkan waktu penurunan kepada Nabi Muhammad ﷺ <\/hover> . Kronologi adalah subjek pendapat ulama dan beberapa Surah diturunkan dalam bahagian pada masa yang berbeza. Pesanan di sini adalah berdasarkan hasil kerja Tanzil.net <\/link> . [Nota: susunan Mushaf yang disusun daripada al-Fatiha kepada al-Nas adalah perkara yang disepakati.]", + "revelation-order-disclaimer": "Pandangan ini menunjukkan susunan kronologi Surah dalam al-Quran berdasarkan waktu penurunan kepada Nabi Muhammad . Kronologi adalah subjek pendapat ulama dan beberapa Surah diturunkan dalam bahagian pada masa yang berbeza. Pesanan di sini adalah berdasarkan hasil kerja Tanzil.net . [Nota: susunan Mushaf yang disusun daripada al-Fatiha kepada al-Nas adalah perkara yang disepakati.]", + "see-more-learning-plans": "Lihat Lagi", + "set-custom-goal": "Tetapkan Matlamat", + "share-quran": { + "description": "Bantu sebarkan Al-Quran kepada pelajar baharu", + "title": "Kongsi Al-Quran!" + }, + "start-read": "Mulakan Membaca", + "stay-consistent": "Jejaki Trek, Cipta Matlamat Tersuai, Kekal Konsisten", "tab": { "bookmarks": "Penanda buku", "popular": "Popular" diff --git a/locales/ms/learn.json b/locales/ms/learn.json index bd0e5ad843..8bc9c541c7 100644 --- a/locales/ms/learn.json +++ b/locales/ms/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Terima kasih atas maklum balas anda!", "your-feedback": "Maklum Balas Anda" }, + "help-about-reflection": "Bantuan tentang ciri refleksi", "learn-duration": "Tempoh", + "learn-more": "Ketahui lebih lanjut", "learning-plan-material": "Bahan Rancangan Pembelajaran", "learning-plan-meta-desc": "Pelan Pembelajaran ini akan membantu mengubah cara anda melibatkan diri dengan Al-Quran, mulakan perjalanan anda hari ini!", "learning-plans-desc": "Tingkatkan pengetahuan anda dengan pelajaran yang mudah diikuti yang memastikan anda terus berkembang dalam perjalanan anda dengan al-Quran.

    Mulakan Rancangan Pembelajaran hari ini! Kemajuan anda dijejaki sehingga anda sampai ke garisan penamat.", @@ -34,9 +36,12 @@ "next-lesson": "Pelajaran Seterusnya", "not-enrolled": "Anda belum mendaftar dalam sebarang Rancangan Pembelajaran lagi.", "prev-lesson": "Pelajaran Sebelumnya", + "reflection-description-1": "Mengklik \"Tambah Refleksi\" akan membawa anda ke QuranReflect, platform untuk berkongsi refleksi peribadi tentang Al-Quran. Berbeza dengan Tafsir (tafsiran ulama), renungan adalah pandangan dan pengalaman peribadi yang berkaitan dengan ayat-ayat tersebut.", + "reflection-description-2": "Jika anda menyiarkan secara terbuka, renungan anda akan disemak oleh pasukan penyederhana dan dapat dilihat oleh komuniti QuranReflect.", "start-learning": "Mula Belajar", "tabs": { "main": "Butiran Utama", "syllabus": "Silibus" - } + }, + "what-happens-when-you-click-add-reflection": "Apakah yang berlaku apabila anda mengklik \"Tambah Refleksi\"?" } diff --git a/locales/ms/login.json b/locales/ms/login.json index 4d459f5dc4..e780039070 100644 --- a/locales/ms/login.json +++ b/locales/ms/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Menunggu pengesahan", + "back": "belakang", + "back-to-login": "Kembali ke Log Masuk", + "check-email-title": "Semak e-mel untuk melengkapkan pendaftaran", + "confirm": "sahkan", + "confirm-new-password-placeholder": "Sahkan kata laluan baharu", + "confirm-password-placeholder": "Sahkan kata laluan", + "continue": "Teruskan", "continue-apple": "Teruskan dengan Apple", "continue-email": "Teruskan dengan E-mel", "continue-facebook": "Teruskan dengan Facebook", "continue-google": "Teruskan dengan Google", "email-placeholder": "Alamat emel", + "error": { + "email-required": "E-mel tiada!", + "invalid-credentials": "E-mel atau kata laluan tidak sah", + "invalid-email": "Format E-mel Tidak Sah!", + "login-failed": "Log masuk gagal. Sila cuba lagi.", + "password-required": "Kata laluan tiada!" + }, + "errors": { + "account-banned": "Maaf, Akaun anda dilarang. Hubungi Quran.Foundation", + "badRequest": "*Permintaan tidak sah", + "banned": "*Maaf, Akaun anda dilarang. Hubungi Quran.Foundation", + "confirm": "*Sahkan kata laluan tidak sepadan dengan kata laluan", + "email": "*Format E-mel Tidak Sah!", + "exactLength": "*Nilai mestilah panjang tepat", + "expiredToken": "*Token ini telah tamat tempoh", + "forgot-password-failed": "Gagal menghantar e-mel tetapan semula kata laluan. Sila cuba lagi.", + "immutable": "*Nilai ini tidak boleh diubah", + "invalid": "* {{fieldName}} ini tidak sah", + "invalidEmailOrPassword": "*E-mel atau kata laluan tidak sah", + "max": "* {{fieldName}} mestilah kurang daripada atau sama dengan {{max}} digit", + "min": "* {{fieldName}} mestilah lebih daripada atau sama dengan {{min}} digit", + "name": "* {{fieldName}} hendaklah huruf dan nombor sahaja", + "notFound": "*Tidak dijumpai", + "required": "* {{fieldName}} tiada!", + "reset-password-failed": "Gagal menetapkan semula kata laluan. Sila cuba lagi.", + "signin-failed": "Log masuk gagal. Sila cuba lagi.", + "signup-failed": "Pendaftaran gagal. Sila cuba lagi.", + "taken": "* {{fieldName}} sudah wujud!", + "usedToken": "*Token ini sudah digunakan", + "username": "* {{fieldName}} terima garis bawah dan huruf sahaja", + "verification-code-invalid": "Kod pengesahan ini tidak sah", + "verification-code-length": "Kod pengesahan mestilah {{length}} digit", + "verification-failed": "Pengesahan gagal. Sila cuba lagi.", + "verification-resend-failed": "Gagal menghantar semula kod pengesahan" + }, "feature-1": "Jejaki matlamat anda", "feature-2": "Kekalkan coretan bacaan", "feature-3": "Buat koleksi", "feature-4": "Segerakkan data anda merentas penyemak imbas", "feature-5": "Dan banyak lagi!", "feature-6": " Baharu! Nota & Refleksi", + "first-name-placeholder": "Nama Pertama", + "forgot-password": "Terlupa kata laluan", + "forgot-password-description": "Masukkan alamat e-mel anda dan kami akan menghantar arahan untuk menetapkan semula kata laluan anda.", + "forgot-password-success": "E-mel tetapan semula kata laluan dihantar! Sila semak peti masuk anda.", + "forgot-password-title": "Lupa kata laluan?", + "last-name-placeholder": "Nama Akhir", "login-cta": "Log masuk atau Daftar sekarang:", "login-error": { "AuthenticationError": "Pengesahan gagal. Sila cuba sebentar lagi", + "BannedUserError": "Maaf, Akaun anda dilarang. Hubungi Quran.Foundation.", "TokenExpiredError": "Anda telah log keluar, sila log masuk semula." }, "login-title": "Log masuk ke Quran.com", + "new-password-placeholder": "Kata laluan baharu", "other-options": "Pilihan Log Masuk Lain", + "password-placeholder": "Kata laluan", + "password-reset-success": "Tetapan semula kata laluan berjaya!", + "password-rules": { + "lowercase": "Sekurang-kurangnya satu huruf kecil", + "max-length": "Maks 20 aksara", + "min-length": "Min 8 aksara", + "number": "Sekurang-kurangnya satu nombor", + "special": "Sekurang-kurangnya satu watak istimewa (!@#$%^&*_-)", + "uppercase": "Sekurang-kurangnya satu huruf besar" + }, "privacy-policy": "Melindungi privasi anda adalah keutamaan kami – Dengan mendaftar, anda bersetuju menerima Dasar Privasi dan Terma dan syarat kami.", - "verify-code": "Sahkan bahawa kod keselamatan yang diberikan sepadan dengan teks berikut:" + "quran-text": "Quran", + "quran-title": "Quran.com", + "reflect-feature-1": "Renungkan Al-Quran", + "reflect-feature-2": "Sertai Kumpulan", + "reflect-feature-3": "Berinteraksi dengan orang lain", + "reflect-feature-4": "Dan banyak lagi!", + "reset-password": "Tetapkan Semula Kata Laluan", + "reset-password-success": "Tetapan semula kata laluan berjaya!", + "set-new-password": "Tetapkan kata laluan baharu", + "sign-in": "Log masuk", + "sign-in-or-sign-up": "Daftar masuk atau Daftar", + "sign-up": "daftar", + "unified-registration-1": "Pendaftaran bersatu bagi ", + "unified-registration-2": "Quran.Yayasan", + "unified-registration-3": ". Anda akan mempunyai akses ke laman web berikut ", + "unified-registration-4": "melalui butiran log masuk anda.", + "username-placeholder": "Nama pengguna", + "verification-code-instruction": "Sila masukkan kod yang diberikan dalam e-mel untuk melengkapkan pendaftaran", + "verification-code-resend": "Hantar semula e-mel", + "verification-code-resend-countdown": "Hantar semula e-mel pengesahan dalam {{seconds}} saat...", + "verification-code-sent": "Kod pengesahan dihantar!", + "verification-code-sent-to": "Kami baru sahaja menghantar e-mel kepada", + "verification-code-spam-note": "Tidak menerima e-mel? Semak folder spam anda", + "verify-code": "Sahkan bahawa kod keselamatan yang diberikan sepadan dengan teks berikut:", + "welcome-description-1": "Pendaftaran bersatu bagi", + "welcome-description-2": ".Yayasan", + "welcome-description-3": "Anda akan mempunyai akses ke tapak web berikut melalui butiran log masuk anda.", + "welcome-title": "Selamat datang ke" } diff --git a/locales/ms/onboarding.json b/locales/ms/onboarding.json index 4e3c3bcafb..5529cd82b4 100644 --- a/locales/ms/onboarding.json +++ b/locales/ms/onboarding.json @@ -87,10 +87,6 @@ "description": "Pilih daripada pelbagai terjemahan dalam pelbagai bahasa. Tip: Bandingkan terjemahan dengan memilih berbilang pilihan", "title": "Terjemahan" }, - "voice-search": { - "description": "Sentuh ikon mikrofon dan bacakan ayat yang anda cari. Laluan Cepat! : Untuk mengetahui ayat yang sedang dibaca (Cth. Solat Tarawih), sentuh ikon mikrofon. Selepas satu atau dua ayat dikesan, tekan berhenti untuk mencari lokasi ayat-ayat yang di baca", - "title": "Carian Suara (Tarteel)" - }, "wbw-audio": { "description": "Guna pilihan ini untuk mendengar setiap perkataan secara individu dengan hanya satu sentuhan pada perkataan yang tertentu!", "title": "Dengar transliterasi per kata dengan mengklik pada perkataan tersebut" diff --git a/locales/ms/question.json b/locales/ms/question.json index 2dbb4a1f96..50b54f4c19 100644 --- a/locales/ms/question.json +++ b/locales/ms/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Soalan dan Jawapan berkaitan dengan ", - "question": "soalan" + "question": "soalan", + "questions-meta-desc": "Terokai jawapan yang dipercayai untuk memperdalam pemahaman anda tentang Al-Quran." } diff --git a/locales/ms/quick-links.json b/locales/ms/quick-links.json index b5f080f616..219aece344 100644 --- a/locales/ms/quick-links.json +++ b/locales/ms/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "Tentang Al-Quran", "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Yesus dalam Al-Quran", "kahf": "Surah Al Kahf", "mulk": "Surah Al Mulk", "muzzammil": "Surah Al Muzzammil", @@ -8,5 +9,6 @@ "rahman": "Surah Ar-Rahman", "sunnah": "Ayat tentang Sunnah", "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Apa itu Ramadhan?", "yaseen": "Surah Yaseen" } diff --git a/locales/ms/quran-reader.json b/locales/ms/quran-reader.json index 69223a05f7..3d9ae091c5 100644 --- a/locales/ms/quran-reader.json +++ b/locales/ms/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Permulaan Hizb", "include-translator": "Sertakan nama penterjemah?", "juz-beginning": "Permulaan Juz", + "lessons-desc": "Baca dan kongsi pelajaran Al-Quran Ayah {{ayahNumber}} Surah {{surahName}}", + "lessons-disclaimer": "Pelajaran adalah pandangan peribadi dan tafsiran al-Quran. Mereka tidak dimaksudkan untuk dianggap berwibawa.", + "lessons-not-available": "Tiada pelajaran yang disemak untuk ayat ini", "mad-2": "Maad 2 saat", "mad-2-4-6": "Dibenarkan Maad 2 atau 4 atau 6 saat", "mad-4-5": "Maad yang diperlukan 4 atau 5 saat", diff --git a/locales/ms/radio.json b/locales/ms/radio.json index 91860bc0cb..103af67f96 100644 --- a/locales/ms/radio.json +++ b/locales/ms/radio.json @@ -22,5 +22,6 @@ "pause-radio": "Hentikan Radio", "play-radio": "Mainkan Radio", "radio-desc": "Dengarkan bacaan Al-Quran yang indah tanpa henti oleh pelbagai qari.", - "reciter-stations": "Stesen bacaan para Qari" + "reciter-stations": "Stesen bacaan para Qari", + "station": "Stesen" } diff --git a/locales/ms/reading-goal.json b/locales/ms/reading-goal.json index 0532b931ce..053bd33450 100644 --- a/locales/ms/reading-goal.json +++ b/locales/ms/reading-goal.json @@ -7,6 +7,7 @@ "create-plan": "Buat rancangan", "create-reading-goal": "Cipta Matlamat", "daily-progress": "Kemajuan Harian", + "daily-progress-completed": "Selesai! 🎉", "daily": { "description": "Matlamat anda akan ditetapkan semula setiap hari", "title": "Matlamat harian" @@ -40,6 +41,7 @@ "description": "Adakah matlamat anda perlu ditetapkan semula setiap hari atau setiap bilangan hari? Jangan risau, kami akan menjejaki kemajuan anda tanpa mengira kekerapan yang anda pilih.", "title": "Pilih kekerapan untuk matlamat anda" }, + "goal-completed": "Matlamat Selesai! 🎉 ", "goal-done": { "description": "Sebarang bacaan tambahan masih akan direkodkan", "title": "Anda telah melengkapkan matlamat hari ini" @@ -81,12 +83,16 @@ "time-goal": "membaca {{time}} al-Quran" }, "reading-goal": "Matlamat Membaca", + "reading-goal-description": "Adakah anda merasa sukar untuk mengekalkan konsistensi dengan matlamat membaca Al-Quran anda?

    Perjalanan Pertumbuhan Al-Quran ialah ciri dinamik yang dibangunkan untuk membantu anda kekal konsisten dalam perjalanan anda dengan Al-Quran. Sama ada anda menyasarkan untuk membaca 10 minit sehari, menghabiskan satu Juz dalam sebulan, atau menghabiskan keseluruhan Al-Quran dalam setahun, dsb., Quran.com kini boleh membantu anda menetapkan matlamat tersuai dan menjejaki coretan bacaan harian anda, sambil menyesuaikan diri semasa anda membuat kemajuan. Ia adalah percuma untuk digunakan dan kami berharap ia akan membantu anda kekal bermotivasi untuk mencapai matlamat anda!", "reading-goal-label": "Anda berada di", + "reading-goal-title": "Memperkenalkan Kembara Pertumbuhan Al-Quran", "recommended": "Disyorkan", "remaining": "Berbaki untuk hari ini", + "remaining-base": "yang tinggal", "remaining-days": { "other": "{{days}} hari lagi" }, + "set-a-new-goal": "Tetapkan Matlamat baharu", "set-reading-goal-success": "Matlamat membaca anda telah berjaya ditetapkan.", "start-journey": "Mulakan pengembaraan anda!", "start-reading": "Mula membaca", diff --git a/locales/ms/support.json b/locales/ms/support.json index a6fa46149f..7d58ee85b0 100644 --- a/locales/ms/support.json +++ b/locales/ms/support.json @@ -7,11 +7,9 @@ "donate-q": "Bagaimana saya boleh menderma?", "download-a": "Malangnya, tidak. Kami tidak menyediakan fungsi untuk memuat turun laman web kami atau Al-Quran ke komputer anda buat waktu ini. Walau bagaimanapun, anda boleh memuat turun aplikasi mudah alih kami untuk bacaan luar talian.", "download-q": "Bolehkah saya memuat turun Quran.com ke komputer saya?", - "fiqh-a": "Quran.com ialah alat membaca, mendengar dan belajar dalam talian. Pasukan di belakang Quran.com terdiri daripada jurutera perisian, pereka bentuk dan pengurus produk. Malangnya, itu adalah batasan kemahiran kami, maka kami tidak mempunyai ulama, imam atau ustaz dan ustazah sebagai sebahagian daripada pasukan untuk membantu soalan berkaitan Islam, Fiqah atau Fatwa. Kami cuba menahan diri daripada menjawab mana-mana soalan yang diajukan dan menasihati anda untuk bercakap dengan imam di kawasan tempatan anda samaada di masjid atau dengan para asatizah.", - "fiqh-q": "Soalan berkaitan Islam/ Fiqah / Fatwa", "header": "Bantuan dan Maklum Balas", "main-desc": "Sila semak FAQ untuk melihat sama ada soalan anda telah dijawab. Jika perlu, anda boleh <0> hubungi kami & kami akan melakukan yang terbaik untuk menghubungi anda secepat mungkin, namun sila ambil maklum bahawa kami mempunyai pasukan yang kecil, maka harap anda boleh bersabar dan memahami situasi kami.", - "mobile-a": "Ya! Sila lawati <0> laman web aplikasi digital kami untuk mendapatkan maklumat lebih lanjut.", + "mobile-a": "Ya! Sila lawati <0>Quran untuk Android atau <1>Quran iOS untuk memuat turun Apl", "mobile-q": "Adakah Quran.com mempunyai aplikasi mudah alih?", "other-languages-a": "Untuk menukar kepada bahasa pilihan anda, terdapat menu drop-down di sudut kanan atas pada setiap halaman (sudut kiri atas pada bahasa kanan-ke-kiri). Gunakan drop-down menu ini untuk memilih bahasa pilihan anda.", "other-languages-q": "Bolehkah saya ke seluruh halaman web dalam bahasa lain?", diff --git a/locales/nl/about.json b/locales/nl/about.json index 11a81ea105..9dee3b8f93 100644 --- a/locales/nl/about.json +++ b/locales/nl/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Dit project zou niet mogelijk zijn geweest zonder de vele open source bibliotheken en projecten die we hebben gebruikt:", - "lokalize": "<0>Lokalize<\/0>: Een computerondersteund vertaalsysteem dat zich richt op productiviteit en kwaliteitsborging en een naadloze lokalisatieworkflow biedt.", - "quran-align": "<0>Collin Fair<\/0>: Een hulpmiddel voor het produceren van woordprecieze segmentatie van opgenomen koranrecitatie.", - "quran-complex": "<0>QuranComplex<\/0>: King Fahd Glorious Qur'an Printing Complex is een leider in het dienen van de Glorious Qur'an en zijn wetenschappen, het vertalen van de betekenissen ervan en het beschermen van de korantekst tegen vervorming, door optimaal gebruik van geavanceerde technologieën op het gebied van printen, audio-opnames, elektronische publicaties en digitale toepassingen.", - "quran-enc": "<0>QuranEnc<\/0>: Een portaal met gratis en betrouwbare vertalingen van de betekenissen en exegese van de nobele Koran in vele wereldtalen.", - "tanzil": "<0>Tanzil<\/0>: Een internationaal koranproject gericht op het leveren van een zeer geverifieerde nauwkeurige korantekst.", - "title": "Credits", - "vercel": "<0>Vercel<\/0>: is een implementatie- en samenwerkingsplatform voor frontend-ontwikkelaars waarbij de frontend-ontwikkelaar op de eerste plaats komt en hen uitgebreide tools geeft om hoogwaardige websites en applicaties te bouwen.", - "zekr": "<0>Zekr<\/0>: Een open platform Koran-studietool om te bladeren en onderzoek te doen naar de Koran" - }, - "main-description": "Quran.com is opgericht in 1995. De website is bedoeld om het voor iedereen gemakkelijk te maken om de Koran te lezen, te bestuderen en te leren. Het project is open source en is gebouwd als een samenwerking tussen kernteamleden en het <0>Tarteel-team<\/0>." -} \ No newline at end of file + "credits": { + "desc": "Wij willen graag onze dank betuigen aan iedereen die dit project heeft gesteund en eraan heeft bijgedragen. Zo is de Koran voor miljoenen mensen over de hele wereld toegankelijk geworden.", + "lokalize": "<0>Lokalize: Een computerondersteund vertaalsysteem dat zich richt op productiviteit en kwaliteitsborging en een naadloze lokalisatieworkflow biedt.", + "quran-align": "<0>Collin Fair: Een hulpmiddel voor het produceren van woordnauwkeurige segmentatie van opgenomen Koranrecitaties.", + "quran-complex": "<0>QuranComplex: King Fahd Glorious Qur'an Printing Complex is een leider in het dienen van de Glorieuze Koran en de bijbehorende wetenschappen, het vertalen van de betekenissen ervan en het beschermen van de Korantekst tegen vervorming, door het optimaal gebruik van geavanceerde technologieën op het gebied van drukken, audio-opnamen, elektronische publicatie en digitale toepassingen.", + "quran-enc": "<0>QuranEnc: Een portaal met gratis en betrouwbare vertalingen van de betekenissen en uitleg van de edele Koran in vele wereldtalen.", + "tanzil": "<0>Tanzil: Een internationaal Koranproject gericht op het leveren van een uiterst geverifieerde, nauwkeurige Korantekst.", + "tarteel": "<0>Tarteel: Een door AI aangestuurde Koran-memorisatie-app. Deze is ontworpen om je te helpen slimmer te memoriseren, of je nu naar een vers zoekt, je voortgang bijhoudt of je recitatie volgt.", + "title": "Credits", + "vercel": "<0>Vercel: is een implementatie- en samenwerkingsplatform voor frontendontwikkelaars dat de frontendontwikkelaar op de eerste plaats zet en hen uitgebreide hulpmiddelen biedt om websites en applicaties met hoge prestaties te bouwen.", + "zekr": "<0>Zekr: Een open platform Koran-studietool voor het doorbladeren en onderzoeken van de Koran" + }, + "global-effort": { + "desc": "Miljoenen mensen van over de hele wereld vertrouwen op Quran.com als hun primaire digitale Koranbron. Of ze nu komen om te reciteren, reflecteren, memoriseren of studeren, ze delen een gemeenschappelijk doel: een oprecht verlangen om verbinding te maken met de woorden van Allah. \\n Terwijl we blijven groeien, blijven we toegewijd om ervoor te zorgen dat Quran.com een vertrouwde, toegankelijke en prachtig ontworpen ruimte blijft voor iedereen die zich wil bezighouden met de Koran.", + "title": "Een wereldwijde inspanning" + }, + "key-features": { + "desc": "Quran.com is ontworpen om elke fase van betrokkenheid bij de Koran te ondersteunen, van lezen en memoriseren tot studeren en reflecteren. Onze functies omvatten:", + "features": [ + "Gebruiksvriendelijke Koraninterface – Een heldere en intuïtieve leeservaring op elk apparaat.", + "Meerdere vertalingen en tafsir – Toegang tot vertalingen in meerdere talen, samen met tafsir.", + "Audiorecitaties – Luister naar hoogwaardige recitaties van de wereldberoemde Qaris, met de mogelijkheid om woord voor woord mee te volgen.", + "Geavanceerd zoeken en navigeren – Vind direct verzen op onderwerp of trefwoorden in de hele Koran.", + "Ayah-bladwijzers en notities – Sla verzen op en schrijf persoonlijke reflecties voor later gebruik.", + "QuranReflect-integratie – Betrek een wereldwijde gemeenschap bij de reflecties en inzichten die door geleerden en individuen worden gedeeld.", + "Lezen voortgang bijhouden en doelen – Houd uw dagelijkse doelen en leesgeschiedenis bij", + "API's voor ontwikkelaars – Gratis toegang tot content en functies voor islamitische apps en R&D.", + "En nog veel meer, Alhamdullilah." + ], + "title": "Belangrijkste kenmerken en aanbiedingen" + }, + "main-description": "Sinds de oprichting in 1995 heeft Quran.com zich ingezet om de Koran voor iedereen beschikbaar te maken op een manier die duidelijk, authentiek en gemakkelijk te gebruiken is. Elke dag wenden miljoenen mensen wereldwijd zich tot Quran.com om de Koran te lezen, te luisteren, te bestuderen en erover na te denken, of ze nu levenslange studenten, geleerden of net aan hun reis beginnen.", + "our-mission": { + "desc": "De Koran is bedoeld om te worden gelezen, begrepen en over nagedacht. Onze missie is om barrières voor toegang weg te nemen en individuen en gemeenschappen te versterken door een betrouwbare, goed ontworpen en diep verrijkende Koranische ervaring te bieden. We streven ernaar om een vertrouwde bron te zijn voor iedereen die zich met de Koran wil bezighouden, geleid door de principes van nauwkeurigheid, helderheid en oprechtheid.", + "title": "Onze Missie" + }, + "who-we-are": { + "desc": "Quran.com is een waqf (stichting), opgericht als een publiek trust om ervoor te zorgen dat de Koran voor iedereen toegankelijk blijft, gratis en zonder commerciële belangen. Het wordt beheerd door Quran.Foundation, een 501(c)(3) non-profitorganisatie, die Quran.com in stand houdt en ontwikkelt als onderdeel van haar missie om hoogwaardige, authentieke Koranische bronnen aan de wereld te leveren. Onze toewijding is om de Koran en haar lezers te dienen met uitmuntendheid, oprechtheid en verantwoordelijkheid.", + "title": "Wie we zijn" + } +} diff --git a/locales/nl/apps.json b/locales/nl/apps.json index 73bf564259..3cee1ffd3c 100644 --- a/locales/nl/apps.json +++ b/locales/nl/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Door de kernontwikkelaars van Quran.com komen de prachtige en advertentievrije mushaf iOS- en Android-apps. Het is nu gemakkelijker om onderweg de Koran te lezen, uit het hoofd te leren en naar je favoriete voordragers te luisteren.", - "tarteel-desc": "Tarteel is de eerste Koran-app die AI-tools gebruikt om te communiceren met je recitatie en om fouten te markeren. Als een stemgestuurde Koran-metgezel in de palm van je handen, werkt Tarteel intuïtief om je te helpen de Koran met vertrouwen te lezen, reciteren, onthouden en begrijpen! <0><\/0><0><\/0> Tarteel is er trots op een kernontwikkelaar van Quran.com te zijn en tevens lid van hun raad van bestuur." -} \ No newline at end of file + "quran-desc": "Door de kernontwikkelaars van Quran.com komen de prachtige en advertentievrije mushaf iOS- en Android-apps. Het is nu gemakkelijker om onderweg de Koran te lezen, uit het hoofd te leren en naar je favoriete voordragers te luisteren." +} diff --git a/locales/nl/common.json b/locales/nl/common.json index 421ca3ba21..597b031fea 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigatie", "no-nav-results": "Geen navigatieresultaten", - "placeholder": "Wat wil je lezen?", - "powered-by": "Gesproken zoekopdracht mogelijk gemaakt door Tarteel.ai", + "placeholder": "Doorzoek de Koran...", "recent-navigations": "Recente navigatie", "search-by-voice": "Zoek bij stem", "try-navigating": "Probeer te navigeren naar" @@ -122,9 +121,11 @@ } }, "continue": "Doorgaan met", + "contribute-to-our-mission": "Draag bij aan onze missie", "copied": "gekopieerd", "copied-to-clipboard": "Gekopieerd naar het klembord", "copy": "Kopiëren", + "copylink": "Link kopiëren", "counter": { "decrease": "Verminderen", "increase": "Toename" @@ -134,6 +135,7 @@ "developers": "ontwikkelaars", "display": "Weergave", "donate": "Doneren", + "donate-now": "Doneer nu", "donate_monthly": "Doneer maandelijks", "donate_once": "Doneer eenmalig", "edit": "Bewerking", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} Ayahs", "ranges-wrong-order": "Het beginvers moet vóór het eindvers staan." }, + "errors": { + "account-banned": "Sorry, uw account is geblokkeerd. Neem contact op met Quran.Foundation", + "badRequest": "*Ongeldige aanvraag", + "banned": "*Sorry, uw account is geblokkeerd. Neem contact op met Quran.Foundation", + "confirm": "*Bevestig wachtwoord komt niet overeen met het wachtwoord", + "email": "*Ongeldig e-mailadres!", + "exactLength": "*Waarde moet exacte lengte zijn", + "expiredToken": "*Dit token is verlopen", + "forgot-password-failed": "Het is niet gelukt om de e-mail voor het opnieuw instellen van het wachtwoord te versturen. Probeer het opnieuw.", + "immutable": "*Deze waarde kan niet worden gewijzigd", + "invalid": "*Deze {{fieldName}} is ongeldig", + "invalidEmailOrPassword": "*Ongeldig e-mailadres of wachtwoord", + "max": "* {{fieldName}} moet kleiner zijn dan of gelijk zijn aan {{max}} cijfers", + "min": "* {{fieldName}} moet meer dan of gelijk zijn aan {{min}} cijfers", + "name": "* {{fieldName}} mag alleen uit letters en cijfers bestaan", + "notFound": "*Niet gevonden", + "required": "* {{fieldName}} ontbreekt!", + "reset-password-failed": "Wachtwoord resetten mislukt. Probeer het opnieuw.", + "signin-failed": "Aanmelden mislukt. Probeer het opnieuw.", + "signup-failed": "Registratie mislukt. Probeer het opnieuw.", + "taken": "* {{fieldName}} bestaat al!", + "usedToken": "*Dit token is al gebruikt", + "username": "* {{fieldName}} accepteert alleen onderstrepingstekens en letters", + "verification-code-invalid": "Deze verificatiecode is ongeldig", + "verification-code-length": "Verificatiecode moet {{length}} cijfers lang zijn", + "verification-failed": "Verificatie mislukt. Probeer het opnieuw.", + "verification-resend-failed": "Het opnieuw verzenden van de verificatiecode is mislukt" + }, "exciting-updates": "Spannende updates", "feedback": "Feedback", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Vertaling lettergrootte" }, "footer": { - "description": "Quran.com is een Sadaqah Jariyah. We hopen het voor iedereen gemakkelijk te maken om de Edele Koran te lezen, te bestuderen en te leren. De Edele Koran heeft vele namen, waaronder Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr en Al-Noor.", + "description": "Quran.com is een vertrouwd platform dat door miljoenen mensen wereldwijd wordt gebruikt om de Koran in meerdere talen te lezen, te doorzoeken, te beluisteren en erover na te denken. Het biedt vertalingen, tafsir, recitaties, woord-voor-woordvertalingen en hulpmiddelen voor diepere studie, waardoor de Koran voor iedereen toegankelijk is.

    Als Sadaqah Jariyah is Quran.com toegewijd om mensen te helpen een diepe verbinding met de Koran te maken. Ondersteund door Quran.Foundation, een 501(c)(3) non-profitorganisatie, blijft Quran.com groeien als een gratis en waardevolle bron voor iedereen, Alhamdullilah”", "hiring": "Wij werven aan! Sluit je aan bij het team van QuranFoundation en draag bij aan onze missie. Solliciteer nu! ", "rights": "Alle rechten voorbehouden", - "title": "Lees, bestudeer en leer de Edele Koran." + "title": "Lees, luister, zoek en denk na over de Koran" }, "form": { "body": "Lichaam", "code": "Verificatie code", + "confirm-password": "Bevestig wachtwoord", "email": "E-mail", "firstName": "Voornaam", "lastName": "Achternaam", - "title": "Titel" + "password": "Wachtwoord", + "title": "Titel", + "username": "Gebruikersnaam", + "verification-code": "Verificatiecode" }, "from": "Van", + "fundraising-share-title": "Deel Quran.com Fondsenwerving", "fundraising-sticky-banner": { "cta": "Doneer", "title": "Geef tijdens de mooiste dagen!" @@ -217,6 +252,7 @@ "learn-more": "Leer meer", "learning-plans": "Leerplannen", "less": "Minder", + "lessons": "Lessen", "loading": "Bezig met laden", "login": "Log in", "logout": "Uitloggen", @@ -250,6 +286,7 @@ "off": "Uit", "oldest": "Oudste", "on": "Op", + "our-projects": "Onze projecten", "page": "Bladzijde", "pages": "Pagina's", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} van {{totalNumberOfResults}} zoekresultaten", @@ -272,6 +309,7 @@ "privacy": "Privacy", "product-updates": "Productupdates", "profile": "Profiel", + "projects-desc": "Non-profitprojecten die eigendom zijn van, beheerd worden door of gesponsord worden door Quran.Foundation", "q-reflect": "KoranReflect", "quran-com": "koran.com", "quran-radio": "Koran Radio", @@ -287,6 +325,7 @@ "reciters": "voordragers", "reflect": "Reflecteren", "reflections": "Reflecties", + "reflections-and-lessons": "Reflecties en lessen", "remove": "Verwijderen", "rename": "Hernoemen", "retry": "Opnieuw proberen", @@ -296,10 +335,12 @@ "save-to-collection": "Opslaan in collectie", "search-for": "Zoeken naar '{{searchQuery}}'", "search-results": "{{count}} zoekresultaten", + "search-results-no-count": "Zoekresultaten", "search": { "filters": "Filters", "hint": "Probeer te zoeken naar", "jump-to": "Spring naar", + "more-results": "Meer resultaten", "no-results": "geen resultaten gevonden", "no-results-suggestion": "We konden geen overeenkomende zoekresultaten vinden voor \" {{searchQuery}} \". probeer een ander trefwoord te zoeken.", "popular": "Populaire zoekopdrachten", @@ -340,8 +381,10 @@ "search-juz": "Zoek Juz", "search-page": "Zoekpagina", "search-surah": "zoek soera", + "search-verse": "Zoek Vers", "try-navigating-with": "Tip: probeer te navigeren met" }, + "sign-in": "Aanmelden", "sitemap": "Sitemap", "sort": { "ascending": "Oplopend", @@ -362,10 +405,6 @@ "tafsirs-desc": "Lees verschillende Tafsirs van Ayah {{ayahNumber}} van Surah {{surahName}} door vertrouwde Tafsir-geleerden", "title": "Tafsir" }, - "tarteel": { - "app": "Tarteel-app", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Algemene voorwaarden", "theme": "Thema", "themes": { @@ -400,13 +439,13 @@ "view": "Weergave", "voice": { "ask-permission": "Schakel microfoontoestemming in om gesproken zoekopdrachten te gaan gebruiken", - "error": "Er is een fout opgetreden, probeer het later opnieuw. Of download de", - "no-permission": "Het lijkt erop dat u de microfoonrechten niet hebt ingeschakeld. Schakel de microfoonrechten in en probeer het opnieuw of download de", - "not-supported": "Het lijkt erop dat uw browser geen microfoon ondersteunt. Probeer een andere browser of download de", + "error": "Er is een fout opgetreden. Probeer het later opnieuw.", + "no-permission": "Het lijkt erop dat u de microfoonrechten niet hebt ingeschakeld. Schakel de microfoonrechten in en probeer het opnieuw.", + "not-supported": "Het lijkt erop dat uw browser geen microfoon ondersteunt. Probeer een andere browser.", "suggest": "Begin alsjeblieft met reciteren en je vers zal verschijnen.", "suggest-subtitle": "Reciteer een vers in het Arabisch, en het vers zal verschijnen", "suggest-title": "Reciteer nu", - "voice-search-powered-by": "Gesproken zoekopdracht Mogelijk gemaakt door" + "voice-search-powered-by": "Stem zoeken Aangedreven door" }, "wbw": "Woord voor woord", "wbw-lang-summary": "Woord voor woord vertalingsbron: {{source}} . Deze bron is onafhankelijk van de selectie van de versvertaling.", diff --git a/locales/nl/developers.json b/locales/nl/developers.json index 19da347094..4b6f287c18 100644 --- a/locales/nl/developers.json +++ b/locales/nl/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Quran.com-team", - "header": "Ontwikkelingshulp", - "issues-cta": "Als je vragen hebt of contact wilt opnemen met de beheerders, schrijf dan gewoon een probleem! We komen zo snel mogelijk bij je terug, inshAllah.", - "issues-guide": "Meestal gebruiken we <0> Github-projecten <\/0> als bron voor waar we nu aan moeten werken, wat er gaat gebeuren en welke bugs er zijn die moeten worden opgelost. Bijvoorbeeld <1> deze url <\/1> heeft een lijst met bugs, dingen waar we hulp bij nodig hebben en aankomende functies.", - "main-desc": "Asalamu Alykom, Allereerst hartelijk dank voor uw interesse om ons te helpen Quran.com en zijn projecten te ontwikkelen. We werken graag met je samen!", - "projects": { - "all": "We hebben een aantal projecten die allemaal op Github worden gehost. Je vindt ze allemaal <0> hier <\/0> . Maar om ze te schetsen:", - "q-android": "<0>Koran Android<\/0>", - "q-api": "<0> Quran.com API <\/0> - geschreven in Ruby on Rails.", - "q-api-docs": "<0> Quran.com API Docs <\/0> - Ons API docs portaal.", - "q-audio": "<0> Quranic Audio <\/0> en <1> Quranic Audio mobiele apps <\/1>", - "q-audio-segments": "<0> Koran Audio Segmenten <\/0>", - "q-ios": "<0>Koran iOS<\/0>", - "q-next": "<0> Quran.com Frontend <\/0> - geschreven in Next.js.", - "q-v2": "<0> Quran.com <\/0> - geschreven in Ruby on Rails." - }, - "sub-main-desc": "Wij zijn een team van ontwikkelaars, ontwerpers, product managers en denkers die samenwerken met het <0>Tarteel<\/0> team om de beste online Koran leeservaring te leveren. Alhamdulilah we zijn gezegend om te werken voor een aantal geweldige bedrijven over de hele wereld - en voelen dat dit het minste is wat we kunnen doen om onze Ummah vooruit te helpen in het leren en bestuderen van hun religie. Werken aan Quran.com is erg bevredigend en moge Allah ons allen belonen (en u belonen) voor onze inspanningen.", - "thanks": "Bedankt voor het lezen! Ik kijk ernaar uit om je wat code te zien plegen!" -} \ No newline at end of file + "footer": "- Quran.com-team", + "header": "Ontwikkelingshulp", + "issues-cta": "Als je vragen hebt of contact wilt opnemen met de beheerders, schrijf dan gewoon een probleem! We komen zo snel mogelijk bij je terug, inshAllah.", + "issues-guide": "Meestal gebruiken we <0> Github-projecten als bron voor waar we nu aan moeten werken, wat er gaat gebeuren en welke bugs er zijn die moeten worden opgelost. Bijvoorbeeld <1> deze url heeft een lijst met bugs, dingen waar we hulp bij nodig hebben en aankomende functies.", + "main-desc": "Asalamu Alykom, Allereerst hartelijk dank voor uw interesse om ons te helpen Quran.com en zijn projecten te ontwikkelen. We werken graag met je samen!", + "projects": { + "all": "We hebben een aantal projecten die allemaal op Github worden gehost. Je vindt ze allemaal <0> hier . Maar om ze te schetsen:", + "q-android": "<0>Koran Android", + "q-api": "<0> Quran.com API - geschreven in Ruby on Rails.", + "q-api-docs": "<0> Quran.com API Docs - Ons API docs portaal.", + "q-audio": "<0> Quranic Audio en <1> Quranic Audio mobiele apps ", + "q-audio-segments": "<0> Koran Audio Segmenten ", + "q-ios": "<0>Koran iOS", + "q-next": "<0> Quran.com Frontend - geschreven in Next.js.", + "q-v2": "<0> Quran.com - geschreven in Ruby on Rails." + }, + "thanks": "Bedankt voor het lezen! Ik kijk ernaar uit om je wat code te zien plegen!" +} diff --git a/locales/nl/home.json b/locales/nl/home.json index c64dc20832..d1b2c7034c 100644 --- a/locales/nl/home.json +++ b/locales/nl/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Bereik uw Korandoelen", + "begin": "Beginnen", + "chapters-and-verses": "Hoofdstukken en verzen", + "continue-read": "Lees verder", + "explore-topics": "Onderwerpen verkennen", + "first-time-reading": "Nieuw in de Koran? Begin hier ", + "know-someone": "Groei met ons mee deze Ramadan ", + "learning-plan": "Leerplannen", + "listen-to-radio": "Luister naar Koran Radio", + "my-quran": "Mijn Koran", + "navigate-quran": "Navigeer door de Koran", "no-bookmarks": "U heeft nog geen bladwijzers", "no-recently-read": "Je hebt nog geen leessessies", "noble-quran": "De Edele Koran", + "popular": "Populair", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Koran groeireis" }, - "ramadan-activities-cta": " Volg de Global Quranic Calendar <\/b> voor wekelijkse lezingen, inspirerende podcasts en een oproep tot reflectie! <\/link>", + "qr-community": "Lees de aanbevolen verzen en reflecties van vandaag", + "ramadan-activities-cta": " Volg de Global Quranic Calendar voor wekelijkse lezingen, inspirerende podcasts en een oproep tot reflectie! ", + "ramadan": { + "header": "Hulpmiddelen om uw verbinding met de Koran te verdiepen", + "title": "Klaar voor de Ramadan?" + }, "read-juz": "Lees Juz", "recently-read": "Recent gelezen", - "revelation-order-disclaimer": "Deze weergave toont de chronologische volgorde van soera's in de koran op basis van wanneer ze werden geopenbaard aan de profeet Mohammed ﷺ <\/hover> . De chronologie is een onderwerp van wetenschappelijke mening en sommige soera's zijn op verschillende tijdstippen in delen geopenbaard. De volgorde hier is gebaseerd op het werk van Tanzil.net <\/link> . [Opmerking: de samengestelde Mushaf-volgorde van al-Fatiha tot al-Nas is een kwestie van consensus.]", + "revelation-order-disclaimer": "Deze weergave toont de chronologische volgorde van soera's in de koran op basis van wanneer ze werden geopenbaard aan de profeet Mohammed . De chronologie is een onderwerp van wetenschappelijke mening en sommige soera's zijn op verschillende tijdstippen in delen geopenbaard. De volgorde hier is gebaseerd op het werk van Tanzil.net . [Opmerking: de samengestelde Mushaf-volgorde van al-Fatiha tot al-Nas is een kwestie van consensus.]", + "see-more-learning-plans": "Meer zien", + "set-custom-goal": "Stel een doel", + "share-quran": { + "description": "Help de Koran te verspreiden onder nieuwe leerlingen", + "title": "Deel de Koran!" + }, + "start-read": "Begin met lezen", + "stay-consistent": "Volg Streaks, Creëer Aangepaste Doelen, Blijf Consistent", "tab": { "bookmarks": "Bladwijzers", "popular": "Populair" diff --git a/locales/nl/learn.json b/locales/nl/learn.json index 804b3fce22..ced54f9278 100644 --- a/locales/nl/learn.json +++ b/locales/nl/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Bedankt voor uw feedback!", "your-feedback": "Uw feedback" }, + "help-about-reflection": "Help over reflectiefunctie", "learn-duration": "Duur", + "learn-more": "Meer informatie", "learning-plan-material": "Materiaal leerplan", "learning-plan-meta-desc": "Dit leerplan zal helpen de manier waarop u met de Koran omgaat, te transformeren. Begin vandaag nog aan uw reis!", "learning-plans-desc": "Vergroot uw kennis met eenvoudig te volgen lessen die ervoor zorgen dat u groeit op uw reis met de Koran.

    Start vandaag nog met een leerplan! Je voortgang wordt bijgehouden totdat je de finish bereikt.", @@ -34,9 +36,12 @@ "next-lesson": "Volgende les", "not-enrolled": "Je bent nog niet ingeschreven voor het Leerplan .", "prev-lesson": "Vorige les", + "reflection-description-1": "Als u op \"Add Reflection\" klikt, komt u op QuranReflect, een platform voor het delen van persoonlijke reflecties op de Koran. In tegenstelling tot Tafsir (wetenschappelijke interpretatie) zijn reflecties persoonlijke inzichten en ervaringen gerelateerd aan de verzen.", + "reflection-description-2": "Als u een openbaar bericht plaatst, wordt uw reflectie beoordeeld door het moderatieteam en zichtbaar voor de QuranReflect-community.", "start-learning": "Begin met leren", "tabs": { "main": "Belangrijkste details", "syllabus": "Syllabus" - } + }, + "what-happens-when-you-click-add-reflection": "Wat gebeurt er als je op 'Reflectie toevoegen' klikt?" } diff --git a/locales/nl/login.json b/locales/nl/login.json index 2421070172..d36810ced6 100644 --- a/locales/nl/login.json +++ b/locales/nl/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Wachtend op bevestiging", + "back": "Rug", + "back-to-login": "Terug naar Inloggen", + "check-email-title": "Controleer uw e-mail om uw aanmelding te voltooien", + "confirm": "Bevestigen", + "confirm-new-password-placeholder": "Bevestig nieuw wachtwoord", + "confirm-password-placeholder": "Bevestig wachtwoord", + "continue": "Doorgaan", "continue-apple": "Doorgaan met Apple", "continue-email": "Doorgaan met e-mail", "continue-facebook": "Ga verder met Facebook", "continue-google": "Ga verder met Google", "email-placeholder": "E-mailadres", + "error": { + "email-required": "E-mailadres ontbreekt!", + "invalid-credentials": "Ongeldig e-mailadres of wachtwoord", + "invalid-email": "Ongeldig e-mailformaat!", + "login-failed": "Inloggen mislukt. Probeer het opnieuw.", + "password-required": "Wachtwoord ontbreekt!" + }, + "errors": { + "account-banned": "Sorry, uw account is geblokkeerd. Neem contact op met Quran.Foundation", + "badRequest": "*Ongeldige aanvraag", + "banned": "*Sorry, uw account is geblokkeerd. Neem contact op met Quran.Foundation", + "confirm": "*Bevestig wachtwoord komt niet overeen met het wachtwoord", + "email": "*Ongeldig e-mailadres!", + "exactLength": "*Waarde moet exacte lengte zijn", + "expiredToken": "*Dit token is verlopen", + "forgot-password-failed": "Het is niet gelukt om de e-mail voor het opnieuw instellen van het wachtwoord te versturen. Probeer het opnieuw.", + "immutable": "*Deze waarde kan niet worden gewijzigd", + "invalid": "*Deze {{fieldName}} is ongeldig", + "invalidEmailOrPassword": "*Ongeldig e-mailadres of wachtwoord", + "max": "* {{fieldName}} moet kleiner zijn dan of gelijk zijn aan {{max}} cijfers", + "min": "* {{fieldName}} moet meer dan of gelijk zijn aan {{min}} cijfers", + "name": "* {{fieldName}} mag alleen uit letters en cijfers bestaan", + "notFound": "*Niet gevonden", + "required": "* {{fieldName}} ontbreekt!", + "reset-password-failed": "Wachtwoord resetten mislukt. Probeer het opnieuw.", + "signin-failed": "Aanmelden mislukt. Probeer het opnieuw.", + "signup-failed": "Registratie mislukt. Probeer het opnieuw.", + "taken": "* {{fieldName}} bestaat al!", + "usedToken": "*Dit token is al gebruikt", + "username": "* {{fieldName}} accepteert alleen onderstrepingstekens en letters", + "verification-code-invalid": "Deze verificatiecode is ongeldig", + "verification-code-length": "Verificatiecode moet {{length}} cijfers lang zijn", + "verification-failed": "Verificatie mislukt. Probeer het opnieuw.", + "verification-resend-failed": "Het opnieuw verzenden van de verificatiecode is mislukt" + }, "feature-1": "Volg uw doelen", "feature-2": "Houd leesstrepen aan", "feature-3": "Verzamelingen maken", "feature-4": "Synchroniseer uw gegevens tussen browsers", "feature-5": "En meer!", "feature-6": " Nieuw! Opmerkingen en reflecties", + "first-name-placeholder": "Voornaam", + "forgot-password": "Wachtwoord vergeten", + "forgot-password-description": "Voer uw e-mailadres in, dan sturen wij u instructies om uw wachtwoord opnieuw in te stellen.", + "forgot-password-success": "Wachtwoord reset e-mail verzonden! Controleer uw inbox.", + "forgot-password-title": "Wachtwoord vergeten?", + "last-name-placeholder": "Achternaam", "login-cta": "Inloggen of nu aanmelden:", "login-error": { "AuthenticationError": "Verificatie mislukt. Probeer het later opnieuw", + "BannedUserError": "Sorry, uw account is geblokkeerd. Neem contact op met Quran.Foundation.", "TokenExpiredError": "U bent uitgelogd, gelieve opnieuw in te loggen." }, "login-title": "Log in op Quran.com", + "new-password-placeholder": "Nieuw wachtwoord", "other-options": "Andere aanmeldingsopties", + "password-placeholder": "Wachtwoord", + "password-reset-success": "Wachtwoord opnieuw ingesteld!", + "password-rules": { + "lowercase": "Minimaal één kleine letter", + "max-length": "Maximaal 20 tekens", + "min-length": "Min. 8 tekens", + "number": "Minstens één nummer", + "special": "Minimaal één speciaal teken (!@#$%^&*_-)", + "uppercase": "Minimaal één hoofdletter" + }, "privacy-policy": "Het beschermen van uw privacy is onze prioriteit – Door u aan te melden, stemt u in met ons Privacybeleid en Algemene voorwaarden .", - "verify-code": "Controleer of de verstrekte beveiligingscode overeenkomt met de volgende tekst:" + "quran-text": "Koran", + "quran-title": "Koran.com", + "reflect-feature-1": "Denk na over de Koran", + "reflect-feature-2": "Groepen toevoegen", + "reflect-feature-3": "Interactie met anderen", + "reflect-feature-4": "En nog veel meer!", + "reset-password": "Wachtwoord opnieuw instellen", + "reset-password-success": "Wachtwoord opnieuw ingesteld!", + "set-new-password": "Stel een nieuw wachtwoord in", + "sign-in": "Aanmelden", + "sign-in-or-sign-up": "Meld je aan of registreer je", + "sign-up": "Aanmelden", + "unified-registration-1": "De uniforme registratie van ", + "unified-registration-2": "Koran.Foundation", + "unified-registration-3": ". U krijgt toegang tot de volgende websites ", + "unified-registration-4": "via uw aanmeldgegevens.", + "username-placeholder": "Gebruikersnaam", + "verification-code-instruction": "Voer de code in die in de e-mail staat om uw registratie te voltooien", + "verification-code-resend": "E-mail opnieuw verzenden", + "verification-code-resend-countdown": "Verificatie-e-mail opnieuw verzenden over {{seconds}} sec...", + "verification-code-sent": "Verificatiecode verzonden!", + "verification-code-sent-to": "We hebben zojuist een e-mail gestuurd naar", + "verification-code-spam-note": "Geen e-mail ontvangen? Controleer uw spamfolder", + "verify-code": "Controleer of de verstrekte beveiligingscode overeenkomt met de volgende tekst:", + "welcome-description-1": "De uniforme registratie van", + "welcome-description-2": ".Fundering", + "welcome-description-3": "Met uw inloggegevens krijgt u toegang tot de volgende websites.", + "welcome-title": "Welkom bij" } diff --git a/locales/nl/onboarding.json b/locales/nl/onboarding.json index 4ef010bec9..da187f115f 100644 --- a/locales/nl/onboarding.json +++ b/locales/nl/onboarding.json @@ -87,10 +87,6 @@ "description": "Kies uit verschillende vertalingen in meerdere talen. Tip: Vergelijk vertalingen door meerdere opties te selecteren", "title": "Vertalingen" }, - "voice-search": { - "description": "Tik op het microfoonpictogram en reciteer het vers waarnaar je zoekt. Snelle tip! Om te ontdekken waar iemand reciteert (bijvoorbeeld Taraweeh-gebeden), tikt u op het microfoonpictogram. Nadat een of twee verzen zijn gedetecteerd, drukt u op stop om de locatie te vinden", - "title": "Gesproken zoekopdracht (Tarteel)" - }, "wbw-audio": { "description": "Selecteer deze optie om elk woord afzonderlijk te beluisteren door simpelweg op het woord te klikken!", "title": "Luister naar de woord-voor-woord transliteratie door op het woord te klikken" diff --git a/locales/nl/question.json b/locales/nl/question.json index 914de902e3..6478bf875d 100644 --- a/locales/nl/question.json +++ b/locales/nl/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Vragen en antwoorden met betrekking tot ", - "question": "Vraag" + "question": "Vraag", + "questions-meta-desc": "Ontdek betrouwbare antwoorden om uw begrip van de Koran te verdiepen." } diff --git a/locales/nl/quick-links.json b/locales/nl/quick-links.json index 481cf87298..993fadaef0 100644 --- a/locales/nl/quick-links.json +++ b/locales/nl/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "Over de koran", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Doe mee met de Ramadan van Bezinning", - "rahman": "Surah Ar-Rahman", - "sunnah": "Verzen over de Soennah", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "Over de koran", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jezus in de Koran", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Doe mee met de Ramadan van Bezinning", + "rahman": "Surah Ar-Rahman", + "sunnah": "Verzen over de Soennah", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Wat is Ramadan?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/nl/quran-reader.json b/locales/nl/quran-reader.json index f59ec36b8d..6d011e0c8a 100644 --- a/locales/nl/quran-reader.json +++ b/locales/nl/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Begin van Hizb", "include-translator": "Naam van de vertaler toevoegen?", "juz-beginning": "begin van Juzo", + "lessons-desc": "Lees en deel Koranische lessen van Ayah {{ayahNumber}} van Soera {{surahName}}", + "lessons-disclaimer": "Lessen zijn persoonlijke inzichten en interpretaties van de Koran. Ze zijn niet bedoeld om als gezaghebbend te worden beschouwd.", + "lessons-not-available": "Er zijn geen beoordeelde lessen voor deze ayah", "mad-2": "Maad 2 seconden", "mad-2-4-6": "Toegestane Maad 2 of 4 of 6 seconden", "mad-4-5": "Noodzakelijk Maad 4 of 5 seconden", diff --git a/locales/nl/radio.json b/locales/nl/radio.json index 861c2a5d08..4c4dcc6d7b 100644 --- a/locales/nl/radio.json +++ b/locales/nl/radio.json @@ -1,26 +1,27 @@ { - "change": "Wijziging", - "curated-station": { - "juz-amma": { - "description": "Luister naar de laatste Juz van de Koran", - "title": "Juz Amma" - }, - "popular-recitations": { - "description": "Dagelijks samengestelde feed van recitaties", - "title": "Populaire recitaties" - }, - "surah-al-kahf": { - "description": "Luister naar Surah Alkahf bij herhaling", - "title": "Surah Al-Kahfi" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "De soera's van een verzameling voordragers", - "title": "Yaseen, Al-Waqiah, Al-Mulk" - } + "change": "Wijziging", + "curated-station": { + "juz-amma": { + "description": "Luister naar de laatste Juz van de Koran", + "title": "Juz Amma" }, - "curated-stations": "Beheerde stations", - "pause-radio": "Radio pauzeren", - "play-radio": "Radio afspelen", - "radio-desc": "Luister naar non-stop prachtige recitatie van de Heilige Koran door verschillende voordragers.", - "reciter-stations": "Voordragerstations" -} \ No newline at end of file + "popular-recitations": { + "description": "Dagelijks samengestelde feed van recitaties", + "title": "Populaire recitaties" + }, + "surah-al-kahf": { + "description": "Luister naar Surah Alkahf bij herhaling", + "title": "Surah Al-Kahfi" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "De soera's van een verzameling voordragers", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Beheerde stations", + "pause-radio": "Radio pauzeren", + "play-radio": "Radio afspelen", + "radio-desc": "Luister naar non-stop prachtige recitatie van de Heilige Koran door verschillende voordragers.", + "reciter-stations": "Voordragerstations", + "station": "Station" +} diff --git a/locales/nl/reading-goal.json b/locales/nl/reading-goal.json index e57ef55f74..677779dfde 100644 --- a/locales/nl/reading-goal.json +++ b/locales/nl/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Lees verder", - "continuous": { - "description": "Je doel berekent je voortgang over een periode van dagen", - "title": "Over een duur" - }, - "create-plan": "Plan maken", - "create-reading-goal": "Doel maken", - "daily-progress": "Dagelijkse voortgang", - "daily": { - "description": "Je doel wordt elke dag gereset", - "title": "Dagelijks doel" - }, - "day-x": "Dag {{day}}", - "days": "Dagen", - "duration": "Duur (dagen)", - "ending-chapter": "Einde soera", - "ending-verse": "Ayah beëindigen", - "examples-subtitle": "Hier is een lijst met gemeenschappelijke doelen. Je kunt ook je eigen doel maken.", - "examples-title": "Kies een vooraf ingesteld doel of maak je eigen doel", - "examples": { - "custom": { - "description": "Stel een aangepast doel in dat bij u past", - "title": "Aangepast" - }, - "khatm": { - "description": "Een klassiek Khatm-doelpunt. Lees 1 Juz per dag", - "title": "Lees de koran in 30 dagen" - }, - "time": { - "description": "Een eenvoudig beginnersvriendelijk doel", - "title": "Lees 10 minuten per dag" - }, - "year": { - "description": "Lees de koran het komende jaar in je eigen tempo", - "title": "Lees de Koran in een jaar" - } - }, - "frequency-tab": { - "description": "Moet uw doel elke dag of elk aantal dagen worden gereset? Maak je geen zorgen, we houden je voortgang bij, ongeacht de frequentie die je kiest.", - "title": "Kies een frequentie voor je doel" - }, - "goal-done": { - "description": "Eventuele extra metingen worden nog steeds geregistreerd", - "title": "Je hebt het doel van vandaag behaald" - }, - "goal-target": { - "description": "Hoeveel tijd, pagina's of verzen moet je lezen om je doel te bereiken?", - "title": "Stel een doel voor je doel" - }, - "goal-type": { - "description": "Moet uw doel gebaseerd zijn op tijd, pagina's of een aangepast bereik (dwz 3 juzs van de koran)?", - "title": "Kies een criterium voor je doel" - }, - "goal-types": { - "pages": { - "description": "Je doel wordt gebaseerd op pagina's", - "title": "Pagina's" - }, - "range": { - "description": "Je doel zal gebaseerd zijn op een aangepaste reeks verzen (dit kan een soera, een juz of zelfs de hele koran zijn)", - "title": "Aangepast bereik" - }, - "time": { - "description": "Je doel is gebaseerd op tijd", - "title": "Tijd" - } - }, - "plus-x-more-days": { - "one": "+ nog {{days}} dag", - "other": "+ nog {{days}} dagen" - }, - "preview-schedule": { - "description": "Zo ziet je doel eruit. Je kunt het later altijd wijzigen.", - "title": "Hier is een voorproefje van je schema" - }, - "progress": { - "complete": "Het doel van vandaag is behaald 🎉", - "goal-complete": "Je hele doel is voltooid 🎉", - "pages-goal": "lees {{pages}} pagina's van de koran", - "range-goal": "lees {{from}} tot {{to}}", - "time-goal": "lees {{time}} van de koran" - }, - "reading-goal": "Doel lezen", - "reading-goal-description": "Vind je het een uitdaging om consistent te blijven met je koranleesdoelen? Quran Growth Journey is een dynamische functie die is ontwikkeld om u te helpen consistent te blijven op uw reis met de Koran. Of je nu 10 minuten per dag wilt lezen, een Juz in een maand wilt voltooien, of de hele koran in een jaar wilt uitlezen, enz., Quran.com kan je nu helpen een aangepast doel te stellen en je dagelijkse leesreeksen bij te houden, terwijl aanpassen terwijl u vooruitgang boekt. Het is volledig gratis te gebruiken en we hopen dat het je zal helpen gemotiveerd te blijven om je doel te bereiken!", - "reading-goal-label": "Je bent op een", - "reading-goal-title": "Introductie van de reis van de groei van de koran", - "recommended": "Aanbevolen", - "remaining": "Blijft over voor vandaag", - "remaining-days": { - "one": "Nog {{days}} dag over", - "other": "Nog {{days}} dagen" - }, - "set-reading-goal-success": "Je leesdoel is succesvol ingesteld.", - "start-journey": "Begin je reis!", - "start-reading": "Start met lezen", - "starting-chapter": "Soera beginnen", - "starting-verse": "Ayah beginnen", - "streak": "Streep", - "streak-definition": "Een streak is het aantal opeenvolgende dagen dat je de koran hebt gelezen.", - "timeline-meaning": "Wat betekent uw tijdlijn?", - "timeline-states": { - "checked": "Je hebt je doel bereikt", - "filled": "Je hebt iets gelezen, maar niet genoeg om je doel te bereiken", - "none": "Je hebt die dag nog niets gelezen", - "stroked": "Je hebt vandaag niets gelezen" - }, - "todays-goal": "Het doel van vandaag", - "view-progress": "Voortgang bekijken", - "week-progress": "De vorderingen van deze week", - "x-days": { - "one": "{{days}} dag", - "other": "{{days}} dagen" - }, - "x-days-streak": "{{days}} dagenreeks", - "x-hours": { - "one": "{{hours}} uur", - "other": "{{hours}} uren" - }, - "x-minutes": { - "one": "{{minutes}} minuut", - "other": "{{minutes}} minuten" - }, - "x-pages": { - "one": "{{pages}} pagina", - "other": "{{pages}} pagina's" - }, - "x-seconds": { - "one": "{{seconds}} seconde", - "other": "{{seconds}} seconden" + "continue-reading": "Lees verder", + "continuous": { + "description": "Je doel berekent je voortgang over een periode van dagen", + "title": "Over een duur" + }, + "create-plan": "Plan maken", + "create-reading-goal": "Doel maken", + "daily-progress": "Dagelijkse voortgang", + "daily-progress-completed": "Voltooid! 🎉", + "daily": { + "description": "Je doel wordt elke dag gereset", + "title": "Dagelijks doel" + }, + "day-x": "Dag {{day}}", + "days": "Dagen", + "duration": "Duur (dagen)", + "ending-chapter": "Einde soera", + "ending-verse": "Ayah beëindigen", + "examples-subtitle": "Hier is een lijst met gemeenschappelijke doelen. Je kunt ook je eigen doel maken.", + "examples-title": "Kies een vooraf ingesteld doel of maak je eigen doel", + "examples": { + "custom": { + "description": "Stel een aangepast doel in dat bij u past", + "title": "Aangepast" + }, + "khatm": { + "description": "Een klassiek Khatm-doelpunt. Lees 1 Juz per dag", + "title": "Lees de koran in 30 dagen" + }, + "time": { + "description": "Een eenvoudig beginnersvriendelijk doel", + "title": "Lees 10 minuten per dag" + }, + "year": { + "description": "Lees de koran het komende jaar in je eigen tempo", + "title": "Lees de Koran in een jaar" + } + }, + "frequency-tab": { + "description": "Moet uw doel elke dag of elk aantal dagen worden gereset? Maak je geen zorgen, we houden je voortgang bij, ongeacht de frequentie die je kiest.", + "title": "Kies een frequentie voor je doel" + }, + "goal-completed": "Doel bereikt! 🎉 ", + "goal-done": { + "description": "Eventuele extra metingen worden nog steeds geregistreerd", + "title": "Je hebt het doel van vandaag behaald" + }, + "goal-target": { + "description": "Hoeveel tijd, pagina's of verzen moet je lezen om je doel te bereiken?", + "title": "Stel een doel voor je doel" + }, + "goal-type": { + "description": "Moet uw doel gebaseerd zijn op tijd, pagina's of een aangepast bereik (dwz 3 juzs van de koran)?", + "title": "Kies een criterium voor je doel" + }, + "goal-types": { + "pages": { + "description": "Je doel wordt gebaseerd op pagina's", + "title": "Pagina's" + }, + "range": { + "description": "Je doel zal gebaseerd zijn op een aangepaste reeks verzen (dit kan een soera, een juz of zelfs de hele koran zijn)", + "title": "Aangepast bereik" + }, + "time": { + "description": "Je doel is gebaseerd op tijd", + "title": "Tijd" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+ nog {{days}} dag", + "other": "+ nog {{days}} dagen" + }, + "preview-schedule": { + "description": "Zo ziet je doel eruit. Je kunt het later altijd wijzigen.", + "title": "Hier is een voorproefje van je schema" + }, + "progress": { + "complete": "Het doel van vandaag is behaald 🎉", + "goal-complete": "Je hele doel is voltooid 🎉", + "pages-goal": "lees {{pages}} pagina's van de koran", + "range-goal": "lees {{from}} tot {{to}}", + "time-goal": "lees {{time}} van de koran" + }, + "reading-goal": "Doel lezen", + "reading-goal-description": "Vindt u het een uitdaging om consistent te blijven met uw leesdoelen voor de Koran?

    Quran Growth Journey is een dynamische functie die is ontwikkeld om u te helpen consistent te blijven op uw reis met de Koran. Of u nu 10 minuten per dag wilt lezen, een Juz in een maand wilt voltooien of de hele Koran in een jaar wilt voltooien, enz., Quran.com kan u nu helpen een aangepast doel te stellen en uw dagelijkse leesstrepen bij te houden, terwijl u aanpassingen maakt naarmate u vordert. Het is volledig gratis te gebruiken en we hopen dat het u zal helpen gemotiveerd te blijven om uw doel te bereiken!", + "reading-goal-label": "Je bent op een", + "reading-goal-title": "Introductie van de Koran Groeireis", + "recommended": "Aanbevolen", + "remaining": "Blijft over voor vandaag", + "remaining-base": "Overig", + "remaining-days": { + "one": "Nog {{days}} dag over", + "other": "Nog {{days}} dagen" + }, + "set-a-new-goal": "Stel een nieuw doel in", + "set-reading-goal-success": "Je leesdoel is succesvol ingesteld.", + "start-journey": "Begin je reis!", + "start-reading": "Start met lezen", + "starting-chapter": "Soera beginnen", + "starting-verse": "Ayah beginnen", + "streak": "Streep", + "streak-definition": "Een streak is het aantal opeenvolgende dagen dat je de koran hebt gelezen.", + "timeline-meaning": "Wat betekent uw tijdlijn?", + "timeline-states": { + "checked": "Je hebt je doel bereikt", + "filled": "Je hebt iets gelezen, maar niet genoeg om je doel te bereiken", + "none": "Je hebt die dag nog niets gelezen", + "stroked": "Je hebt vandaag niets gelezen" + }, + "todays-goal": "Het doel van vandaag", + "view-progress": "Voortgang bekijken", + "week-progress": "De vorderingen van deze week", + "x-days": { + "one": "{{days}} dag", + "other": "{{days}} dagen" + }, + "x-days-streak": "{{days}} dagenreeks", + "x-hours": { + "one": "{{hours}} uur", + "other": "{{hours}} uren" + }, + "x-minutes": { + "one": "{{minutes}} minuut", + "other": "{{minutes}} minuten" + }, + "x-pages": { + "one": "{{pages}} pagina", + "other": "{{pages}} pagina's" + }, + "x-seconds": { + "one": "{{seconds}} seconde", + "other": "{{seconds}} seconden" + } +} diff --git a/locales/nl/support.json b/locales/nl/support.json index 43d1238055..944bad45cf 100644 --- a/locales/nl/support.json +++ b/locales/nl/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Rapporteer deze bug <0> hier <\/0> en we zullen deze bug zo snel mogelijk repareren inshAllah.", - "bug-q": "Ik heb een vertaalfout gevonden, waar moet ik die indienen?", - "developer-a": "Zie <0> ontwikkelaarspagina <\/0> voor meer info.", - "developer-q": "Ik ben een ontwikkelaar. Hoe kan ik bijdragen?", - "donate-a": "Ten eerste stellen we uw interesse om bij te dragen zeer op prijs. Ga naar <0> deze <\/0> link", - "donate-q": "Hoe kan ik doneren?", - "download-a": "Helaas niet. We bieden nog geen functionaliteit om onze website of de Koran naar uw computer te downloaden. U kunt echter wel onze mobiele app installeren voor offline lezen.", - "download-q": "Kan ik de Quran.com naar mijn computer downloaden?", - "fiqh-a": "Quran.com is een online hulpmiddel voor lezen, luisteren en studeren. Het team achter Quran.com bestaat uit software-ingenieurs, ontwerpers en productmanagers. Helaas is dat de beperking van onze vaardigheden. We hebben geen geleerden, imams of sjeiks als onderdeel van het team om te helpen met islamitische, Fiqh- of Fatwa-gerelateerde vragen. We proberen deze vragen niet te beantwoorden en adviseren u om met uw plaatselijke imam in een moskee of een sjeik te praten.", - "fiqh-q": "Islamitische \/ Fiqh \/ Fatwa-gerelateerde vragen", - "header": "Hulp en feedback", - "main-desc": "Controleer de veelgestelde vragen om te zien of uw vraag al is beantwoord. Indien nodig kunt u <0> contact met ons opnemen <\/0> en we zullen ons best doen om zo snel mogelijk contact met u op te nemen, maar zodat u weet dat we een klein team zijn, dus wees aardig.", - "mobile-a": "Ja! Bezoek onze <0>mobiele apps pagina<\/0> voor meer info.", - "mobile-q": "Heeft Quran.com een mobiele app?", - "other-languages-a": "Om uw voorkeurstaal te wijzigen, is er een vervolgkeuzelijst in de rechterbovenhoek op elke pagina (linksboven in de talen van rechts naar links). Gebruik deze vervolgkeuzelijst om uw voorkeurstaal te kiezen.", - "other-languages-q": "Kan ik door de site bladeren in andere talen?", - "reciters-a": "Stuur meer info over deze voordrager <0> hier <\/0>", - "reciters-q": "Meer voordragers toevoegen", - "site-down-a": "Dat is niet goed! Als de site helemaal niet werkt of misschien zie je een wit scherm met de tekst 'Sorry, er is iets misgegaan', dan stellen we het op prijs als je dit <0>hier<\/0> kunt melden.", - "site-down-q": "De site werkt niet, hoe vertel ik dat?", - "support": "Steun", - "tafsir-a": "Ja, we hebben wel wat Tafsirs. Klik op het pictogram dat naast elke ayah wordt weergegeven en klik vervolgens op tafisrs. App toont je een lijst met beschikbare tafsirs. Klik op de tafsir die je wilt lezen.", - "tafsir-q": "Is Tafsir beschikbaar?", - "translations-a": "Open een nieuw nummer <0> hier <\/0> met alle details, link naar vertaling en we zullen ons best doen om dit toe te voegen.", - "translations-q": "Nog een vertaling toevoegen" -} \ No newline at end of file + "bug-a": "Rapporteer deze bug <0> hier en we zullen deze bug zo snel mogelijk repareren inshAllah.", + "bug-q": "Ik heb een vertaalfout gevonden, waar moet ik die indienen?", + "developer-a": "Zie <0> ontwikkelaarspagina voor meer info.", + "developer-q": "Ik ben een ontwikkelaar. Hoe kan ik bijdragen?", + "donate-a": "Ten eerste stellen we uw interesse om bij te dragen zeer op prijs. Ga naar <0> deze link", + "donate-q": "Hoe kan ik doneren?", + "download-a": "Helaas niet. We bieden nog geen functionaliteit om onze website of de Koran naar uw computer te downloaden. U kunt echter wel onze mobiele app installeren voor offline lezen.", + "download-q": "Kan ik de Quran.com naar mijn computer downloaden?", + "header": "Hulp en feedback", + "main-desc": "Controleer de veelgestelde vragen om te zien of uw vraag al is beantwoord. Indien nodig kunt u <0> contact met ons opnemen en we zullen ons best doen om zo snel mogelijk contact met u op te nemen, maar zodat u weet dat we een klein team zijn, dus wees aardig.", + "mobile-a": "Ja! Bezoek <0>Quran voor Android of <1>Quran iOS om de apps te downloaden", + "mobile-q": "Heeft Quran.com een mobiele app?", + "other-languages-a": "Om uw voorkeurstaal te wijzigen, is er een vervolgkeuzelijst in de rechterbovenhoek op elke pagina (linksboven in de talen van rechts naar links). Gebruik deze vervolgkeuzelijst om uw voorkeurstaal te kiezen.", + "other-languages-q": "Kan ik door de site bladeren in andere talen?", + "reciters-a": "Stuur meer info over deze voordrager <0> hier ", + "reciters-q": "Meer voordragers toevoegen", + "site-down-a": "Dat is niet goed! Als de site helemaal niet werkt of misschien zie je een wit scherm met de tekst 'Sorry, er is iets misgegaan', dan stellen we het op prijs als je dit <0>hier kunt melden.", + "site-down-q": "De site werkt niet, hoe vertel ik dat?", + "support": "Steun", + "tafsir-a": "Ja, we hebben wel wat Tafsirs. Klik op het pictogram dat naast elke ayah wordt weergegeven en klik vervolgens op tafisrs. App toont je een lijst met beschikbare tafsirs. Klik op de tafsir die je wilt lezen.", + "tafsir-q": "Is Tafsir beschikbaar?", + "translations-a": "Open een nieuw nummer <0> hier met alle details, link naar vertaling en we zullen ons best doen om dit toe te voegen.", + "translations-q": "Nog een vertaling toevoegen" +} diff --git a/locales/pt/about.json b/locales/pt/about.json index 14a1259d04..baab9aded5 100644 --- a/locales/pt/about.json +++ b/locales/pt/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Este projeto não teria sido possível sem as muitas bibliotecas e projetos de código aberto que usamos:", - "lokalize": "<0> Lokalize <\/0> : Um sistema de tradução auxiliado por computador que se concentra na produtividade e na garantia de qualidade e fornece um fluxo de trabalho de localização perfeito.", - "quran-align": "<0> Collin Fair <\/0> : Uma ferramenta para produzir a segmentação com precisão de palavras da recitação do Alcorão gravada.", - "quran-complex": "<0> Complexo do Alcorão <\/0> : O Complexo de Impressão do Alcorão Glorioso do Rei Fahd é líder em servir o Alcorão Glorioso e suas Ciências, traduzindo seus significados e salvaguardando o Texto do Alcorão de distorção, por meio do uso otimizado de tecnologias avançadas no campo da impressão, gravações de áudio, edição eletrônica e aplicações digitais.", - "quran-enc": "<0> Alcorão <\/0> : Um portal com traduções gratuitas e confiáveis dos significados e exegeses do nobre Alcorão em muitas línguas do mundo.", - "tanzil": "<0> Tanzil <\/0> : Um projeto internacional do Alcorão com o objetivo de fornecer um texto do Alcorão altamente verificado e preciso.", - "title": "Créditos", - "vercel": "<0> Vercel <\/0> : é uma plataforma de implantação e colaboração para desenvolvedores front-end que coloca o desenvolvedor front-end em primeiro lugar, dando-lhes ferramentas abrangentes para construir sites e aplicativos de alto desempenho.", - "zekr": "<0> Zekr <\/0> : uma ferramenta de estudo do Alcorão de plataforma aberta para navegar e pesquisar no Alcorão" - }, - "main-description": "Quran.com foi fundado em 1995. O site tem como objetivo tornar mais fácil para qualquer pessoa ler, estudar e aprender o Alcorão. O projeto é de código aberto e é construído como uma colaboração entre os membros da equipe principal e a <0> equipe Tarteel <\/0> ." -} \ No newline at end of file + "credits": { + "desc": "Agradecemos a todos aqueles que apoiaram e contribuíram para este projeto, ajudando a tornar o Alcorão acessível a milhões de pessoas no mundo todo.", + "lokalize": "<0>Lokalize: Um sistema de tradução auxiliado por computador que se concentra na produtividade e na garantia de qualidade e fornece um fluxo de trabalho de localização perfeito.", + "quran-align": "<0>Collin Fair: Uma ferramenta para produzir segmentação precisa de palavras de recitações corânicas gravadas.", + "quran-complex": "<0>QuranComplex: O Complexo de Impressão do Glorioso Alcorão Rei Fahd é líder em servir o Glorioso Alcorão e suas Ciências, traduzindo seus Significados e protegendo o Texto Corânico de distorções, por meio do uso ideal de tecnologias avançadas no campo da impressão, gravações de áudio, publicação eletrônica e aplicações digitais.", + "quran-enc": "<0>QuranEnc: Um portal que apresenta traduções gratuitas e confiáveis dos significados e exegeses do nobre Alcorão em muitas línguas do mundo.", + "tanzil": "<0>Tanzil: Um projeto corânico internacional que visa fornecer um texto do Alcorão preciso e altamente verificado.", + "tarteel": "<0>Tarteel: Um aplicativo de memorização do Alcorão com tecnologia de IA. Ele foi projetado para ajudar você a memorizar de forma mais inteligente, seja procurando um versículo, monitorando seu progresso ou acompanhando sua recitação.", + "title": "Créditos", + "vercel": "<0>Vercel: é uma plataforma de implantação e colaboração para desenvolvedores front-end que coloca o desenvolvedor front-end em primeiro lugar, fornecendo a eles ferramentas abrangentes para criar sites e aplicativos de alto desempenho.", + "zekr": "<0>Zekr: Uma ferramenta de estudo do Alcorão de plataforma aberta para navegar e pesquisar sobre o Alcorão" + }, + "global-effort": { + "desc": "Milhões de pessoas de todo o mundo confiam no Quran.com como seu principal recurso digital do Alcorão. Quer venham para recitar, refletir, memorizar ou estudar, eles compartilham um propósito comum: um desejo sincero de se conectar com as palavras de Alá. \\n À medida que continuamos a crescer, continuamos comprometidos em garantir que o Quran.com continue sendo um espaço confiável, acessível e lindamente projetado para qualquer pessoa que busque se envolver com o Alcorão.", + "title": "Um esforço global" + }, + "key-features": { + "desc": "Quran.com foi criado para dar suporte a cada estágio do envolvimento com o Alcorão — da leitura e memorização ao estudo e reflexão. Nossos recursos incluem:", + "features": [ + "Interface do Alcorão fácil de usar – Uma experiência de leitura limpa e intuitiva em qualquer dispositivo.", + "Várias traduções e Tafsir – Acesso a traduções em vários idiomas, juntamente com tafsir.", + "Recitações em áudio – Ouça recitações de alta qualidade de Qaris de renome mundial, com a capacidade de acompanhar palavra por palavra.", + "Pesquisa e navegação avançadas – Encontre versículos instantaneamente por tópico ou palavras-chave em todo o Alcorão.", + "Marcação de versículos e notas – Salve versículos e escreva reflexões pessoais para referência posterior.", + "Integração do QuranReflect – Interaja com uma comunidade global por meio de reflexões e percepções compartilhadas por acadêmicos e indivíduos.", + "Acompanhamento do progresso da leitura e metas – Acompanhe suas metas diárias e histórico de leitura", + "APIs para desenvolvedores – acesso gratuito a conteúdo e recursos para impulsionar aplicativos islâmicos e P&D.", + "E muito mais, Alhamdullilah." + ], + "title": "Principais recursos e ofertas" + }, + "main-description": "Desde sua fundação em 1995, o Quran.com tem se comprometido a tornar o Alcorão disponível para todos de uma forma clara, autêntica e fácil de se envolver. Todos os dias, milhões de pessoas no mundo todo recorrem ao Quran.com para ler, ouvir, estudar e refletir sobre o Alcorão — sejam estudantes ao longo da vida, acadêmicos ou apenas começando sua jornada.", + "our-mission": { + "desc": "O Alcorão foi feito para ser lido, compreendido e refletido. Nossa missão é remover barreiras de acesso e empoderar indivíduos e comunidades, fornecendo uma experiência corânica confiável, bem projetada e profundamente enriquecedora. Nosso objetivo é servir como uma fonte confiável para qualquer um que esteja buscando se envolver com o Alcorão, guiado pelos princípios de precisão, clareza e sinceridade.", + "title": "Nossa Missão" + }, + "who-we-are": { + "desc": "Quran.com é um waqf (fundo patrimonial), estabelecido como um fundo público para garantir que o Alcorão permaneça acessível a todos, gratuitamente e sem interesses comerciais. É administrado pela Quran.Foundation, uma organização sem fins lucrativos 501(c)(3), que sustenta e desenvolve o Quran.com como parte de sua missão de fornecer recursos corânicos autênticos e de alta qualidade para o mundo. Nosso compromisso é servir o Alcorão e seus leitores com excelência, sinceridade e responsabilidade.", + "title": "Quem somos" + } +} diff --git a/locales/pt/apps.json b/locales/pt/apps.json index 2882c1409c..4d1303d65d 100644 --- a/locales/pt/apps.json +++ b/locales/pt/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Pelos desenvolvedores centrais do Quran.com, chegam os aplicativos mushaf iOS e Android bonitos e sem anúncios. Agora é mais fácil ler o Alcorão em qualquer lugar, memorizá-lo e ouvir seus recitadores favoritos.", - "tarteel-desc": "Tarteel é o primeiro aplicativo do Alcorão a usar ferramentas de IA para interagir com sua recitação e destacar erros. Um companheiro do Alcorão conduzido por voz na palma de suas mãos, Tarteel funciona intuitivamente para ajudá-lo a ler, recitar, memorizar e entender o Alcorão com confiança! <0><\/0><0><\/0> Tarteel tem orgulho de ser um desenvolvedor central do Quran.com, bem como membro de seu conselho de administração." -} \ No newline at end of file + "quran-desc": "Pelos desenvolvedores centrais do Quran.com, chegam os aplicativos mushaf iOS e Android bonitos e sem anúncios. Agora é mais fácil ler o Alcorão em qualquer lugar, memorizá-lo e ouvir seus recitadores favoritos." +} diff --git a/locales/pt/common.json b/locales/pt/common.json index ce6feedc44..823cc9001b 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navegações", "no-nav-results": "Sem resultados de navegação", - "placeholder": "O que voce quer ler", - "powered-by": "Pesquisa por voz com tecnologia Tarteel.ai", + "placeholder": "Pesquise no Alcorão...", "recent-navigations": "Navegações recentes", "search-by-voice": "Pesquisa por voz", "try-navigating": "Tente navegar para" @@ -122,9 +121,11 @@ } }, "continue": "Prosseguir", + "contribute-to-our-mission": "Contribua para a nossa missão", "copied": "Copiado", "copied-to-clipboard": "Copiado para a área de transferência", "copy": "cópia de", + "copylink": "Copiar link", "counter": { "decrease": "Diminuir", "increase": "Aumentar" @@ -134,6 +135,7 @@ "developers": "Desenvolvedores", "display": "Mostrar", "donate": "Doar", + "donate-now": "Doe agora", "donate_monthly": "Doe mensalmente", "donate_once": "Doe uma vez", "edit": "Editar", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Máx {{maxNumberOfVerses}} Ayahs", "ranges-wrong-order": "O verso inicial deve estar antes do verso final." }, + "errors": { + "account-banned": "Desculpe, sua conta foi banida. Contate Quran.Foundation", + "badRequest": "*Pedido inválido", + "banned": "*Desculpe, sua conta foi banida. Contate Quran.Foundation", + "confirm": "*A senha de confirmação não corresponde à senha", + "email": "*Formato de e-mail inválido!", + "exactLength": "*O valor deve ter o comprimento exato", + "expiredToken": "*Este token expirou", + "forgot-password-failed": "Falha ao enviar e-mail de redefinição de senha. Tente novamente.", + "immutable": "*Este valor não pode ser alterado", + "invalid": "*Este {{fieldName}} é inválido", + "invalidEmailOrPassword": "*E-mail ou senha inválidos", + "max": "* {{fieldName}} deve ser menor ou igual a {{max}} dígitos", + "min": "* {{fieldName}} deve ter mais ou igual a {{min}} dígitos", + "name": "* {{fieldName}} deve conter apenas letras e números", + "notFound": "*Não encontrado", + "required": "* {{fieldName}} está faltando!", + "reset-password-failed": "Falha ao redefinir a senha. Tente novamente.", + "signin-failed": "Falha no login. Tente novamente.", + "signup-failed": "Falha na inscrição. Tente novamente.", + "taken": "* {{fieldName}} já existe!", + "usedToken": "*Este token já foi usado", + "username": "* {{fieldName}} aceita somente sublinhados e letras", + "verification-code-invalid": "Este código de verificação é inválido", + "verification-code-length": "O código de verificação deve ter {{length}} dígitos", + "verification-failed": "A verificação falhou. Por favor, tente novamente.", + "verification-resend-failed": "Falha ao reenviar o código de verificação" + }, "exciting-updates": "Atualizações emocionantes", "feedback": "Comentários", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Tamanho da fonte da tradução" }, "footer": { - "description": "Quran.com é um Sadaqah Jariyah. Esperamos tornar mais fácil para todos ler, estudar e aprender o Nobre Alcorão. O Nobre Alcorão tem muitos nomes, incluindo Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr e Al-Noor.", + "description": "Quran.com é uma plataforma confiável usada por milhões de pessoas no mundo todo para ler, pesquisar, ouvir e refletir sobre o Alcorão em vários idiomas. Ela fornece traduções, tafsir, recitações, tradução palavra por palavra e ferramentas para estudo mais profundo, tornando o Alcorão acessível a todos.

    Como uma Sadaqah Jariyah, Quran.com se dedica a ajudar as pessoas a se conectarem profundamente com o Alcorão. Apoiado pela Quran.Foundation, uma organização sem fins lucrativos 501(c)(3), Quran.com continua a crescer como um recurso gratuito e valioso para todos, Alhamdullilah”", "hiring": "Estamos contratando! Junte-se à equipe da QuranFoundation e contribua para a nossa missão. Inscreva-se agora! ", "rights": "Todos os direitos reservados", - "title": "Leia, estude e aprenda O Nobre Alcorão." + "title": "Leia, ouça, pesquise e reflita sobre o Alcorão" }, "form": { "body": "Corpo", "code": "Código de verificação", + "confirm-password": "Confirme sua senha", "email": "E-mail", "firstName": "Primeiro nome", "lastName": "Sobrenome", - "title": "Título" + "password": "Senha", + "title": "Título", + "username": "Nome de usuário", + "verification-code": "Código de Verificação" }, "from": "A partir de", + "fundraising-share-title": "Compartilhe Quran.com Arrecadação de fundos", "fundraising-sticky-banner": { "cta": "Doar", "title": "Dê nos melhores dias!" @@ -217,6 +252,7 @@ "learn-more": "Saber mais", "learning-plans": "Planos de aprendizagem", "less": "Menos", + "lessons": "Lições", "loading": "Carregando", "login": "Conecte-se", "logout": "Sair", @@ -250,6 +286,7 @@ "off": "Desligado", "oldest": "Mais antigo", "on": "Sobre", + "our-projects": "Nossos Projetos", "page": "Página", "pages": "Páginas", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} de {{totalNumberOfResults}} resultados da pesquisa", @@ -272,6 +309,7 @@ "privacy": "Privacidade", "product-updates": "Atualizações de produtos", "profile": "Perfil", + "projects-desc": "Projetos sem fins lucrativos de propriedade, administrados ou patrocinados pela Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "Rádio Alcorão", @@ -287,6 +325,7 @@ "reciters": "Recitadores", "reflect": "Refletir", "reflections": "Reflexões", + "reflections-and-lessons": "Reflexões e Lições", "remove": "Retirar", "rename": "Renomear", "retry": "Tentar novamente", @@ -296,10 +335,12 @@ "save-to-collection": "Salvar na coleção", "search-for": "Procure por '{{searchQuery}}'", "search-results": "{{count}} resultados de pesquisa", + "search-results-no-count": "Resultados da pesquisa", "search": { "filters": "Filtros", "hint": "Tente pesquisar por", "jump-to": "Pule para", + "more-results": "Mais resultados", "no-results": "Nenhum resultado encontrado", "no-results-suggestion": "Não foi possível encontrar resultados de pesquisa correspondentes para \" {{searchQuery}} \". tente pesquisar por uma palavra-chave diferente.", "popular": "Pesquisas populares", @@ -340,8 +381,10 @@ "search-juz": "Pesquisar Juz", "search-page": "Página de Pesquisa", "search-surah": "Surata de pesquisa", + "search-verse": "Pesquisar Verso", "try-navigating-with": "Dica: tente navegar com" }, + "sign-in": "Entrar", "sitemap": "Mapa do site", "sort": { "ascending": "Ascendente", @@ -362,10 +405,6 @@ "tafsirs-desc": "Leia vários Tafsirs de Ayah {{ayahNumber}} de Sura {{surahName}} por estudiosos Tafsir confiáveis", "title": "Tafsir" }, - "tarteel": { - "app": "App Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Termos e Condições", "theme": "Tema", "themes": { @@ -400,9 +439,9 @@ "view": "Visualizar", "voice": { "ask-permission": "Ative a permissão do microfone para começar a usar a Pesquisa por voz", - "error": "Ocorreu um erro, tente novamente mais tarde. Ou baixe o", - "no-permission": "Parece que você não tem as permissões de microfone ativadas. Ative as permissões do microfone e tente novamente ou baixe o", - "not-supported": "Parece que seu navegador não oferece suporte a microfone. Tente um navegador diferente ou baixe o", + "error": "Ocorreu um erro. Tente novamente mais tarde.", + "no-permission": "Parece que você não tem as permissões de microfone habilitadas. Habilite as permissões de microfone e tente novamente.", + "not-supported": "Parece que seu navegador não suporta microfone. Tente um navegador diferente.", "suggest": "Por favor, comece a recitar e seu verso aparecerá.", "suggest-subtitle": "Recite qualquer versículo em árabe e o verso aparecerá", "suggest-title": "Recite agora", diff --git a/locales/pt/developers.json b/locales/pt/developers.json index ab677b5b39..29bc28cba7 100644 --- a/locales/pt/developers.json +++ b/locales/pt/developers.json @@ -1,20 +1,19 @@ { - "footer": "- equipe Quran.com", - "header": "Ajuda de desenvolvimento", - "issues-cta": "Se você tiver alguma dúvida ou quiser entrar em contato com os mantenedores, escreva um problema! Entraremos em contato com você assim que pudermos, inshAllah.", - "issues-guide": "Normalmente usamos <0> projetos Github <\/0> como a fonte para o que trabalhar a seguir, o que está por vir e quais bugs existem que precisam ser resolvidos. Por exemplo, <1> este url <\/1> contém uma lista de bugs, coisas para as quais precisamos de ajuda e recursos futuros.", - "main-desc": "Asalamu Alykom, Em primeiro lugar, muito obrigado pelo seu interesse em nos ajudar a desenvolver o Quran.com e seus projetos. Estamos muito animados para trabalhar com você!", - "projects": { - "all": "Temos vários projetos hospedados no Github. Você pode encontrá-los todos <0> aqui <\/0> . Mas para resumi-los:", - "q-android": "<0> Alcorão Android <\/0>", - "q-api": "<0> API Quran.com <\/0> - escrita em Ruby on Rails.", - "q-api-docs": "<0> Quran.com API Docs <\/0> - Nosso portal de documentos da API.", - "q-audio": "<0> Áudio do Alcorão <\/0> e <1> aplicativos para dispositivos móveis do Áudio do Alcorão <\/1>", - "q-audio-segments": "<0> Segmentos de áudio do Alcorão <\/0>", - "q-ios": "<0> Alcorão iOS <\/0>", - "q-next": "<0> Interface do Quran.com <\/0> - escrito em Next.js.", - "q-v2": "<0> Quran.com <\/0> - escrito em Ruby on Rails." - }, - "sub-main-desc": "Somos uma equipe de desenvolvedores, designers, gerentes de produto e pensadores que trabalham no Quran.com como voluntários. Alhamdulilah, fomos abençoados por trabalhar para algumas grandes empresas no Vale do Silício, Toronto e Emirados Árabes Unidos - e sentimos que isso é o mínimo que podemos fazer para ajudar nossa Ummah a avançar no aprendizado e no estudo de sua religião. Trabalhar no Quran.com é muito gratificante e que Allah recompense a todos nós (e recompense você) por nossos esforços.", - "thanks": "Obrigado por ler! Esperamos ver você cometer algum código!" -} \ No newline at end of file + "footer": "- equipe Quran.com", + "header": "Ajuda de desenvolvimento", + "issues-cta": "Se você tiver alguma dúvida ou quiser entrar em contato com os mantenedores, escreva um problema! Entraremos em contato com você assim que pudermos, inshAllah.", + "issues-guide": "Normalmente usamos <0> projetos Github como a fonte para o que trabalhar a seguir, o que está por vir e quais bugs existem que precisam ser resolvidos. Por exemplo, <1> este url contém uma lista de bugs, coisas para as quais precisamos de ajuda e recursos futuros.", + "main-desc": "Asalamu Alykom, Em primeiro lugar, muito obrigado pelo seu interesse em nos ajudar a desenvolver o Quran.com e seus projetos. Estamos muito animados para trabalhar com você!", + "projects": { + "all": "Temos vários projetos hospedados no Github. Você pode encontrá-los todos <0> aqui . Mas para resumi-los:", + "q-android": "<0> Alcorão Android ", + "q-api": "<0> API Quran.com - escrita em Ruby on Rails.", + "q-api-docs": "<0> Quran.com API Docs - Nosso portal de documentos da API.", + "q-audio": "<0> Áudio do Alcorão e <1> aplicativos para dispositivos móveis do Áudio do Alcorão ", + "q-audio-segments": "<0> Segmentos de áudio do Alcorão ", + "q-ios": "<0> Alcorão iOS ", + "q-next": "<0> Interface do Quran.com - escrito em Next.js.", + "q-v2": "<0> Quran.com - escrito em Ruby on Rails." + }, + "thanks": "Obrigado por ler! Esperamos ver você cometer algum código!" +} diff --git a/locales/pt/home.json b/locales/pt/home.json index 1ce41de22f..ee58a80590 100644 --- a/locales/pt/home.json +++ b/locales/pt/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Alcance seus objetivos do Alcorão", + "begin": "Começar", + "chapters-and-verses": "Capítulos e Versículos", + "continue-read": "Continuar lendo", + "explore-topics": "Explorar tópicos", + "first-time-reading": "Novo no Alcorão? Comece aqui ", + "know-someone": "Cresça conosco neste Ramadã ", + "learning-plan": "Planos de Aprendizagem", + "listen-to-radio": "Ouça a Rádio Alcorão", + "my-quran": "Meu Alcorão", + "navigate-quran": "Navegar pelo Alcorão", "no-bookmarks": "Você ainda não tem favoritos", "no-recently-read": "Você ainda não tem nenhuma sessão de leitura", "noble-quran": "O Nobre Alcorão", + "popular": "Popular", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Jornada de Crescimento do Alcorão" }, - "ramadan-activities-cta": " Siga o Calendário Corânico Global <\/b> para leituras semanais, podcasts inspiradores e um chamado para refletir! <\/link>", + "qr-community": "Leia os versículos e reflexões em destaque hoje", + "ramadan-activities-cta": " Siga o Calendário Corânico Global para leituras semanais, podcasts inspiradores e um chamado para refletir! ", + "ramadan": { + "header": "Ferramentas para aprofundar sua conexão com o Alcorão", + "title": "Pronto para o Ramadã?" + }, "read-juz": "Leia Juz", "recently-read": "Lidos recentemente", - "revelation-order-disclaimer": "Esta exibição mostra a ordem cronológica das suratas no Alcorão com base em quando foram reveladas ao Profeta Muhammad ﷺ <\/hover> . A cronologia é um assunto de opinião acadêmica e algumas suratas foram reveladas em partes em diferentes épocas. A ordem aqui é baseada no trabalho de Tanzil.net <\/link> . [Nota: a ordem de Mushaf compilada de al-Fatiha a al-Nas é uma questão de consenso.]", + "revelation-order-disclaimer": "Esta exibição mostra a ordem cronológica das suratas no Alcorão com base em quando foram reveladas ao Profeta Muhammad . A cronologia é um assunto de opinião acadêmica e algumas suratas foram reveladas em partes em diferentes épocas. A ordem aqui é baseada no trabalho de Tanzil.net . [Nota: a ordem de Mushaf compilada de al-Fatiha a al-Nas é uma questão de consenso.]", + "see-more-learning-plans": "Ver mais", + "set-custom-goal": "Defina uma meta", + "share-quran": { + "description": "Ajude a espalhar o Alcorão para novos alunos", + "title": "Compartilhe o Alcorão!" + }, + "start-read": "Comece a ler", + "stay-consistent": "Acompanhe as sequências, crie metas personalizadas e seja consistente", "tab": { "bookmarks": "Favoritos", "popular": "Popular" diff --git a/locales/pt/learn.json b/locales/pt/learn.json index af2ebd62ef..acf85cd738 100644 --- a/locales/pt/learn.json +++ b/locales/pt/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Obrigado pelo seu feedback!", "your-feedback": "Seu feedback" }, + "help-about-reflection": "Ajuda sobre o recurso de reflexão", "learn-duration": "Duração", + "learn-more": "Saber mais", "learning-plan-material": "Material do Plano de Aprendizagem", "learning-plan-meta-desc": "Este Plano de Aprendizagem ajudará a transformar a maneira como você se envolve com o Alcorão. Comece sua jornada hoje!", "learning-plans-desc": "Aumente seu conhecimento com lições fáceis de seguir que o manterão crescendo em sua jornada com o Alcorão.

    Inicie um Plano de Aprendizagem hoje mesmo! Seu progresso é monitorado até você chegar à linha de chegada.", @@ -34,9 +36,12 @@ "next-lesson": "Próxima lição", "not-enrolled": "Você ainda não está inscrito no Plano de aprendizagem .", "prev-lesson": "Lição Anterior", + "reflection-description-1": "Clicar em \"Add Reflection\" levará você ao QuranReflect, uma plataforma para compartilhar reflexões pessoais sobre o Alcorão. Diferentemente do Tafsir (interpretação acadêmica), as reflexões são insights e experiências pessoais relacionadas aos versos.", + "reflection-description-2": "Se você postar publicamente, sua reflexão será revisada pela equipe de moderação e ficará visível para a comunidade QuranReflect.", "start-learning": "Comece a aprender", "tabs": { "main": "Detalhes principais", "syllabus": "Programa de Estudos" - } + }, + "what-happens-when-you-click-add-reflection": "O que acontece quando você clica em \"Adicionar reflexão\"?" } diff --git a/locales/pt/login.json b/locales/pt/login.json index ac61b546bf..891e30cab1 100644 --- a/locales/pt/login.json +++ b/locales/pt/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Aguardando confirmação", + "back": "Voltar", + "back-to-login": "Voltar para Login", + "check-email-title": "Verifique o e-mail para concluir a inscrição", + "confirm": "Confirmar", + "confirm-new-password-placeholder": "Confirmar nova senha", + "confirm-password-placeholder": "Confirme sua senha", + "continue": "Continuar", "continue-apple": "Continuar com a Apple", "continue-email": "Continuar com e-mail", "continue-facebook": "Continuar com o Facebook", "continue-google": "Continuar com o Google", "email-placeholder": "Endereço de email", + "error": { + "email-required": "O e-mail está faltando!", + "invalid-credentials": "E-mail ou senha inválidos", + "invalid-email": "Formato de e-mail inválido!", + "login-failed": "Falha no login. Tente novamente.", + "password-required": "A senha está faltando!" + }, + "errors": { + "account-banned": "Desculpe, sua conta foi banida. Contate Quran.Foundation", + "badRequest": "*Pedido inválido", + "banned": "*Desculpe, sua conta foi banida. Contate Quran.Foundation", + "confirm": "*A senha de confirmação não corresponde à senha", + "email": "*Formato de e-mail inválido!", + "exactLength": "*O valor deve ter o comprimento exato", + "expiredToken": "*Este token expirou", + "forgot-password-failed": "Falha ao enviar e-mail de redefinição de senha. Tente novamente.", + "immutable": "*Este valor não pode ser alterado", + "invalid": "*Este {{fieldName}} é inválido", + "invalidEmailOrPassword": "*E-mail ou senha inválidos", + "max": "* {{fieldName}} deve ser menor ou igual a {{max}} dígitos", + "min": "* {{fieldName}} deve ter mais ou igual a {{min}} dígitos", + "name": "* {{fieldName}} deve conter apenas letras e números", + "notFound": "*Não encontrado", + "required": "* {{fieldName}} está faltando!", + "reset-password-failed": "Falha ao redefinir a senha. Tente novamente.", + "signin-failed": "Falha no login. Tente novamente.", + "signup-failed": "Falha na inscrição. Tente novamente.", + "taken": "* {{fieldName}} já existe!", + "usedToken": "*Este token já foi usado", + "username": "* {{fieldName}} aceita somente sublinhados e letras", + "verification-code-invalid": "Este código de verificação é inválido", + "verification-code-length": "O código de verificação deve ter {{length}} dígitos", + "verification-failed": "A verificação falhou. Por favor, tente novamente.", + "verification-resend-failed": "Falha ao reenviar o código de verificação" + }, "feature-1": "Acompanhe seus objetivos", "feature-2": "Mantenha sequências de leitura", "feature-3": "Criar coleções", "feature-4": "Sincronize seus dados entre navegadores", "feature-5": "E mais!", "feature-6": " Novidade! Notas e reflexões", + "first-name-placeholder": "Primeiro nome", + "forgot-password": "Esqueceu sua senha", + "forgot-password-description": "Insira seu endereço de e-mail e enviaremos instruções para redefinir sua senha.", + "forgot-password-success": "E-mail de redefinição de senha enviado! Verifique sua caixa de entrada.", + "forgot-password-title": "Esqueceu sua senha?", + "last-name-placeholder": "Sobrenome", "login-cta": "Faça login ou cadastre-se agora:", "login-error": { "AuthenticationError": "Falha na autenticação. Por favor, tente novamente mais tarde", + "BannedUserError": "Desculpe, sua conta foi banida. Entre em contato com Quran.Foundation.", "TokenExpiredError": "Você foi desconectado, faça o login novamente." }, "login-title": "Faça login no Quran.com", + "new-password-placeholder": "Nova Senha", "other-options": "Outras opções de login", + "password-placeholder": "Senha", + "password-reset-success": "Senha redefinida com sucesso!", + "password-rules": { + "lowercase": "Pelo menos uma letra minúscula", + "max-length": "Máximo de 20 caracteres", + "min-length": "Mínimo de 8 caracteres", + "number": "Pelo menos um número", + "special": "Pelo menos um caractere especial (!@#$%^&*_-)", + "uppercase": "Pelo menos uma letra maiúscula" + }, "privacy-policy": "Proteger sua privacidade é nossa prioridade – Ao se inscrever, você concorda com nossa Política de Privacidade e Termos e Condições .", - "verify-code": "Verifique se o código de segurança fornecido corresponde ao seguinte texto:" + "quran-text": "Alcorão", + "quran-title": "Quran.com", + "reflect-feature-1": "Reflita sobre o Alcorão", + "reflect-feature-2": "Junte-se a grupos", + "reflect-feature-3": "Interaja com outras pessoas", + "reflect-feature-4": "E muito mais!", + "reset-password": "Redefinir senha", + "reset-password-success": "Senha redefinida com sucesso!", + "set-new-password": "Defina uma nova senha", + "sign-in": "Entrar", + "sign-in-or-sign-up": "Entrar ou Cadastrar-se", + "sign-up": "Inscrever-se", + "unified-registration-1": "O registo unificado de ", + "unified-registration-2": "Alcorão.Fundação", + "unified-registration-3": ". Você terá acesso aos seguintes sites ", + "unified-registration-4": "através dos seus detalhes de login.", + "username-placeholder": "Nome de usuário", + "verification-code-instruction": "Insira o código fornecido no e-mail para concluir a inscrição", + "verification-code-resend": "Reenviar e-mail", + "verification-code-resend-countdown": "Reenviar e-mail de verificação em {{seconds}} seg...", + "verification-code-sent": "Código de verificação enviado!", + "verification-code-sent-to": "Acabamos de enviar um e-mail para", + "verification-code-spam-note": "Não recebeu um e-mail? Verifique sua pasta de spam", + "verify-code": "Verifique se o código de segurança fornecido corresponde ao seguinte texto:", + "welcome-description-1": "O registo unificado de", + "welcome-description-2": ".Fundação", + "welcome-description-3": "Você terá acesso aos seguintes sites por meio de seus dados de login.", + "welcome-title": "Bem-vindo ao" } diff --git a/locales/pt/onboarding.json b/locales/pt/onboarding.json index e1c17081fa..a2db28bb94 100644 --- a/locales/pt/onboarding.json +++ b/locales/pt/onboarding.json @@ -87,10 +87,6 @@ "description": "Escolha entre uma variedade de traduções em vários idiomas. Dica: compare traduções selecionando diversas opções", "title": "Traduções" }, - "voice-search": { - "description": "Toque no ícone do microfone e recite o versículo que você está procurando. Dica rápida! Para descobrir onde alguém está recitando (por exemplo, orações de Taraweeh), toque no ícone do microfone. Depois que um ou dois versículos forem detectados, pressione parar para encontrar o local", - "title": "Pesquisa por voz (Tarteel)" - }, "wbw-audio": { "description": "Selecione esta opção para ouvir cada palavra individualmente simplesmente clicando na palavra!", "title": "Ouça a transliteração palavra por palavra clicando na palavra" diff --git a/locales/pt/question.json b/locales/pt/question.json index a5fce9ae7b..681b0a9eb8 100644 --- a/locales/pt/question.json +++ b/locales/pt/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Perguntas e respostas relacionadas a ", - "question": "Pergunta" + "question": "Pergunta", + "questions-meta-desc": "Explore respostas confiáveis para aprofundar sua compreensão do Alcorão." } diff --git a/locales/pt/quick-links.json b/locales/pt/quick-links.json index 1ac6655f40..bcf4925b50 100644 --- a/locales/pt/quick-links.json +++ b/locales/pt/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "Sobre o Alcorão", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Participe do Ramadã de Reflexão", - "rahman": "Surah Ar-Rahman", - "sunnah": "Versículos sobre a Sunnah", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "Sobre o Alcorão", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jesus no Alcorão", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Participe do Ramadã de Reflexão", + "rahman": "Surah Ar-Rahman", + "sunnah": "Versículos sobre a Sunnah", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "O que é o Ramadã?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/pt/quran-reader.json b/locales/pt/quran-reader.json index 805313a5ec..8e310b4a00 100644 --- a/locales/pt/quran-reader.json +++ b/locales/pt/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Começo do Hizb", "include-translator": "Incluir nome do tradutor?", "juz-beginning": "Começo de Juz", + "lessons-desc": "Leia e compartilhe as lições do Alcorão do versículo {{ayahNumber}} da Surata {{surahName}}", + "lessons-disclaimer": "As lições são percepções e interpretações pessoais do Alcorão. Elas não devem ser tomadas como autoritativas.", + "lessons-not-available": "Não há lições revisadas para este versículo", "mad-2": "Em 2 segundos", "mad-2-4-6": "Permitido Maad 2 ou 4 ou 6 segundos", "mad-4-5": "Necessário Maad 4 ou 5 segundos", diff --git a/locales/pt/radio.json b/locales/pt/radio.json index c20633f10f..fd1c56af37 100644 --- a/locales/pt/radio.json +++ b/locales/pt/radio.json @@ -1,26 +1,27 @@ { - "change": "Mudar", - "curated-station": { - "juz-amma": { - "description": "Ouça o Juz final do Alcorão", - "title": "Juz Amma" - }, - "popular-recitations": { - "description": "Feed com curadoria diária de recitações", - "title": "Recitações Populares" - }, - "surah-al-kahf": { - "description": "Ouça a Sura Alkahf na repetição", - "title": "Surata Al-Kahf" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "As Suras de uma curadoria de recitadores", - "title": "Yaseen, Al-Waqiah, Al-Mulk" - } + "change": "Mudar", + "curated-station": { + "juz-amma": { + "description": "Ouça o Juz final do Alcorão", + "title": "Juz Amma" }, - "curated-stations": "Estações com curadoria", - "pause-radio": "Pausar rádio", - "play-radio": "Tocar rádio", - "radio-desc": "Ouça a bela recitação ininterrupta do Alcorão Sagrado por vários recitadores.", - "reciter-stations": "Estações de recitadores" -} \ No newline at end of file + "popular-recitations": { + "description": "Feed com curadoria diária de recitações", + "title": "Recitações Populares" + }, + "surah-al-kahf": { + "description": "Ouça a Sura Alkahf na repetição", + "title": "Surata Al-Kahf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "As Suras de uma curadoria de recitadores", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Estações com curadoria", + "pause-radio": "Pausar rádio", + "play-radio": "Tocar rádio", + "radio-desc": "Ouça a bela recitação ininterrupta do Alcorão Sagrado por vários recitadores.", + "reciter-stations": "Estações de recitadores", + "station": "Estação" +} diff --git a/locales/pt/reading-goal.json b/locales/pt/reading-goal.json index 011494c59b..8114b4e70d 100644 --- a/locales/pt/reading-goal.json +++ b/locales/pt/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Continue lendo", - "continuous": { - "description": "Sua meta calculará seu progresso ao longo de alguns dias", - "title": "Ao longo de uma duração" - }, - "create-plan": "Criar plano", - "create-reading-goal": "Criar meta", - "daily-progress": "Progresso diário", - "daily": { - "description": "Seu objetivo será redefinido todos os dias", - "title": "meta diária" - }, - "day-x": "Dia {{day}}", - "days": "Dias", - "duration": "Duração (dias)", - "ending-chapter": "Surata Final", - "ending-verse": "Fim de Ayah", - "examples-subtitle": "Aqui está uma lista de objetivos comuns. Você também pode criar seu próprio objetivo.", - "examples-title": "Escolha um objetivo predefinido ou crie o seu próprio", - "examples": { - "custom": { - "description": "Defina uma meta personalizada adequada a você", - "title": "Personalizado" - }, - "khatm": { - "description": "Um gol clássico de Khatm. Leia 1 Juz por dia", - "title": "Leia o Alcorão em 30 dias" - }, - "time": { - "description": "Um objetivo simples para iniciantes", - "title": "Leia 10 minutos por dia" - }, - "year": { - "description": "Leia o Alcorão no seu próprio ritmo durante o próximo ano", - "title": "Leia o Alcorão em um ano" - } - }, - "frequency-tab": { - "description": "Sua meta deve ser redefinida todos os dias ou a cada número de dias? Não se preocupe, acompanharemos seu progresso independentemente da frequência que você escolher.", - "title": "Escolha uma frequência para o seu objetivo" - }, - "goal-done": { - "description": "Qualquer leitura adicional ainda será registrada", - "title": "Você completou a meta de hoje" - }, - "goal-target": { - "description": "Quanto tempo, páginas ou versículos você deve ler para completar seu objetivo?", - "title": "Defina uma meta para o seu objetivo" - }, - "goal-type": { - "description": "Seu objetivo deve ser baseado em tempo, páginas ou um intervalo personalizado (ou seja, 3 Juzs do Alcorão)?", - "title": "Escolha um critério para sua meta" - }, - "goal-types": { - "pages": { - "description": "Sua meta será baseada em páginas", - "title": "Páginas" - }, - "range": { - "description": "Seu objetivo será baseado em uma gama personalizada de versículos (pode ser uma Surata, um Juz ou até mesmo todo o Alcorão)", - "title": "Intervalo personalizado" - }, - "time": { - "description": "Seu objetivo será baseado no tempo", - "title": "Tempo" - } - }, - "plus-x-more-days": { - "one": "+{{days}} dia", - "other": "+{{days}} dias a mais" - }, - "preview-schedule": { - "description": "É assim que seu objetivo ficará. Você sempre pode alterá-lo mais tarde.", - "title": "Aqui está uma prévia da sua programação" - }, - "progress": { - "complete": "A meta de hoje está completa 🎉", - "goal-complete": "Todo o seu objetivo está completo 🎉", - "pages-goal": "leia {{pages}} páginas do Alcorão", - "range-goal": "leia {{from}} para {{to}}", - "time-goal": "leia {{time}} do Alcorão" - }, - "reading-goal": "meta de leitura", - "reading-goal-description": "Você acha difícil manter a consistência com seus objetivos de leitura do Alcorão? Quran Growth Journey é um recurso dinâmico desenvolvido para ajudá-lo a permanecer consistente em sua jornada com o Alcorão. Se você pretende ler 10 minutos por dia, concluir um Juz em um mês ou terminar o Alcorão inteiro em um ano, etc., o Quran.com agora pode ajudá-lo a definir uma meta personalizada e acompanhar suas sequências de leitura diárias, enquanto ajustando conforme você progride. É totalmente gratuito e esperamos que ajude você a se manter motivado para alcançar seu objetivo!", - "reading-goal-label": "você está em um", - "reading-goal-title": "Apresentando a jornada de crescimento do Alcorão", - "recommended": "Recomendado", - "remaining": "Restante para hoje", - "remaining-days": { - "one": "{{days}} dia restante", - "other": "{{days}} dias restantes" - }, - "set-reading-goal-success": "Sua meta de leitura foi definida com sucesso.", - "start-journey": "Comece sua jornada!", - "start-reading": "Comece a ler", - "starting-chapter": "Surata Inicial", - "starting-verse": "Começando Ayah", - "streak": "Onda", - "streak-definition": "Uma sequência é o número de dias consecutivos em que você leu o Alcorão.", - "timeline-meaning": "O que significa sua linha do tempo?", - "timeline-states": { - "checked": "Você completou seu objetivo", - "filled": "Você leu alguma coisa, mas não o suficiente para completar seu objetivo", - "none": "Você ainda não leu nada naquele dia", - "stroked": "Você não leu nada hoje" - }, - "todays-goal": "Gol de hoje", - "view-progress": "Ver Progresso", - "week-progress": "Progresso desta semana", - "x-days": { - "one": "{{days}} dia", - "other": "{{days}} dias" - }, - "x-days-streak": "sequência de {{days}} dias", - "x-hours": { - "one": "{{hours}} hora", - "other": "{{hours}} horas" - }, - "x-minutes": { - "one": "{{minutes}} minuto", - "other": "{{minutes}} minutos" - }, - "x-pages": { - "one": "{{pages}} página", - "other": "{{pages}} páginas" - }, - "x-seconds": { - "one": "{{seconds}} segundo", - "other": "{{seconds}} segundos" + "continue-reading": "Continue lendo", + "continuous": { + "description": "Sua meta calculará seu progresso ao longo de alguns dias", + "title": "Ao longo de uma duração" + }, + "create-plan": "Criar plano", + "create-reading-goal": "Criar meta", + "daily-progress": "Progresso diário", + "daily-progress-completed": "Concluído! 🎉", + "daily": { + "description": "Seu objetivo será redefinido todos os dias", + "title": "meta diária" + }, + "day-x": "Dia {{day}}", + "days": "Dias", + "duration": "Duração (dias)", + "ending-chapter": "Surata Final", + "ending-verse": "Fim de Ayah", + "examples-subtitle": "Aqui está uma lista de objetivos comuns. Você também pode criar seu próprio objetivo.", + "examples-title": "Escolha um objetivo predefinido ou crie o seu próprio", + "examples": { + "custom": { + "description": "Defina uma meta personalizada adequada a você", + "title": "Personalizado" + }, + "khatm": { + "description": "Um gol clássico de Khatm. Leia 1 Juz por dia", + "title": "Leia o Alcorão em 30 dias" + }, + "time": { + "description": "Um objetivo simples para iniciantes", + "title": "Leia 10 minutos por dia" + }, + "year": { + "description": "Leia o Alcorão no seu próprio ritmo durante o próximo ano", + "title": "Leia o Alcorão em um ano" + } + }, + "frequency-tab": { + "description": "Sua meta deve ser redefinida todos os dias ou a cada número de dias? Não se preocupe, acompanharemos seu progresso independentemente da frequência que você escolher.", + "title": "Escolha uma frequência para o seu objetivo" + }, + "goal-completed": "Objetivo concluído! 🎉 ", + "goal-done": { + "description": "Qualquer leitura adicional ainda será registrada", + "title": "Você completou a meta de hoje" + }, + "goal-target": { + "description": "Quanto tempo, páginas ou versículos você deve ler para completar seu objetivo?", + "title": "Defina uma meta para o seu objetivo" + }, + "goal-type": { + "description": "Seu objetivo deve ser baseado em tempo, páginas ou um intervalo personalizado (ou seja, 3 Juzs do Alcorão)?", + "title": "Escolha um critério para sua meta" + }, + "goal-types": { + "pages": { + "description": "Sua meta será baseada em páginas", + "title": "Páginas" + }, + "range": { + "description": "Seu objetivo será baseado em uma gama personalizada de versículos (pode ser uma Surata, um Juz ou até mesmo todo o Alcorão)", + "title": "Intervalo personalizado" + }, + "time": { + "description": "Seu objetivo será baseado no tempo", + "title": "Tempo" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} dia", + "other": "+{{days}} dias a mais" + }, + "preview-schedule": { + "description": "É assim que seu objetivo ficará. Você sempre pode alterá-lo mais tarde.", + "title": "Aqui está uma prévia da sua programação" + }, + "progress": { + "complete": "A meta de hoje está completa 🎉", + "goal-complete": "Todo o seu objetivo está completo 🎉", + "pages-goal": "leia {{pages}} páginas do Alcorão", + "range-goal": "leia {{from}} para {{to}}", + "time-goal": "leia {{time}} do Alcorão" + }, + "reading-goal": "meta de leitura", + "reading-goal-description": "Você acha desafiador manter a consistência com suas metas de leitura do Alcorão?

    Quran Growth Journey é um recurso dinâmico desenvolvido para ajudar você a permanecer consistente em sua jornada com o Alcorão. Quer você tenha como objetivo ler 10 minutos por dia, completar um Juz em um mês ou terminar o Alcorão inteiro em um ano, etc., o Quran.com agora pode ajudar você a definir uma meta personalizada e acompanhar suas sequências diárias de leitura, enquanto ajusta conforme você progride. É totalmente gratuito e esperamos que ajude você a se manter motivado para atingir sua meta!", + "reading-goal-label": "você está em um", + "reading-goal-title": "Apresentando a Jornada de Crescimento do Alcorão", + "recommended": "Recomendado", + "remaining": "Restante para hoje", + "remaining-base": "Restante", + "remaining-days": { + "one": "{{days}} dia restante", + "other": "{{days}} dias restantes" + }, + "set-a-new-goal": "Defina uma nova meta", + "set-reading-goal-success": "Sua meta de leitura foi definida com sucesso.", + "start-journey": "Comece sua jornada!", + "start-reading": "Comece a ler", + "starting-chapter": "Surata Inicial", + "starting-verse": "Começando Ayah", + "streak": "Onda", + "streak-definition": "Uma sequência é o número de dias consecutivos em que você leu o Alcorão.", + "timeline-meaning": "O que significa sua linha do tempo?", + "timeline-states": { + "checked": "Você completou seu objetivo", + "filled": "Você leu alguma coisa, mas não o suficiente para completar seu objetivo", + "none": "Você ainda não leu nada naquele dia", + "stroked": "Você não leu nada hoje" + }, + "todays-goal": "Gol de hoje", + "view-progress": "Ver Progresso", + "week-progress": "Progresso desta semana", + "x-days": { + "one": "{{days}} dia", + "other": "{{days}} dias" + }, + "x-days-streak": "sequência de {{days}} dias", + "x-hours": { + "one": "{{hours}} hora", + "other": "{{hours}} horas" + }, + "x-minutes": { + "one": "{{minutes}} minuto", + "other": "{{minutes}} minutos" + }, + "x-pages": { + "one": "{{pages}} página", + "other": "{{pages}} páginas" + }, + "x-seconds": { + "one": "{{seconds}} segundo", + "other": "{{seconds}} segundos" + } +} diff --git a/locales/pt/support.json b/locales/pt/support.json index e93aa9e1d1..182e413dca 100644 --- a/locales/pt/support.json +++ b/locales/pt/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Por favor, relate este bug <0> aqui <\/0> e nós o corrigiremos o mais rápido possível inshAllah.", - "bug-q": "Eu encontrei um bug de tradução, onde eu o arquivo?", - "developer-a": "Por favor, consulte a <0> página de desenvolvedores <\/0> para mais informações.", - "developer-q": "Sou um desenvolvedor. Como posso contribuir?", - "donate-a": "Em primeiro lugar, realmente agradecemos seu interesse em contribuir. Visite <0> este <\/0> link", - "donate-q": "Como posso doar?", - "download-a": "Infelizmente não. Ainda não fornecemos a funcionalidade de download do nosso site ou do Alcorão para o seu computador. Você pode, no entanto, instalar nosso aplicativo móvel para leitura offline.", - "download-q": "Posso baixar o Quran.com para o meu computador?", - "fiqh-a": "Quran.com é uma ferramenta online de leitura, escuta e estudo. A equipe por trás do Quran.com é composta por engenheiros de software, designers e gerentes de produto. Infelizmente, essa é a limitação de nosso conjunto de habilidades, não temos estudiosos, imames ou xeques como parte da equipe para ajudar com questões islâmicas, Fiqh ou Fatwa. Tentamos evitar responder a qualquer uma dessas perguntas e aconselhá-lo a falar com seu imã local em uma mesquita ou com um xeque.", - "fiqh-q": "Questões relacionadas com islâmica \/ Fiqh \/ Fatwa", - "header": "Ajuda e feedback", - "main-desc": "Verifique o FAQ para ver se sua pergunta já foi respondida. Se necessário, você pode <0> entrar em contato conosco <\/0> e faremos o possível para entrar em contato com você o mais rápido possível, mas apenas para que você saiba que somos uma equipe pequena, por favor, seja gentil.", - "mobile-a": "Sim! Visite nossa <0> página de aplicativos para celular <\/0> para obter mais informações.", - "mobile-q": "O Quran.com tem um aplicativo móvel?", - "other-languages-a": "Para alterar o idioma de sua preferência, há uma lista suspensa no canto superior direito de cada página (canto superior esquerdo nos idiomas da direita para a esquerda). Use esta lista suspensa para escolher seu idioma preferido.", - "other-languages-q": "Posso navegar no site em outros idiomas?", - "reciters-a": "Envie mais informações sobre este recitador <0> aqui <\/0>", - "reciters-q": "Adicionando mais recitadores", - "site-down-a": "Isso não é bom! Se o site não estiver funcionando ou se você vir uma tela branca com o texto 'Desculpe, algo deu errado', agradecemos se você puder denunciar <0> aqui <\/0> .", - "site-down-q": "O site não está funcionando, como posso te dizer?", - "support": "Apoio, suporte", - "tafsir-a": "Sim, temos alguns Tafsirs. Clique no ícone mostrado ao lado de cada versículo e, em seguida, clique em tafisrs. O aplicativo irá mostrar uma lista de tafsirs disponíveis. Clique no tafsir que deseja ler.", - "tafsir-q": "O Tafsir está disponível?", - "translations-a": "Abra um novo exemplar <0> aqui <\/0> com todos os detalhes, link para a tradução e faremos o possível para adicioná-lo.", - "translations-q": "Adicionar outras traduções" -} \ No newline at end of file + "bug-a": "Por favor, relate este bug <0> aqui e nós o corrigiremos o mais rápido possível inshAllah.", + "bug-q": "Eu encontrei um bug de tradução, onde eu o arquivo?", + "developer-a": "Por favor, consulte a <0> página de desenvolvedores para mais informações.", + "developer-q": "Sou um desenvolvedor. Como posso contribuir?", + "donate-a": "Em primeiro lugar, realmente agradecemos seu interesse em contribuir. Visite <0> este link", + "donate-q": "Como posso doar?", + "download-a": "Infelizmente não. Ainda não fornecemos a funcionalidade de download do nosso site ou do Alcorão para o seu computador. Você pode, no entanto, instalar nosso aplicativo móvel para leitura offline.", + "download-q": "Posso baixar o Quran.com para o meu computador?", + "header": "Ajuda e feedback", + "main-desc": "Verifique o FAQ para ver se sua pergunta já foi respondida. Se necessário, você pode <0> entrar em contato conosco e faremos o possível para entrar em contato com você o mais rápido possível, mas apenas para que você saiba que somos uma equipe pequena, por favor, seja gentil.", + "mobile-a": "Sim! Por favor, visite <0>Quran para Android ou <1>Quran iOS para baixar os aplicativos", + "mobile-q": "O Quran.com tem um aplicativo móvel?", + "other-languages-a": "Para alterar o idioma de sua preferência, há uma lista suspensa no canto superior direito de cada página (canto superior esquerdo nos idiomas da direita para a esquerda). Use esta lista suspensa para escolher seu idioma preferido.", + "other-languages-q": "Posso navegar no site em outros idiomas?", + "reciters-a": "Envie mais informações sobre este recitador <0> aqui ", + "reciters-q": "Adicionando mais recitadores", + "site-down-a": "Isso não é bom! Se o site não estiver funcionando ou se você vir uma tela branca com o texto 'Desculpe, algo deu errado', agradecemos se você puder denunciar <0> aqui .", + "site-down-q": "O site não está funcionando, como posso te dizer?", + "support": "Apoio, suporte", + "tafsir-a": "Sim, temos alguns Tafsirs. Clique no ícone mostrado ao lado de cada versículo e, em seguida, clique em tafisrs. O aplicativo irá mostrar uma lista de tafsirs disponíveis. Clique no tafsir que deseja ler.", + "tafsir-q": "O Tafsir está disponível?", + "translations-a": "Abra um novo exemplar <0> aqui com todos os detalhes, link para a tradução e faremos o possível para adicioná-lo.", + "translations-q": "Adicionar outras traduções" +} diff --git a/locales/ru/about.json b/locales/ru/about.json index 60de0dd099..211f011e22 100644 --- a/locales/ru/about.json +++ b/locales/ru/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Этот проект был бы невозможен без множества библиотек и проектов с открытым исходным кодом, которые мы использовали:", - "lokalize": "<0> Lokalize <\/0> : система автоматизированного перевода, ориентированная на производительность и обеспечение качества и обеспечивающая непрерывный рабочий процесс локализации.", - "quran-align": "<0> Collin Fair <\/0> : инструмент для точной сегментации записанного чтения Корана.", - "quran-complex": "<0> QuranComplex <\/0> : Комплекс печати Корана короля Фахда является лидером в служении Славному Корану и его наукам, переводу его значений и защите Корана от искажения за счет оптимального использования передовые технологии в области печати, аудиозаписи, электронных публикаций и цифровых приложений.", - "quran-enc": "<0> QuranEnc <\/0> : портал, на котором представлены бесплатные и надежные переводы значений и толкований благородного Корана на многие языки мира.", - "tanzil": "<0> Танзил <\/0> : международный коранический проект, направленный на предоставление проверенного точного текста Корана.", - "title": "Кредиты", - "vercel": "<0> Vercel <\/0> : это платформа развертывания и совместной работы для разработчиков внешнего интерфейса, которая ставит на первое место разработчика внешнего интерфейса, предоставляя им комплексные инструменты для создания высокопроизводительных веб-сайтов и приложений.", - "zekr": "<0> Zekr <\/0> : инструмент для изучения Корана на открытой платформе, позволяющий просматривать и исследовать Коран." - }, - "main-description": "Quran.com был основан в 1995 году. Цель веб-сайта - облегчить каждому чтение, изучение и изучение Корана. Проект с открытым исходным кодом построен в результате сотрудничества между членами основной команды и командой <0> Tarteel <\/0> ." -} \ No newline at end of file + "credits": { + "desc": "Мы выражаем нашу благодарность всем, кто поддержал и внес свой вклад в этот проект, помогая сделать Коран доступным для миллионов людей по всему миру.", + "lokalize": "<0>Lokalize: система автоматизированного перевода, ориентированная на производительность и контроль качества, а также обеспечивающая бесперебойный рабочий процесс локализации.", + "quran-align": "<0>Collin Fair: Инструмент для точной пословной сегментации записанных отрывков Корана.", + "quran-complex": "<0>QuranComplex: King Fahd Glorious Qur'an Printing Complex является лидером в служении Священному Корану и его наукам, переводе его смыслов и защите текста Корана от искажений посредством оптимального использования передовых технологий в области печати, аудиозаписи, электронных публикаций и цифровых приложений.", + "quran-enc": "<0>QuranEnc: портал, предлагающий бесплатные и заслуживающие доверия переводы смыслов и толкований благородного Корана на многих языках мира.", + "tanzil": "<0>Танзиль: международный коранический проект, направленный на предоставление высокопроверенного и точного текста Корана.", + "tarteel": "<0>Tarteel: приложение для запоминания Корана на базе искусственного интеллекта. Оно создано, чтобы помочь вам запоминать умнее, независимо от того, ищете ли вы стих, отслеживаете свой прогресс или следите за своим чтением.", + "title": "Кредиты", + "vercel": "<0>Vercel: платформа для развертывания и совместной работы разработчиков интерфейсов, которая ставит разработчиков интерфейсов на первое место, предоставляя им комплексные инструменты для создания высокопроизводительных веб-сайтов и приложений.", + "zekr": "<0>Zekr: инструмент для изучения Корана на открытой платформе, позволяющий просматривать и исследовать Коран." + }, + "global-effort": { + "desc": "Миллионы людей со всего мира полагаются на Quran.com как на свой основной цифровой ресурс Корана. Независимо от того, приходят ли они сюда, чтобы читать, размышлять, запоминать или изучать, у них есть общая цель: искреннее желание соединиться со словами Аллаха. \\n Продолжая расти, мы по-прежнему стремимся к тому, чтобы Quran.com оставался надежным, доступным и красиво оформленным пространством для всех, кто хочет познакомиться с Кораном.", + "title": "Глобальные усилия" + }, + "key-features": { + "desc": "Quran.com предназначен для поддержки каждого этапа взаимодействия с Кораном — от чтения и заучивания до изучения и размышления. Наши возможности включают:", + "features": [ + "Удобный интерфейс Корана – простой и интуитивно понятный интерфейс чтения на любом устройстве.", + "Множественные переводы и тафсир – доступ к переводам на нескольких языках, а также к тафсиру.", + "Аудиодекламации – слушайте высококачественные декламации всемирно известных кари с возможностью следить за текстом слово в слово.", + "Расширенный поиск и навигация — мгновенно находите стихи по теме или ключевым словам во всем Коране.", + "Закладки и заметки аятов – сохраняйте стихи и записывайте личные размышления для дальнейшего использования.", + "Интеграция QuranReflect – взаимодействуйте с мировым сообществом посредством размышлений и идей, которыми делятся ученые и отдельные лица.", + "Отслеживание прогресса чтения и целей — следите за своими ежедневными целями и историей чтения.", + "API для разработчиков – бесплатный доступ к контенту и функциям для поддержки исламских приложений и исследований и разработок.", + "И многое другое, Альхамдуллилах." + ], + "title": "Основные характеристики и предложения" + }, + "main-description": "С момента своего основания в 1995 году Quran.com стремится сделать Коран доступным для всех таким образом, чтобы он был понятным, достоверным и простым для взаимодействия. Каждый день миллионы людей по всему миру обращаются к Quran.com, чтобы читать, слушать, изучать и размышлять о Коране — независимо от того, являются ли они вечными студентами, учеными или только начинают свой путь.", + "our-mission": { + "desc": "Коран предназначен для чтения, понимания и размышления. Наша миссия — устранить барьеры для доступа и расширения прав и возможностей отдельных лиц и сообществ, предоставляя надежный, хорошо продуманный и глубоко обогащающий опыт Корана. Мы стремимся стать надежным источником для всех, кто стремится взаимодействовать с Кораном, руководствуясь принципами точности, ясности и искренности.", + "title": "Наша миссия" + }, + "who-we-are": { + "desc": "Quran.com — это вакф (благотворительный фонд), созданный как общественный фонд, чтобы гарантировать, что Коран остается доступным для всех, бесплатно и без коммерческих интересов. Он управляется Quran.Foundation, некоммерческой организацией 501(c)(3), которая поддерживает и развивает Quran.com в рамках своей миссии по предоставлению высококачественных, аутентичных ресурсов Корана миру. Наше обязательство — служить Корану и его читателям с совершенством, искренностью и ответственностью.", + "title": "Кто мы такие" + } +} diff --git a/locales/ru/apps.json b/locales/ru/apps.json index 2da8123326..a0508a0b59 100644 --- a/locales/ru/apps.json +++ b/locales/ru/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Основные разработчики Quran.com представляют красивые и бесплатные приложения mushaf для iOS и Android. Теперь стало проще читать Коран на ходу, запоминать его и слушать любимых чтецов.", - "tarteel-desc": "Tarteel — первое приложение для Корана, использующее инструменты искусственного интеллекта для взаимодействия с чтением и выделения ошибок. Голосовой компаньон в Коране у вас на ладони, Tarteel работает интуитивно, чтобы помочь вам уверенно читать, декламировать, запоминать и понимать Коран! <0><\/0><0><\/0> Tarteel гордится тем, что является основным разработчиком Quran.com, а также членом их совета директоров." -} \ No newline at end of file + "quran-desc": "Основные разработчики Quran.com представляют красивые и бесплатные приложения mushaf для iOS и Android. Теперь стало проще читать Коран на ходу, запоминать его и слушать любимых чтецов." +} diff --git a/locales/ru/common.json b/locales/ru/common.json index f3d3a4110d..50eaf6b0a2 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Навигация", "no-nav-results": "Нет результатов навигации", - "placeholder": "Что ты хочешь прочитать?", - "powered-by": "Голосовой поиск на платформе Tarteel.ai", + "placeholder": "Поиск в Коране...", "recent-navigations": "Недавние переходы", "search-by-voice": "Голосовой поиск", "try-navigating": "Попробуйте перейти к" @@ -122,9 +121,11 @@ } }, "continue": "Продолжать", + "contribute-to-our-mission": "Внесите свой вклад в нашу миссию", "copied": "Скопировано", "copied-to-clipboard": "Скопировано в буфер обмена", "copy": "Копировать", + "copylink": "Копировать ссылку", "counter": { "decrease": "Снижаться", "increase": "Увеличивать" @@ -134,6 +135,7 @@ "developers": "Разработчики", "display": "Отображать", "donate": "Пожертвовать", + "donate-now": "Пожертвовать сейчас", "donate_monthly": "Пожертвовать ежемесячно", "donate_once": "Пожертвовать один раз", "edit": "Редактировать", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Макс {{maxNumberOfVerses}} аятов", "ranges-wrong-order": "Начальный стих должен предшествовать заключительному." }, + "errors": { + "account-banned": "Извините, Ваш аккаунт забанен. Свяжитесь с Quran.Foundation", + "badRequest": "*Неверный запрос", + "banned": "*Извините, Ваш аккаунт забанен. Свяжитесь с Quran.Foundation", + "confirm": "*Подтвердите пароль не совпадает с паролем", + "email": "*Неверный формат адреса электронной почты!", + "exactLength": "*Значение должно иметь точную длину", + "expiredToken": "*Срок действия этого токена истек", + "forgot-password-failed": "Не удалось отправить письмо для сброса пароля. Попробуйте еще раз.", + "immutable": "*Это значение не может быть изменено.", + "invalid": "*Это {{fieldName}} недействительно", + "invalidEmailOrPassword": "*Неверный адрес электронной почты или пароль", + "max": "* {{fieldName}} должно быть меньше или равно {{max}} цифр", + "min": "* {{fieldName}} должно быть больше или равно {{min}} цифр", + "name": "* {{fieldName}} должно содержать только буквы и цифры", + "notFound": "*Не найдено", + "required": "* {{fieldName}} отсутствует!", + "reset-password-failed": "Не удалось сбросить пароль. Попробуйте еще раз.", + "signin-failed": "Не удалось войти. Попробуйте еще раз.", + "signup-failed": "Регистрация не удалась. Попробуйте еще раз.", + "taken": "* {{fieldName}} уже существует!", + "usedToken": "*Этот токен уже использован", + "username": "* {{fieldName}} принимает только подчеркивание и буквы", + "verification-code-invalid": "Этот код подтверждения недействителен", + "verification-code-length": "Проверочный код должен содержать {{length}} цифр", + "verification-failed": "Проверка не удалась. Попробуйте еще раз.", + "verification-resend-failed": "Не удалось повторно отправить код подтверждения." + }, "exciting-updates": "Захватывающие обновления", "feedback": "Обратная связь", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Размер шрифта перевода" }, "footer": { - "description": "Quran.com - это садака Джария. Мы надеемся, что всем будет легко читать, изучать и изучать Благородный Коран. В Благородном Коране много имен, включая Аль-Коран, Аль-Карим, Аль-Кетаб, Аль-Фуркан, Аль-Мавита, Аль-Тикр и Аль-Нур.", + "description": "Quran.com — это надежная платформа, используемая миллионами людей по всему миру для чтения, поиска, прослушивания и размышлений над Кораном на нескольких языках. Она предоставляет переводы, тафсир, декламации, пословный перевод и инструменты для более глубокого изучения, делая Коран доступным для всех.

    Как садака джария, Quran.com призван помогать людям глубже проникать в Коран. Поддерживаемый Quran.Foundation, некоммерческой организацией 501(c)(3), Quran.com продолжает расти как бесплатный и ценный ресурс для всех, Alhamdullilah»", "hiring": "Мы нанимаем! Присоединяйтесь к команде QuranFoundation и внесите свой вклад в нашу миссию. Подайте заявку сейчас! ", "rights": "Все права защищены", - "title": "Читайте, изучайте и изучайте Благородный Коран." + "title": "Читайте, слушайте, ищите и размышляйте над Кораном" }, "form": { "body": "Тело", "code": "Код верификации", + "confirm-password": "Подтвердите пароль", "email": "Эл. адрес", "firstName": "Имя", "lastName": "Фамилия", - "title": "Заголовок" + "password": "Пароль", + "title": "Заголовок", + "username": "Имя пользователя", + "verification-code": "Проверочный код" }, "from": "Из", + "fundraising-share-title": "Поделиться Quran.com Сбор средств", "fundraising-sticky-banner": { "cta": "Пожертвовать", "title": "Дарите в лучшие дни!" @@ -217,6 +252,7 @@ "learn-more": "Учить больше", "learning-plans": "Планы обучения", "less": "Меньше", + "lessons": "Уроки", "loading": "Загрузка", "login": "Авторизоваться", "logout": "Выйти", @@ -250,6 +286,7 @@ "off": "Выключенный", "oldest": "Самый старый", "on": "На", + "our-projects": "Наши проекты", "page": "Страница", "pages": "Страницы", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} из {{totalNumberOfResults}} результатов поиска", @@ -272,6 +309,7 @@ "privacy": "Конфиденциальность", "product-updates": "Обновления продуктов", "profile": "Профиль", + "projects-desc": "Некоммерческие проекты, принадлежащие, управляемые или спонсируемые Quran.Foundation", "q-reflect": "Коран", "quran-com": "Quran.com", "quran-radio": "Коран Радио", @@ -287,6 +325,7 @@ "reciters": "Чтецы", "reflect": "Отражать", "reflections": "Размышления", + "reflections-and-lessons": "Размышления и уроки", "remove": "Удалять", "rename": "Переименовать", "retry": "Повторить", @@ -296,10 +335,12 @@ "save-to-collection": "Сохранить в коллекцию", "search-for": "Найдите '{{searchQuery}}'", "search-results": "{{count}} результатов поиска", + "search-results-no-count": "Результаты поиска", "search": { "filters": "Фильтры", "hint": "Попробуйте поискать", "jump-to": "Прыгать в", + "more-results": "Больше результатов", "no-results": "результаты не найдены", "no-results-suggestion": "Мы не смогли найти подходящих результатов поиска для \" {{searchQuery}} \". попробуйте поискать другое ключевое слово.", "popular": "Популярные запросы", @@ -340,8 +381,10 @@ "search-juz": "Искать Джуз", "search-page": "Страница поиска", "search-surah": "Искать суру", + "search-verse": "Поиск стиха", "try-navigating-with": "Совет: попробуйте перемещаться с помощью" }, + "sign-in": "Войти", "sitemap": "Карта сайта", "sort": { "ascending": "по возрастанию", @@ -362,10 +405,6 @@ "tafsirs-desc": "Прочтите различные тафсиры аята {{ayahNumber}} суры {{surahName}} от доверенных ученых-тафсиров", "title": "Тафсир" }, - "tarteel": { - "app": "Приложение Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Условия и положения", "theme": "Тема", "themes": { @@ -400,13 +439,13 @@ "view": "Вид", "voice": { "ask-permission": "Пожалуйста, разрешите микрофону, чтобы начать использовать голосовой поиск", - "error": "Произошла ошибка. Повторите попытку позже. Или скачайте", - "no-permission": "Похоже, у вас не включены разрешения для микрофона. Пожалуйста, включите разрешения микрофона и попробуйте еще раз или загрузите", - "not-supported": "Похоже, ваш браузер не поддерживает микрофон. Пожалуйста, попробуйте другой браузер или загрузите", + "error": "Произошла ошибка, попробуйте еще раз позже.", + "no-permission": "Похоже, у вас не включены разрешения на микрофон. Включите разрешения на микрофон и попробуйте еще раз.", + "not-supported": "Похоже, ваш браузер не поддерживает микрофон. Попробуйте другой браузер.", "suggest": "Пожалуйста, начните читать, и ваш стих появится.", "suggest-subtitle": "Произнесите любой стих на арабском языке, и этот стих появится.", "suggest-title": "Читай сейчас", - "voice-search-powered-by": "Голосовой поиск на базе" + "voice-search-powered-by": "Голосовой поиск Работает на" }, "wbw": "Слово за слово", "wbw-lang-summary": "Источник пословного перевода: {{source}} . Этот источник не зависит от выбора перевода стиха.", diff --git a/locales/ru/developers.json b/locales/ru/developers.json index bae600a122..6836f13555 100644 --- a/locales/ru/developers.json +++ b/locales/ru/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Команда Quran.com", - "header": "Помощь в разработке", - "issues-cta": "Если у вас есть какие-либо вопросы или вы хотите связаться с сопровождающими, просто напишите о проблеме! Мы свяжемся с вами, как только сможем, иншАллах.", - "issues-guide": "Обычно мы используем <0> проекты Github <\/0> как источник того, над чем работать дальше, что будет дальше и какие ошибки необходимо исправить. Например, <1> этот URL <\/1> содержит список ошибок, вещи, с которыми нам нужна помощь, и предстоящие функции.", - "main-desc": "Асаламу Алыком, во-первых, большое спасибо за ваш интерес, который вы помогли нам в развитии Quran.com и его проектов. Мы рады работать с вами!", - "projects": { - "all": "У нас есть несколько проектов, размещенных на Github. Вы можете найти их все <0> здесь <\/0> . Но чтобы обрисовать их в общих чертах:", - "q-android": "<0> Коран Android <\/0>", - "q-api": "<0> Quran.com API <\/0> - написано на Ruby on Rails.", - "q-api-docs": "<0> Quran.com API Docs <\/0> — наш портал документации по API.", - "q-audio": "<0> Quranic Audio <\/0> и <1> Мобильные приложения Quranic Audio <\/1>", - "q-audio-segments": "<0> Аудиосегменты Корана <\/0>", - "q-ios": "<0> Коран iOS <\/0>", - "q-next": "<0> Quran.com Frontend <\/0> - написано на Next.js.", - "q-v2": "<0> Quran.com <\/0> - написано на Ruby on Rails." - }, - "sub-main-desc": "Мы команда разработчиков, дизайнеров, менеджеров по продуктам и мыслителей, работающих над Quran.com на волонтерской основе. Альхамдулила, нам повезло работать в некоторых великих компаниях в Кремниевой долине, Торонто и ОАЭ - и мы чувствуем, что это меньшее, что мы можем сделать, чтобы помочь нашей умме продвинуться вперед в изучении и изучении их религии. Работать над Quran.com очень приятно, и пусть Аллах вознаградит всех нас (и вознаградит вас) за наши усилия.", - "thanks": "Спасибо за прочтение! С нетерпением жду встречи с вами, фиксирующей код!" -} \ No newline at end of file + "footer": "- Команда Quran.com", + "header": "Помощь в разработке", + "issues-cta": "Если у вас есть какие-либо вопросы или вы хотите связаться с сопровождающими, просто напишите о проблеме! Мы свяжемся с вами, как только сможем, иншАллах.", + "issues-guide": "Обычно мы используем <0> проекты Github как источник того, над чем работать дальше, что будет дальше и какие ошибки необходимо исправить. Например, <1> этот URL содержит список ошибок, вещи, с которыми нам нужна помощь, и предстоящие функции.", + "main-desc": "Асаламу Алыком, во-первых, большое спасибо за ваш интерес, который вы помогли нам в развитии Quran.com и его проектов. Мы рады работать с вами!", + "projects": { + "all": "У нас есть несколько проектов, размещенных на Github. Вы можете найти их все <0> здесь . Но чтобы обрисовать их в общих чертах:", + "q-android": "<0> Коран Android ", + "q-api": "<0> Quran.com API - написано на Ruby on Rails.", + "q-api-docs": "<0> Quran.com API Docs — наш портал документации по API.", + "q-audio": "<0> Quranic Audio и <1> Мобильные приложения Quranic Audio ", + "q-audio-segments": "<0> Аудиосегменты Корана ", + "q-ios": "<0> Коран iOS ", + "q-next": "<0> Quran.com Frontend - написано на Next.js.", + "q-v2": "<0> Quran.com - написано на Ruby on Rails." + }, + "thanks": "Спасибо за прочтение! С нетерпением жду встречи с вами, фиксирующей код!" +} diff --git a/locales/ru/home.json b/locales/ru/home.json index f0a5086b24..ba5079a640 100644 --- a/locales/ru/home.json +++ b/locales/ru/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Достигните своих целей в Коране", + "begin": "Начинать", + "chapters-and-verses": "Главы и стихи", + "continue-read": "Продолжить чтение", + "explore-topics": "Исследуйте темы", + "first-time-reading": "Впервые читаете Коран? Начните здесь ", + "know-someone": "Развивайтесь вместе с нами в этот Рамадан ", + "learning-plan": "Планы обучения", + "listen-to-radio": "Слушайте радио Корана", + "my-quran": "Мой Коран", + "navigate-quran": "Навигация по Корану", "no-bookmarks": "У вас еще нет закладок", "no-recently-read": "У вас пока нет сеансов чтения", "noble-quran": "Благородный Коран", + "popular": "Популярный", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Путь развития Корана" }, - "ramadan-activities-cta": " Следите за Всемирным календарем Корана <\/b> чтобы еженедельно читать отрывки из Корана, слушать вдохновляющие подкасты и получать призывы к размышлениям! <\/link>", + "qr-community": "Прочитайте сегодняшние избранные стихи и размышления", + "ramadan-activities-cta": " Следите за Всемирным календарем Корана чтобы еженедельно читать отрывки из Корана, слушать вдохновляющие подкасты и получать призывы к размышлениям! ", + "ramadan": { + "header": "Инструменты для углубления вашей связи с Кораном", + "title": "Готовы к Рамадану?" + }, "read-juz": "Читать юз", "recently-read": "Недавно прочитал", - "revelation-order-disclaimer": "Этот вид показывает хронологический порядок сур в Коране, основанный на том, когда они были ниспосланы Пророку Мухаммеду ﷺ <\/hover> . Хронология является предметом научных мнений, и некоторые суры раскрывались по частям в разное время. Порядок здесь основан на работе Tanzil.net <\/link> . [Примечание: составленный порядок Мусхаф от аль-Фатихи до ан-Наса является предметом консенсуса.]", + "revelation-order-disclaimer": "Этот вид показывает хронологический порядок сур в Коране, основанный на том, когда они были ниспосланы Пророку Мухаммеду . Хронология является предметом научных мнений, и некоторые суры раскрывались по частям в разное время. Порядок здесь основан на работе Tanzil.net . [Примечание: составленный порядок Мусхаф от аль-Фатихи до ан-Наса является предметом консенсуса.]", + "see-more-learning-plans": "Смотреть больше", + "set-custom-goal": "Поставьте цель", + "share-quran": { + "description": "Помогите распространить Коран среди новых учеников", + "title": "Поделитесь Кораном!" + }, + "start-read": "Начать чтение", + "stay-consistent": "Отслеживайте серии, создавайте индивидуальные цели, оставайтесь последовательными", "tab": { "bookmarks": "Закладки", "popular": "Популярный" diff --git a/locales/ru/learn.json b/locales/ru/learn.json index 9d9f0cbd65..1389b28cdf 100644 --- a/locales/ru/learn.json +++ b/locales/ru/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Спасибо за ваш отзыв!", "your-feedback": "Ваш отзыв" }, + "help-about-reflection": "Помощь по функции отражения", "learn-duration": "Продолжительность", + "learn-more": "Узнать больше", "learning-plan-material": "Материал плана обучения", "learning-plan-meta-desc": "Этот план обучения поможет изменить ваше отношение к Корану. Начните свое путешествие сегодня!", "learning-plans-desc": "Повысьте свои знания с помощью простых для понимания уроков, которые помогут вам расти в вашем путешествии по Корану.

    Начните план обучения сегодня! Ваш прогресс отслеживается, пока вы не достигнете финиша.", @@ -34,9 +36,12 @@ "next-lesson": "Следующий урок", "not-enrolled": "Вы еще не зарегистрированы в Плане обучения .", "prev-lesson": "Предыдущий урок", + "reflection-description-1": "Нажатие «Добавить размышление» перенесет вас на QuranReflect, платформу для обмена личными размышлениями о Коране. В отличие от Тафсира (научного толкования), размышления — это личные идеи и опыт, связанные с аятами.", + "reflection-description-2": "Если вы опубликуете сообщение публично, оно будет рассмотрено командой модераторов и станет видимым для сообщества QuranReflect.", "start-learning": "Начать обучение", "tabs": { "main": "Основные детали", "syllabus": "Учебный план" - } + }, + "what-happens-when-you-click-add-reflection": "Что происходит, когда вы нажимаете «Добавить отражение»?" } diff --git a/locales/ru/login.json b/locales/ru/login.json index c2e97df36f..ac789c9533 100644 --- a/locales/ru/login.json +++ b/locales/ru/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Ожидает подтверждения", + "back": "Назад", + "back-to-login": "Вернуться к входу", + "check-email-title": "Проверьте электронную почту, чтобы завершить регистрацию", + "confirm": "Подтверждать", + "confirm-new-password-placeholder": "Подтвердите новый пароль", + "confirm-password-placeholder": "Подтвердите пароль", + "continue": "Продолжать", "continue-apple": "Продолжить с Apple", "continue-email": "Продолжить с электронной почтой", "continue-facebook": "Продолжить с Facebook", "continue-google": "Продолжить через Google", "email-placeholder": "Адрес электронной почты", + "error": { + "email-required": "Электронная почта отсутствует!", + "invalid-credentials": "Неверный адрес электронной почты или пароль", + "invalid-email": "Неверный формат адреса электронной почты!", + "login-failed": "Не удалось войти. Попробуйте еще раз.", + "password-required": "Пароль отсутствует!" + }, + "errors": { + "account-banned": "Извините, Ваш аккаунт забанен. Свяжитесь с Quran.Foundation", + "badRequest": "*Неверный запрос", + "banned": "*Извините, Ваш аккаунт забанен. Свяжитесь с Quran.Foundation", + "confirm": "*Подтвердите пароль не совпадает с паролем", + "email": "*Неверный формат адреса электронной почты!", + "exactLength": "*Значение должно иметь точную длину", + "expiredToken": "*Срок действия этого токена истек", + "forgot-password-failed": "Не удалось отправить письмо для сброса пароля. Попробуйте еще раз.", + "immutable": "*Это значение не может быть изменено.", + "invalid": "*Это {{fieldName}} недействительно", + "invalidEmailOrPassword": "*Неверный адрес электронной почты или пароль", + "max": "* {{fieldName}} должно быть меньше или равно {{max}} цифр", + "min": "* {{fieldName}} должно быть больше или равно {{min}} цифр", + "name": "* {{fieldName}} должно содержать только буквы и цифры", + "notFound": "*Не найдено", + "required": "* {{fieldName}} отсутствует!", + "reset-password-failed": "Не удалось сбросить пароль. Попробуйте еще раз.", + "signin-failed": "Не удалось войти. Попробуйте еще раз.", + "signup-failed": "Регистрация не удалась. Попробуйте еще раз.", + "taken": "* {{fieldName}} уже существует!", + "usedToken": "*Этот токен уже использован", + "username": "* {{fieldName}} принимает только подчеркивание и буквы", + "verification-code-invalid": "Этот код подтверждения недействителен", + "verification-code-length": "Проверочный код должен содержать {{length}} цифр", + "verification-failed": "Проверка не удалась. Попробуйте еще раз.", + "verification-resend-failed": "Не удалось повторно отправить код подтверждения." + }, "feature-1": "Отслеживайте свои цели", "feature-2": "Сохраняйте полосу чтения", "feature-3": "Создавайте коллекции", "feature-4": "Синхронизируйте ваши данные между браузерами", "feature-5": "И более!", "feature-6": " Новинка! Примечания и размышления", + "first-name-placeholder": "Имя", + "forgot-password": "Забыли пароль", + "forgot-password-description": "Введите свой адрес электронной почты, и мы вышлем вам инструкции по сбросу пароля.", + "forgot-password-success": "Письмо для сброса пароля отправлено! Проверьте свой почтовый ящик.", + "forgot-password-title": "Забыли пароль?", + "last-name-placeholder": "Фамилия", "login-cta": "Войдите или зарегистрируйтесь сейчас:", "login-error": { "AuthenticationError": "Ошибка аутентификации. Пожалуйста, попробуйте позже", + "BannedUserError": "Извините, Ваш аккаунт забанен. Свяжитесь с Quran.Foundation.", "TokenExpiredError": "Вы вышли из системы, пожалуйста, войдите снова." }, "login-title": "Войти на Quran.com", + "new-password-placeholder": "Новый пароль", "other-options": "Другие варианты входа", + "password-placeholder": "Пароль", + "password-reset-success": "Пароль успешно сброшен!", + "password-rules": { + "lowercase": "По крайней мере одна строчная буква", + "max-length": "Макс. 20 символов", + "min-length": "Минимум 8 символов", + "number": "По крайней мере один номер", + "special": "По крайней мере один специальный символ (!@#$%^&*_-)", + "uppercase": "По крайней мере одна заглавная буква" + }, "privacy-policy": "Защита вашей конфиденциальности — наш приоритет. Регистрируясь, вы соглашаетесь с нашей Политикой конфиденциальности и Условиями и положениями .", - "verify-code": "Убедитесь, что предоставленный код безопасности соответствует следующему тексту:" + "quran-text": "Коран", + "quran-title": "Коран.com", + "reflect-feature-1": "Поразмышляйте над Кораном", + "reflect-feature-2": "Присоединяйтесь к группам", + "reflect-feature-3": "Взаимодействуйте с другими", + "reflect-feature-4": "И многое другое!", + "reset-password": "Сбросить пароль", + "reset-password-success": "Пароль успешно сброшен!", + "set-new-password": "Установить новый пароль", + "sign-in": "Войти", + "sign-in-or-sign-up": "Войти или зарегистрироваться", + "sign-up": "Зарегистрироваться", + "unified-registration-1": "Единая регистрация ", + "unified-registration-2": "Коран.Основание", + "unified-registration-3": ". У вас будет доступ к следующим веб-сайтам ", + "unified-registration-4": "через ваши учетные данные.", + "username-placeholder": "Имя пользователя", + "verification-code-instruction": "Пожалуйста, введите код, указанный в электронном письме, чтобы завершить регистрацию.", + "verification-code-resend": "Отправить письмо повторно", + "verification-code-resend-countdown": "Повторно отправить письмо с подтверждением через {{seconds}} сек...", + "verification-code-sent": "Код подтверждения отправлен!", + "verification-code-sent-to": "Мы только что отправили электронное письмо", + "verification-code-spam-note": "Не получили письмо? Проверьте папку со спамом", + "verify-code": "Убедитесь, что предоставленный код безопасности соответствует следующему тексту:", + "welcome-description-1": "Единая регистрация", + "welcome-description-2": ".Фундамент", + "welcome-description-3": "Используя свои учетные данные, вы получите доступ к следующим веб-сайтам.", + "welcome-title": "Добро пожаловать в" } diff --git a/locales/ru/onboarding.json b/locales/ru/onboarding.json index 70d5cd26d2..10c5ad9bd3 100644 --- a/locales/ru/onboarding.json +++ b/locales/ru/onboarding.json @@ -87,10 +87,6 @@ "description": "Выбирайте из множества переводов на несколько языков. Совет: сравните переводы, выбрав несколько вариантов.", "title": "Переводы" }, - "voice-search": { - "description": "Коснитесь значка микрофона и произнесите стих, который ищете. Быстрая подсказка! Чтобы узнать, где кто-то читает (например, молитвы Таравих), коснитесь значка микрофона. После обнаружения одного или двух стихов нажмите «Стоп», чтобы найти местоположение.", - "title": "Голосовой поиск (Тартил)" - }, "wbw-audio": { "description": "Выберите эту опцию, чтобы прослушивать каждое слово по отдельности, просто щелкая по слову!", "title": "Прослушайте пословную транслитерацию, щелкнув по слову." diff --git a/locales/ru/question.json b/locales/ru/question.json index f360bac2f5..be3d7a6527 100644 --- a/locales/ru/question.json +++ b/locales/ru/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Вопросы и ответы по теме ", - "question": "Вопрос" + "question": "Вопрос", + "questions-meta-desc": "Изучите проверенные ответы, чтобы углубить свое понимание Корана." } diff --git a/locales/ru/quick-links.json b/locales/ru/quick-links.json index f83b13b16b..19e9855eae 100644 --- a/locales/ru/quick-links.json +++ b/locales/ru/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "О Коране", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Присоединяйтесь к Рамадану размышлений", - "rahman": "Surah Ar-Rahman", - "sunnah": "Стихи о Сунне", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "О Коране", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Иисус в Коране", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Присоединяйтесь к Рамадану размышлений", + "rahman": "Surah Ar-Rahman", + "sunnah": "Стихи о Сунне", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Что такое Рамадан?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/ru/quran-reader.json b/locales/ru/quran-reader.json index d12aaa0929..e868225411 100644 --- a/locales/ru/quran-reader.json +++ b/locales/ru/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Начало Хизба", "include-translator": "Включить имя переводчика?", "juz-beginning": "Начало жуза", + "lessons-desc": "Читайте и делитесь уроками Корана из аята {{ayahNumber}} суры {{surahName}}", + "lessons-disclaimer": "Уроки — это личные прозрения и толкования Корана. Они не должны восприниматься как авторитетные.", + "lessons-not-available": "Для этого аята нет проверенных уроков", "mad-2": "Маад 2 секунды", "mad-2-4-6": "Разрешенный маад 2 или 4 или 6 секунд", "mad-4-5": "Необходимо Маад 4 или 5 секунд", diff --git a/locales/ru/radio.json b/locales/ru/radio.json index d590edd5bd..3141e5588d 100644 --- a/locales/ru/radio.json +++ b/locales/ru/radio.json @@ -1,26 +1,27 @@ { - "change": "Изменять", - "curated-station": { - "juz-amma": { - "description": "Слушайте последний жуз Корана", - "title": "Джуз Амма" - }, - "popular-recitations": { - "description": "Ежедневная кураторская лента декламаций", - "title": "Популярные чтения" - }, - "surah-al-kahf": { - "description": "Слушайте суру Алькахф на повторе", - "title": "Сура Аль-Кахф" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "Суры от кураторов чтецов", - "title": "Ясин, Аль-Вакиа, Аль-Мульк" - } + "change": "Изменять", + "curated-station": { + "juz-amma": { + "description": "Слушайте последний жуз Корана", + "title": "Джуз Амма" }, - "curated-stations": "Кураторские станции", - "pause-radio": "Пауза Радио", - "play-radio": "Воспроизвести радио", - "radio-desc": "Слушайте безостановочное красивое чтение Священного Корана разными чтецами.", - "reciter-stations": "Чтец станции" -} \ No newline at end of file + "popular-recitations": { + "description": "Ежедневная кураторская лента декламаций", + "title": "Популярные чтения" + }, + "surah-al-kahf": { + "description": "Слушайте суру Алькахф на повторе", + "title": "Сура Аль-Кахф" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Суры от кураторов чтецов", + "title": "Ясин, Аль-Вакиа, Аль-Мульк" + } + }, + "curated-stations": "Кураторские станции", + "pause-radio": "Пауза Радио", + "play-radio": "Воспроизвести радио", + "radio-desc": "Слушайте безостановочное красивое чтение Священного Корана разными чтецами.", + "reciter-stations": "Чтец станции", + "station": "Станция" +} diff --git a/locales/ru/reading-goal.json b/locales/ru/reading-goal.json index 94b15782f8..b6c08556a2 100644 --- a/locales/ru/reading-goal.json +++ b/locales/ru/reading-goal.json @@ -1,146 +1,150 @@ { - "continue-reading": "Продолжить чтение", - "continuous": { - "description": "Ваша цель рассчитает ваш прогресс в течение нескольких дней", - "title": "В течение продолжительного времени" - }, - "create-plan": "Создать план", - "create-reading-goal": "Создать цель", - "daily-progress": "Ежедневный прогресс", - "daily": { - "description": "Ваша цель будет сбрасываться каждый день", - "title": "Ежедневная цель" - }, - "day-x": "День {{day}}", - "days": "Дни", - "duration": "Продолжительность (дни)", - "ending-chapter": "Окончание суры", - "ending-verse": "Концовка Ая", - "examples-subtitle": "Вот список общих целей. Вы также можете создать свою собственную цель.", - "examples-title": "Выберите предустановленную цель или создайте собственную", - "examples": { - "custom": { - "description": "Установите персонализированную цель, которая вам подходит", - "title": "Обычай" - }, - "khatm": { - "description": "Классический гол Хатма. Читать по 1 юзу в день", - "title": "Прочтите Коран за 30 дней" - }, - "time": { - "description": "Простая цель для начинающих", - "title": "Читайте 10 минут в день" - }, - "year": { - "description": "Читайте Коран в своем собственном темпе в течение следующего года", - "title": "Прочтите Коран за год" - } - }, - "frequency-tab": { - "description": "Должна ли ваша цель сбрасываться каждый день или через определенное количество дней? Не волнуйтесь, мы будем отслеживать ваш прогресс независимо от выбранной вами частоты.", - "title": "Выберите частоту для вашей цели" - }, - "goal-done": { - "description": "Любые дополнительные показания будут по-прежнему записываться", - "title": "Вы выполнили сегодняшнюю цель" - }, - "goal-target": { - "description": "Сколько времени, страниц или стихов вы должны прочитать, чтобы достичь своей цели?", - "title": "Установите цель для своей цели" - }, - "goal-type": { - "description": "Должна ли ваша цель основываться на времени, страницах или произвольном диапазоне (например, 3 джуза Корана)?", - "title": "Выберите критерий для вашей цели" - }, - "goal-types": { - "pages": { - "description": "Ваша цель будет основываться на страницах", - "title": "Страницы" - }, - "range": { - "description": "Ваша цель будет основываться на определенном наборе стихов (это может быть сура, джуз или даже весь Коран).", - "title": "Пользовательский диапазон" - }, - "time": { - "description": "Ваша цель будет зависеть от времени", - "title": "Время" - } - }, - "plus-x-more-days": { - "one": "+{{days}} еще день", - "few": "+{{days}} дня", - "many": "+{{days}} дней", - "other": "+{{days}} дней" - }, - "preview-schedule": { - "description": "Вот так будет выглядеть ваша цель. Вы всегда можете изменить его позже.", - "title": "Вот предварительный просмотр вашего расписания" - }, - "progress": { - "complete": "Сегодняшняя цель выполнена 🎉", - "goal-complete": "Ваша цель достигнута 🎉", - "pages-goal": "прочитать {{pages}} страниц Корана", - "range-goal": "читать {{from}} до {{to}}", - "time-goal": "читать {{time}} Корана" - }, - "reading-goal": "Цель чтения", - "reading-goal-description": "Считаете ли вы трудным поддерживать согласованность с вашими целями чтения Корана? Путешествие по Корану — это динамическая функция, разработанная, чтобы помочь вам оставаться последовательным в своем путешествии по Корану. Независимо от того, стремитесь ли вы читать 10 минут в день, завершить джуз за месяц или прочитать весь Коран за год и т. д., Quran.com теперь может помочь вам установить собственную цель и отслеживать ваши ежедневные полосы чтения, в то время как корректируя по мере продвижения. Его можно использовать совершенно бесплатно, и мы надеемся, что он поможет вам сохранить мотивацию для достижения своей цели!", - "reading-goal-label": "Вы находитесь на", - "reading-goal-title": "Знакомство с Путешествием по Корану", - "recommended": "рекомендуемые", - "remaining": "Осталось на сегодня", - "remaining-days": { - "one": "Остался {{days}} день", - "few": "осталось {{days}} дня", - "many": "осталось {{days}} дней", - "other": "осталось {{days}} дней" - }, - "set-reading-goal-success": "Ваша цель чтения была успешно установлена.", - "start-journey": "Начните свое путешествие!", - "start-reading": "Начать чтение", - "starting-chapter": "Начальная сура", - "starting-verse": "Начиная с ая", - "streak": "Полоса", - "streak-definition": "Полоса — это количество дней подряд, когда вы читали Коран.", - "timeline-meaning": "Что означает ваша временная шкала?", - "timeline-states": { - "checked": "Вы достигли своей цели", - "filled": "Вы что-то прочитали, но недостаточно для достижения цели", - "none": "Вы еще ничего не читали в тот день", - "stroked": "Вы ничего не читали сегодня" - }, - "todays-goal": "Сегодняшняя цель", - "view-progress": "Посмотреть прогресс", - "week-progress": "Прогресс на этой неделе", - "x-days": { - "one": "{{days}} день", - "few": "{{days}} дня", - "many": "{{days}} дней", - "other": "{{days}} дней" - }, - "x-days-streak": "{{days}} дневная серия", - "x-hours": { - "one": "{{hours}} час", - "few": "{{hours}} часа", - "many": "{{hours}} часов", - "other": "{{hours}} часов" - }, - "x-minutes": { - "one": "{{minutes}} минута", - "few": "{{minutes}} минуты", - "many": "{{minutes}} минут", - "other": "{{minutes}} минут" - }, - "x-pages": { - "one": "{{pages}} страница", - "few": "{{pages}} страницы", - "many": "{{pages}} страниц", - "other": "{{pages}} страниц" - }, - "x-seconds": { - "one": "{{seconds}} секунда", - "few": "{{seconds}} секунды", - "many": "{{seconds}} секунд", - "other": "{{seconds}} секунд" + "continue-reading": "Продолжить чтение", + "continuous": { + "description": "Ваша цель рассчитает ваш прогресс в течение нескольких дней", + "title": "В течение продолжительного времени" + }, + "create-plan": "Создать план", + "create-reading-goal": "Создать цель", + "daily-progress": "Ежедневный прогресс", + "daily-progress-completed": "Завершено! 🎉", + "daily": { + "description": "Ваша цель будет сбрасываться каждый день", + "title": "Ежедневная цель" + }, + "day-x": "День {{day}}", + "days": "Дни", + "duration": "Продолжительность (дни)", + "ending-chapter": "Окончание суры", + "ending-verse": "Концовка Ая", + "examples-subtitle": "Вот список общих целей. Вы также можете создать свою собственную цель.", + "examples-title": "Выберите предустановленную цель или создайте собственную", + "examples": { + "custom": { + "description": "Установите персонализированную цель, которая вам подходит", + "title": "Обычай" + }, + "khatm": { + "description": "Классический гол Хатма. Читать по 1 юзу в день", + "title": "Прочтите Коран за 30 дней" + }, + "time": { + "description": "Простая цель для начинающих", + "title": "Читайте 10 минут в день" + }, + "year": { + "description": "Читайте Коран в своем собственном темпе в течение следующего года", + "title": "Прочтите Коран за год" + } + }, + "frequency-tab": { + "description": "Должна ли ваша цель сбрасываться каждый день или через определенное количество дней? Не волнуйтесь, мы будем отслеживать ваш прогресс независимо от выбранной вами частоты.", + "title": "Выберите частоту для вашей цели" + }, + "goal-completed": "Цель достигнута! 🎉 ", + "goal-done": { + "description": "Любые дополнительные показания будут по-прежнему записываться", + "title": "Вы выполнили сегодняшнюю цель" + }, + "goal-target": { + "description": "Сколько времени, страниц или стихов вы должны прочитать, чтобы достичь своей цели?", + "title": "Установите цель для своей цели" + }, + "goal-type": { + "description": "Должна ли ваша цель основываться на времени, страницах или произвольном диапазоне (например, 3 джуза Корана)?", + "title": "Выберите критерий для вашей цели" + }, + "goal-types": { + "pages": { + "description": "Ваша цель будет основываться на страницах", + "title": "Страницы" + }, + "range": { + "description": "Ваша цель будет основываться на определенном наборе стихов (это может быть сура, джуз или даже весь Коран).", + "title": "Пользовательский диапазон" + }, + "time": { + "description": "Ваша цель будет зависеть от времени", + "title": "Время" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} еще день", + "few": "+{{days}} дня", + "many": "+{{days}} дней", + "other": "+{{days}} дней" + }, + "preview-schedule": { + "description": "Вот так будет выглядеть ваша цель. Вы всегда можете изменить его позже.", + "title": "Вот предварительный просмотр вашего расписания" + }, + "progress": { + "complete": "Сегодняшняя цель выполнена 🎉", + "goal-complete": "Ваша цель достигнута 🎉", + "pages-goal": "прочитать {{pages}} страниц Корана", + "range-goal": "читать {{from}} до {{to}}", + "time-goal": "читать {{time}} Корана" + }, + "reading-goal": "Цель чтения", + "reading-goal-description": "Вам сложно поддерживать последовательность в достижении ваших целей чтения Корана?

    Quran Growth Journey — это динамическая функция, разработанная для того, чтобы помочь вам оставаться последовательными в вашем путешествии с Кораном. Независимо от того, ставите ли вы себе цель читать 10 минут в день, завершить джуз за месяц или закончить весь Коран за год и т. д., Quran.com теперь может помочь вам установить индивидуальную цель и отслеживать ваши ежедневные серии чтения, корректируя их по мере вашего прогресса. Его можно использовать совершенно бесплатно, и мы надеемся, что он поможет вам оставаться мотивированными для достижения своей цели!", + "reading-goal-label": "Вы находитесь на", + "reading-goal-title": "Представляем вам Quran Growth Journey", + "recommended": "рекомендуемые", + "remaining": "Осталось на сегодня", + "remaining-base": "Оставшийся", + "remaining-days": { + "one": "Остался {{days}} день", + "few": "осталось {{days}} дня", + "many": "осталось {{days}} дней", + "other": "осталось {{days}} дней" + }, + "set-a-new-goal": "Поставьте новую цель", + "set-reading-goal-success": "Ваша цель чтения была успешно установлена.", + "start-journey": "Начните свое путешествие!", + "start-reading": "Начать чтение", + "starting-chapter": "Начальная сура", + "starting-verse": "Начиная с ая", + "streak": "Полоса", + "streak-definition": "Полоса — это количество дней подряд, когда вы читали Коран.", + "timeline-meaning": "Что означает ваша временная шкала?", + "timeline-states": { + "checked": "Вы достигли своей цели", + "filled": "Вы что-то прочитали, но недостаточно для достижения цели", + "none": "Вы еще ничего не читали в тот день", + "stroked": "Вы ничего не читали сегодня" + }, + "todays-goal": "Сегодняшняя цель", + "view-progress": "Посмотреть прогресс", + "week-progress": "Прогресс на этой неделе", + "x-days": { + "one": "{{days}} день", + "few": "{{days}} дня", + "many": "{{days}} дней", + "other": "{{days}} дней" + }, + "x-days-streak": "{{days}} дневная серия", + "x-hours": { + "one": "{{hours}} час", + "few": "{{hours}} часа", + "many": "{{hours}} часов", + "other": "{{hours}} часов" + }, + "x-minutes": { + "one": "{{minutes}} минута", + "few": "{{minutes}} минуты", + "many": "{{minutes}} минут", + "other": "{{minutes}} минут" + }, + "x-pages": { + "one": "{{pages}} страница", + "few": "{{pages}} страницы", + "many": "{{pages}} страниц", + "other": "{{pages}} страниц" + }, + "x-seconds": { + "one": "{{seconds}} секунда", + "few": "{{seconds}} секунды", + "many": "{{seconds}} секунд", + "other": "{{seconds}} секунд" + } +} diff --git a/locales/ru/support.json b/locales/ru/support.json index 432efa89ca..de3d160f00 100644 --- a/locales/ru/support.json +++ b/locales/ru/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Пожалуйста, сообщите об этой ошибке <0> здесь <\/0> и мы исправим эту ошибку как можно скорее, иншаллах.", - "bug-q": "Я обнаружил ошибку перевода, где мне ее зарегистрировать?", - "developer-a": "Пожалуйста, посетите <0> страницу разработчиков <\/0> для получения дополнительной информации.", - "developer-q": "Я разработчик. Как я могу внести свой вклад?", - "donate-a": "Во-первых, мы очень ценим ваш интерес. Перейдите по <0> этой <\/0> ссылке", - "donate-q": "Как я могу сделать пожертвование?", - "download-a": "К сожалению нет. Мы пока не предоставляем возможности для загрузки нашего веб-сайта или Корана на ваш компьютер. Однако вы можете установить наше мобильное приложение для чтения в автономном режиме.", - "download-q": "Могу ли я загрузить Quran.com на свой компьютер?", - "fiqh-a": "Quran.com - это онлайн-инструмент для чтения, прослушивания и изучения. Команда Quran.com состоит из инженеров-программистов, дизайнеров и менеджеров по продукции. К сожалению, это ограничение нашего набора навыков. У нас нет ученых, имамов или шейхов в составе команды, которая могла бы помочь с вопросами, связанными с исламом, фикхом или фетвами. Мы стараемся воздерживаться от ответов на эти вопросы и советуем вам поговорить с местным имамом в мечети или с шейхом.", - "fiqh-q": "Вопросы, связанные с исламом \/ фикхом \/ фетвами", - "header": "Помощь и обратная связь", - "main-desc": "Пожалуйста, проверьте FAQ, чтобы увидеть, был ли уже дан ответ на ваш вопрос. При необходимости вы можете <0> связаться с нами <\/0> и мы сделаем все возможное, чтобы свяжемся с вами как можно скорее, но для того, чтобы вы знали, что у нас небольшая команда, пожалуйста, будьте любезны.", - "mobile-a": "Да! Посетите нашу <0> страницу мобильных приложений <\/0> для получения дополнительной информации.", - "mobile-q": "Есть ли у Quran.com мобильное приложение?", - "other-languages-a": "Чтобы изменить предпочитаемый язык, в правом верхнем углу каждой страницы есть раскрывающийся список (в верхнем левом углу для языков с письмом справа налево). Используйте это раскрывающееся меню, чтобы выбрать предпочитаемый язык.", - "other-languages-q": "Могу ли я просматривать сайт на других языках?", - "reciters-a": "Разместите дополнительную информацию об этом чтеце <0> здесь <\/0>", - "reciters-q": "Добавление чтецов", - "site-down-a": "Это не хорошо! Если сайт вообще не работает или, возможно, вы видите белый экран с текстом «Извините, что-то пошло не так», мы будем признательны, если вы сообщите об этом <0> здесь <\/0> .", - "site-down-q": "Сайт не работает, как мне сказать?", - "support": "Служба поддержки", - "tafsir-a": "Да, у нас есть тафсиры. Щелкните значок, показанный рядом с каждым аятом, затем щелкните тафисры. Приложение покажет вам список доступных тафсиров. Щелкните по тафсиру, который хотите прочитать.", - "tafsir-q": "Доступен ли Тафсир?", - "translations-a": "Откройте новый выпуск <0> здесь <\/0> со всеми подробностями, дайте ссылку на перевод, и мы постараемся добавить это.", - "translations-q": "Добавить еще перевод" -} \ No newline at end of file + "bug-a": "Пожалуйста, сообщите об этой ошибке <0> здесь и мы исправим эту ошибку как можно скорее, иншаллах.", + "bug-q": "Я обнаружил ошибку перевода, где мне ее зарегистрировать?", + "developer-a": "Пожалуйста, посетите <0> страницу разработчиков для получения дополнительной информации.", + "developer-q": "Я разработчик. Как я могу внести свой вклад?", + "donate-a": "Во-первых, мы очень ценим ваш интерес. Перейдите по <0> этой ссылке", + "donate-q": "Как я могу сделать пожертвование?", + "download-a": "К сожалению нет. Мы пока не предоставляем возможности для загрузки нашего веб-сайта или Корана на ваш компьютер. Однако вы можете установить наше мобильное приложение для чтения в автономном режиме.", + "download-q": "Могу ли я загрузить Quran.com на свой компьютер?", + "header": "Помощь и обратная связь", + "main-desc": "Пожалуйста, проверьте FAQ, чтобы увидеть, был ли уже дан ответ на ваш вопрос. При необходимости вы можете <0> связаться с нами и мы сделаем все возможное, чтобы свяжемся с вами как можно скорее, но для того, чтобы вы знали, что у нас небольшая команда, пожалуйста, будьте любезны.", + "mobile-a": "Да! Пожалуйста, посетите <0>Quran для Android или <1>Quran iOS, чтобы загрузить приложения", + "mobile-q": "Есть ли у Quran.com мобильное приложение?", + "other-languages-a": "Чтобы изменить предпочитаемый язык, в правом верхнем углу каждой страницы есть раскрывающийся список (в верхнем левом углу для языков с письмом справа налево). Используйте это раскрывающееся меню, чтобы выбрать предпочитаемый язык.", + "other-languages-q": "Могу ли я просматривать сайт на других языках?", + "reciters-a": "Разместите дополнительную информацию об этом чтеце <0> здесь ", + "reciters-q": "Добавление чтецов", + "site-down-a": "Это не хорошо! Если сайт вообще не работает или, возможно, вы видите белый экран с текстом «Извините, что-то пошло не так», мы будем признательны, если вы сообщите об этом <0> здесь .", + "site-down-q": "Сайт не работает, как мне сказать?", + "support": "Служба поддержки", + "tafsir-a": "Да, у нас есть тафсиры. Щелкните значок, показанный рядом с каждым аятом, затем щелкните тафисры. Приложение покажет вам список доступных тафсиров. Щелкните по тафсиру, который хотите прочитать.", + "tafsir-q": "Доступен ли Тафсир?", + "translations-a": "Откройте новый выпуск <0> здесь со всеми подробностями, дайте ссылку на перевод, и мы постараемся добавить это.", + "translations-q": "Добавить еще перевод" +} diff --git a/locales/sq/about.json b/locales/sq/about.json index f1f077709a..a472f75853 100644 --- a/locales/sq/about.json +++ b/locales/sq/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Ky projekt nuk do të ishte i mundur pa shumë librari dhe projekte me burim të hapur që kemi përdorur:", - "lokalize": "<0>Lokalize<\/0>: Një sistem përkthimi me ndihmën e kompjuterit që fokusohet në produktivitetin dhe sigurimin e cilësisë dhe ofron një rrjedhë pune lokalizimi pa probleme.", - "quran-align": "<0>Collin Fair<\/0>: Një mjet për prodhimin e segmentimit të saktë të fjalëve të recitimit të regjistruar Kur'anor.", - "quran-complex": "<0>Kompleksi Mbretit Fehd për printimin e Kur'anit të lavdishëm<\/0>:Kompleksi Mbretit Fehd për printimin e Kur'anit të lavdishëm është një lider në shërbimin e Kur'anit të lavdishëm dhe shkencave të tij, në përkthimin e kuptimeve të tij dhe në mbrojtjen e tekstit kuranor nga shtrembërimi, nëpërmjet përdorimit optimal të teknologji të avancuara në fushën e printimit, regjistrimeve audio, publikimeve elektronike dhe aplikacioneve dixhitale.", - "quran-enc": "<0>QuranEnc<\/0>: Një portal që paraqet përkthime falas dhe të besueshme të kuptimeve dhe interpretimeve të Kuranit fisnik në shumë gjuhë të botës.", - "tanzil": "<0>Tanzil<\/0> : Një projekt ndërkombëtar Kur'anor që synon të sigurojë një tekst të saktë të Kur'anit me verifikim të lartë.", - "title": "Akretidime", - "vercel": "<0>Vercel<\/0>: është një platformë vendosjeje dhe bashkëpunimi për zhvilluesit e front-endit, e cila e vendos në plan të parë zhvilluesin e frontendit, duke u dhënë atyre mjete gjithëpërfshirëse për të ndërtuar faqe interneti dhe aplikacione me performancë të lartë.", - "zekr": "<0>Zekr<\/0>: Një platformë e hapur mjet studimi i Kuranit për shfletimin dhe kërkimin mbi Kuranin" - }, - "main-description": "Quran.com u themelua në vitin 1995. Faqja e internetit synon ta bëjë të lehtë për këdo leximin, studimin dhe mësimin e Kuranit. Projekti është me kod të hapur dhe është ndërtuar si një bashkëpunim midis anëtarëve të ekipit kryesor dhe ekipit <0>Tarteel<\/0> ." -} \ No newline at end of file + "credits": { + "desc": "Ne shprehim mirënjohjen tonë për të gjithë ata që kanë mbështetur dhe kontribuar në këtë projekt, duke ndihmuar për ta bërë Kuranin të aksesueshëm për miliona njerëz në mbarë botën.", + "lokalize": "<0>Lokalize: Një sistem përkthimi me ndihmën e kompjuterit që fokusohet në produktivitetin dhe sigurimin e cilësisë dhe ofron një rrjedhë pune të pandërprerë të lokalizimit.", + "quran-align": "<0>Collin Fair: Një mjet për prodhimin e segmentimit të saktë të fjalëve të recitimit të regjistruar Kur'anor.", + "quran-complex": "<0>Kompleksi i Kuranit: Kompleksi i Shtypjes së Kur'anit të Lavdishëm Mbreti Fahd është një lider në shërbimin e Kur'anit të Lavdishëm dhe Shkencave të tij, në përkthimin e Domethënieve të tij dhe në ruajtjen e Tekstit Kur'anor nga shtrembërimi, nëpërmjet përdorimit optimal të teknologjive të përparuara në fushën e printimit, regjistrimeve audio, botimit elektronik dhe aplikacioneve dixhitale.", + "quran-enc": "<0>QuranEnc: Një portal që paraqet përkthime falas dhe të besueshme të kuptimeve dhe interpretimeve të Kuranit fisnik në shumë gjuhë të botës.", + "tanzil": "<0>Tanzil: Një projekt ndërkombëtar kuranor që synon të sigurojë një tekst të saktë të Kuranit shumë të verifikuar.", + "tarteel": "<0>Tarteel: Një aplikacion për memorizimin e Kuranit i mbështetur nga AI. Është krijuar për t'ju ndihmuar të mësoni përmendësh më të zgjuar, pavarësisht nëse jeni duke kërkuar për një varg, duke ndjekur përparimin tuaj ose duke ndjekur së bashku me recitimin tuaj.", + "title": "Kreditë", + "vercel": "<0>Vercel: është një platformë vendosjeje dhe bashkëpunimi për zhvilluesit e frontendit, e cila e vendos në plan të parë zhvilluesin e frontendit, duke u dhënë atyre mjete gjithëpërfshirëse për të ndërtuar faqe interneti dhe aplikacione me performancë të lartë.", + "zekr": "<0>Zekr: Një platformë e hapur mjet studimi i Kuranit për shfletimin dhe kërkimin mbi Kuranin" + }, + "global-effort": { + "desc": "Miliona njerëz nga e gjithë bota mbështeten te Quran.com si burimi i tyre kryesor dixhital i Kuranit. Pavarësisht nëse vijnë për të recituar, reflektuar, mësuar përmendësh ose studiuar, ata ndajnë një qëllim të përbashkët: një dëshirë të sinqertë për t'u lidhur me fjalët e Allahut. \\n Ndërsa vazhdojmë të rritemi, ne mbetemi të përkushtuar për të siguruar që Quran.com të mbetet një hapësirë ​​e besueshme, e aksesueshme dhe e dizajnuar bukur për këdo që kërkon të angazhohet me Kuranin.", + "title": "Një Përpjekje Globale" + }, + "key-features": { + "desc": "Quran.com është krijuar për të mbështetur çdo fazë të angazhimit me Kuranin – nga leximi dhe memorizimi deri te studimi dhe reflektimi. Karakteristikat tona përfshijnë:", + "features": [ + "Ndërfaqja miqësore e Kuranit - Një përvojë e pastër dhe intuitive leximi në çdo pajisje.", + "Përkthime të Shumëfishta dhe Tefsir – Qasje në përkthime në shumë gjuhë, së bashku me tefsirin.", + "Recitime audio – Dëgjoni recitime me cilësi të lartë nga Qaris me famë botërore, me aftësinë për të ndjekur fjalë për fjalë.", + "Kërkim dhe navigim i avancuar – Gjeni vargjet në çast sipas temës ose fjalëve kyçe në të gjithë Kuranin.", + "Ayah Bookmarking & Notes – Ruani vargjet dhe shkruani reflektime personale për referencë të mëvonshme.", + "Kurani Reflect Integrimi – Angazhohuni me një komunitet global përmes reflektimeve dhe njohurive të ndara nga studiues dhe individë.", + "Ndjekja e progresit dhe objektivat e leximit – Mbani gjurmët e qëllimeve tuaja ditore dhe historisë së leximit", + "API për Zhvilluesit – Qasje falas në përmbajtje dhe veçori për të fuqizuar aplikacionet islamike dhe R&D.", + "Dhe shumë më tepër, Elhamdullilah." + ], + "title": "Karakteristikat dhe Ofertat kryesore" + }, + "main-description": "Që nga themelimi i tij në 1995, Quran.com është përkushtuar që ta bëjë Kuranin të disponueshëm për të gjithë në një mënyrë që është e qartë, autentike dhe e lehtë për t'u përfshirë. Çdo ditë, miliona njerëz në mbarë botën i drejtohen Quran.com për të lexuar, dëgjuar, studiuar dhe reflektuar mbi Kuranin – qofshin ata studentë të përjetshëm, studiues apo sapo kanë filluar udhëtimin e tyre.", + "our-mission": { + "desc": "Kurani është menduar për t'u lexuar, kuptuar dhe reflektuar mbi të. Misioni ynë është të heqim pengesat për aksesin dhe fuqizojmë individët dhe komunitetet duke ofruar një përvojë Kuranore të besueshme, të mirë-projektuar dhe pasuruese të thellë. Ne synojmë të shërbejmë si një burim i besueshëm për këdo që kërkon të angazhohet me Kuranin, të udhëhequr nga parimet e saktësisë, qartësisë dhe sinqeritetit.", + "title": "Misioni ynë" + }, + "who-we-are": { + "desc": "Quran.com është një vakëf (dhurim), i krijuar si një besim publik për të siguruar që Kurani të mbetet i aksesueshëm për të gjithë, pa pagesë dhe pa interesa komerciale. Ai menaxhohet nga Quran.Foundation, një organizatë jofitimprurëse 501(c)(3), e cila mbështet dhe zhvillon Quran.com si pjesë e misionit të saj për të ofruar burime autentike kuranore me cilësi të lartë në botë. Angazhimi ynë është t'i shërbejmë Kur'anit dhe lexuesve të tij me përsosmëri, sinqeritet dhe përgjegjësi.", + "title": "Kush Jemi Ne" + } +} diff --git a/locales/sq/apps.json b/locales/sq/apps.json index fd7b1ef361..a2116abf56 100644 --- a/locales/sq/apps.json +++ b/locales/sq/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Nga zhvilluesit kryesorë të Quran.com, vijnë aplikacionet e bukura dhe pa reklama mushaf për iOS dhe Android. Tani është më e lehtë të lexosh Kuranin në lëvizje, ta mësosh përmendësh dhe të dëgjosh recituesit e tu të preferuar.", - "tarteel-desc": "Tarteel është aplikacioni i parë i Kuranit që përdor mjetet e AI për të bashkëvepruar me recitimin tuaj dhe për të theksuar gabimet. Një shoqërues i Kuranit i drejtuar nga zëri në pëllëmbën e duarve tuaja, Tarteel punon në mënyrë intuitive për t'ju ndihmuar të lexoni, recitoni, mësoni përmendësh dhe kuptoni Kuranin me besim! <0><\/0><0><\/0> Tarteel është krenar që është një zhvillues kryesor i Quran.com si dhe një anëtar i bordit të tyre të qeverisjes." -} \ No newline at end of file + "quran-desc": "Nga zhvilluesit kryesorë të Quran.com, vijnë aplikacionet e bukura dhe pa reklama mushaf për iOS dhe Android. Tani është më e lehtë të lexosh Kuranin në lëvizje, ta mësosh përmendësh dhe të dëgjosh recituesit e tu të preferuar." +} diff --git a/locales/sq/common.json b/locales/sq/common.json index 029d7224a7..9b21e92a8d 100644 --- a/locales/sq/common.json +++ b/locales/sq/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Lundrimet", "no-nav-results": "Nuk ka rezultate navigimi", - "placeholder": "Çfarë doni të lexoni?", - "powered-by": "Kërkimi zanor i mundësuar nga Tarteel.ai", + "placeholder": "Kërkoni në Kuran...", "recent-navigations": "Lundrimet e fundit", "search-by-voice": "Kërko me zë", "try-navigating": "Provoni të lundroni në" @@ -122,9 +121,11 @@ } }, "continue": "Vazhdoni", + "contribute-to-our-mission": "Kontribuoni në misionin tonë", "copied": "E kopjuar", "copied-to-clipboard": "Kopjuar në kujtesën tuaj", "copy": "Kopjo", + "copylink": "Kopjo lidhjen", "counter": { "decrease": "Ulje", "increase": "Rrit" @@ -134,6 +135,7 @@ "developers": "Zhvilluesit", "display": "Ekrani", "donate": "Dhuroni", + "donate-now": "Dhuroni tani", "donate_monthly": "Dhuroni çdo muaj", "donate_once": "Dhuroni një herë", "edit": "Redakto", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Max {{maxNumberOfVerses}} Ajete", "ranges-wrong-order": "Vargu fillestar duhet të jetë para vargut përfundimtar." }, + "errors": { + "account-banned": "Na vjen keq, llogaria juaj është e ndaluar. Kontakto Kuran.Fondacioni", + "badRequest": "*Kërkesë e pavlefshme", + "banned": "*Na falni, llogaria juaj është e ndaluar. Kontakto Kuran.Fondacioni", + "confirm": "*Konfirmo që fjalëkalimi nuk përputhet me fjalëkalimin", + "email": "*Format i pavlefshëm i postës elektronike!", + "exactLength": "*Vlera duhet të jetë gjatësia e saktë", + "expiredToken": "*Ky token ka skaduar", + "forgot-password-failed": "Dërgimi i email-it për rivendosjen e fjalëkalimit dështoi. Ju lutemi provoni përsëri.", + "immutable": "*Kjo vlerë nuk mund të ndryshohet", + "invalid": "*Kjo {{fieldName}} është e pavlefshme", + "invalidEmailOrPassword": "*Email ose fjalëkalim i pavlefshëm", + "max": "* {{fieldName}} duhet të jetë më pak ose e barabartë me {{max}} shifra", + "min": "* {{fieldName}} duhet të jetë më shumë se ose e barabartë me {{min}} shifra", + "name": "* {{fieldName}} duhet të jetë vetëm shkronja dhe numra", + "notFound": "*Nuk u gjet", + "required": "* {{fieldName}} mungon!", + "reset-password-failed": "Rivendosja e fjalëkalimit dështoi. Ju lutemi provoni përsëri.", + "signin-failed": "Identifikimi dështoi. Ju lutemi provoni përsëri.", + "signup-failed": "Regjistrimi dështoi. Ju lutemi provoni përsëri.", + "taken": "* {{fieldName}} ekziston tashmë!", + "usedToken": "*Kjo shenjë është përdorur tashmë", + "username": "* {{fieldName}} pranoni vetëm nënvizat dhe shkronjat", + "verification-code-invalid": "Ky kod verifikimi është i pavlefshëm", + "verification-code-length": "Kodi i verifikimit duhet të jetë {{length}} shifra", + "verification-failed": "Verifikimi dështoi. Ju lutemi provoni përsëri.", + "verification-resend-failed": "Dështoi ridërgimi i kodit të verifikimit" + }, "exciting-updates": "Përditësime emocionuese", "feedback": "Feedback", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Madhësia e shkronjave të përkthimit" }, "footer": { - "description": "Quran.com është një Jariyah Sadakah. Shpresojmë t'ua bëjmë të lehtë të gjithëve leximin, studimin dhe mësimin e Kuranit Fisnik. Kurani Fisnik ka shumë emra duke përfshirë Al-Kuran Al-Kareem, Al-Ketab, Al-Furkan, Al-Maw'itha, Al-Thikr dhe Al-Noor.", + "description": "Quran.com është një platformë e besuar e përdorur nga miliona njerëz në mbarë botën për të lexuar, kërkuar, dëgjuar dhe reflektuar mbi Kuranin në shumë gjuhë. Ai ofron përkthime, tefsir, recitime, përkthim fjalë për fjalë dhe mjete për studim më të thellë, duke e bërë Kuranin të arritshëm për të gjithë.

    Si një Jariyah Sadakah, Quran.com është i përkushtuar për të ndihmuar njerëzit të lidhen thellë me Kuranin. Mbështetur nga Quran.Foundation, një organizatë jofitimprurëse 501(c)(3), Quran.com vazhdon të rritet si një burim falas dhe i vlefshëm për të gjithë, Alhamdullilah”.", "hiring": "Ne po punësojmë! Bashkohuni me ekipin e QuranFoundation dhe kontribuoni në misionin tonë. Apliko tani! ", "rights": "Të gjitha të drejtat e rezervuara", - "title": "Lexoni, studioni dhe mësoni Kuranin Fisnik." + "title": "Lexoni, dëgjoni, kërkoni dhe reflektoni mbi Kuranin" }, "form": { "body": "Trupi", "code": "Kodi i Verifikimit", + "confirm-password": "Konfirmo fjalëkalimin", "email": "Email", "firstName": "Emri", "lastName": "Mbiemri", - "title": "Titulli" + "password": "Fjalëkalimi", + "title": "Titulli", + "username": "Emri i përdoruesit", + "verification-code": "Kodi i verifikimit" }, "from": "Nga", + "fundraising-share-title": "Share Quran.com Mbledhja e fondeve", "fundraising-sticky-banner": { "cta": "Dhuroni", "title": "Jepni në ditët më të mira!" @@ -217,6 +252,7 @@ "learn-more": "Mëso më shumë", "learning-plans": "Planet mësimore", "less": "Më pak", + "lessons": "Mësimet", "loading": "Po ngarkohet", "login": "Identifikohu", "logout": "Shkyç", @@ -250,6 +286,7 @@ "off": "Joaktiv", "oldest": "Më e vjetra", "on": "Aktiv", + "our-projects": "Projektet tona", "page": "Faqe", "pages": "Faqet", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} nga {{totalNumberOfResults}} rezultate kërkimi", @@ -272,6 +309,7 @@ "privacy": "Privatësia", "product-updates": "Përditësimet e produktit", "profile": "Profili", + "projects-desc": "Projektet jofitimprurëse të zotëruara, të menaxhuara ose të sponsorizuara nga Quran.Foundation", "q-reflect": "Kurani Reflekto", "quran-com": "Quran.com", "quran-radio": "Kuran Radio", @@ -287,6 +325,7 @@ "reciters": "Recituesit", "reflect": "Pasqyrim", "reflections": "Reflektime", + "reflections-and-lessons": "Reflektime & Mësime", "remove": "Hiq", "rename": "Riemërto", "retry": "Provo sërish", @@ -296,10 +335,12 @@ "save-to-collection": "Ruaje në Koleksion", "search-for": "Kërko për \"{{searchQuery}}\"", "search-results": "{{count}} rezultatet e kërkimit", + "search-results-no-count": "Rezultatet e Kërkimit", "search": { "filters": "Filtrat", "hint": "Provoni të kërkoni për", "jump-to": "Kërce Te", + "more-results": "Më shumë rezultate", "no-results": "Nuk u gjet asnjë rezultat", "no-results-suggestion": "Nuk gjetëm asnjë rezultat kërkimi që përputhej për \" {{searchQuery}} \". provoni të kërkoni për një fjalë kyçe të ndryshme.", "popular": "Kërkimet popullore", @@ -340,8 +381,10 @@ "search-juz": "Kërko Xhuzin", "search-page": "Kërko Faqja", "search-surah": "Kërko suren", + "search-verse": "Kërko Vargu", "try-navigating-with": "Këshillë: provoni të lundroni me" }, + "sign-in": "Identifikohu", "sitemap": "Harta e faqes", "sort": { "ascending": "Në ngjitje", @@ -362,10 +405,6 @@ "tafsirs-desc": "Lexoni tefsire të ndryshme të Ajetit {{ayahNumber}} të sures {{surahName}} nga dijetarë të besuar të tefsirit", "title": "Tefsir" }, - "tarteel": { - "app": "Aplikacioni Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Termat dhe Kushtet", "theme": "Tema", "themes": { @@ -400,9 +439,9 @@ "view": "Pamje", "voice": { "ask-permission": "Ju lutemi aktivizoni lejen e mikrofonit për të filluar përdorimin e Kërkimit me zë", - "error": "Një gabim ka ndodhur.Ju lutemi, provojeni përsëri më vonë. Ose shkarkoni", - "no-permission": "Me sa duket nuk i ke të aktivizuara lejet e mikrofonit. Aktivizo lejet e mikrofonit dhe provo sërish ose shkarko", - "not-supported": "Duket sikur shfletuesi juaj nuk e mbështet mikrofonin. Ju lutemi provoni një shfletues tjetër ose shkarkoni", + "error": "Ka ndodhur një gabim, ju lutemi provoni përsëri më vonë.", + "no-permission": "Me sa duket nuk i ke të aktivizuara lejet e mikrofonit. Aktivizo lejet e mikrofonit dhe provo sërish.", + "not-supported": "Duket sikur shfletuesi juaj nuk e mbështet mikrofonin. Ju lutemi provoni një shfletues tjetër.", "suggest": "Ju lutemi filloni të recitoni dhe vargu juaj do të shfaqet.", "suggest-subtitle": "Recitoni çdo varg në arabisht dhe vargu do të shfaqet", "suggest-title": "Recitoni tani", diff --git a/locales/sq/developers.json b/locales/sq/developers.json index d92a75b06f..97a715acae 100644 --- a/locales/sq/developers.json +++ b/locales/sq/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Ekipi i Quran.com", - "header": "Ndihmë për zhvillimin", - "issues-cta": "Nëse keni ndonjë pyetje ose dëshironi të kontaktoni mirëmbajtësit, thjesht shkruani një mesazh! Ne do të kthehemi tek ju sa më shpejt që të mundemi, inshAllah.", - "issues-guide": "Në mënyrë tipike ne përdorim <0>projektet Github<\/0> si burim për çfarë të punojmë më pas, çfarë do të ndodhë dhe çfarë gabimesh ekzistojnë që duhen zgjidhur. Për shembull <1>kjo url<\/1> ka një listë të gabimeve, gjëra për të cilat kemi nevojë për ndihmë dhe veçori të ardhshme.", - "main-desc": "Esselamu Alejkum, Së pari, ju falënderojmë shumë për interesimin tuaj për të na ndihmuar të zhvillojmë Quran.com dhe projektet e tij. Ne jemi të ngazëllyer për të punuar me ju!", - "projects": { - "all": "Ne kemi një numër projektesh të gjitha të organizuara në Github. Mund t'i gjeni të gjitha <0>këtu<\/0>. Por për t'i përshkruar ato:", - "q-android": "<0>Kurani Android<\/0>", - "q-api": "<0>Quran.com API<\/0> - shkruar në Ruby on Rails.", - "q-api-docs": "<0> Dokumentet API të Quran.com <\/0> - Portali ynë i dokumenteve API.", - "q-audio": "<0>Audio Kur'anore<\/0> dhe <1>Aplikacionet celulare Audio Kur'anore<\/1>", - "q-audio-segments": "<0>Segmentet audio të Kuranit<\/0>", - "q-ios": "<0>Kurani iOS<\/0>", - "q-next": "<0>Quran.com Frontend<\/0> - shkruar në Next.js.", - "q-v2": "<0>Quran.com<\/0> - shkruar në Ruby on Rails." - }, - "sub-main-desc": "Ne jemi një ekip zhvilluesish, stilistësh, menaxherësh produktesh dhe mendimtarësh që punojnë në bashkëpunim me ekipin <0>Tarteel<\/0> për të ofruar përvojën më të mirë në internet të leximit të Kuranit. Elhamdulilah, ne kemi qenë të bekuar të punojmë për disa kompani të mëdha në mbarë botën - dhe mendojmë se kjo është më e pakta që mund të bëjmë për të ndihmuar Umetin tonë të ecë përpara në mësimin dhe studimin e fesë së tyre. Puna në Quran.com është shumë kënaqësi dhe Allahu na shpërbleftë të gjithëve (dhe ju shpërbleftë) për përpjekjet tona.", - "thanks": "Faleminderit per leximin! Mezi pres t'ju shoh të kryeni një kod!" -} \ No newline at end of file + "footer": "- Ekipi i Quran.com", + "header": "Ndihmë për zhvillimin", + "issues-cta": "Nëse keni ndonjë pyetje ose dëshironi të kontaktoni mirëmbajtësit, thjesht shkruani një mesazh! Ne do të kthehemi tek ju sa më shpejt që të mundemi, inshAllah.", + "issues-guide": "Në mënyrë tipike ne përdorim <0>projektet Github si burim për çfarë të punojmë më pas, çfarë do të ndodhë dhe çfarë gabimesh ekzistojnë që duhen zgjidhur. Për shembull <1>kjo url ka një listë të gabimeve, gjëra për të cilat kemi nevojë për ndihmë dhe veçori të ardhshme.", + "main-desc": "Esselamu Alejkum, Së pari, ju falënderojmë shumë për interesimin tuaj për të na ndihmuar të zhvillojmë Quran.com dhe projektet e tij. Ne jemi të ngazëllyer për të punuar me ju!", + "projects": { + "all": "Ne kemi një numër projektesh të gjitha të organizuara në Github. Mund t'i gjeni të gjitha <0>këtu. Por për t'i përshkruar ato:", + "q-android": "<0>Kurani Android", + "q-api": "<0>Quran.com API - shkruar në Ruby on Rails.", + "q-api-docs": "<0> Dokumentet API të Quran.com - Portali ynë i dokumenteve API.", + "q-audio": "<0>Audio Kur'anore dhe <1>Aplikacionet celulare Audio Kur'anore", + "q-audio-segments": "<0>Segmentet audio të Kuranit", + "q-ios": "<0>Kurani iOS", + "q-next": "<0>Quran.com Frontend - shkruar në Next.js.", + "q-v2": "<0>Quran.com - shkruar në Ruby on Rails." + }, + "thanks": "Faleminderit per leximin! Mezi pres t'ju shoh të kryeni një kod!" +} diff --git a/locales/sq/home.json b/locales/sq/home.json index fccf056111..1d68b7a688 100644 --- a/locales/sq/home.json +++ b/locales/sq/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Arritni qëllimet tuaja të Kuranit", + "begin": "Filloni", + "chapters-and-verses": "Kapitujt dhe vargjet", + "continue-read": "Vazhdo Leximi", + "explore-topics": "Eksploroni Temat", + "first-time-reading": "I ri në Kuran? Fillo këtu ", + "know-someone": "Rriteni me ne këtë Ramazan ", + "learning-plan": "Planet mësimore", + "listen-to-radio": "Dëgjoni Radio Kur'anin", + "my-quran": "Kurani im", + "navigate-quran": "Lundroni në Kuran", "no-bookmarks": "Nuk keni ende asnjë faqeshënues", "no-recently-read": "Nuk keni ende asnjë seancë leximi", "noble-quran": "Kurani Fisnik", + "popular": "Popullore", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Udhëtimi i rritjes së Kuranit" }, - "ramadan-activities-cta": " Ndiqni Kalendarin Global Kur'anor <\/b> për lexime javore, podkaste frymëzuese dhe thirrje për të reflektuar! <\/link>", + "qr-community": "Lexoni vargjet dhe refleksionet e paraqitura sot", + "ramadan-activities-cta": " Ndiqni Kalendarin Global Kur'anor për lexime javore, podkaste frymëzuese dhe thirrje për të reflektuar! ", + "ramadan": { + "header": "Mjete për të thelluar lidhjen tuaj me Kuranin", + "title": "Gati për Ramazan?" + }, "read-juz": "Lexoni Juz", "recently-read": "Lexuar së fundmi", - "revelation-order-disclaimer": "Ky këndvështrim tregon rendin kronologjik të sureve në Kuran bazuar në kohën kur ato iu shpallën Profetit Muhamed ﷺ <\/hover> . Kronologjia është temë e mendimit të studiuesve dhe disa sure janë shpallur pjesë-pjesë në kohë të ndryshme. Renditja këtu bazohet në punën e Tanzil.net <\/link> . [Shënim: urdhri i përpiluar i Mushaf nga el-Fatiha në el-Nas është një çështje konsensusi.]", + "revelation-order-disclaimer": "Ky këndvështrim tregon rendin kronologjik të sureve në Kuran bazuar në kohën kur ato iu shpallën Profetit Muhamed . Kronologjia është temë e mendimit të studiuesve dhe disa sure janë shpallur pjesë-pjesë në kohë të ndryshme. Renditja këtu bazohet në punën e Tanzil.net . [Shënim: urdhri i përpiluar i Mushaf nga el-Fatiha në el-Nas është një çështje konsensusi.]", + "see-more-learning-plans": "Shih më shumë", + "set-custom-goal": "Vendosni një qëllim", + "share-quran": { + "description": "Ndihmoni në përhapjen e Kuranit te nxënësit e rinj", + "title": "Shpërndaje Kuranin!" + }, + "start-read": "Filloni të lexoni", + "stay-consistent": "Ndiqni vijat, krijoni qëllime të personalizuara, qëndroni konsistent", "tab": { "bookmarks": "Faqeruajtësit", "popular": "Popullore" diff --git a/locales/sq/learn.json b/locales/sq/learn.json index b20b112fab..b94d34d73a 100644 --- a/locales/sq/learn.json +++ b/locales/sq/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Faleminderit për komentin tuaj!", "your-feedback": "Komentet tuaja" }, + "help-about-reflection": "Ndihmë për veçorinë e reflektimit", "learn-duration": "Kohëzgjatja", + "learn-more": "Mësoni më shumë", "learning-plan-material": "Materiali i planit mësimor", "learning-plan-meta-desc": "Ky Plan Mësimi do të ndihmojë në transformimin e mënyrës se si angazhoheni me Kuranin, filloni udhëtimin tuaj sot!", "learning-plans-desc": "Rritni njohuritë tuaja me mësime të thjeshta për t'u ndjekur që ju bëjnë të rriteni në udhëtimin tuaj me Kuranin.

    Filloni një plan mësimor sot! Përparimi juaj gjurmohet derisa të arrini në vijën e finishit.", @@ -34,9 +36,12 @@ "next-lesson": "Mësimi tjetër", "not-enrolled": "Nuk jeni regjistruar ende në planin mësimor .", "prev-lesson": "Mësimi i mëparshëm", + "reflection-description-1": "Duke klikuar \"Shto Refleksion\" do t'ju çojë te QuranReflect, një platformë për ndarjen e reflektimeve personale mbi Kuranin. Ndryshe nga Tefsiri (interpretimi dijetar), reflektimet janë njohuri dhe përvoja personale që lidhen me vargjet.", + "reflection-description-2": "Nëse postoni publikisht, reflektimi juaj do të shqyrtohet nga ekipi i moderimit dhe do të bëhet i dukshëm për komunitetin e KuranReflekt.", "start-learning": "Filloni të mësoni", "tabs": { "main": "Detajet kryesore", "syllabus": "Programi mësimor" - } + }, + "what-happens-when-you-click-add-reflection": "Çfarë ndodh kur klikoni \"Shto reflektim\"?" } diff --git a/locales/sq/login.json b/locales/sq/login.json index 6e9c08dcc8..1ed965dfcd 100644 --- a/locales/sq/login.json +++ b/locales/sq/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Në pritje të konfirmimit", + "back": "Mbrapa", + "back-to-login": "Kthehu te Login", + "check-email-title": "Kontrolloni emailin për të përfunduar regjistrimin", + "confirm": "Konfirmo", + "confirm-new-password-placeholder": "Konfirmo fjalëkalimin e ri", + "confirm-password-placeholder": "Konfirmo fjalëkalimin", + "continue": "Vazhdoni", "continue-apple": "Vazhdoni me Apple", "continue-email": "Vazhdo me Email", "continue-facebook": "Vazhdo me Facebook", "continue-google": "Vazhdo me Google", "email-placeholder": "Adresa e emailit", + "error": { + "email-required": "Email-i mungon!", + "invalid-credentials": "Email ose fjalëkalim i pavlefshëm", + "invalid-email": "Format i pavlefshëm i postës elektronike!", + "login-failed": "Identifikimi dështoi. Ju lutemi provoni përsëri.", + "password-required": "Fjalëkalimi mungon!" + }, + "errors": { + "account-banned": "Na vjen keq, llogaria juaj është e ndaluar. Kontakto Kuran.Fondacioni", + "badRequest": "*Kërkesë e pavlefshme", + "banned": "*Na falni, llogaria juaj është e ndaluar. Kontakto Kuran.Fondacioni", + "confirm": "*Konfirmo që fjalëkalimi nuk përputhet me fjalëkalimin", + "email": "*Format i pavlefshëm i postës elektronike!", + "exactLength": "*Vlera duhet të jetë gjatësia e saktë", + "expiredToken": "*Ky token ka skaduar", + "forgot-password-failed": "Dërgimi i email-it për rivendosjen e fjalëkalimit dështoi. Ju lutemi provoni përsëri.", + "immutable": "*Kjo vlerë nuk mund të ndryshohet", + "invalid": "*Kjo {{fieldName}} është e pavlefshme", + "invalidEmailOrPassword": "*Email ose fjalëkalim i pavlefshëm", + "max": "* {{fieldName}} duhet të jetë më pak ose e barabartë me {{max}} shifra", + "min": "* {{fieldName}} duhet të jetë më shumë se ose e barabartë me {{min}} shifra", + "name": "* {{fieldName}} duhet të jetë vetëm shkronja dhe numra", + "notFound": "*Nuk u gjet", + "required": "* {{fieldName}} mungon!", + "reset-password-failed": "Rivendosja e fjalëkalimit dështoi. Ju lutemi provoni përsëri.", + "signin-failed": "Identifikimi dështoi. Ju lutemi provoni përsëri.", + "signup-failed": "Regjistrimi dështoi. Ju lutemi provoni përsëri.", + "taken": "* {{fieldName}} ekziston tashmë!", + "usedToken": "*Kjo shenjë është përdorur tashmë", + "username": "* {{fieldName}} pranoni vetëm nënvizat dhe shkronjat", + "verification-code-invalid": "Ky kod verifikimi është i pavlefshëm", + "verification-code-length": "Kodi i verifikimit duhet të jetë {{length}} shifra", + "verification-failed": "Verifikimi dështoi. Ju lutemi provoni përsëri.", + "verification-resend-failed": "Dështoi ridërgimi i kodit të verifikimit" + }, "feature-1": "Ndiqni qëllimet tuaja", "feature-2": "Ruani vijat e leximit", "feature-3": "Krijo koleksione", "feature-4": "Sinkronizoni të dhënat tuaja nëpër shfletues", "feature-5": "Dhe me shume!", "feature-6": " E re! Shënime dhe reflektime", + "first-name-placeholder": "Emri", + "forgot-password": "Keni harruar fjalëkalimin", + "forgot-password-description": "Shkruani adresën tuaj të emailit dhe ne do t'ju dërgojmë udhëzime për të rivendosur fjalëkalimin tuaj.", + "forgot-password-success": "Email për rivendosjen e fjalëkalimit u dërgua! Ju lutemi kontrolloni kutinë tuaj hyrëse.", + "forgot-password-title": "Keni harruar fjalëkalimin?", + "last-name-placeholder": "Mbiemri", "login-cta": "Identifikohu ose regjistrohu tani:", "login-error": { "AuthenticationError": "Autentifikimi dështoi. Ju lutemi provoni sërish më vonë", + "BannedUserError": "Na vjen keq, llogaria juaj është e ndaluar. Kontakto Kuran.Fondacioni.", "TokenExpiredError": "Ju keni dalë nga llogaria, ju lutemi identifikohuni përsëri." }, "login-title": "Hyni në Quran.com", + "new-password-placeholder": "Fjalëkalim i ri", "other-options": "Opsione të tjera të hyrjes", + "password-placeholder": "Fjalëkalimi", + "password-reset-success": "Rivendosja e fjalëkalimit me sukses!", + "password-rules": { + "lowercase": "Të paktën një shkronjë të vogël", + "max-length": "Maksimumi 20 karaktere", + "min-length": "Minim 8 karaktere", + "number": "Të paktën një numër", + "special": "Të paktën një karakter special (!@#$%^&*_-)", + "uppercase": "Të paktën një shkronjë e madhe" + }, "privacy-policy": "Mbrojtja e privatësisë suaj është përparësia jonë – Duke u regjistruar, ju pranoni Politikën tonë të Privatësisë dhe Termat dhe kushtet .", - "verify-code": "Verifikoni që kodi i sigurisë i dhënë përputhet me tekstin e mëposhtëm:" + "quran-text": "Kurani", + "quran-title": "Kurani.com", + "reflect-feature-1": "Reflektoni për Kuranin", + "reflect-feature-2": "Bashkohuni me Grupet", + "reflect-feature-3": "Ndërveproni me të tjerët", + "reflect-feature-4": "Dhe më shumë!", + "reset-password": "Rivendos fjalëkalimin", + "reset-password-success": "Rivendosja e fjalëkalimit me sukses!", + "set-new-password": "Vendosni një fjalëkalim të ri", + "sign-in": "Identifikohu", + "sign-in-or-sign-up": "Identifikohu ose Regjistrohu", + "sign-up": "Regjistrohu", + "unified-registration-1": "Regjistrimi i unifikuar i ", + "unified-registration-2": "Kurani.Themeli", + "unified-registration-3": ". Do të keni akses në faqet e mëposhtme të internetit ", + "unified-registration-4": "përmes detajeve të hyrjes suaj.", + "username-placeholder": "Emri i përdoruesit", + "verification-code-instruction": "Ju lutemi shkruani kodin e dhënë në email për të përfunduar regjistrimin", + "verification-code-resend": "Ridërgo email", + "verification-code-resend-countdown": "Ridërgo email-in e verifikimit për {{seconds}} sek...", + "verification-code-sent": "Kodi i verifikimit u dërgua!", + "verification-code-sent-to": "Sapo dërguam një email tek", + "verification-code-spam-note": "Nuk keni marrë një email? Kontrolloni dosjen tuaj të spamit", + "verify-code": "Verifikoni që kodi i sigurisë i dhënë përputhet me tekstin e mëposhtëm:", + "welcome-description-1": "Regjistrimi i unifikuar i", + "welcome-description-2": ".Themeli", + "welcome-description-3": "Ju do të keni akses në faqet e mëposhtme të internetit përmes detajeve tuaja të hyrjes.", + "welcome-title": "Mirë se vini në" } diff --git a/locales/sq/onboarding.json b/locales/sq/onboarding.json index d6aff25790..cab3516d19 100644 --- a/locales/sq/onboarding.json +++ b/locales/sq/onboarding.json @@ -87,10 +87,6 @@ "description": "Zgjidhni nga një shumëllojshmëri përkthimesh në shumë gjuhë. Këshillë: Krahasoni përkthimet duke zgjedhur opsione të shumta", "title": "Përkthime" }, - "voice-search": { - "description": "Prekni ikonën e mikrofonit dhe recitoni vargun që po kërkoni. Këshillë e shpejtë! Për të zbuluar se ku po reciton dikush (p.sh. lutjet e teravive), trokitni lehtë mbi ikonën e mikrofonit. Pasi të zbulohen një ose dy vargje, shtypni stop për të gjetur vendndodhjen", - "title": "Kërkimi me zë (Tarteel)" - }, "wbw-audio": { "description": "Zgjidhni këtë opsion për të dëgjuar çdo fjalë veç e veç duke klikuar thjesht mbi fjalën!", "title": "Dëgjoni transliterimin fjalë për fjalë duke klikuar fjalën" diff --git a/locales/sq/question.json b/locales/sq/question.json index e88aa190b6..40cb1c67fd 100644 --- a/locales/sq/question.json +++ b/locales/sq/question.json @@ -1,4 +1,5 @@ { "q-and-a": "Pyetje dhe përgjigje që lidhen me ", - "question": "Pyetje" + "question": "Pyetje", + "questions-meta-desc": "Eksploroni përgjigjet e besueshme për të thelluar të kuptuarit tuaj të Kuranit." } diff --git a/locales/sq/quick-links.json b/locales/sq/quick-links.json index e34266b0b0..887191e444 100644 --- a/locales/sq/quick-links.json +++ b/locales/sq/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "Rreth Kuranit", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Bashkohuni me Ramazanin e Reflektimit", - "rahman": "Surah Ar-Rahman", - "sunnah": "Ajete rreth Sunetit", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "Rreth Kuranit", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Jezusi në Kuran", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Bashkohuni me Ramazanin e Reflektimit", + "rahman": "Surah Ar-Rahman", + "sunnah": "Ajete rreth Sunetit", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Çfarë është Ramazani?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/sq/quran-reader.json b/locales/sq/quran-reader.json index 2cfdbd5a66..180c38ec1c 100644 --- a/locales/sq/quran-reader.json +++ b/locales/sq/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Fillimi i Hizbit", "include-translator": "Të përfshihet emri i përkthyesit?", "juz-beginning": "Fillimi i Xhuzit", + "lessons-desc": "Lexoni dhe shpërndani mësimet kur'anore të Ajetit {{ayahNumber}} të sures {{surahName}}", + "lessons-disclaimer": "Mësimet janë njohuri dhe interpretime personale të Kuranit. Ata nuk janë menduar të merren si autoritare.", + "lessons-not-available": "Nuk ka mësime të rishikuara për këtë ajet", "mad-2": "Maad 2 sekonda", "mad-2-4-6": "Lejohet Maad 2 ose 4 ose 6 sekonda", "mad-4-5": "Maad e nevojshme 4 ose 5 sekonda", diff --git a/locales/sq/radio.json b/locales/sq/radio.json index bd8741b4e6..ea1441ba18 100644 --- a/locales/sq/radio.json +++ b/locales/sq/radio.json @@ -1,26 +1,27 @@ { - "change": "Ndryshimi", - "curated-station": { - "juz-amma": { - "description": "Dëgjoni Xhuzin e fundit të Kuranit", - "title": "Xhuzi Amma" - }, - "popular-recitations": { - "description": "Furnizimi i përditshëm i recitimeve", - "title": "Recitime popullore" - }, - "surah-al-kahf": { - "description": "Dëgjojeni suren Alkahf në mënyrë të përsëritur", - "title": "Surja El-Kehf" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "Suret nga një kurim recituesish", - "title": "Jasin, El-Vakiah, El-Mulk" - } + "change": "Ndryshimi", + "curated-station": { + "juz-amma": { + "description": "Dëgjoni Xhuzin e fundit të Kuranit", + "title": "Xhuzi Amma" }, - "curated-stations": "Stacione të kuruara", - "pause-radio": "Ndalo radion", - "play-radio": "Luaj Radion", - "radio-desc": "Dëgjoni pa ndalur recitimin e bukur të Kuranit të Shenjtë nga recitues të ndryshëm.", - "reciter-stations": "Stacione recituese" -} \ No newline at end of file + "popular-recitations": { + "description": "Furnizimi i përditshëm i recitimeve", + "title": "Recitime popullore" + }, + "surah-al-kahf": { + "description": "Dëgjojeni suren Alkahf në mënyrë të përsëritur", + "title": "Surja El-Kehf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Suret nga një kurim recituesish", + "title": "Jasin, El-Vakiah, El-Mulk" + } + }, + "curated-stations": "Stacione të kuruara", + "pause-radio": "Ndalo radion", + "play-radio": "Luaj Radion", + "radio-desc": "Dëgjoni pa ndalur recitimin e bukur të Kuranit të Shenjtë nga recitues të ndryshëm.", + "reciter-stations": "Stacione recituese", + "station": "Stacioni" +} diff --git a/locales/sq/reading-goal.json b/locales/sq/reading-goal.json index fb4c33537c..45bfc17793 100644 --- a/locales/sq/reading-goal.json +++ b/locales/sq/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Vazhdo te lexosh", - "continuous": { - "description": "Qëllimi juaj do të llogarisë përparimin tuaj për një kohëzgjatje prej ditësh", - "title": "Për një kohëzgjatje" - }, - "create-plan": "Krijo plan", - "create-reading-goal": "Krijo një qëllim", - "daily-progress": "Progresi ditor", - "daily": { - "description": "Qëllimi juaj do të rivendoset çdo ditë", - "title": "Qëllimi i përditshëm" - }, - "day-x": "dita {{day}}", - "days": "Ditët", - "duration": "Kohëzgjatja (ditë)", - "ending-chapter": "Surja përfunduese", - "ending-verse": "Përfundimi i Ajetit", - "examples-subtitle": "Këtu është një listë e qëllimeve të përbashkëta. Ju gjithashtu mund të krijoni qëllimin tuaj.", - "examples-title": "Zgjidhni një qëllim të paracaktuar ose krijoni tuajin", - "examples": { - "custom": { - "description": "Vendosni një qëllim personal që ju përshtatet", - "title": "Me porosi" - }, - "khatm": { - "description": "Një gol klasik Khatm. Lexoni 1 Juz në ditë", - "title": "Lexoni Kuranin për 30 ditë" - }, - "time": { - "description": "Një objektiv i thjeshtë miqësor për fillestarët", - "title": "Lexoni 10 minuta në ditë" - }, - "year": { - "description": "Lexoni Kuranin me ritmin tuaj gjatë vitit të ardhshëm", - "title": "Lexoni Kuranin brenda një viti" - } - }, - "frequency-tab": { - "description": "A duhet të rivendoset qëllimi juaj çdo ditë apo çdo numër ditësh? Mos u shqetësoni, ne do të gjurmojmë përparimin tuaj pavarësisht nga frekuenca që ju zgjidhni.", - "title": "Zgjidhni një frekuencë për qëllimin tuaj" - }, - "goal-done": { - "description": "Çdo lexim shtesë do të regjistrohet ende", - "title": "E përfunduat qëllimin e sotëm" - }, - "goal-target": { - "description": "Sa kohë, faqe ose vargje duhet të lexoni për të përmbushur qëllimin tuaj?", - "title": "Vendosni një objektiv për qëllimin tuaj" - }, - "goal-type": { - "description": "A duhet që qëllimi juaj të bazohet në kohë, faqe ose një gamë të personalizuar (dmth. 3 Xhuza të Kuranit)?", - "title": "Zgjidhni një kriter për qëllimin tuaj" - }, - "goal-types": { - "pages": { - "description": "Qëllimi juaj do të bazohet në faqe", - "title": "Faqet" - }, - "range": { - "description": "Qëllimi juaj do të bazohet në një varg vargjesh të personalizuara (kjo mund të jetë një sure, një xhuz, apo edhe i gjithë Kurani)", - "title": "Gama e personalizuar" - }, - "time": { - "description": "Qëllimi juaj do të bazohet në kohë", - "title": "Koha" - } - }, - "plus-x-more-days": { - "one": "+{{days}} ditë më shumë", - "other": "+{{days}} ditë të tjera" - }, - "preview-schedule": { - "description": "Kështu do të duket qëllimi juaj. Mund ta ndryshoni gjithmonë më vonë.", - "title": "Këtu është një pamje paraprake e orarit tuaj" - }, - "progress": { - "complete": "Qëllimi i sotëm është i plotë 🎉", - "goal-complete": "I gjithë qëllimi juaj është i plotë 🎉", - "pages-goal": "lexoni {{pages}} faqe të Kuranit", - "range-goal": "lexo {{from}} në {{to}}", - "time-goal": "lexoni {{time}} të Kuranit" - }, - "reading-goal": "Qëllimi i leximit", - "reading-goal-description": "A ju duket e vështirë të ruani konsistencën me qëllimet tuaja të leximit të Kuranit? Udhëtimi i Rritjes së Kuranit është një veçori dinamike e zhvilluar për t'ju ndihmuar të qëndroni të qëndrueshëm në udhëtimin tuaj me Kuranin. Pavarësisht nëse synoni të lexoni 10 minuta në ditë, të përfundoni një Xhuz në një muaj, ose të përfundoni të gjithë Kuranin në një vit, etj., Quran.com tani mund t'ju ndihmojë të vendosni një qëllim të personalizuar dhe të mbani gjurmët e vijave tuaja të përditshme të leximit, ndërsa duke u përshtatur ndërsa përparoni. Është plotësisht falas për t'u përdorur dhe shpresojmë se do t'ju ndihmojë të qëndroni të motivuar për të arritur qëllimin tuaj!", - "reading-goal-label": "Ju jeni në një", - "reading-goal-title": "Prezantimi i Udhëtimit të Rritjes së Kuranit", - "recommended": "Rekomanduar", - "remaining": "Mbetet për sot", - "remaining-days": { - "one": "Ka mbetur edhe {{days}} dite", - "other": "Kanë mbetur edhe {{days}} ditë" - }, - "set-reading-goal-success": "Qëllimi juaj i leximit është vendosur me sukses.", - "start-journey": "Filloni udhëtimin tuaj!", - "start-reading": "Filloni të lexoni", - "starting-chapter": "Fillimi i sures", - "starting-verse": "Fillimi i ajetit", - "streak": "brez", - "streak-definition": "Një varg është numri i ditëve të njëpasnjëshme që keni lexuar Kuranin.", - "timeline-meaning": "Çfarë do të thotë afati juaj kohor?", - "timeline-states": { - "checked": "Ju keni përfunduar qëllimin tuaj", - "filled": "Ju keni lexuar diçka, por jo mjaftueshëm për të përmbushur qëllimin tuaj", - "none": "Nuk keni lexuar ende asgjë atë ditë", - "stroked": "Ju nuk keni lexuar asgjë sot" - }, - "todays-goal": "Goli i sotëm", - "view-progress": "Shiko Progresin", - "week-progress": "Progresi i kësaj jave", - "x-days": { - "one": "{{days}} dite", - "other": "{{days}} dite" - }, - "x-days-streak": "{{days}} varg ditësh", - "x-hours": { - "one": "{{hours}} orë", - "other": "{{hours}} ore" - }, - "x-minutes": { - "one": "{{minutes}} minutë", - "other": "{{minutes}} minuta" - }, - "x-pages": { - "one": "{{pages}} faqe", - "other": "{{pages}} faqe" - }, - "x-seconds": { - "one": "{{seconds}} sekondë", - "other": "{{seconds}} sekonda" + "continue-reading": "Vazhdo te lexosh", + "continuous": { + "description": "Qëllimi juaj do të llogarisë përparimin tuaj për një kohëzgjatje prej ditësh", + "title": "Për një kohëzgjatje" + }, + "create-plan": "Krijo plan", + "create-reading-goal": "Krijo një qëllim", + "daily-progress": "Progresi ditor", + "daily-progress-completed": "E përfunduar! 🎉", + "daily": { + "description": "Qëllimi juaj do të rivendoset çdo ditë", + "title": "Qëllimi i përditshëm" + }, + "day-x": "dita {{day}}", + "days": "Ditët", + "duration": "Kohëzgjatja (ditë)", + "ending-chapter": "Surja përfunduese", + "ending-verse": "Përfundimi i Ajetit", + "examples-subtitle": "Këtu është një listë e qëllimeve të përbashkëta. Ju gjithashtu mund të krijoni qëllimin tuaj.", + "examples-title": "Zgjidhni një qëllim të paracaktuar ose krijoni tuajin", + "examples": { + "custom": { + "description": "Vendosni një qëllim personal që ju përshtatet", + "title": "Me porosi" + }, + "khatm": { + "description": "Një gol klasik Khatm. Lexoni 1 Juz në ditë", + "title": "Lexoni Kuranin për 30 ditë" + }, + "time": { + "description": "Një objektiv i thjeshtë miqësor për fillestarët", + "title": "Lexoni 10 minuta në ditë" + }, + "year": { + "description": "Lexoni Kuranin me ritmin tuaj gjatë vitit të ardhshëm", + "title": "Lexoni Kuranin brenda një viti" + } + }, + "frequency-tab": { + "description": "A duhet të rivendoset qëllimi juaj çdo ditë apo çdo numër ditësh? Mos u shqetësoni, ne do të gjurmojmë përparimin tuaj pavarësisht nga frekuenca që ju zgjidhni.", + "title": "Zgjidhni një frekuencë për qëllimin tuaj" + }, + "goal-completed": "Qëllimi i përfunduar! 🎉 ", + "goal-done": { + "description": "Çdo lexim shtesë do të regjistrohet ende", + "title": "E përfunduat qëllimin e sotëm" + }, + "goal-target": { + "description": "Sa kohë, faqe ose vargje duhet të lexoni për të përmbushur qëllimin tuaj?", + "title": "Vendosni një objektiv për qëllimin tuaj" + }, + "goal-type": { + "description": "A duhet që qëllimi juaj të bazohet në kohë, faqe ose një gamë të personalizuar (dmth. 3 Xhuza të Kuranit)?", + "title": "Zgjidhni një kriter për qëllimin tuaj" + }, + "goal-types": { + "pages": { + "description": "Qëllimi juaj do të bazohet në faqe", + "title": "Faqet" + }, + "range": { + "description": "Qëllimi juaj do të bazohet në një varg vargjesh të personalizuara (kjo mund të jetë një sure, një xhuz, apo edhe i gjithë Kurani)", + "title": "Gama e personalizuar" + }, + "time": { + "description": "Qëllimi juaj do të bazohet në kohë", + "title": "Koha" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} ditë më shumë", + "other": "+{{days}} ditë të tjera" + }, + "preview-schedule": { + "description": "Kështu do të duket qëllimi juaj. Mund ta ndryshoni gjithmonë më vonë.", + "title": "Këtu është një pamje paraprake e orarit tuaj" + }, + "progress": { + "complete": "Qëllimi i sotëm është i plotë 🎉", + "goal-complete": "I gjithë qëllimi juaj është i plotë 🎉", + "pages-goal": "lexoni {{pages}} faqe të Kuranit", + "range-goal": "lexo {{from}} në {{to}}", + "time-goal": "lexoni {{time}} të Kuranit" + }, + "reading-goal": "Qëllimi i leximit", + "reading-goal-description": "A ju duket e vështirë të ruani konsistencën me qëllimet tuaja të leximit të Kuranit?

    Udhëtimi i Rritjes së Kuranit është një veçori dinamike e zhvilluar për t'ju ndihmuar të qëndroni të qëndrueshëm në udhëtimin tuaj me Kuranin. Pavarësisht nëse synoni të lexoni 10 minuta në ditë, të përfundoni një Xhuz në një muaj, ose të përfundoni të gjithë Kuranin në një vit, etj., Quran.com tani mund t'ju ndihmojë të vendosni një qëllim të personalizuar dhe të mbani gjurmët e vijave tuaja të përditshme të leximit, ndërkohë që përshtateni ndërsa përparoni. Është plotësisht falas për t'u përdorur dhe shpresojmë se do t'ju ndihmojë të qëndroni të motivuar për të arritur qëllimin tuaj!", + "reading-goal-label": "Ju jeni në një", + "reading-goal-title": "Prezantimi i Udhëtimit të Rritjes së Kuranit", + "recommended": "Rekomanduar", + "remaining": "Mbetet për sot", + "remaining-base": "E mbetur", + "remaining-days": { + "one": "Ka mbetur edhe {{days}} dite", + "other": "Kanë mbetur edhe {{days}} ditë" + }, + "set-a-new-goal": "Vendosni një qëllim të ri", + "set-reading-goal-success": "Qëllimi juaj i leximit është vendosur me sukses.", + "start-journey": "Filloni udhëtimin tuaj!", + "start-reading": "Filloni të lexoni", + "starting-chapter": "Fillimi i sures", + "starting-verse": "Fillimi i ajetit", + "streak": "brez", + "streak-definition": "Një varg është numri i ditëve të njëpasnjëshme që keni lexuar Kuranin.", + "timeline-meaning": "Çfarë do të thotë afati juaj kohor?", + "timeline-states": { + "checked": "Ju keni përfunduar qëllimin tuaj", + "filled": "Ju keni lexuar diçka, por jo mjaftueshëm për të përmbushur qëllimin tuaj", + "none": "Nuk keni lexuar ende asgjë atë ditë", + "stroked": "Ju nuk keni lexuar asgjë sot" + }, + "todays-goal": "Goli i sotëm", + "view-progress": "Shiko Progresin", + "week-progress": "Progresi i kësaj jave", + "x-days": { + "one": "{{days}} dite", + "other": "{{days}} dite" + }, + "x-days-streak": "{{days}} varg ditësh", + "x-hours": { + "one": "{{hours}} orë", + "other": "{{hours}} ore" + }, + "x-minutes": { + "one": "{{minutes}} minutë", + "other": "{{minutes}} minuta" + }, + "x-pages": { + "one": "{{pages}} faqe", + "other": "{{pages}} faqe" + }, + "x-seconds": { + "one": "{{seconds}} sekondë", + "other": "{{seconds}} sekonda" + } +} diff --git a/locales/sq/support.json b/locales/sq/support.json index a74da85bab..fc81a34653 100644 --- a/locales/sq/support.json +++ b/locales/sq/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Ju lutemi raportoni këtë defekt <0>këtu<\/0> dhe ne do ta rregullojmë këtë defekt sa më shpejt që të jetë e mundur inshAllah.", - "bug-q": "Gjeta një gabim përkthimi, ku mund ta depozitoj?", - "developer-a": "Ju lutemi shikoni <0>faqen e zhvilluesve<\/0> për më shumë informacion.", - "developer-q": "Unë jam një zhvillues. Si mund të kontribuoj?", - "donate-a": "Së pari, ne e vlerësojmë vërtet interesin tuaj për të kontribuar. Ju lutemi vizitoni <0>këtë<\/0> lidhje", - "donate-q": "Si mund të dhuroj?", - "download-a": "Fatkeqësisht, jo. Ne nuk ofrojmë ende funksionalitet për të shkarkuar faqen tonë të internetit ose Kur'anin në kompjuterin tuaj. Megjithatë, mund të instaloni aplikacionin tonë celular për lexim jashtë linje.", - "download-q": "A mund ta shkarkoj Quran.com në kompjuterin tim?", - "fiqh-a": "Quran.com është një mjet leximi, dëgjimi dhe studimi në internet. Ekipi që qëndron pas Quran.com përbëhet nga inxhinierë softuerësh, dizajnerë dhe menaxherë produktesh. Fatkeqësisht, ky është kufizimi i grupit tonë të aftësive, ne nuk kemi dijetarë, imamë apo sheikë si pjesë e ekipit për të ndihmuar me pyetjet e lidhura me Islamin, Fikhun ose Fetvanë. Ne përpiqemi të përmbahemi nga përgjigjja e ndonjërës prej atyre pyetjeve dhe ju këshillojmë të flisni me imamin tuaj lokal në një xhami ose me një sheik.", - "fiqh-q": "Pyetje të lidhura me Islamin\/Fikhun\/Fetvanë", - "header": "Ndihmë dhe Feedback", - "main-desc": "Ju lutem kontrolloni FAQ për të parë nëse pyetja juaj tashmë është përgjigjur. Nëse keni nevojë ju mund të <0>na kontaktoni<\/0> & ne do të bëjmë më të mirën tonë për t'u kthyer tek ju sa më shpejt të jetë e mundur, por vetëm kështu që ju e dini se ne jemi një ekip i vogël kështu që ju lutem të jetë e mirë.", - "mobile-a": "Po! Ju lutemi vizitoni <0>faqen tonë të aplikacioneve celular<\/0> për më shumë informacion.", - "mobile-q": "A ka Quran.com aplikacion celular?", - "other-languages-a": "Për të ndryshuar gjuhën tuaj të preferuar, ka një menu në këndin e sipërm djathtas në çdo faqe (këndi i sipërm majtas në gjuhët nga e djathta në të majtë). Përdorni këtë menu për të zgjedhur gjuhën tuaj të preferuar.", - "other-languages-q": "A mund ta shfletoj sajtin në gjuhë të tjera?", - "reciters-a": "Dërgo më shumë informacion rreth këtij recituesi <0>këtu<\/0>", - "reciters-q": "Shtimi i më shumë recituesve", - "site-down-a": "Kjo nuk është mirë! Nëse sajti nuk funksionon fare ose ndoshta shihni një ekran të bardhë me tekstin \"Na falni, diçka shkoi keq\", ne e vlerësojmë nëse mund ta raportoni <0>këtu<\/0> .", - "site-down-q": "Faqja nuk funksionon, si t'ju them?", - "support": "Mbështetje", - "tafsir-a": "Po, ne kemi disa Tefsire. Klikoni në ikonën e treguar pranë çdo ajeti, më pas klikoni në tefisrs. Aplikacioni do t'ju tregojë listën e tefsireve të disponueshme. Klikoni në cdo tefsir që dëshironi të lexoni.", - "tafsir-q": "A është i disponueshëm Tefsir?", - "translations-a": "Hapni një numër të ri <0>këtu<\/0> me të gjitha detajet, lidhja me përkthimin dhe ne do të bëjmë çmos për ta shtuar këtë.", - "translations-q": "Shto përkthime të tjera" -} \ No newline at end of file + "bug-a": "Ju lutemi raportoni këtë defekt <0>këtu dhe ne do ta rregullojmë këtë defekt sa më shpejt që të jetë e mundur inshAllah.", + "bug-q": "Gjeta një gabim përkthimi, ku mund ta depozitoj?", + "developer-a": "Ju lutemi shikoni <0>faqen e zhvilluesve për më shumë informacion.", + "developer-q": "Unë jam një zhvillues. Si mund të kontribuoj?", + "donate-a": "Së pari, ne e vlerësojmë vërtet interesin tuaj për të kontribuar. Ju lutemi vizitoni <0>këtë lidhje", + "donate-q": "Si mund të dhuroj?", + "download-a": "Fatkeqësisht, jo. Ne nuk ofrojmë ende funksionalitet për të shkarkuar faqen tonë të internetit ose Kur'anin në kompjuterin tuaj. Megjithatë, mund të instaloni aplikacionin tonë celular për lexim jashtë linje.", + "download-q": "A mund ta shkarkoj Quran.com në kompjuterin tim?", + "header": "Ndihmë dhe Feedback", + "main-desc": "Ju lutem kontrolloni FAQ për të parë nëse pyetja juaj tashmë është përgjigjur. Nëse keni nevojë ju mund të <0>na kontaktoni & ne do të bëjmë më të mirën tonë për t'u kthyer tek ju sa më shpejt të jetë e mundur, por vetëm kështu që ju e dini se ne jemi një ekip i vogël kështu që ju lutem të jetë e mirë.", + "mobile-a": "po! Ju lutemi vizitoni <0>Kuranin për Android ose <1>Kuranin iOS për të shkarkuar aplikacionet", + "mobile-q": "A ka Quran.com aplikacion celular?", + "other-languages-a": "Për të ndryshuar gjuhën tuaj të preferuar, ka një menu në këndin e sipërm djathtas në çdo faqe (këndi i sipërm majtas në gjuhët nga e djathta në të majtë). Përdorni këtë menu për të zgjedhur gjuhën tuaj të preferuar.", + "other-languages-q": "A mund ta shfletoj sajtin në gjuhë të tjera?", + "reciters-a": "Dërgo më shumë informacion rreth këtij recituesi <0>këtu", + "reciters-q": "Shtimi i më shumë recituesve", + "site-down-a": "Kjo nuk është mirë! Nëse sajti nuk funksionon fare ose ndoshta shihni një ekran të bardhë me tekstin \"Na falni, diçka shkoi keq\", ne e vlerësojmë nëse mund ta raportoni <0>këtu .", + "site-down-q": "Faqja nuk funksionon, si t'ju them?", + "support": "Mbështetje", + "tafsir-a": "Po, ne kemi disa Tefsire. Klikoni në ikonën e treguar pranë çdo ajeti, më pas klikoni në tefisrs. Aplikacioni do t'ju tregojë listën e tefsireve të disponueshme. Klikoni në cdo tefsir që dëshironi të lexoni.", + "tafsir-q": "A është i disponueshëm Tefsir?", + "translations-a": "Hapni një numër të ri <0>këtu me të gjitha detajet, lidhja me përkthimin dhe ne do të bëjmë çmos për ta shtuar këtë.", + "translations-q": "Shto përkthime të tjera" +} diff --git a/locales/sw/about-quran.json b/locales/sw/about-quran.json new file mode 100644 index 0000000000..6e6beecda1 --- /dev/null +++ b/locales/sw/about-quran.json @@ -0,0 +1,5 @@ +{ + "about-quran-cta": "Anza kusoma Quran", + "about-quran-desc": "Qur'ani ni nini? Pata majibu kwa maswali muhimu na vidokezi vya jinsi ya kuichunguza", + "about-the-quran": "Kuhusu Qur'ani" +} diff --git a/locales/sw/about.json b/locales/sw/about.json new file mode 100644 index 0000000000..5367ecf017 --- /dev/null +++ b/locales/sw/about.json @@ -0,0 +1,42 @@ +{ + "credits": { + "desc": "Tunatoa shukrani zetu kwa wale wote ambao wameunga mkono na kuchangia mradi huu, kusaidia kufanya Quran ipatikane kwa mamilioni duniani kote.", + "lokalize": "<0>Lokalize: Mfumo wa utafsiri unaosaidiwa na kompyuta ambao unaangazia tija na uhakikisho wa ubora na hutoa mtiririko wa kazi wa ujanibishaji.", + "quran-align": "<0>Collin Fair: Chombo cha kutengeneza sehemu za maneno kwa usahihi za usomaji wa Kurani uliorekodiwa.", + "quran-complex": "<0>QuranComplex: Kiwanja cha Uchapishaji wa Qur'ani Tukufu cha Mfalme Fahd ni kiongozi katika kutumikia Qur'ani Tukufu na Sayansi zake, kutafsiri Maana zake, na kulinda Maandishi ya Qur'ani dhidi ya kupotoshwa, kupitia matumizi bora ya teknolojia ya hali ya juu katika uwanja wa uchapishaji, rekodi za sauti na uchapishaji wa programu za kielektroniki.", + "quran-enc": "<0>QuranEnc: Lango yenye tafsiri za bure na za kuaminika za maana na ufafanuzi wa Qur'ani tukufu katika lugha nyingi za ulimwengu.", + "tanzil": "<0>Tanzil: Mradi wa kimataifa wa Kurani unaolenga kutoa maandishi sahihi ya Kurani yaliyothibitishwa sana.", + "tarteel": "<0>Tarteel: Programu ya kukariri Kurani inayoendeshwa na AI. Imeundwa ili kukusaidia kukariri vyema zaidi, iwe unatafuta aya, kufuatilia maendeleo yako, au kufuata pamoja na kukariri kwako.", + "title": "Mikopo", + "vercel": "<0>Vercel: ni jukwaa la uwekaji na ushirikiano kwa wasanidi programu wa hali ya juu ambalo huweka msanidi programu kwanza, na kuwapa zana za kina za kuunda tovuti na programu zenye utendakazi wa hali ya juu.", + "zekr": "<0>Zekr: Chombo cha wazi cha kujifunza Quran kwa ajili ya kuvinjari na kutafiti juu ya Quran" + }, + "global-effort": { + "desc": "Mamilioni ya watu kutoka duniani kote wanategemea Quran.com kama nyenzo yao msingi ya Kurani ya dijiti. Iwe wanakuja kukariri, kutafakari, kukariri, au kusoma, wanashiriki kusudi moja: nia ya dhati ya kuunganishwa na maneno ya Mwenyezi Mungu. \\n Tunapoendelea kukua, tunasalia kujitolea kuhakikisha kuwa Quran.com inasalia kuwa nafasi inayoaminika, inayoweza kufikiwa na iliyoundwa kwa uzuri kwa mtu yeyote anayetaka kutumia Quran.", + "title": "Juhudi za Kimataifa" + }, + "key-features": { + "desc": "Quran.com imeundwa kusaidia kila hatua ya kujihusisha na Kurani—kuanzia kusoma na kukariri hadi kusoma na kutafakari. Vipengele vyetu ni pamoja na:", + "features": [ + "Kiolesura cha Kurani kinachofaa Mtumiaji- Uzoefu safi na angavu wa kusoma kwenye kifaa chochote.", + "Tafsiri Nyingi & Tafsir - Upatikanaji wa tafsiri katika lugha nyingi, pamoja na tafsir.", + "Vikariri vya Sauti - Sikiliza vikariri vya hali ya juu kutoka kwa Qaris maarufu duniani, kwa uwezo wa kufuata neno baada ya neno.", + "Utafutaji wa Hali ya Juu na Urambazaji - Tafuta aya mara moja kulingana na mada au maneno muhimu katika Kurani nzima.", + "Alamisho na Vidokezo vya Ayah - Hifadhi aya na uandike tafakari za kibinafsi kwa marejeleo ya baadaye.", + "Muunganisho wa QuranReflect - Shirikiana na jumuiya ya kimataifa kupitia tafakari na maarifa yaliyoshirikiwa na wasomi na watu binafsi.", + "Ufuatiliaji wa Maendeleo ya Kusoma na Malengo - Fuatilia malengo yako ya kila siku na historia ya kusoma", + "API za Wasanidi Programu - Ufikiaji bila malipo wa maudhui na vipengele ili kuwasha programu za Kiislamu na R&D.", + "Na mengine mengi, Alhamdullilah." + ], + "title": "Sifa Muhimu & Sadaka" + }, + "main-description": "Tangu kuanzishwa kwake mwaka wa 1995, Quran.com imejitolea kuifanya Qur'an ipatikane kwa kila mtu kwa njia iliyo wazi, sahihi na rahisi kushughulikia. Kila siku, mamilioni ya watu ulimwenguni kote hugeukia Quran.com kusoma, kusikiliza, kusoma na kutafakari kuhusu Kurani—iwe ni wanafunzi wa maisha yote, wasomi, au ndio wanaoanza safari yao.", + "our-mission": { + "desc": "Quran imekusudiwa kusomwa, kueleweka, na kutafakariwa. Dhamira yetu ni kuondoa vizuizi vya kufikia na kuwawezesha watu binafsi na jamii kwa kutoa uzoefu wa kutegemewa, uliobuniwa vyema, na unaoboresha sana Kurani. Tunalenga kutumika kama chanzo kinachoaminika kwa yeyote anayetaka kujihusisha na Quran, tukiongozwa na kanuni za usahihi, uwazi na uaminifu.", + "title": "Dhamira Yetu" + }, + "who-we-are": { + "desc": "Quran.com ni wakfu (wakfu), iliyoanzishwa kama amana ya umma ili kuhakikisha kuwa Quran inabaki kupatikana kwa wote, bila malipo na bila maslahi ya kibiashara. Inasimamiwa na Quran.Foundation, shirika lisilo la faida la 501(c)(3), ambalo hudumisha na kuendeleza Quran.com kama sehemu ya dhamira yake ya kutoa rasilimali za Qur'ani za ubora wa juu kwa ulimwengu. Dhamira yetu ni kuitumikia Quran na wasomaji wake kwa ubora, ikhlasi, na uwajibikaji.", + "title": "Sisi ni Nani" + } +} diff --git a/locales/sw/apps.json b/locales/sw/apps.json new file mode 100644 index 0000000000..bfdd4e27a3 --- /dev/null +++ b/locales/sw/apps.json @@ -0,0 +1,3 @@ +{ + "quran-desc": "Kutoka kwa wasanidi wakuu wa Quran.com, imetujia mushaf mzuri na usio na matangazo wa programu za Android na iOS. Sasa ni rahisi kusoma Qur'ani popote ulipo, kuihifadhi na kusikiliza wasomaji unaowapenda." +} diff --git a/locales/sw/chapter.json b/locales/sw/chapter.json new file mode 100644 index 0000000000..f53cd5e226 --- /dev/null +++ b/locales/sw/chapter.json @@ -0,0 +1,4 @@ +{ + "meta-description": "Soma na usikilize Sura {{transliteratedName}}. Sura imeteremshwa {{revelationPlace}}, kwa mpangilio wa {{chapterOrder}} ndani ya Qur'ani. Jina la Surah linamaanisha \" {{translatedName}} \" katika {{localeName}} na lina aya {{versesCount}}.", + "ranges-meta-desc": "Soma na sikiliza kutoka Aya {{rangeFrom}} hadi Aya {{rangeTo}}." +} diff --git a/locales/sw/collection.json b/locales/sw/collection.json new file mode 100644 index 0000000000..e9be8728db --- /dev/null +++ b/locales/sw/collection.json @@ -0,0 +1,23 @@ +{ + "all-saved-verses": "Aya zote zilizohifadhiwa", + "alphabetical": "A-Z", + "back-to-collection-list": "Rudi kwenye orodha ya mkusanyiko", + "collapse-all": "Kunja aya zote", + "collection-list-empty": "Orodha ya mkusanyiko ni tupu. Bado hujaunda mkusanyiko wowote", + "collections": "Mikusanyiko", + "delete-bookmark": { + "subtitle": "Je, una uhakika unataka kufuta {{bookmarkName}} kutoka kwenye mkusanyiko wa {{collectionName}}?", + "title": "Futa alamisho" + }, + "delete-collection": { + "subtitle": "Je, una uhakika unataka kufuta mkusanyiko {{collectionName}}?", + "title": "Futa mkusanyiko" + }, + "empty": "Mkusanyiko ni tupu", + "expand-all": "Panua aya zote", + "go-to-ayah": "Nenda kwa aya", + "load-more": "Pakia Zaidi", + "recently-added": "Iliyoongezwa hivi karibuni", + "recently-updated": "Imesasishwa hivi karibuni", + "verse-key": "Sura na Nambari ya Aya" +} diff --git a/locales/sw/common.json b/locales/sw/common.json new file mode 100644 index 0000000000..b92d5836b9 --- /dev/null +++ b/locales/sw/common.json @@ -0,0 +1,462 @@ +{ + "about": "Kutuhusu", + "allow": "Ruhusu", + "and": "na", + "announcements": { + "auth-onboarding": { + "data-sync": { + "action": "Inayofuata", + "description": "Iwe unatumia Quran.com kwenye simu yako au kompyuta yako ndogo, utaweza kupata alamisho zako, aya za mwisho ulizozisoma na mapendeleo yako.", + "title": "Data yako itasawazishwa

    kwenye vifaa vyote" + }, + "feedback": { + "action": "Sawa, nimeipata", + "description": "Asante kwa kutumia Quran.com na tutafurahi kusikia maoni yako kwenye feedback.quran.com ", + "title": "Tungependa kusikia mawazo yako" + }, + "quran-foundation-link": { + "action": "Inayofuata", + "description": "Tumia maelezo yale yale ya kuingia kwenye Quran.com kuweza kuingia kwenye QuranReflect.com - jumuiya ya kimataifa iliyostawi na inayojishughulisha na kutafakari Qur'ani.", + "title": "Tumia akaunti yako kwenye programu za Quran.Foundation!" + }, + "quran-growth-journey": { + "action": "Inayofuata", + "description": "Dumisha streak yako ya kusoma Qur'ani na ujiendeleze kupitia malengo yako huku ukijenga tabia mpya", + "title": "Anza Safari yako ya kukua pamoja na Qur'ani!" + }, + "welcome": { + "action": "Tazama kilicho kipya", + "title": "Karibu kwenye Quran.com

    Akaunti ya Mtumiaji" + } + }, + "collections-announcement": { + "slide-1": { + "description": "Tuna furaha sana kutangaza kwamba sasa unaweza kuweka alamisho chini ya \"mikusanyiko\"!

  • Ongeza mikusanyiko kadiri utakavyo
  • Ongeza alamisho kwenye mkusanyiko mmoja au zaidi
  • Na zaidi!
  • ", + "title": "Mikusanyiko ya vialamisho iko hapa!" + } + } + }, + "aria": { + "change-settings": "Badilisha Mipangilio", + "drawer-close": "Funga Menyu", + "msg-close": "Funga Ujumbe", + "nav-drawer-open": "Fungua Navigation Drawer", + "play-surah": "Cheza Sura {{surahName}}", + "select-lng": "Chagua Lugha", + "sidebar-nav-close": "Funga Upau wa pembeni wa Uchunguzi" + }, + "audio": { + "auto-scroll": { + "off": "Zima", + "on": "Washa", + "title": "Sogeza kiotomatiki" + }, + "displaying": "Inaonyesha", + "exp-tip": " Badilisha maudhui yanayoonyeshwa chini ya

    Mipangilio > Neno Kwa Neno ", + "exp-tip-no-select": " Weka alama kwenye chaguo la kuonyesha tooltip na uchague

    Chaguo la Tarjuma na/au Unukuzi


    chini ya Mipangilio > Neno Kwa Neno , ili

    kuwezesha kipengele hiki. ", + "experience": "Uzoefu", + "play": "Cheza Sauti", + "playback-normal": "Kawaida", + "playback-speed": "Kasi ya Uchezaji", + "playback-speed-unit": "x", + "player": { + "close-audio-player": "Funga Kicheza Sauti", + "currently-playing": "Kwa sasa unacheza", + "delay-verse": "Kukawia kati ya aya na nyingine", + "download": "Pakua", + "full-surah": "Sura Kamili", + "manage-repeat-settings": "Dhibiti mipangilio ya kurudia", + "mismatch": "Bofya \"Anza Upya\" ikiwa ungependa kucheza {{currentReadingChapter}} badala yake", + "pause": "Sitisha", + "pause-audio": "Sitisha Sauti", + "play": "Cheza", + "play-audio": "Cheza Sauti", + "play-range": "Kiwango cha kucheza", + "previous-ayah": "Aya Iliyotangulia", + "repeat-1-verse": "Rudia Aya", + "repeat-settings": "Mipangilio ya kurudia", + "repeat-verse": "Rudia kila aya", + "search-verse": "Tafuta aya", + "single-verse": "Aya moja", + "start-over": "Anza upya", + "start-playing": "Anza Kucheza", + "stop-repeating": "Acha Kurudia", + "times": "mara", + "verses-range": "Msururu wa aya", + "volume-control": "Urekebishaji wa sauti" + }, + "repeat-moved": "Mipangilio ya kurudia imehamishwa hadi kwa kicheza sauti. Bofya aikoni ya <0> ili kuzifikia", + "select-reciter": "Chagua Msomaji", + "speed": "Kasi", + "title": "Sauti" + }, + "ayah": "Aya", + "ayahs": "Aya", + "beta": "Beta", + "bookmark": "Alamisha", + "bookmarked": "Zilizoalamishwa", + "both": "Zote mbili", + "cancel": "Batilisha", + "click-here": "Bofya hapa", + "close": "Funga", + "command-bar": { + "navigations": "Uchunguzi", + "no-nav-results": "Hakuna matokeo", + "placeholder": "Tafuta Quran...", + "recent-navigations": "Uchunguzi wa hivi majuzi", + "search-by-voice": "Tafuta kutumia sauti", + "try-navigating": "Nenda hadi" + }, + "community": { + "cta": "Jiunge na Jumuiya", + "header": "Jiunge na Jumuiya ya QDC ya wajenzi na wanateknolojia wa Kiislamu.", + "sub-header": "Jisajili kwa Quran.com Discord ili ushiriki na ushirikiane na jumuiya inayoongoza kwa kujenga teknolojia ya Kiislamu.", + "title": "Jumuiya" + }, + "complete-sign-up": "Kamilisha usajili wako", + "consents": { + "communication": { + "body": "🚀 Boresha maendeleo yako kupitia arifa zilizobinafsishwa kuhusu maendeleo ya lengo lako, kudumisha streaks, na kuboresha matumizi yako ya vipengele vyetu vya sasa.



    Je, tunaweza kukufahamisha kupitia barua pepe na vituo vingine? Wewe ndiye unayedhibiti - jisikie huru kurekebisha mapendeleo haya wakati wowote katika mipangilio ya akaunti yako.



    Chagua tu 'Ruhusu' kupata vikumbusho vinavyotia moyo au 'Si Sasa' ili kukataa.", + "header": "Tungependa kukusaidia ubaki uwe na msimamo na uthabiti katika kukuza safari yako na Qur'ani! 📖🌟" + } + }, + "continue": "Endelea", + "contribute-to-our-mission": "Changia kwa utume wetu", + "copied": "Imenakiliwa", + "copied-to-clipboard": "Imenakiliwa kwenye ubao wa kunakili", + "copy": "Nakili", + "copylink": "Nakili kiungo", + "counter": { + "decrease": "Punguza", + "increase": "Ongeza" + }, + "default-description": "Qur'ani iliyotarjumiwa katika lugha nyingi katika kiolesura rahisi na ya kawaida", + "delete": "Futa", + "developers": "Watengenezaji", + "display": "Onyesho", + "donate": "Changia", + "donate-now": "Changia sasa", + "donate_monthly": "Changia kila mwezi", + "donate_once": "Changia mara moja", + "edit": "Hariri", + "email-verification": { + "check-spam": "Hukupokea barua pepe ya uthibitishaji? Angalia kisanduku pokezi chako cha barua taka", + "email-sent": "Tumetuma barua pepe kwa {{email}} ", + "email-verification": "Uthibitishaji wa barua pepe", + "resend-email": "Tuma barua pepe tena", + "resend-email-in": "Tuma tena barua pepe ya uthibitishaji baada ya sekunde {{remainingTime}}...", + "verify-code": "Thibitisha Msimbo" + }, + "end-year-donate": "Kamilisha 2024 kwa Sadaka ❤️", + "error": { + "MediaVersesRangeLimitExceeded": "Unaweza tu kuchagua hadi aya {{limit}} kwa wakati mmoja. Tafadhali chagua msururu mdogo.", + "bookmark-sync": "Alamisho haijasawazishwa.", + "email-login-fail": "Imeshindikana kuingia kwa kutumia barua pepe. Tafadhali jaribu tena", + "general": "Hitilafu fulani imetokea. Tafadhali jaribu tena.", + "offline": "Inaonekana umepoteza muunganisho wako. Tafadhali iangalie na ujaribu tena.", + "pref-persist-fail": "Imeshindikana kusawazisha mipangilio yako kwenye cloud.", + "ranges-no-value": "Msururu wa mwanzo na wa mwisho lazima iwe na tarakimu", + "ranges-too-many-verses": "*Upeo wa Aya {{maxNumberOfVerses}}", + "ranges-wrong-order": "Mstari wa kuanzia lazima uwe kabla ya mstari wa kumalizia." + }, + "errors": { + "account-banned": "Samahani, Akaunti yako imepigwa marufuku. Wasiliana na Quran.Foundation", + "badRequest": "*Ombi batili", + "banned": "*Samahani, Akaunti yako imepigwa marufuku. Wasiliana na Quran.Foundation", + "confirm": "*Thibitisha nenosiri hailingani na nenosiri", + "email": "*Muundo wa Barua pepe si Sahihi!", + "exactLength": "*Thamani lazima iwe urefu kamili", + "expiredToken": "*Tokeni hii imekwisha muda wake", + "forgot-password-failed": "Imeshindwa kutuma barua pepe ya kuweka upya nenosiri. Tafadhali jaribu tena.", + "immutable": "*Thamani hii haiwezi kubadilishwa", + "invalid": "*Hii {{fieldName}} si sahihi", + "invalidEmailOrPassword": "*Barua pepe au nenosiri batili", + "max": "* {{fieldName}} lazima iwe chini ya au sawa na tarakimu {{max}}", + "min": "* {{fieldName}} lazima iwe zaidi ya au sawa na tarakimu {{min}}", + "name": "* {{fieldName}} inapaswa kuwa herufi na nambari pekee", + "notFound": "*Haijapatikana", + "required": "* {{fieldName}} haipo!", + "reset-password-failed": "Imeshindwa kuweka upya nenosiri. Tafadhali jaribu tena.", + "signin-failed": "Kuingia kumeshindwa. Tafadhali jaribu tena.", + "signup-failed": "Kujisajili kumeshindwa. Tafadhali jaribu tena.", + "taken": "* {{fieldName}} tayari ipo!", + "usedToken": "*Toni hii tayari imetumika", + "username": "* {{fieldName}} kubali chini na herufi pekee", + "verification-code-invalid": "Nambari hii ya uthibitishaji si sahihi", + "verification-code-length": "Nambari ya kuthibitisha lazima iwe tarakimu {{length}}", + "verification-failed": "Uthibitishaji haukufaulu. Tafadhali jaribu tena.", + "verification-resend-failed": "Imeshindwa kutuma tena nambari ya kuthibitisha" + }, + "exciting-updates": "Sasisho za Kusisimua", + "feedback": "Maoni", + "fonts": { + "15_lines": "Mistari 15", + "16_lines": "Mistari 16", + "code_v1": "King Fahad Complex V1", + "code_v2": "King Fahad Complex V2", + "font-size": "Ukubwa wa herufi", + "lines": "Mistari", + "qcf-desc": "Fonti za King Fahad Complex (V1 na V2) hupeana ubora wa juu lakini huchukua muda mrefu kupakiwa.", + "qcf-v4-desc": "Fonti za Tajweed ziliundwa kwa kutumia Easy Quran - Dar Al Marifa Tajweed Mushaf na King Fahad Glorious Quran Printing Complex (KFGQPC) - Fonti za Uthmanic Hafs V4 baada ya kupokea ruhusa kutoka kwa wote wawili.", + "qpc_uthmani_hafs": "QPC Uthmani Hafs", + "quran-font": "Fonti ya Qur'ani", + "quran-font-size": "Ukubwa wa fonti ya Qur'ani", + "tajweed": "Tajweed", + "tajweed-desc": "Fonti ya Tajweed inaonyesha Mushaf ya rangi ya Tajweed. Unaweza kusoma zaidi kuhusu kanuni za rangi za Tajweed <0> hapa ", + "tajweed_v4": "King Fahad Complex V4", + "text_indopak": "IndoPak", + "text_uthmani": "Uthmani", + "translation-font-size": "Ukubwa wa fonti ya tarjuma" + }, + "footer": { + "description": "Quran.com ni jukwaa linaloaminika linalotumiwa na mamilioni ya watu duniani kote kusoma, kutafuta, kusikiliza na kutafakari Kurani katika lugha nyingi. Inatoa tafsiri, tafsir, vikariri, tafsiri ya neno kwa neno, na zana za kusoma kwa kina, na kufanya Quran ipatikane na kila mtu.

    Kama Sadaqah Jariyah, Quran.com imejitolea kusaidia watu kuunganishwa kwa kina na Kurani. Ikiungwa mkono na Quran.Foundation, 501(c)(3) shirika lisilo la faida, Quran.com inaendelea kukua kama rasilimali ya bure na yenye thamani kwa wote, Alhamdullilah\"", + "hiring": "Tunaajiri! Jiunge na timu ya QuranFoundation na uchangie katika dhamira yetu. Tuma ombi sasa! ", + "rights": "Haki Zote Zimehifadhiwa", + "title": "Soma, Sikiliza, Tafuta, na Tafakari juu ya Quran" + }, + "form": { + "body": "Mwili", + "code": "Nambari ya Uthibitishaji", + "confirm-password": "Thibitisha Nenosiri", + "email": "Barua pepe", + "firstName": "Jina la kwanza", + "lastName": "Jina la mwisho", + "password": "Nenosiri", + "title": "Kichwa", + "username": "Jina la mtumiaji", + "verification-code": "Nambari ya Uthibitishaji" + }, + "from": "Kutoka", + "fundraising-share-title": "Shiriki Uchangishaji wa Quran.com", + "fundraising-sticky-banner": { + "cta": "Changia", + "title": "Toa wakati wa siku bora!" + }, + "fundraising": { + "description": "Michango ya kila mwezi hutusaidia kuboresha Quran.com na kudumisha shughuli ili tusizingatie sana uchangishaji wa pesa na tuzingatie zaidi kuleta athari.", + "title": "Kuwa Mfadhili wa Kila Mwezi" + }, + "get-started": "Anza", + "hear-it-pronounced": "Bonyeza neno lolote la Qur'ani, lisikie likitamkwa", + "help": "Msaada", + "hizb": "Hizb", + "home": "Nyumbani", + "hours": "Saa", + "inline": "Mstari kwa Mstari", + "input": { + "clear": "Futa" + }, + "juz": "Juz", + "language": "Lugha", + "languages": "Lugha", + "learn-more": "Jifunze zaidi", + "learning-plans": "Mipango ya Kujifunza", + "less": "Kidogo", + "lessons": "Masomo", + "loading": "Inapakia", + "login": "Ingia", + "logout": "Ondoka", + "meccan": "Imeteremshwa Makka", + "medinan": "Imeteremshwa Madina", + "menu": "Menyu", + "minutes": "Dakika", + "mobile-apps": "Programu za Simu", + "mode": "Hali", + "more": "Zaidi", + "my-learning-plans": "Mipango Yangu ya Kujifunza", + "navigate": "Chunguza", + "network": "Mtandao", + "new": "Mpya!", + "newest": "Mpya zaidi", + "next": "Inayofuata", + "next-ayah": "Aya Inayofuata", + "no": "Hapana", + "no-notifications": "Hakuna arifa Bado", + "none": "Hakuna", + "not-now": "Sio Sasa", + "notes": { + "title": "Maelezo na Tafakari Zangu" + }, + "notification-settings": "Mipangilio ya Arifa", + "notification": { + "mark-all-as-read": "Weka alama kama zote zimesomwa", + "mark-as-read": "Weka alama kama imesomwa" + }, + "notifications": "Arifa", + "off": "Zima", + "oldest": "Zee zaidi", + "on": "Washa", + "our-projects": "Miradi Yetu", + "page": "Ukurasa", + "pages": "Kurasa", + "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} kati ya {{totalNumberOfResults}} matokeo ya utafutaji", + "pbuh": "Baraka za Mwenyezi Mungu ziwe juu yake", + "popular-links": "Viungo Maarufu", + "popup": { + "companion-title": "Mpendwa Mwenzi wa Qur'ani,", + "footnote": "Michango ya kila mwezi huturuhusu kupunguza uchangishaji", + "text-1": "Tumejitolea kutumikia ulimwengu kupitia elimu ya Qur'ani pamoja na teknolojia, bila malipo.", + "text-2": "Fursa nzuri ya kutoa sadaka endelevu (Sadaqa Jariyah). Wekeza katika Akhera yako kama mfadhili wa kila mwezi (au mara moja).", + "title": "Toa Wakati wa Siku Bora!" + }, + "powered-by": "Inaendeshwa na", + "prepare-hearts": { + "cta": "Jifunze zaidi", + "title": "Endelea baada ya Ramadhani!" + }, + "prev": "Iliyotangulia", + "previous-ayah": "Aya Iliyotangulia", + "privacy": "Faragha", + "product-updates": "Sasisho za Bidhaa", + "profile": "Wasifu", + "projects-desc": "Miradi isiyo ya faida inayomilikiwa, kusimamiwa, au kufadhiliwa na Quran.Foundation", + "q-reflect": "Quranreflect", + "quran-com": "Quran.com", + "quran-radio": "Redio ya Qur'ani", + "reading-history": "Historia ya kusoma", + "reading-preference": { + "reading": "Soma", + "translation": "Tarjuma" + }, + "ready-for-ramadan": "Je, uko tayari kwa Ramadhani?", + "recitation": "Usomaji", + "reciter": "Msomaji", + "reciter-summary": "(Kwa idhini njema ya Kituo cha Tafsir)", + "reciters": "Wasomaji", + "reflect": "Tafakari", + "reflections": "Tafakari", + "reflections-and-lessons": "Tafakari na Mafunzo", + "remove": "Ondoa", + "rename": "Badilisha jina", + "retry": "Jaribu tena", + "revelation_order": "Taratibu za Uteremshaji", + "rub": "Rub el Hizb", + "save": "Hifadhi", + "save-to-collection": "Hifadhi kwenye Mkusanyiko", + "search-for": "Tafuta ' {{searchQuery}} '", + "search-results": "{{count}} matokeo ya utafutaji", + "search-results-no-count": "Matokeo ya Utafutaji", + "search": { + "filters": "Vichujio", + "hint": "Jaribu kutafuta", + "jump-to": "Nenda mpaka", + "more-results": "Matokeo zaidi", + "no-results": "Hakuna matokeo yaliyopatikana", + "no-results-suggestion": "Hatukuweza kupata matokeo yoyote ya utafutaji yanayolingana na \" {{searchQuery}} \". jaribu kutumia neno lingine tofauti.", + "popular": "Chunguzi maarufu", + "recent": "Utafutaji wa hivi majuzi", + "results": "matokeo", + "show-all": "Onyesha matokeo yote", + "switch-mode": "Hamia kwenye Utafutaji wa Kina", + "title": "Tafuta" + }, + "seconds": "Sekunde", + "see-new": "Tazama Nini Kipya", + "settings": { + "no-tafsir-selected": "Hakuna tafsir iliyochaguliwa", + "no-translation-selected": "Hakuna tarjuma iliyochaguliwa", + "reading-experience": "Tajriba ya Usomaji", + "reset": "Weka upya", + "reset-cta": "Weka upya Mipangilio", + "reset-notif": "Mipangilio yako imewekwa upya kulingana na chaguomsingi", + "search-reciter": "Tafuta Msomaji", + "search-tafsirs": "Tafuta Tafsir", + "search-translations": "Tafuta Tarjuma", + "selected-reciter": "Msomaji aliyechaguliwa", + "selected-tafsirs": "Tafsir Zilizochaguliwa", + "selected-translations": "Tarjuma Zilizochaguliwa", + "show-tooltip-when-playing-audio": "Onyesha tooltip unapocheza sauti", + "title": "Mipangilio", + "tooltip-playing-audio-helper": "Onyesha tarjuma ya maneno katika tooltip unapocheza aya", + "value-and-other": "{{value}}, na {{othersCount}} nyingine", + "value-and-others": "{{value}}, na {{othersCount}} wengine", + "wbw-helper": "Onyesha tarjuma au unukuzi moja kwa moja chini ya neno", + "word-tooltip-helper": "Onyesha tarjuma au unukuzi unapoelea juu ya neno au kubofya neno" + }, + "share": "Shiriki", + "shared": "Kiungo kimenakiliwa kwenye ubao wa kunakili!", + "show-more": "Onyesha zaidi", + "sidebar": { + "search-hizb": "Tafuta Hizb", + "search-juz": "Tafuta Juz", + "search-page": "Tafuta Ukurasa", + "search-surah": "Tafuta Sura", + "search-verse": "Tafuta Aya", + "try-navigating-with": "Jaribu kutafuta ukitumia" + }, + "sign-in": "Ingia", + "sitemap": "Ramani ya tovuti", + "sort": { + "ascending": "Kuenda juu", + "by": "Panga", + "descending": "Kuenda chini" + }, + "style": "Mtindo", + "submit": "Wasilisha", + "subscribe": "Jisajili", + "subscribed": "Umejisajili", + "surah": "Sura", + "tafsir": { + "font-size": "Ukubwa wa fonti ya Tafsir", + "group-message": "Unasoma tafsir kwa kundi la aya {{from}} hadi {{to}}", + "no-text": "{{tafsirName}} haipatikani kwa aya hii", + "surah": "Tafsir Surah", + "tafsir-desc": "Soma {{tafsirName}} ya Aya {{verseNumber}} ya Sura {{surahName}}", + "tafsirs-desc": "Soma Tafsir mbalimbali za Aya {{ayahNumber}} ya Sura {{surahName}} kutoka kwa wanazuoni wa Tafsir wanaoaminika.", + "title": "Tafsir" + }, + "terms-and-conditions": "Sheria na Masharti", + "theme": "Mandhari", + "themes": { + "auto": "Auto", + "dark": "Dark", + "light": "Light", + "sepia": "Sepia", + "system": "Mfumo", + "system-desc": "Mandhari ya mfumo hutumika kiotomatiki kwa mipangilio yako ya hali ya light/dark" + }, + "to": "Hadi", + "tooltip": "Tooltip", + "tooltip-trans-lang": "Lugha ya Tooltip", + "trans-lang": "Lugha ya Tarjuma", + "translation": "Tarjuma", + "translations": "Tarjuma", + "transliteration": "Unukuzi", + "type": "Aina", + "unavailable": "Kwa sasa haipatikani", + "undo": "Tendua", + "validation": { + "invalid-email": "{{field}} lazima iwe barua pepe halali", + "invalid-field": "Tafadhali weka neno halali ya {{field}}", + "maximum-length": "{{field}} haiwezi kuzidi herufi {{value}}", + "minimum-length": "{{field}} lazima iwe na angalau herufi {{value}}", + "required-field": "{{field}} inahitajika" + }, + "verse": "Aya", + "verse-bookmark-removed": "Alamisho ya aya imeondolewa!", + "verse-bookmarked": "Aya imealamishwa!", + "verses": "Aya", + "view": "Tazama", + "voice": { + "ask-permission": "Tafadhali wezesha ruhusa ya maikrofoni ili kuanza kutumia Utafutaji kupitia sauti", + "error": "Hitilafu imetokea, tafadhali jaribu tena baadaye.", + "no-permission": "Inaonekana huna ruhusa za maikrofoni zilizowezeshwa. Tafadhali washa ruhusa za maikrofoni na ujaribu tena.", + "not-supported": "Inaonekana kivinjari chako hakitumii maikrofoni. Tafadhali jaribu kivinjari tofauti.", + "suggest": "Tafadhali anza kusoma na aya yako itaonekana.", + "suggest-subtitle": "Soma aya yoyote kwa Kiarabu, na aya itaonekana", + "suggest-title": "Soma sasa", + "voice-search-powered-by": "Utafutaji wa Sauti Unaendeshwa na" + }, + "wbw": "Neno Kwa Neno", + "wbw-lang-summary": "Chanzo cha tarjuma ya neno kwa neno: {{source}} . Chanzo hiki hakijitegemei uteuzi wa tarjuma ya aya.", + "wbw-trans-lang": "Lugha ya neno kwa neno", + "wbw-translation": "Tarjuma ya Neno Kwa Neno", + "wbw-transliteration": "Unukuzi wa Neno Kwa Neno", + "word-click": { + "no-audio": "Hakuna Sauti", + "play-audio": "Cheza Sauti", + "title": "Bonyeza Neno" + }, + "word-tooltip": "Tooltip ya Neno", + "yes": "Ndiyo" +} diff --git a/locales/sw/developers.json b/locales/sw/developers.json new file mode 100644 index 0000000000..d5c9986271 --- /dev/null +++ b/locales/sw/developers.json @@ -0,0 +1,19 @@ +{ + "footer": "- Timu ya Quran.com", + "header": "Msaada wa Usanidi", + "issues-cta": "Iwapo una maswali yoyote au unataka kuwasiliana na wasimamizi, andika tu hoja lako. Tutakujibu haraka tuwezavyo inshaAllah.", + "issues-guide": "Kwa kawaida sisi hutumia <0>Miradi ya Github kama chanzo cha kazi inayofuata, nini kinakuja na ni hitilafu zipi zipo zinazohitaji kutatuliwa. Kwa mfano <1>url hii ina orodha ya hitilafu, mambo tunayohitaji usaidizi, na vipengele vijavyo.", + "main-desc": "Asante kwa nia yako ya kutusaidia kukuza Quran.com na miradi yake. Tunafurahi kufanya kazi na wewe!", + "projects": { + "all": "Tuna idadi ya miradi iliyopangishwa kwenye Github. Unaweza kupata zote <0>hapa. Lakini kutaja tu kwa muhtasari:", + "q-android": "<0>Quran Android - imeandikwa kupitia Kotlin na Java.", + "q-api": "<0>Quran.com API - imeandikwa kupitia Ruby on Rails.", + "q-api-docs": "<0>Quran.com API Docs - Our API docs portal", + "q-audio": "<0>Sauti ya Qur'ani na <1>Programu za sauti za simu za mkononi za Qur'ani", + "q-audio-segments": "<0>Sehemu za Sauti za Qur'ani", + "q-ios": "<0>Quran iOS - imeandikwa kwa Swift.", + "q-next": "<0>Quran.com Frontend - imeandikwa katika Next.js.", + "q-v2": "<0>Quran.com - imeandikwa kupitia Ruby on Rails." + }, + "thanks": "Tunatazamia mchango wako!" +} diff --git a/locales/sw/error.json b/locales/sw/error.json new file mode 100644 index 0000000000..dcb62cd844 --- /dev/null +++ b/locales/sw/error.json @@ -0,0 +1,6 @@ +{ + "go-back": "Rudi Nyuma", + "if-persist": "Suala likiendelea, tafadhali", + "report-cta": "ripoti hitilafu", + "title": "Samahani, hitilafu fulani imetokea" +} diff --git a/locales/sw/home.json b/locales/sw/home.json new file mode 100644 index 0000000000..c69279bb30 --- /dev/null +++ b/locales/sw/home.json @@ -0,0 +1,66 @@ +{ + "achieve-quran-goals": "Fikia Malengo yako ya Quran", + "begin": "Anza", + "chapters-and-verses": "Sura na Aya", + "continue-read": "Endelea Kusoma", + "explore-topics": "Chunguza Mada", + "first-time-reading": "Mpya kwa Quran? Anzia hapa ", + "know-someone": "Kua nasi katika Ramadhani ", + "learning-plan": "Mipango ya Kujifunza", + "listen-to-radio": "Sikiliza Quran Radio", + "my-quran": "Quran yangu", + "navigate-quran": "Sogeza Quran", + "no-bookmarks": "Huna alamisho zozote bado", + "no-recently-read": "Bado huna vipindi vyovyote vya kusoma", + "noble-quran": "Qur'ani Tukufu", + "popular": "Maarufu", + "qgj": { + "learning-plans": { + "cta": { + "all-plans": "Tazama Mipango Yote", + "my-plans": "Mipango Yangu" + }, + "desc": { + "logged-in": "Je, umewahi kuanzisha programu ya kujifunza na kisha kupoteza mwelekeo katikati? Mipango yetu ya masomo imegawanywa katika sehemu unazoweza kusoma kwa urahisi na tunafuatilia maendeleo yako hadi ufikie mwisho. Gundua toleo letu la sasa la kozi uitakayo leo hii", + "logged-in-no-plans": "Je, umewahi kuanzisha programu ya kujifunza na kisha kupoteza mwelekeo katikati? Mipango yetu ya masomo imegawanywa katika sehemu unazoweza kusoma kwa urahisi na tunafuatilia maendeleo yako hadi ufikie mwisho. Gundua toleo letu la sasa la kozi uitakayo leo hii", + "logged-out": "Je, umewahi kuanzisha programu ya kujifunza na kisha ukashindwa kumaliza? Mipango yetu ya masomo imegawanywa katika sehemu zinazoweza kudhibitiwa kwa urahisi na tunafuatilia maendeleo yako hadi ufikie mwisho. Gundua toleo letu la sasa la kozi" + }, + "title": "Mipango ya Kujifunza" + }, + "quran-reading-goals": { + "desc": { + "logged-out": "Je, ungependa kusoma dakika 10 kwa siku, kukamilisha Juz katika mwezi mmoja, au kumaliza Qur'ani nzima kwa mwaka mmoja? Ni rahisi kuunda lengo maalum na kufuatilia maendeleo yako" + }, + "title": "Malengo Maalum ya Kusoma Qur'ani" + }, + "title": "Kuza safari yako na Qur'ani" + }, + "qr-community": "Soma Mistari na Tafakari ya leo", + "ramadan-activities-cta": " Fuata Global Quranic Calendar kwa usomaji wa kila wiki, podikasti za kusisimua, na wito wa kutafakari! ", + "ramadan": { + "header": "Vyombo vya Kukuza Uhusiano Wako na Quran", + "title": "Je, uko tayari kwa Ramadhani?" + }, + "read-juz": "Soma Juz", + "recently-read": "Uliyoisoma Hivi Karibuni", + "revelation-order-disclaimer": "Mtazamo huu unaonyesha utaratibu wa mpangilio wa Surah katika Quran kulingana na wakati zilipoteremshwa kwa Mtume Muhammad . Utaratibu huu ni mtazamo katika maoni ya wanazuoni na baadhi ya Sura ziliteremshwa kisehemu kwa nyakati tofauti. Utaratibu uliotumika hapa kunatokana na kazi ya Tanzil.net . [Kumbuka: utaratibu wa Mushaf uliyokusanywa kutoka al-Fatiha hadi al-Nas ni suala la makubaliano kati ya wanazuoni.]", + "see-more-learning-plans": "Tazama Zaidi", + "set-custom-goal": "Weka Lengo", + "share-quran": { + "description": "Saidia kueneza Kurani kwa wanafunzi wapya", + "title": "Shiriki Quran!" + }, + "start-read": "Anza Kusoma", + "stay-consistent": "Fuatilia Mifululizo, Unda Malengo Maalum, Udumu", + "tab": { + "bookmarks": "Alamisho", + "popular": "Maarufu" + }, + "view-all-bookmarks": "Tazama alamisho zote", + "voice": { + "trigger": "Ufikiaji wa haraka wa chochote" + }, + "welcome": { + "title": "Ni Mwezi wa Qur'ani! Saidia mamilioni ya watumiaji kupata mwongozo wa Qur'ani." + } +} diff --git a/locales/sw/learn.json b/locales/sw/learn.json index bf628b5e92..830d549ac4 100644 --- a/locales/sw/learn.json +++ b/locales/sw/learn.json @@ -5,7 +5,7 @@ "author": "Mwandishi", "back-to-learning-plan": "Rudi kwenye Mpango wa Mafunzo", "back-to-learning-plans": "Rudi kwenye Mipango ya Kujifunza", - "category": "", + "category": "Kategoria", "coming-soon": "Inakuja Hivi Karibuni...", "completed": "Imekamilika", "continue-learning": "Endelea Kujifunza", @@ -24,19 +24,24 @@ "feedback-success": "Asante kwa maoni yako!", "your-feedback": "Maoni Yako" }, + "help-about-reflection": "Msaada kuhusu kipengele cha kutafakari", "learn-duration": "Muda", + "learn-more": "Jifunze zaidi", "learning-plan-material": "Nyenzo ya Mpango wa Kujifunza", "learning-plan-meta-desc": "Mpango huu wa Mafunzo utasaidia kubadilisha uhusiano wako na Qur'ani, anza safari yako leo!", - "learning-plans-desc": "Ongeza maarifa yako kwa masomo rahisi ambayo yatakukuza katika safari yako ya Qur'ani.

    Anzisha Mpango wa Kujifunza leo! Maendeleo yako yanafuatiliwa hadi ufike mwisho.", + "learning-plans-desc": "Ongeza maarifa yako kwa masomo rahisi ambayo yatakukuza katika safari yako ya Qur'ani.

    Anzisha Mpango wa Kujifunza leo! Maendeleo yako yanafuatiliwa hadi ufike mwisho.", "learning-plans-meta-desc": "Mipango ya Kujifunza ya Quran.com itasaidia kubadilisha uhusiano wako na Qur'ani. Gundua mkusanyiko wetu wa masomo yaliyoratibiwa na uanze safari yako leo!", - "mark-complete": "Weka alama kuwa umekamilika", + "mark-complete": "Weka alama kuwa imekamilika", "mark-complete-success": "Somo limekamilika kwa mafanikio!", "next-lesson": "Somo Lijalo", "not-enrolled": "Bado hujajiandikisha katika Mpango wa Mafunzo .", "prev-lesson": "Somo Lililotangulia", + "reflection-description-1": "Kubofya \"Ongeza Tafakari\" kutakupeleka kwenye QuranReflect, jukwaa la kushiriki tafakari za kibinafsi kuhusu Quran. Tofauti na Tafsir (tafsiri ya kitaalamu), tafakuri ni utambuzi wa kibinafsi na uzoefu unaohusiana na aya.", + "reflection-description-2": "Ukichapisha hadharani, tafakari yako itakaguliwa na timu ya wasimamizi na itaonekana kwa jumuiya ya QuranReflect.", "start-learning": "Anza Kujifunza", "tabs": { "main": "Maelezo kuu", "syllabus": "Muhtasari wa masomo" - } + }, + "what-happens-when-you-click-add-reflection": "Nini kinatokea unapobofya \"Ongeza Tafakari\"?" } diff --git a/locales/sw/login.json b/locales/sw/login.json new file mode 100644 index 0000000000..586ccb6a02 --- /dev/null +++ b/locales/sw/login.json @@ -0,0 +1,110 @@ +{ + "awaiting-confirmation": "Inasubiri Uthibitisho", + "back": "Nyuma", + "back-to-login": "Rudi kwa Ingia", + "check-email-title": "Angalia barua pepe ili kukamilisha kujiandikisha", + "confirm": "Thibitisha", + "confirm-new-password-placeholder": "Thibitisha nenosiri jipya", + "confirm-password-placeholder": "Thibitisha nenosiri", + "continue": "Endelea", + "continue-apple": "Endelea na Apple", + "continue-email": "Endelea na Barua pepe", + "continue-facebook": "Endelea na Facebook", + "continue-google": "Endelea na Google", + "email-placeholder": "Anwani ya Barua Pepe", + "error": { + "email-required": "Barua pepe haipo!", + "invalid-credentials": "Barua pepe au nenosiri batili", + "invalid-email": "Umbizo la Barua Pepe si Sahihi!", + "login-failed": "Kuingia kumeshindwa. Tafadhali jaribu tena.", + "password-required": "Nenosiri halipo!" + }, + "errors": { + "account-banned": "Samahani, Akaunti yako imepigwa marufuku. Wasiliana na Quran.Foundation", + "badRequest": "*Ombi batili", + "banned": "*Samahani, Akaunti yako imepigwa marufuku. Wasiliana na Quran.Foundation", + "confirm": "*Thibitisha nenosiri hailingani na nenosiri", + "email": "*Muundo wa Barua pepe si Sahihi!", + "exactLength": "*Thamani lazima iwe urefu kamili", + "expiredToken": "*Tokeni hii imekwisha muda wake", + "forgot-password-failed": "Imeshindwa kutuma barua pepe ya kuweka upya nenosiri. Tafadhali jaribu tena.", + "immutable": "*Thamani hii haiwezi kubadilishwa", + "invalid": "*Hii {{fieldName}} si sahihi", + "invalidEmailOrPassword": "*Barua pepe au nenosiri batili", + "max": "* {{fieldName}} lazima iwe chini ya au sawa na tarakimu {{max}}", + "min": "* {{fieldName}} lazima iwe zaidi ya au sawa na tarakimu {{min}}", + "name": "* {{fieldName}} inapaswa kuwa herufi na nambari pekee", + "notFound": "*Haijapatikana", + "required": "* {{fieldName}} haipo!", + "reset-password-failed": "Imeshindwa kuweka upya nenosiri. Tafadhali jaribu tena.", + "signin-failed": "Kuingia kumeshindwa. Tafadhali jaribu tena.", + "signup-failed": "Kujisajili kumeshindwa. Tafadhali jaribu tena.", + "taken": "* {{fieldName}} tayari ipo!", + "usedToken": "*Toni hii tayari imetumika", + "username": "* {{fieldName}} kubali chini na herufi pekee", + "verification-code-invalid": "Nambari hii ya uthibitishaji si sahihi", + "verification-code-length": "Nambari ya kuthibitisha lazima iwe tarakimu {{length}}", + "verification-failed": "Uthibitishaji haukufaulu. Tafadhali jaribu tena.", + "verification-resend-failed": "Imeshindwa kutuma tena nambari ya kuthibitisha" + }, + "feature-1": "Fuatilia malengo yako", + "feature-2": "Dumisha streaks za kusoma", + "feature-3": "Unda mikusanyiko", + "feature-4": "Sawazisha data yako kwenye vivinjari", + "feature-5": "Na mengine zaidi!", + "feature-6": " Mpya! Maelezo na Tafakari", + "first-name-placeholder": "Jina la kwanza", + "forgot-password": "Umesahau nenosiri", + "forgot-password-description": "Weka barua pepe yako na tutakutumia maagizo ya kuweka upya nenosiri lako.", + "forgot-password-success": "Barua pepe ya kuweka upya nenosiri imetumwa! Tafadhali angalia kisanduku pokezi chako.", + "forgot-password-title": "Umesahau nenosiri?", + "last-name-placeholder": "Jina la mwisho", + "login-cta": "Ingia au Jisajili sasa:", + "login-error": { + "AuthenticationError": "Uthibitishaji umeshindikana. Tafadhali jaribu tena baadaye", + "BannedUserError": "Samahani, Akaunti yako imepigwa marufuku. Wasiliana na Quran.Foundation.", + "TokenExpiredError": "Umetoka nje, tafadhali ingia tena." + }, + "login-title": "Ingia kwenye Quran.com", + "new-password-placeholder": "Nenosiri mpya", + "other-options": "Chaguzi Nyingine za Kuingia", + "password-placeholder": "Nenosiri", + "password-reset-success": "Imefaulu kuweka upya nenosiri!", + "password-rules": { + "lowercase": "Angalau herufi ndogo moja", + "max-length": "Upeo wa herufi 20", + "min-length": "Chini ya herufi 8", + "number": "Angalau nambari moja", + "special": "Angalau herufi moja maalum (!@#$%^&*_-)", + "uppercase": "Angalau herufi kubwa moja" + }, + "privacy-policy": "Kulinda faragha yako ndio kipaumbele chetu - Kwa kujiandikisha, umekubali Sera yetu ya Faragha na Sheria na Masharti .", + "quran-text": "Quran", + "quran-title": "Quran.com", + "reflect-feature-1": "Tafakari juu ya Quran", + "reflect-feature-2": "Jiunge na Vikundi", + "reflect-feature-3": "Kuingiliana na wengine", + "reflect-feature-4": "Na zaidi!", + "reset-password": "Weka upya Nenosiri", + "reset-password-success": "Imefaulu kuweka upya nenosiri!", + "set-new-password": "Weka nenosiri jipya", + "sign-in": "Ingia", + "sign-in-or-sign-up": "Ingia au Jisajili", + "sign-up": "Jisajili", + "unified-registration-1": "Usajili wa umoja wa ", + "unified-registration-2": "Quran.Msingi", + "unified-registration-3": ". Utakuwa na ufikiaji wa tovuti zifuatazo ", + "unified-registration-4": "kupitia maelezo yako ya kuingia.", + "username-placeholder": "Jina la mtumiaji", + "verification-code-instruction": "Tafadhali weka msimbo uliotolewa katika barua pepe ili kukamilisha kujisajili", + "verification-code-resend": "Tuma barua pepe tena", + "verification-code-resend-countdown": "Tuma tena barua pepe ya uthibitishaji baada ya {{seconds}}...", + "verification-code-sent": "Nambari ya kuthibitisha imetumwa!", + "verification-code-sent-to": "Tumetuma barua pepe kwa", + "verification-code-spam-note": "Hukupokea barua pepe? Angalia folda yako ya barua taka", + "verify-code": "Thibitisha kuwa nambari ya kuthibitisha iliyotolewa inalingana na maandishi yafuatayo:", + "welcome-description-1": "Usajili wa umoja wa", + "welcome-description-2": ".Msingi", + "welcome-description-3": "Utakuwa na ufikiaji wa tovuti zifuatazo kupitia maelezo yako ya kuingia.", + "welcome-title": "Karibu kwa" +} diff --git a/locales/sw/media.json b/locales/sw/media.json new file mode 100644 index 0000000000..452d3f9b1b --- /dev/null +++ b/locales/sw/media.json @@ -0,0 +1,31 @@ +{ + "background-opacity": "Mandharinyuma ya maandishi na uwazi", + "border-color-size": "Rangi ya mpaka na ukubwa", + "centre": "Katikati", + "collapse": "Kunja orodha", + "copied": "Imenakiliwa", + "copy-link": "Nakili kiungo", + "count": "{{count}}", + "deselect": "Acha kuchagua zote", + "download-image": "Pakua Picha", + "download-share": "Pakua/Shiriki", + "download-video": "Pakua Video", + "justified": "Imeratibiwa", + "landscape": "Upana", + "limit": " / {{limit}}", + "maker-meta-desc": "Quran Media Maker ni zana ya bure ya kuunda video nzuri na picha za skrini kutumia aya za Qur'ani. Shiriki ujuzi wako na uwatie moyo wengine.", + "maker-title": "Quran Video Maker - Unda Video na Picha za Qura'ni za Kustaajabisha", + "max-ayahs": "Upeo wa Aya 10", + "monthly-balance": "Salio la kila mwezi: ", + "orientation": "Mwelekeo", + "portrait": "Urefu", + "render-image": "Piga picha ya skrini", + "render-video": "Onyesha", + "reset-defaults": "Ungependa kuweka upya mipangilio chaguomsingi?", + "style": "Mtindo wa fonti wa Qur'ani", + "text-color": "Rangi ya maandishi", + "title": "Tengeneza na shiriki video za Qur'ani", + "to": "hadi", + "verse-key": "Sura na Nambari ya Aya km 2:255", + "video-picker": "Video ya usuli" +} diff --git a/locales/sw/notes.json b/locales/sw/notes.json new file mode 100644 index 0000000000..025dbdb3b1 --- /dev/null +++ b/locales/sw/notes.json @@ -0,0 +1,62 @@ +{ + "add-another-note": "Ongeza maelezo mengine", + "body-placeholder": "Tumia nafasi hii kuhifadhi maelezo ya jumla, au kuandika tafakari.", + "checkbox-refl-intro": { + "checkbox": { + "desc": "
  • Kuchapisha kunamaanisha kuwa tafakari yako itashirikishwa kwenye QuranReflect chini ya jina lako ambapo itakaguliwa na timu ya wasimamizi na kuonekana kwa jumuiya ya QuranReflect.
  • Baada ya chapisho lako kukaguliwa na kuidhinishwa au kupandishwa cheo na timu yetu ya usimamizi, utaweza kupata likes, comments na kuweza kutazama arifa. Baada ya kuingia katika QuranReflect, unaweza kusasisha mipangilio yako ya arifa ili kukidhi mapendeleo yako.
  • Unaweza kutazama maelezo yako na tafakari zilizochapishwa ndani ya wasifu wako wa kuingia kwenye Quran.com katika sehemu ya “Maelezo na Tafakari Zangu”, au ingia kwenye QuranReflect ukitumia barua pepe yako ya Quran.com.
  • ", + "title": "Nini kitatokea nikichagua kisanduku hiki?" + }, + "post-button": "Itakuaje nitakapochapisha kwenye QuranReflect?", + "qr-intro": "QuranReflect, pamoja na Quran.com, ni mojawapo katika familia ya Quran.Foundation. Ni jukwaa la kijamii la kushiriki tafakari za kibinafsi juu ya Qura'ni, likiwahimiza watumiaji kutafakari ujumbe wa Qur'ani pamoja na kushiriki maarifa ambayo huchochea mabadiliko chanya. Tofauti na tafsir, ambayo ni tafsiri ya kielimu, tafakari ni mawazo ya kibinafsi na uzoefu unaohusiana na aya. Machapisho ya mtumiaji kwenye QuranReflect yanakaguliwa na kusimamiwa na timu iliyohitimu, ambayo inasaidia kuhakikisha ubora wa maudhui, adabu wakati wa kuingiliana na Qur'ani, na inawawezesha watumiaji kwa kushiriki maoni na kuangazia hotuba muhimu na hivyo kukuza jamii inayoinua kiroho, na inayozingatia Qur'ani. Pata maelezo zaidi: Quranreflect.com/faq ", + "title": "QuranReflect ni nini na nini kitatokea nikichagua kisanduku hiki?" + }, + "click-to-see-more": "bonyeza kuona zaidi", + "delete-note": "Futa maelezo", + "delete-note-modal": { + "subtitle": "Je, una uhakika unataka kufuta maelezo?", + "title": "Futa Maelezo" + }, + "delete-success": "Maelezo yamefutwa kwa mafanikio", + "empty-notes": "Hakuna maelezo yaliyopatikana", + "empty-reflections": "Hakuna tafakari zilizopatikana", + "export-success": "Maelezo yamechapishwa kwa akaunti yako ya QuranReflect kwa mafanikio", + "new-note-reflc-intro": { + "reflc-prompts": { + "deeper": { + "desc": "
  • Je, kuna majina ya Mwenyezi Mungu yaliyotajwa, na yanahusiana vipi na Aya?
  • Ni vipengele vipi vya lugha au maneno gani yaliyokuvutia?
  • Je, unaweza kuunganisha muktadha wa aya, na aya nyingine za Qur'ani, hadith, au matukio mengine?
  • ", + "title": "Ufahamu wa kina:" + }, + "personal": { + "desc": "
  • Je, aya hii imekuvutia au kukutia moyo kwa njia gani?
  • Je, kuna sifa au vitendo vilivyotajwa ambavyo unaweza kujiboresha navyo?
  • Je, kuna ahadi au onyo/katazo ambalo unaweza kutekeleza katika maisha yako?
  • Je, una hadithi ya kibinafsi inayohusiana na aya hii?
  • Ni mabadiliko gani unayotaka kufanya kulingana na aya hii, na unawezaje wewe au mtu mwingine kuyatekeleza?
  • ", + "title": "Maswali ya Tafakari ya Kibinafsi:" + }, + "title": "Vishawishi vya Tafakari" + }, + "title": "Je, unahitaji usaidizi wa kutafakari Qur'ani? Jifunze zaidi", + "what-is-reflc": { + "desc": "Kuitafakari au kuwaza juu ya Qur'ani kunahusisha kusoma au kusikiliza kwa makini maneno ya Mwenyezi Mungu, kujihusisha na maana zake, na kuiruhusu ituathiri na kutubadilisha kuwa bora. Hii inajulikana kama \"Tadabbur\". Ilihali Tafsir, ni ufafanuaji wa kielimu wa Qur'ani, unaotoa maelezo ya kina ya aya kulingana na vyanzo vya awali na uchambuzi wa kielimu wa sasa. Huku Tafsir ikiwa imehifadhiwa kwa wanachuoni, Mwenyezi Mungu ﷻ anahimiza kila mtu ajishughulishe na Tadabbur (Quran 38:29 , 47:24 , 4:82 , na mengine mengi).



    Watumiaji wanaweza kuhifadhi madokezo na tafakari zao za kibinafsi kwa faragha. Mara nyingi tafakari zetu zinaweza kuwagusa wengine kwa kina, kusaidia uhusiano wao na Qur'ani, na uhusiano wao na Allah ﷻ. Ndiyo maana watumiaji wana chaguo la kushiriki tafakari yao kwa QuranReflect kama sehemu ya juhudi zetu za kuwasaidia watu kukua pamoja katika safari yao. Ili kupata maelezo zaidi, tembelea: QuranReflect.com/faq na Lenzi Tano za Kutafakari Quran ", + "title": "Tafakari ni nini?" + } + }, + "note": "Maelezo", + "notes-and-reflcs": "Maelezo na Tafakari", + "post-on-qr": "Chapisha kwenye QuranReflect", + "posted-reflections": "Tafakari Zilizochapishwa", + "private-notes": "Maelezo", + "qr-tooltip": " QuranReflect ni jukwaa la kijamii la kushiriki tafakari kuhusu Qur'ani. wasiliana na Qur'ani, wasiliana na jambo la muhimu. ", + "reflections-intro": { + "line-1": "Ili kutazama na kuwasiliana na mawazo ya jamii, jihusishe na jumuiya, unaweza pia kufanya mengi zaidi, tembelea QuranReflect.com .", + "line-2": "Unaweza kuingia katika akaunti yako ya QuranReflect kwa kuingia au kujisajili kwa kutumia barua pepe ile ile ya Quran.com unayotumia wakati unapoingia.", + "line-3": "Maudhui ambayo hayafai kutazamwa na umma yatafichwa au kufutwa. Watumiaji wanaochapisha maudhui yasiyofaa watazuiwa.", + "title": "Pata maelezo zaidi kuhusu Tafakari Zilizochapishwa" + }, + "save-post-to-qr": "Hifadhi na Uchapishe kwenye Quranreflect", + "save-privately": "Hifadhi kisiri", + "save-publish-failed": "Maelezo yamehifadhiwa kwa mafanikio lakini hayajachapishwa", + "save-success": "Maelezo yamehifadhiwa", + "share-to-qr": "Shiriki kwenye QuranReflect.com", + "share-to-qr-desc": "Shiriki kama {{name}} . Hadhira ni watumiaji wa QuranReflect ", + "update-publish-failed": "Maelezo yamesasishwa kwa mafanikio lakini hayajachapishwa", + "update-success": "Maelezo yamesasishwa", + "view-on-qr": "Tazama kwenye QuranReflect" +} diff --git a/locales/sw/notification-settings.json b/locales/sw/notification-settings.json new file mode 100644 index 0000000000..1f2d598dfe --- /dev/null +++ b/locales/sw/notification-settings.json @@ -0,0 +1,22 @@ +{ + "all-notifications": "Arifa Zote", + "channels-notifications": "Arifa za Vituo", + "channels": { + "chat": "Zungumza", + "email": "Barua pepe", + "in_app": "In-App", + "push": "Sukuma", + "sms": "SMS" + }, + "notif-settings-not-enabled": "Mipangilio ya arifa haijawezeshwa", + "notif-update-success": "Mipangilio yako ya arifa imesasishwa!", + "tabs": { + "categories-settings": "Mipangilio ya Kategoria", + "global-settings": "Mipangilio ya jumla" + }, + "tags": { + "learning-plans": "Mipango ya Kujifunza", + "qgj": "Kuza safari yako na Qur'ani", + "streaks": "Streaks" + } +} diff --git a/locales/sw/onboarding.json b/locales/sw/onboarding.json new file mode 100644 index 0000000000..1ec9392cf3 --- /dev/null +++ b/locales/sw/onboarding.json @@ -0,0 +1,103 @@ +{ + "checklist": { + "1": "Vipengele vya ukurasa wa nyumbani", + "2": "Binafsisha mipangilio yako", + "3": "Boresha uzoefu wako wa kusoma Aya", + "4": "Vipengele vilivyobinafsishwa" + }, + "finish": "Maliza", + "onboarding-checklist": "Orodha hakiki ya Kuingia", + "onboarding-title": "Ongeza matumizi yako ya Quran.com hadi upeo!

    Anza ziara yako sasa:", + "previous": "Iliyotangulia", + "skip": "Ruka", + "steps": { + "3-dot-menu": { + "description": "Bofya menyu ya nukta 3 ili kugundua chaguo za kunakili, kuweka alamisho na kurudia aya. Gundua chaguzi mbalimbali za kurudia aya", + "title": "Menyu ya nukta 3" + }, + "ayah-reflection": { + "description": "Soma tafakari (tadabbur) kutoka kwa wanazuoni, wanafunzi wasomi, na watu wa kawaida pia ili kukusaidia kukuza zaidi uhusiano wako wa kibinafsi na Qur'ani.", + "title": "Soma tafakari katika kiwango cha aya" + }, + "ayah-tafsir": { + "description": "Chunguza Tafsir katika kiwango cha aya, itakayokupa umaizi wa kina ili kuboresha kuelewa kwako unaposoma. (Tafsir inaweza kupangwa kwa makundi ya aya wakati mwingine)", + "title": "Soma Tafsir katika kiwango cha Aya" + }, + "font-size": { + "description": "Binafsisha usomaji wako wa Qur'ani kwa ukubwa za fonti zilizo rahisi kurekebisha ili usomaji wako uwe na raha", + "title": "Ukubwa wa Fonti" + }, + "font-style": { + "description": "Chaguo zilizopo ni Uthmani - King Fahad Complex v1, Uthmani - King Fahad Complex v2, Uthmani QPC Hafs, Indopak mistari 15, Indopak mistari 16.", + "title": "Chagua hati ya kusoma unayopendelea" + }, + "inline-wbw": { + "description": "Tazama tarjuma ya kila neno kwenye mstari (chini ya neno) au kwenye kiputo juu ya neno huku ukisikiliza Qur'ani", + "title": "Onyesha tarjuma ya neno kwa neno kwenye aya (chini ya neno) au onyesha tooltip" + }, + "juz": { + "description": "Tazama Qur'ani kupitia Juz", + "title": "Tazama Qur'ani kupitia Juz" + }, + "listen": { + "description": "Anzisha kicheza sauti ili kusikiliza kisomo", + "title": "Sikiliza Surah au Aya" + }, + "login": { + "description": "Ingia na uhifadhi mipangilio kwenye vifaa vyote na upate ufikiaji wa vipengele vya ziada.", + "title": "Ingia" + }, + "quran-radio": { + "description": "Sikiliza QuranRadio - Cheza Qur'ani bila matangazo", + "title": "Redio ya Qur'ani" + }, + "reading-sessions": { + "description": "Kagua kwa urahisi safari yako ya Qur'ani kwa kutazama historia yako ya usomaji iliyobinafsishwa, ukifuatilia aya ambazo umezitazama kwenye Quran.com.", + "title": "Tazama historia ya kusoma" + }, + "reading-view": { + "description": "Tazama Qur'ani katika hali ya kusoma mushaf", + "title": "Hali ya kusoma" + }, + "search-bar": { + "description": "Tafuta aya, surah, maneno muhimu, juz na mada unazohitaji kwa kutumia upau wetu wa utafutaji.", + "title": "Upau wa Utafutaji" + }, + "select-reciter": { + "description": "Binafsisha usikilizaji wako kwa kuchagua msomaji unayependa kumsikiliza zaidi!", + "title": "Chagua usikilizaji kutoka kwa wasomaji anuwai" + }, + "settings": { + "description": "Dhibiti mapendeleo yako", + "title": "Mipangilio" + }, + "streak": { + "description": "Weka malengo ya usomaji yaliyobinafsishwa, fuatilia maendeleo yako, na jenga tabia thabiti ya usomaji wa Qur'ani ukitumia kipengele chetu cha Streaks za kusoma na kipengele cha Mipango.", + "title": "Fuatilia Streaks za kusoma na mipango ya kusoma" + }, + "surah-info": { + "description": "Pata maarifa kuhusu kila Sura - inayopatikana kwa urahisi mwanzoni mwa kila Sura", + "title": "Soma Kuhusu Sura" + }, + "theme": { + "description": "Chagua mwonekano unaoupenda—Light, Sepia au Dark mode—ili upate uzoefu mzuri wa kibinafsi wa kusoma Qur'ani.", + "title": "Soma Qur'ani kwa Light, Sepia au Dark mode" + }, + "translations": { + "description": "Chagua kutoka kwa anuwai ya tarjuma katika lugha mbalimbali. Kidokezo: Linganisha tafsiri tofauti kwa kuchagua chaguo kadhaa", + "title": "Tarjuma" + }, + "wbw-audio": { + "description": "Teua chaguo hili ili kusikiliza kila neno moja kwa moja kwa kubofya tu neno!", + "title": "Sikiliza unukuzi wa neno kwa neno kwa kubofya neno hilo" + }, + "wbw-translation": { + "description": "Tazama maana ya maneno mahususi unaposoma au kusikiliza Qur'ani ili ikusaidie kuboresha msamiati wako wa Qur'ani", + "title": "Soma tarjuma ya neno kwa neno" + }, + "wbw-transliteration": { + "description": "Tazama unukuzi wa kila neno ili kukusaidia katika safari yako ya kusoma Qur'ani", + "title": "Soma unukuzi wa neno kwa neno" + } + } +} diff --git a/locales/sw/privacy.json b/locales/sw/privacy.json new file mode 100644 index 0000000000..1fd818e1d4 --- /dev/null +++ b/locales/sw/privacy.json @@ -0,0 +1,48 @@ +{ + "communication": { + "desc": "Tunaweza kutumia anwani yako ya barua pepe kukutumia masasisho muhimu, majarida, au arifa zinazohusiana na huduma zetu, maudhui, n.k. Utakuwa na uwezo wa kujiondoa kutoka kwa mawasiliano haya wakati wowote.", + "title": "Mawasiliano" + }, + "contact-us": { + "desc": "Ikiwa una maswali yoyote, matatizo, au maombi kuhusu Sera hii ya Faragha au utunzaji wa maelezo yako ya kibinafsi, tafadhali wasiliana nasi <0>hapa. Kwa kutumia tovuti yetu, unakubali kwamba umesoma na kuelewa Sera hii ya Faragha na kukubali kukusanya, kutumia na kufichua maelezo yako ya kibinafsi kama ilivyoelezwa.", + "title": "Wasiliana Nasi" + }, + "cookies": { + "desc": "Quran.com hutumia vidakuzi ili kuboresha matumizi yako ya kuvinjari, kutoa maudhui yaliyobinafsishwa, na kuchanganua trafiki ya tovuti. Kwa kuingia na kutumia tovuti yetu, unakubali matumizi ya vidakuzi kwa mujibu wa Sera hii ya Faragha.

  • Aina za Vidakuzi Tunazotumia:
  • Vidakuzi Muhimu: Vidakuzi hivi ni muhimu kwa utendakazi ifaavyo wa tovuti yetu na kuwezesha vipengele vya msingi, kama vile usogezaji kwenye ukurasa na kufikia maeneo salama. Hazikusanyi taarifa zozote zinazoweza kumtambulisha mtu binafsi. Bila vidakuzi hivi, baadhi ya sehemu za tovuti huenda zisifanye kazi ipasavyo. Vidakuzi vya Uchambuzi na Utendaji: Tunatumia vidakuzi hivi kukusanya taarifa kuhusu jinsi wageni wanavyotumia tovuti yetu, ikijumuisha idadi ya wageni, kurasa wanazotembelea, na muda unaotumika kwenye kila ukurasa. Data hii hutusaidia kuchanganua na kuboresha utendaji na utendakazi wa tovuti yetu. Vidakuzi hivi havikutambulishi wewe binafsi; data yote imejumlishwa na haitambulishwi na mtu binafsi. ", + "title": "Matumizi ya Vidakuzi" + }, + "data-analysis": { + "desc": "Tunatumia Google Analytics ili kuhakikisha kuwa tovuti inaendelea kufanya kazi inavyotarajiwa na pia kujua ni vipengele vipi vya kazi tutatanguliza, n.k. Maelezo haya hayatambuliki na mtu binafsi na hatuyafuatilii kwa mtu yeyote mahususi.", + "title": "Uchambuzi wa Data" + }, + "data-deletion": { + "desc": "Ili kuhakikisha faragha yako na udhibiti wa maelezo yako ya kibinafsi, tunatoa mchakato wa moja kwa moja wa kufuta akaunti. Unapochagua kufuta akaunti yako, data yote ya kibinafsi inayohusishwa itaondolewa kiotomatiki na kabisa kutoka kwa mifumo yetu. Unaweza kuanzisha ufutaji wa akaunti kwa kufikia ukurasa wako wa wasifu. Ufutaji unapoanzishwa, data yako ya kibinafsi itafutwa kwa usalama kutoka kwa seva zetu ndani ya muda unaofaa.", + "title": "Ufutaji wa Data" + }, + "data-protection": { + "desc": " Haki ya kufikia: Una haki ya kuomba Quran Foundation nakala za data yako ya kibinafsi. Tunaweza kukutoza ada kidogo kwa huduma hii.

    Haki ya kusahihishwa : Una haki ya kuomba Quran Foundation kusahihisha taarifa zozote unazoamini si sahihi. Pia una haki ya kuomba Quran Foundation kukamilisha maelezo ambayo unaamini kuwa hayajakamilika.

    Haki ya kufuta: Una haki ya kuomba Quran Foundation kufuta data yako ya kibinafsi, chini ya masharti fulani.

    Haki ya kuzuia uchakataji: Una haki ya kuomba Quran Foundation kuzuia uchakataji wa data yako ya kibinafsi, chini ya masharti fulani.

    Haki ya kupinga kuchakatwa : Una haki ya kupinga uchakataji wa data yako ya kibinafsi wa Quran Foundation chini ya masharti fulani.

    Haki ya usafirishaji wa data : Una haki ya kuomba Quran Foundation kuhamisha data yako ambayo tumekusanya kwenda kwa shirika lingine, au kwako moja kwa moja, chini ya masharti fulani.", + "title": "Haki za Ulinzi wa Data" + }, + "data-security": { + "desc": "Tunachukua hatua zinazofaa ili kulinda taarifa zako za kibinafsi dhidi ya utumiaji usioidhinishwa, madiliko, ufichuzi au uharibifu. Tunatumia itifaki za usalama za kiwango cha sekta na kuajiri ulinzi wa asili, wa kielektroniki na wa usimamizi ili kuhakikisha usiri na uadilifu wa data yako.", + "title": "Usalama wa Data" + }, + "data-sharing": { + "desc": "Hatuuzi, kufanya biashara, au kukodisha taarifa zako za kibinafsi kwa wahusika wengine.", + "title": "Kushiriki Data" + }, + "info-collection": { + "desc": "Tunakusanya taarifa fulani za kibinafsi kutoka kwa watumiaji wanaochagua kufungua akaunti kwenye Quran.com. Maelezo haya yanaweza kujumuisha:

    Anwani ya Barua Pepe : Tunakusanya anwani yako ya barua pepe ili kuwezesha mchakato wa kuunda akaunti na kwa madhumuni ya mawasiliano yanayohusiana na akaunti yako, ikiwa ni pamoja na uokoaji wa akaunti na arifa za usalama.", + "title": "Ukusanyaji wa Habari" + }, + "log-data": { + "desc": "Tunakusanya maelezo ambayo kivinjari chako hutuma kila unapotembelea Huduma yetu (“Log Data”). Log Data hii inaweza kujumuisha maelezo kama vile anwani ya Itifaki ya Mtandao ya kompyuta (“IP”) ya kompyuta yako, aina ya kivinjari, toleo la kivinjari, kurasa zetu unazotembelea, saa na tarehe ya ziara yako, muda uliotumika kwenye kurasa hizo na takwimu nyinginezo.", + "title": "Log Data" + }, + "main-privacy-desc": "Quran Foundation, Inc. (inayojumuisha Quran.com) ni shirika lisilo la faida la 501(c)(3) ambalo linajitahidi kumwezesha kila mwanadamu kufaidika na Qur'ani. Quran Foundation, Inc. inathamini na kuheshimu faragha ya watumiaji wetu wote.", + "personal-info-use": { + "desc": "Tunatumia maelezo ya kibinafsi tunayokusanya kwa madhumuni yafuatayo:
  • Uundaji na Usimamizi wa Akaunti : Barua pepe yako inatumiwa kuunda na kudhibiti akaunti yako kwenye tovuti yetu. Inakuwezesha kuingia, kufikia mipangilio yako, na kuhifadhi alamisho zako na historia ya kusoma.
  • Ubinafsishaji : Tunaweza kutumia historia yako ya kusoma ili kutoa mapendekezo na maoni ya kibinafsi kulingana na mapendeleo na maslahi yako.
  • ", + "title": "Matumizi ya Taarifa za Kibinafsi" + }, + "privacy-header": "Sera ya Faragha" +} diff --git a/locales/sw/product-updates.json b/locales/sw/product-updates.json new file mode 100644 index 0000000000..83efaa475b --- /dev/null +++ b/locales/sw/product-updates.json @@ -0,0 +1,3 @@ +{ + "localization-message": "Unatazama ukurasa huu kwa Kiingereza. Tunafanya kazi ya kuifasiri. Tunaomba radhi kwa usumbufu." +} diff --git a/locales/sw/profile.json b/locales/sw/profile.json new file mode 100644 index 0000000000..aae7808fa9 --- /dev/null +++ b/locales/sw/profile.json @@ -0,0 +1,10 @@ +{ + "delete-account": "Futa Akaunti", + "delete-confirmation": { + "action-text": "Ninaelewa matokeo, futa akaunti yangu", + "confirmation-text": "futa akaunti yangu", + "instruction-text": "Tafadhali andika {{text}} ili kuthibitisha", + "subtitle": "Kitendo hiki hakiwezi kutenduliwa. Hii itafuta kabisa akaunti yako, alamisho zilizohifadhiwa, vipindi vya kusoma na data yako yote.", + "title": "Una uhakika kabisa?" + } +} diff --git a/locales/sw/question.json b/locales/sw/question.json new file mode 100644 index 0000000000..15d1cae666 --- /dev/null +++ b/locales/sw/question.json @@ -0,0 +1,5 @@ +{ + "q-and-a": "Maswali na Majibu kuhusiana na ", + "question": "Swali", + "questions-meta-desc": "Chunguza majibu yanayoaminika ili kuongeza uelewa wako wa Quran." +} diff --git a/locales/sw/quick-links.json b/locales/sw/quick-links.json new file mode 100644 index 0000000000..d090c06e47 --- /dev/null +++ b/locales/sw/quick-links.json @@ -0,0 +1,14 @@ +{ + "about-quran": "Kuhusu Qur'ani", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Yesu katika Quran", + "kahf": "Al Kahf", + "mulk": "Al Mulk", + "muzzammil": "Al Muzzammil", + "qr": "Jiunge na Ramadhani ya Tafakari", + "rahman": "Ar-Rahman", + "sunnah": "Aya kuhusu Sunnah", + "waqiah": "Al Waqi'ah", + "what-is-ramadan": "Ramadhani ni nini?", + "yaseen": "Yaseen" +} diff --git a/locales/sw/quran-reader.json b/locales/sw/quran-reader.json new file mode 100644 index 0000000000..ad6d3051e2 --- /dev/null +++ b/locales/sw/quran-reader.json @@ -0,0 +1,92 @@ +{ + "add-collection": "Ongeza Mkusanyiko", + "advanced-copy": "Nakala ya Juu", + "aria": { + "read-ayah-refls": "Soma Tafakari za Aya", + "read-tafsirs": "Soma Tafsir za Aya" + }, + "ayatul-kursi": "Ayatul Kursi", + "back-to-ayah": "Rudi kwa Aya", + "copy-arabic": "Maandishi ya Kiarabu (Nakala ya Uthmani)", + "copy-footnote-q": "Nakili pia Tanbihi?", + "copy-success": "Maandishi yamenakiliwa katika ubao wako wa kunakili.", + "copy-text": "Nakili maandishi", + "copy-verse": "Nakili Maandishi", + "cpy-link": "Nakili Kiungo", + "current-verse": "Aya ya sasa", + "download-copy": "ikiwa unataka kupakua faili ya maandishi.", + "edgham": "Herufi ya kimya", + "ekhfa": "Ghunna/ikhfa'", + "font": "Fonti ya kunakili ya Kiarabu", + "font-placeholder": "Chagua fonti", + "font-tooltip": "Fonti za King Fahad V1 na V2 zitakuwa katika unicode.", + "footnote": "Tanbihi", + "footnote-dl": " Dual
    Fomu ya vitenzi na viwakilishi katika lugha ya Kiarabu unapohutubia watu wawili", + "footnote-pl": "Wingi", + "footnote-sg": "Umoja", + "full-surah-cta": "Soma sura kamili", + "generate-media": "Tengeneza Video/Picha", + "go-ayah": "Nenda kwa Aya", + "hizb-beginning": "Mwanzo wa Hizb", + "include-translator": "Jumuisha jina la mtafsiri?", + "juz-beginning": "Mwanzo wa Juz", + "lessons-desc": "Soma na ushiriki masomo ya Kurani ya Ayah {{ayahNumber}} ya Surah {{surahName}}", + "lessons-disclaimer": "Masomo ni utambuzi wa kibinafsi na tafsiri za Quran. Hazikusudiwi kuchukuliwa kama mamlaka.", + "lessons-not-available": "Hakuna masomo yaliyopitiwa kwa aya hii", + "mad-2": "Madd Tabi`ee", + "mad-2-4-6": "Madd Al-Munfasil (2/4/6)", + "mad-4-5": "Madd Al-Mutassil (4/5)", + "mad-6": "Madd Laazim (6)", + "new-collection-name": "Jina Jipya la Mkusanyiko", + "next-hizb": "Hizb inayofuata", + "next-juz": "Juz Inayofuata", + "next-page": "Ukurasa unaofuata", + "next-rub": "Rub el Hizb Inayofuata", + "next-surah": "Sura inayofuata", + "posted-in": "Imechapishwa kwa", + "prev-ayah": "Aya Iliyotangulia", + "prev-hizb": "Hizb Iliyotangulia", + "prev-juz": "Juz Iliyotangulia", + "prev-page": "Ukurasa uliotangulia", + "prev-rub": "Rub el Hizb iliyotangulia", + "prev-surah": "Sura Iliyotangulia", + "q-and-a": { + "answer": "Jibu", + "clarification": "Ufafanuzi", + "community": "Jumuiya", + "explore_answers": "Chunguza Majibu", + "explore_answers_tooltip": "'Gundua Majibu' ni orodha iliyoratibiwa ya maswali ya kufikirika na madokezo muhimu yanayohusiana na aya mahususi ambayo yataongeza uelewa wako na uhusiano wako na Quran.", + "questions": "Maswali", + "references": "Marejeleo", + "summary": "Muhtasari", + "tafsir": "Tafsir" + }, + "qalqala": "Qalqala (mwangwi)", + "query-param-message": "Unatazama mipangilio ya kusoma iliyochaguliwa mapema. <0>Ondoa ili kutazama katika mipangilio yako ya sasa au <1>Hifadhi ili kusasisha mipangilio yako", + "ramadan-of-reflection": "Jiunge na Quranreflect \"Ramadhani ya Tafakari\"", + "read-more-quran-reflect": "Soma zaidi kwenye QuranReflect", + "referencing": "Kurejelea", + "reflection-disclaimer": "Tafakari ni mitazamo ya kibinafsi (iliyokaguliwa kwa minajli ya ubora) na haipaswi kuchukuliwa kama yenye mamlaka.", + "reflection-not-available": "Hakuna tafakari zilizokaguliwa kwa aya hii", + "reflections-desc": "Soma na ushiriki tafakari za Qur'ani za Aya {{ayahNumber}} ya Sura {{surahName}}", + "remove-bookmark": "Ondoa alamisho", + "removed-from": "Imeondolewa kutoka kwa {{collectionName}}", + "revelation-order-notice": "Kumbuka: unachunguza Qur'ani kwa mpangilio ulioteremshwa. Bofya hapa ili kurejea kwa mpangilio chaguomsingi.", + "rub-beginning": "Mwanzo wa Rub el Hizb", + "save-to": "Hifadhi kwa...", + "saved-to": "Imehifadhiwa kwenye {{collectionName}}", + "see-less": "Tazama kidogo", + "see-more": "Tazama zaidi", + "select-range": "Chagua msururu wa aya", + "share-your-reflection": "Shiriki tafakari yako kuhusu aya hii", + "surah-beginning": "Mwanzo wa Surah", + "surah-info": "Taarifa ya Sura", + "tafkhim": "Tafkhim (nzito)", + "tafsirs": "Tafsir", + "tajweed-colors": "Rangi za Tajweed", + "text-copied": "Maandishi yamenakiliwa kwenye ubao wa kunakili!", + "trans-change": "Badilisha", + "translation-by": "Tarjuma ya", + "verses-range": "Msururu wa aya", + "view-on-quran-reflect": "Tazama kwenye QuranReflect" +} diff --git a/locales/sw/quranic-calendar.json b/locales/sw/quranic-calendar.json new file mode 100644 index 0000000000..eb02c43d7d --- /dev/null +++ b/locales/sw/quranic-calendar.json @@ -0,0 +1,35 @@ +{ + "hero": { + "line-1": "The Global Quranic Calendar ni ratiba ya usomaji iliyoundwa ili kuhimiza usomaji kwa hali kutafakari Qur'ani nzima, kutoka mwisho wa Ramadhani moja hadi mwanzo wa Ramadhani inayofuata. Tunakuhimiza uchukue muda kuelewa na kutafakari aya ili uweze kupata mawasiliano wa kina, na wa dhati zaidi na Qur'ani." + }, + "interact-with-post": "Wasiliana na chapisho hili kwenye QuranReflect", + "islamic-months": { + "1": "Muharram", + "2": "Safar", + "3": "Rabi' al-Awwal", + "4": "Rabi' al-Thani", + "5": "Jumada al-Awwal", + "6": "Jumada al-Thani", + "7": "Rajab", + "8": "Sha'ban", + "9": "Ramadhani", + "10": "Shawwal", + "11": "Dhu al-Qi'dah", + "12": "Dhu al-Hijjah" + }, + "join-qc": { + "line-1": "Tuko katika Wiki {{weekNumber}} ya Quranic Calendar.", + "line-2": " Jiunge nasi kwa usomaji wa wiki hii hata ikiwa ni mara yako ya kwanza! " + }, + "join-quranic-calendar": "Jisajili ili upate sasisho na nyenzo mbalimbali kupitia QuranReflect", + "join-quranic-calendar-success": "Umefanikiwa kujiunga na Divine Book Club!", + "quranic-calendar": "The Global Quranic Calendar", + "reading-options": { + "default-settings": "Soma na mipangilio yangu chaguomsingi", + "en-and-ar": "Soma kwa Kiingereza na Kiarabu", + "en-only": "Soma kwa Kiingereza pekee" + }, + "supplemental-resources": "Maelezo ya ziada", + "today": "Tarehe ya leo ni: {{month}} {{day}} {{year}}, {{gregorianDate}} ", + "week-title": "Wiki {{weekNumber}} ( {{month}} ) inayojumuisha aya {{rangeStart}} hadi {{rangeEnd}}" +} diff --git a/locales/sw/radio.json b/locales/sw/radio.json new file mode 100644 index 0000000000..de824a895a --- /dev/null +++ b/locales/sw/radio.json @@ -0,0 +1,27 @@ +{ + "change": "Badilisha", + "curated-station": { + "juz-amma": { + "description": "Sikiliza Juz ya mwisho ya Qur'ani", + "title": "Juz Amma" + }, + "popular-recitations": { + "description": "Usomaji wa kila siku ulioratibiwa", + "title": "Visomo Maarufu" + }, + "surah-al-kahf": { + "description": "Sikiliza Surah Alkahf kwa kurudia", + "title": "Surah Al-Kahf" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Sura hizi kutoka kwa wasomaji mbalimbali", + "title": "Yaseen, Al-Waqiah, Al-Mulk" + } + }, + "curated-stations": "Vituo Vilivyoratibiwa", + "pause-radio": "Sitisha Redio", + "play-radio": "Cheza Redio", + "radio-desc": "Sikiliza usomaji mzuri wa Qur'ani Tukufu bila kukoma kutoka kwa wasomaji mbalimbali.", + "reciter-stations": "Vituo vya usomaji", + "station": "Kituo" +} diff --git a/locales/sw/ramadan-activities.json b/locales/sw/ramadan-activities.json new file mode 100644 index 0000000000..4791603fe8 --- /dev/null +++ b/locales/sw/ramadan-activities.json @@ -0,0 +1,4 @@ +{ + "ramadan-activities": "Shughuli za Ramadhani", + "ramadan-activities-desc": "Ongeza matumizi yako ya Ramadhani kwa programu na vipengele vyetu vilivyoratibiwa ili kupata muunganisho wa kina wa Kurani. Gundua Shughuli zetu za Ramadhani kwenye Quran.com leo!" +} diff --git a/locales/sw/reading-goal.json b/locales/sw/reading-goal.json new file mode 100644 index 0000000000..b78a2e770d --- /dev/null +++ b/locales/sw/reading-goal.json @@ -0,0 +1,136 @@ +{ + "continue-reading": "Endelea Kusoma", + "continuous": { + "description": "Lengo lako litahesabu maendeleo yako kwa muda wa siku kadhaa", + "title": "Kwa muda" + }, + "create-plan": "Unda mpango", + "create-reading-goal": "Tengeneza Lengo", + "daily-progress": "Maendeleo ya Kila Siku", + "daily-progress-completed": "Imekamilika! 🎉", + "daily": { + "description": "Lengo lako litawekwa upya kila siku", + "title": "Lengo la kila siku" + }, + "day-x": "Siku {{day}}", + "days": "Siku", + "duration": "Muda (siku)", + "ending-chapter": "Sura ya kumalizia", + "ending-verse": "Aya ya kumalizia", + "examples-subtitle": "Hapa kuna orodha ya malengo ya pamoja. Unaweza pia kuunda lengo lako mwenyewe.", + "examples-title": "Chagua lengo lililoundwa kabla au unda lako mwenyewe", + "examples": { + "custom": { + "description": "Weka lengo maalum linalokufaa", + "title": "Iliyo binafsishwa" + }, + "khatm": { + "description": "Lengo maarufu la Khatm. Soma Juz 1 kwa siku", + "title": "Soma Qur'ani ndani ya siku 30" + }, + "time": { + "description": "Lengo rahisi linalofaa kwa wanaoanza", + "title": "Soma dakika 10 kwa siku" + }, + "year": { + "description": "Soma Qur'ani kwa kasi yako mwenyewe katika mwaka ujao", + "title": "Soma Qur'ani ndani ya mwaka mmoja" + } + }, + "frequency-tab": { + "description": "Ikiwa lengo lako litawekwa upya kila siku au kila idadi ya siku, Usiwe na wasi wasi, tutafuatilia maendeleo yako bila kujali idadi ya marudio utakayochagua.", + "title": "Chagua idadi ya marudio ya lengo lako" + }, + "goal-completed": "Lengo Limekamilika! 🎉 ", + "goal-done": { + "description": "Usomaji wowote wa ziada bado utarekodiwa", + "title": "Umekamilisha lengo la leo" + }, + "goal-target": { + "description": "Je, ni muda gani, kurasa ngapi, au aya ngapi ungependa kusoma ili kukamilisha lengo lako?", + "title": "Weka kusudio kwa lengo lako" + }, + "goal-type": { + "description": "Je, lengo lako linategemea wakati, kurasa, au msururu maalum (yaani, Juzu 3 za Qur'ani)?", + "title": "Chagua kigezo cha lengo lako" + }, + "goal-types": { + "pages": { + "description": "Lengo lako litategemea kurasa", + "title": "Kurasa" + }, + "range": { + "description": "Lengo lako litategemea msururu maalum ya aya (hii inaweza kuwa Surah, Juz, au hata Qur'ani nzima)", + "title": "Msururu maalum" + }, + "time": { + "description": "Lengo lako litategemea wakati", + "title": "Wakati" + } + }, + "plus-x-more-days": { + "one": "", + "other": "" + }, + "preview-schedule": { + "description": "Hivi ndivyo lengo lako litakavyoonekana. Unaweza kuibadilisha baadaye.", + "title": "Hapa kuna muhtasari wa ratiba yako" + }, + "progress": { + "complete": "Lengo la leo limekamilika 🎉", + "goal-complete": "Lengo lako lote limekamilika 🎉", + "pages-goal": "soma {{pages}} kurasa za Qur'ani", + "range-goal": "soma {{from}} hadi {{to}}", + "time-goal": "soma {{time}} ya Qur'ani" + }, + "reading-goal": "Lengo la Kusoma", + "reading-goal-description": "Je, unaona ni changamoto kudumisha uthabiti na malengo yako ya usomaji wa Kurani?

    Safari ya Ukuzaji wa Kurani ni kipengele kinachobadilika kilichoundwa ili kukusaidia kuendelea kuwa thabiti katika safari yako ya Kurani. Iwe unalenga kusoma dakika 10 kwa siku, kukamilisha Juz katika mwezi mmoja, au kumaliza Kurani nzima kwa mwaka mmoja, n.k., Quran.com sasa inaweza kukusaidia kuweka lengo maalum na kufuatilia mfululizo wako wa kusoma kila siku, huku ukirekebisha kadiri unavyoendelea. Ni bure kabisa kutumia na tunatumai itakusaidia kukaa na motisha kufikia lengo lako!", + "reading-goal-label": "Uko kwenye", + "reading-goal-title": "Kuanzisha Safari ya Ukuaji wa Qur'ani", + "recommended": "Imependekezwa", + "remaining": "Iliyobakia leo", + "remaining-base": "Iliyosalia", + "remaining-days": { + "one": "", + "other": "" + }, + "set-a-new-goal": "Weka Lengo jipya", + "set-reading-goal-success": "Lengo lako la kusoma limetengenezwa kwa mafanikio.", + "start-journey": "Anza safari yako!", + "start-reading": "Anza Kusoma", + "starting-chapter": "Sura ya kuanzia", + "starting-verse": "Aya ya kuanzia", + "streak": "Streak", + "streak-definition": "Streak ni idadi ya siku ulizosoma Qur'ani kwa mfululizo bila kukosa.", + "timeline-meaning": "Je, kalenda yako ya matukio inamaanisha nini?", + "timeline-states": { + "checked": "Umekamilisha lengo lako", + "filled": "Umesoma kiwango fulani lakini haitoshi kukamilisha lengo lako", + "none": "Bado hujasoma chochote siku hiyo", + "stroked": "Hujasoma chochote leo" + }, + "todays-goal": "Lengo la Leo", + "view-progress": "Tazama Maendeleo", + "week-progress": "Maendeleo ya wiki hii", + "x-days": { + "one": "", + "other": "" + }, + "x-days-streak": "Streak ya siku {{days}}", + "x-hours": { + "one": "", + "other": "" + }, + "x-minutes": { + "one": "", + "other": "" + }, + "x-pages": { + "one": "", + "other": "" + }, + "x-seconds": { + "one": "", + "other": "" + } +} diff --git a/locales/sw/reading-progress.json b/locales/sw/reading-progress.json new file mode 100644 index 0000000000..cda3234448 --- /dev/null +++ b/locales/sw/reading-progress.json @@ -0,0 +1,31 @@ +{ + "add": "Ongeza", + "add-data-success": "Data yako ya kusoma imeongezwa.", + "delete-goal": { + "action": "Futa Lengo", + "confirmation": { + "action-text": "Ninaelewa matokeo, futa lengo langu", + "confirmation-text": "Futa lengo langu", + "instruction-text": "Tafadhali andika {{text}} ili kuthibitisha", + "subtitle": "Kitendo hiki hakiwezi kutenduliwa. Hili litafuta lengo lako kabisa, na tutaacha kufuatilia maendeleo yako.", + "title": "Je, una uhakika?" + }, + "success": "Lengo lako la kusoma limefutwa." + }, + "edit-goal": { + "action": "Hariri Lengo", + "subtitle": "Tutahesabu upya maendeleo yako kulingana na lengo jipya.", + "success": "Lengo lako la kusoma limesasishwa kwa mafanikio.", + "title": "Hariri lengo lako la kusoma" + }, + "history": "Historia ya Kusoma", + "history-for": "Historia ya kusoma ya {{date}}", + "manage-goal": "Dhibiti lengo lako la kusoma", + "manually-add": "Ongeza masomo wewe mwenyewe", + "no-reading-history-for": "Hakuna historia ya kusoma ya {{date}}", + "reading-progress-header": "Maendeleo Yako", + "reading-progress-streak": "Streak", + "reading-time": "Wakati wa kusoma", + "seconds-read-tooltip": "Huu ndio wakati ambao umetumia kusoma Aya ulizoingiza. Tunaijaza kiotomatiki kwa kasi ya wastani ya kusoma kwenye Quran.com, lakini unaweza kuibatilisha kwa muda wako halisi wa kusoma.", + "you-read": "Ulisoma:" +} diff --git a/locales/sw/reciter.json b/locales/sw/reciter.json new file mode 100644 index 0000000000..06a01ad54a --- /dev/null +++ b/locales/sw/reciter.json @@ -0,0 +1,8 @@ +{ + "copy-link": "Nakili Kiungo", + "quran-reciters": "Wasomaji wa Qur'ani", + "read": "Soma", + "reciter-desc": "Sikiliza au pakua usomaji mzuri wa Qur'ani Tukufu kutoka kwa {{reciterName}}.", + "reciters-desc": "Sikiliza au pakua usomaji mzuri wa Qu'rani Tukufu kutoka kwa wasomaji mbalimbali.", + "search-chapter": "Tafuta Sura" +} diff --git a/locales/sw/search.json b/locales/sw/search.json new file mode 100644 index 0000000000..32d4813402 --- /dev/null +++ b/locales/sw/search.json @@ -0,0 +1,12 @@ +{ + "default-translations": "Tarjuma Chaguomsingi", + "filter": "Chuja", + "language-filter-label": "Tafuta tarjuma zote za lugha", + "language-select": "Chagua lugha", + "reset": "weka upya", + "search": "Tafuta", + "search-desc": "Tafuta ndani ya mkusanyo wa Qur'ani Tukufu na tarjuma zake kwa kutumia injini ya utafutaji yenye nguvu na usahihi wa juu kupitia lugha mbalimbali.", + "search-title": "Tafuta ' {{searchQuery}} '", + "searching-translations": "Inatafuta tarjuma", + "translation-select": "Chagua tarjuma" +} diff --git a/locales/sw/support.json b/locales/sw/support.json new file mode 100644 index 0000000000..0ff347db9b --- /dev/null +++ b/locales/sw/support.json @@ -0,0 +1,25 @@ +{ + "bug-a": "Tafadhali ripoti hitilafu hii <0>hapa na tutairekebisha kwa haraka iwezekanavyo inshAllah.", + "bug-q": "Nimepata hitilafu ya tarjuma, ninaiwasilisha wapi?", + "developer-a": "Tafadhali angalia <0>ukurasa wa wasanidi kwa maelezo zaidi.", + "developer-q": "Mimi ni msanidi programu. Ninawezaje kuchangia?", + "donate-a": "Kwanza, tunashukuru sana nia yako ya kuchangia. Tafadhali tembelea kiungo <0>hiki", + "donate-q": "Ninawezaje kuchangia?", + "download-a": "Kwa bahati mbaya, hapana. Hatutoi utendaji wa kupakua tovuti yetu au Qur'ani kwenye kompyuta yako kwa sasa. Hata hivyo, unaweza kusakinisha programu yetu ya simu kwa usomaji wa nje ya mtandao.", + "download-q": "Je, ninaweza kupakua Quran.com kwenye kompyuta yangu?", + "header": "Msaada na Maoni", + "main-desc": "Tafadhali angalia FAQ ili kuona kama swali lako tayari limejibiwa. Ikihitajika unaweza <0>kuwasiliana nasi na tutafanya tuwezavyo ili kuwasiliana nawe haraka iwezekanavyo, lakini tuwie radhi kwani sisi ni timu ndogo na kwa hivyo tunakuomba utufahamu.", + "mobile-a": "Ndiyo! Tafadhali tembelea <0>Quran kwa Android au <1>Quran iOS ili kupakua Programu", + "mobile-q": "Je, Quran.com ina programu ya simu?", + "other-languages-a": "Ili kubadilisha lugha unayopendelea, kuna menyu kunjuzi kwenye kona ya juu kulia kwenye kila ukurasa (kona ya juu kushoto kwenye lugha za kuandikwa kutoka kulia kwenda kushoto). Tumia menyu kunjuzi hii kuchagua lugha unayopendelea.", + "other-languages-q": "Je, ninaweza kuvinjari tovuti katika lugha nyingine?", + "reciters-a": "Wasilisha maelezo zaidi kuhusu msomaji huyu <0>hapa", + "reciters-q": "Kuongeza wasomaji zaidi", + "site-down-a": "Hiyo si nzuri! Ikiwa tovuti haifanyi kazi kabisa au labda unaona skrini nyeupe yenye maandishi 'Samahani, hitilafu imetokea', tutashukuru ikiwa unaweza kuripoti <0>hapa .", + "site-down-q": "Tovuti haifanyi kazi, nitakuambiaje?", + "support": "Msaada", + "tafsir-a": "Ndiyo, tunazo baadhi ya Tafsir. Bofya kwenye ikoni iliyoonyeshwa kando ya kila aya, kisha ubofye tafisr. Programu itakuonyesha orodha ya tafsir zinazopatikana. Bonyeza tafsir unayotaka kusoma.", + "tafsir-q": "Je, Tafsir inapatikana?", + "translations-a": "Fungua toleo jipya <0>hapa lenye maelezo yote, kiungo cha tarjuma na tutajaribu tuwezavyo kuliongeza.", + "translations-q": "Ongeza tarjuma nyingine" +} diff --git a/locales/sw/surah-info.json b/locales/sw/surah-info.json new file mode 100644 index 0000000000..76aeb50023 --- /dev/null +++ b/locales/sw/surah-info.json @@ -0,0 +1,6 @@ +{ + "go-to-surah": "Nenda kwenye Sura", + "madinah": "Madina", + "makkah": "Makka", + "revelation-place": "Mahali iliteremshwa" +} diff --git a/locales/th/about.json b/locales/th/about.json index d44687d72f..3d75613ee7 100644 --- a/locales/th/about.json +++ b/locales/th/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "โครงการนี้จะเกิดขึ้นไม่ได้หากไม่มีไลบรารีโอเพนซอร์สและโครงการต่างๆ ที่เราใช้:", - "lokalize": "<0> Lokalize <\/0> : ระบบการแปลโดยใช้คอมพิวเตอร์ช่วยซึ่งเน้นที่ประสิทธิภาพการทำงานและการประกันคุณภาพ และให้ขั้นตอนการทำงานโลคัลไลเซชันที่ราบรื่น", - "quran-align": "<0> Collin Fair <\/0> : เครื่องมือสำหรับสร้างการแบ่งส่วนคำที่แม่นยำของการอ่านอัลกุรอานที่บันทึกไว้", - "quran-complex": "<0> QuranComplex <\/0> : King Fahd Glorious Qur'an Printing Complex เป็นผู้นำในการให้บริการคัมภีร์กุรอ่านอันรุ่งโรจน์และวิทยาศาสตร์ แปลความหมายและปกป้องข้อความอัลกุรอานจากการบิดเบือนผ่านการใช้อย่างเหมาะสม เทคโนโลยีขั้นสูงในด้านการพิมพ์ การบันทึกเสียง การเผยแพร่ทางอิเล็กทรอนิกส์ และแอปพลิเคชันดิจิทัล", - "quran-enc": "<0> QuranEnc <\/0> : พอร์ทัลที่มีการแปลความหมายและคำอธิบายของคัมภีร์กุรอ่านอันสูงส่งฟรีและเชื่อถือได้ในภาษาต่างๆ ทั่วโลก", - "tanzil": "<0> Tanzil <\/0> : โครงการอัลกุรอานระดับนานาชาติที่มุ่งให้ข้อความอัลกุรอานที่มีความถูกต้องแม่นยำสูง", - "title": "เครดิต", - "vercel": "<0> Vercel <\/0> : เป็นแพลตฟอร์มการปรับใช้และการทำงานร่วมกันสำหรับนักพัฒนาส่วนหน้าซึ่งให้ความสำคัญกับนักพัฒนาส่วนหน้าเป็นอันดับแรก โดยมอบเครื่องมือที่ครอบคลุมเพื่อสร้างเว็บไซต์และแอปพลิเคชันประสิทธิภาพสูง", - "zekr": "<0> Zekr <\/0> : เครื่องมือการศึกษาอัลกุรอานแบบเปิดสำหรับการเรียกดูและค้นคว้าเกี่ยวกับคัมภีร์กุรอาน" - }, - "main-description": "Quran.com ก่อตั้งขึ้นในปี 1995 เว็บไซต์นี้มีจุดมุ่งหมายเพื่อให้ทุกคนอ่าน ศึกษา และเรียนรู้อัลกุรอานได้ง่าย โปรเจ็กต์นี้เป็นโอเพ่นซอร์สและสร้างขึ้นจากการทำงานร่วมกันระหว่างสมาชิกในทีมหลักและทีม <0> Tarteel team <\/0>" -} \ No newline at end of file + "credits": { + "desc": "เราขอขอบพระคุณทุกคนที่สนับสนุนและมีส่วนสนับสนุนโครงการนี้ ซึ่งช่วยให้ผู้คนหลายล้านคนทั่วโลกเข้าถึงคัมภีร์อัลกุรอานได้", + "lokalize": "<0>Lokalize: ระบบการแปลด้วยความช่วยเหลือของคอมพิวเตอร์ที่เน้นในเรื่องประสิทธิภาพการทำงานและการรับประกันคุณภาพ และมอบเวิร์กโฟลว์การแปลที่ราบรื่น", + "quran-align": "<0>Collin Fair: เครื่องมือสำหรับสร้างการแบ่งส่วนคำที่แม่นยำจากการอ่านคัมภีร์กุรอานที่บันทึกไว้", + "quran-complex": "<0>QuranComplex: King Fahd Glorious Qur'an Printing Complex เป็นผู้นำในการให้บริการอัลกุรอานอันทรงเกียรติและศาสตร์ต่างๆ แปลความหมาย และปกป้องข้อความในอัลกุรอานจากการบิดเบือน ผ่านการใช้เทคโนโลยีขั้นสูงอย่างเหมาะสมที่สุดในด้านการพิมพ์ การบันทึกเสียง การจัดพิมพ์ทางอิเล็กทรอนิกส์ และแอปพลิเคชันดิจิทัล", + "quran-enc": "<0>QuranEnc: พอร์ทัลที่มีการแปลความหมายและคำอธิบายของคัมภีร์กุรอานอันศักดิ์สิทธิ์เป็นภาษาต่างๆ ทั่วโลกฟรีและเชื่อถือได้", + "tanzil": "<0>Tanzil: โครงการคัมภีร์อัลกุรอานระดับนานาชาติที่มุ่งหวังที่จะจัดทำข้อความคัมภีร์อัลกุรอานที่มีความแม่นยำและผ่านการตรวจสอบอย่างเข้มงวด", + "tarteel": "<0>Tarteel: แอปท่องจำอัลกุรอานที่ขับเคลื่อนด้วย AI ออกแบบมาเพื่อช่วยให้คุณท่องจำได้อย่างชาญฉลาด ไม่ว่าคุณจะกำลังค้นหาบทกลอน ติดตามความคืบหน้า หรือท่องตามไปด้วย", + "title": "เครดิต", + "vercel": "<0>Vercel: คือแพลตฟอร์มการปรับใช้และการทำงานร่วมกันสำหรับนักพัฒนาฝั่งฟรอนต์เอนด์ ซึ่งให้ความสำคัญกับนักพัฒนาฝั่งฟรอนต์เอนด์เป็นอันดับแรก โดยมอบเครื่องมือที่ครอบคลุมให้กับพวกเขาเพื่อสร้างเว็บไซต์และแอปพลิเคชันที่มีประสิทธิภาพสูง", + "zekr": "<0>Zekr: เครื่องมือศึกษาคัมภีร์อัลกุรอานแบบเปิดสำหรับการค้นหาและค้นคว้าคัมภีร์อัลกุรอาน" + }, + "global-effort": { + "desc": "ผู้คนนับล้านจากทั่วโลกต่างพึ่งพา Quran.com เป็นแหล่งข้อมูลอัลกุรอานดิจิทัลหลัก ไม่ว่าพวกเขาจะมาอ่าน ไตร่ตรอง ท่องจำ หรือศึกษา พวกเขาก็มีเป้าหมายร่วมกัน นั่นคือ ความปรารถนาอย่างจริงใจที่จะเชื่อมโยงกับพระวจนะของอัลลอฮ์ \\n ในขณะที่เราเติบโตต่อไป เรายังคงมุ่งมั่นที่จะทำให้ Quran.com ยังคงเป็นพื้นที่ที่เชื่อถือได้ เข้าถึงได้ และได้รับการออกแบบอย่างสวยงามสำหรับทุกคนที่ต้องการมีส่วนร่วมกับอัลกุรอาน", + "title": "ความพยายามระดับโลก" + }, + "key-features": { + "desc": "Quran.com ออกแบบมาเพื่อรองรับทุกขั้นตอนของการใช้คัมภีร์อัลกุรอาน ตั้งแต่การอ่านและการท่องจำ ไปจนถึงการศึกษาและการไตร่ตรอง คุณลักษณะของเรามีดังนี้:", + "features": [ + "อินเทอร์เฟซอัลกุรอานที่เป็นมิตรกับผู้ใช้ - ประสบการณ์การอ่านที่สะอาดและใช้งานง่ายบนทุกอุปกรณ์", + "การแปลหลายแบบและ Tafsir – เข้าถึงการแปลในหลายภาษาพร้อมกับ Tafsir", + "บทสวดเสียง – ฟังบทสวดคุณภาพสูงจาก Qaris ที่มีชื่อเสียงระดับโลก พร้อมความสามารถในการติดตามทีละคำ", + "การค้นหาและการนำทางขั้นสูง – ค้นหาบทต่างๆ ทันทีตามหัวข้อหรือคำสำคัญทั่วทั้งคัมภีร์อัลกุรอาน", + "การสร้างบุ๊กมาร์กและบันทึกอายะห์ – บันทึกบทกวีและเขียนข้อคิดเห็นส่วนตัวเพื่อใช้เป็นข้อมูลอ้างอิงในภายหลัง", + "การบูรณาการ QuranReflect – มีส่วนร่วมกับชุมชนโลกผ่านการสะท้อนและข้อมูลเชิงลึกที่แบ่งปันโดยนักวิชาการและบุคคลต่างๆ", + "การติดตามความคืบหน้าในการอ่านและเป้าหมาย – ติดตามเป้าหมายรายวันและประวัติการอ่านของคุณ", + "API สำหรับนักพัฒนา – เข้าถึงเนื้อหาและฟีเจอร์ต่างๆ เพื่อขับเคลื่อนแอพอิสลามและการวิจัยและพัฒนาได้ฟรี", + "และอีกมากมาย อัลฮัมดุลิลลาห์" + ], + "title": "คุณสมบัติหลักและข้อเสนอ" + }, + "main-description": "ตั้งแต่ก่อตั้งในปี 1995 Quran.com มุ่งมั่นที่จะทำให้ทุกคนสามารถเข้าถึงอัลกุรอานได้ด้วยวิธีที่ชัดเจน น่าเชื่อถือ และเข้าถึงได้ง่าย ทุกวัน ผู้คนนับล้านทั่วโลกเข้ามาที่ Quran.com เพื่ออ่าน ฟัง ศึกษา และไตร่ตรองเกี่ยวกับอัลกุรอาน ไม่ว่าพวกเขาจะเป็นนักเรียนตลอดชีวิต นักปราชญ์ หรือเพิ่งเริ่มต้นการเดินทาง", + "our-mission": { + "desc": "อัลกุรอานมีไว้เพื่อให้คนอ่าน ทำความเข้าใจ และใคร่ครวญ พันธกิจของเราคือการขจัดอุปสรรคในการเข้าถึงและส่งเสริมพลังให้กับบุคคลและชุมชนโดยมอบประสบการณ์การอ่านอัลกุรอานที่เชื่อถือได้ ได้รับการออกแบบมาอย่างดี และเสริมสร้างความรู้ให้ลึกซึ้ง เราตั้งเป้าที่จะเป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับทุกคนที่ต้องการอ่านอัลกุรอาน โดยยึดหลักความถูกต้อง ชัดเจน และความจริงใจ", + "title": "ภารกิจของเรา" + }, + "who-we-are": { + "desc": "Quran.com เป็นมูลนิธิที่จัดตั้งขึ้นเป็นกองทุนสาธารณะเพื่อให้แน่ใจว่าทุกคนสามารถเข้าถึงอัลกุรอานได้ฟรีและไม่มีผลประโยชน์ทางการค้า มูลนิธินี้บริหารจัดการโดย Quran.Foundation ซึ่งเป็นองค์กรไม่แสวงหากำไร 501(c)(3) ที่ให้การสนับสนุนและพัฒนา Quran.com เป็นส่วนหนึ่งของพันธกิจในการจัดหาแหล่งข้อมูลอัลกุรอานที่มีคุณภาพสูงและถูกต้องให้กับโลก เรามุ่งมั่นที่จะให้บริการอัลกุรอานและผู้อ่านด้วยความเป็นเลิศ จริงใจ และมีความรับผิดชอบ", + "title": "พวกเราเป็นใคร" + } +} diff --git a/locales/th/apps.json b/locales/th/apps.json index e92e267269..f41628c61e 100644 --- a/locales/th/apps.json +++ b/locales/th/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "โดยนักพัฒนาหลักของ Quran.com แอป iOS และ Android ที่สวยงามและไม่มีโฆษณา ตอนนี้การอ่านอัลกุรอาน ท่องจำ ทำได้ทุกที่ และฟังผู้อ่านคนโปรดของคุณได้ง่ายขึ้น", - "tarteel-desc": "Tarteel เป็นแอปอัลกุรอานแรกที่ใช้เครื่องมือ AI เพื่อโต้ตอบกับการท่องจำและเน้นข้อผิดพลาด สหายอัลกุรอานที่นำด้วยเสียงในฝ่ามือของคุณ Tarteel ทำงานอย่างสังหรณ์ใจเพื่อช่วยให้คุณอ่าน ท่องจำ และเข้าใจอัลกุรอานด้วยความมั่นใจ! <0><\/0><0><\/0> Tarteel ภูมิใจที่ได้เป็นผู้พัฒนาหลักของ Quran.com เช่นเดียวกับสมาชิกคณะกรรมการกำกับดูแลของพวกเขา" -} \ No newline at end of file + "quran-desc": "โดยนักพัฒนาหลักของ Quran.com แอป iOS และ Android ที่สวยงามและไม่มีโฆษณา ตอนนี้การอ่านอัลกุรอาน ท่องจำ ทำได้ทุกที่ และฟังผู้อ่านคนโปรดของคุณได้ง่ายขึ้น" +} diff --git a/locales/th/common.json b/locales/th/common.json index 3d02acb5ea..227bc22207 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "นำทาง", "no-nav-results": "ไม่มีผลลัพธ์การนำทาง", - "placeholder": "คุณอยากอ่านอะไร?", - "powered-by": "การค้นหาด้วยเสียง ขับเคลื่อนโดย Tarteel.ai", + "placeholder": "ค้นหาอัลกุรอาน...", "recent-navigations": "การนำทางล่าสุด", "search-by-voice": "ค้นหาด้วยเสียง", "try-navigating": "ลองไปที่" @@ -122,9 +121,11 @@ } }, "continue": "ดำเนินการต่อ", + "contribute-to-our-mission": "ร่วมสนับสนุนภารกิจของเรา", "copied": "คัดลอกแล้ว", "copied-to-clipboard": "คัดลอกไปยังคลิปบอร์ดแล้ว", "copy": "คัดลอก", + "copylink": "คัดลอกลิงค์", "counter": { "decrease": "ลด", "increase": "เพิ่ม" @@ -134,6 +135,7 @@ "developers": "นักพัฒนา", "display": "การแสดงผล", "donate": "บริจาค", + "donate-now": "บริจาคตอนนี้", "donate_monthly": "บริจาครายเดือน", "donate_once": "บริจาคครั้งเดียว", "edit": "แก้ไข", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*สูงสุด {{maxNumberOfVerses}} อายาห์", "ranges-wrong-order": "บทเริ่มต้นต้องอยู่ก่อนบทจบ" }, + "errors": { + "account-banned": "ขออภัย บัญชีของคุณถูกระงับ ติดต่อมูลนิธิอัลกุรอาน", + "badRequest": "*คำขอไม่ถูกต้อง", + "banned": "*ขออภัย บัญชีของคุณถูกระงับ โปรดติดต่อมูลนิธิ Quran", + "confirm": "*ยืนยันรหัสผ่านไม่ตรงกับรหัสผ่าน", + "email": "*รูปแบบอีเมล์ไม่ถูกต้อง!", + "exactLength": "*ค่าต้องมีความยาวที่แน่นอน", + "expiredToken": "*โทเค็นนี้หมดอายุแล้ว", + "forgot-password-failed": "ไม่สามารถส่งอีเมลรีเซ็ตรหัสผ่านได้ โปรดลองอีกครั้ง", + "immutable": "*ค่านี้ไม่สามารถเปลี่ยนแปลงได้", + "invalid": "* {{fieldName}} นี้ไม่ถูกต้อง", + "invalidEmailOrPassword": "*อีเมลหรือรหัสผ่านไม่ถูกต้อง", + "max": "* {{fieldName}} ต้องน้อยกว่าหรือเท่ากับ {{max}} หลัก", + "min": "* {{fieldName}} จะต้องมากกว่าหรือเท่ากับ {{min}} หลัก", + "name": "* {{fieldName}} ควรเป็นตัวอักษรและตัวเลขเท่านั้น", + "notFound": "*ไม่พบ", + "required": "* {{fieldName}} หายไป!", + "reset-password-failed": "ไม่สามารถรีเซ็ตรหัสผ่านได้ กรุณาลองอีกครั้ง", + "signin-failed": "การลงชื่อเข้าใช้ล้มเหลว กรุณาลองอีกครั้ง", + "signup-failed": "การลงทะเบียนล้มเหลว กรุณาลองอีกครั้ง", + "taken": "* {{fieldName}} มีอยู่แล้ว!", + "usedToken": "*โทเค็นนี้ถูกใช้ไปแล้ว", + "username": "* {{fieldName}} ยอมรับเฉพาะเครื่องหมายขีดล่างและตัวอักษรเท่านั้น", + "verification-code-invalid": "รหัสตรวจสอบนี้ไม่ถูกต้อง", + "verification-code-length": "รหัสตรวจสอบจะต้องมี {{length}} หลัก", + "verification-failed": "การตรวจสอบล้มเหลว กรุณาลองอีกครั้ง", + "verification-resend-failed": "ไม่สามารถส่งรหัสยืนยันอีกครั้งได้" + }, "exciting-updates": "การอัปเดตที่น่าตื่นเต้น", "feedback": "แนะนำติชม", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "ขนาดตัวอักษรแปล" }, "footer": { - "description": "Quran.com เป็นเศาะดะเกาะห์ญาริยะห์ ที่เราหวังว่าจะทำให้ทุกคนได้อ่าน ศึกษา และเรียนรู้คัมภีร์อัลกุรอานอย่างง่ายดาย คัมภีร์อัลกุรอานมีหลายชื่อ เช่น อัลกุรอาน อัลการีม (อัลกุรอาน อันทรงเกียรติ), อัลกีตาบ (คัมภีร์), อัลฟุรกอน (สิ่งจำแนก), อัลเมาอิศอ(ข้อตักเตือน) , อัศศิกรฺ (ข้อเตือนสติให้รำลึกถึง) และ อันนูร (แสงสว่าง)", + "description": "Quran.com เป็นแพลตฟอร์มที่เชื่อถือได้ซึ่งผู้คนนับล้านทั่วโลกใช้เพื่ออ่าน ค้นหา ฟัง และไตร่ตรองคัมภีร์อัลกุรอานในหลายภาษา มีการแปล ตัฟซีร การท่องจำ การแปลคำต่อคำ และเครื่องมือสำหรับการศึกษาที่ลึกซึ้งยิ่งขึ้น ทำให้ทุกคนสามารถเข้าถึงคัมภีร์อัลกุรอานได้

    ในฐานะของ Sadaqah Jariyah Quran.com มุ่งมั่นที่จะช่วยให้ผู้คนเชื่อมโยงกับคัมภีร์อัลกุรอานได้อย่างลึกซึ้ง Quran.com ได้รับการสนับสนุนจาก Quran.Foundation ซึ่งเป็นองค์กรไม่แสวงหากำไร 501(c)(3) และยังคงเติบโตต่อไปในฐานะแหล่งข้อมูลที่มีค่าและไม่มีค่าใช้จ่ายสำหรับทุกคน อัลฮัมดุลิลลาห์”", "hiring": "เรากำลังจ้าง! เข้าร่วมทีม QuranFoundation และมีส่วนร่วมในภารกิจของเรา สมัครเลย! ", "rights": "สงวนลิขสิทธิ์", - "title": "อ่านศึกษาและเรียนรู้คัมภีร์อัลกุรอาน" + "title": "อ่าน ฟัง ค้นหา และไตร่ตรองคัมภีร์อัลกุรอาน" }, "form": { "body": "ร่างกาย", "code": "รหัสยืนยัน", + "confirm-password": "ยืนยันรหัสผ่าน", "email": "อีเมล", "firstName": "ชื่อจริง", "lastName": "นามสกุล", - "title": "ชื่อ" + "password": "รหัสผ่าน", + "title": "ชื่อ", + "username": "ชื่อผู้ใช้", + "verification-code": "รหัสตรวจสอบ" }, "from": "จาก", + "fundraising-share-title": "แบ่งปันการระดมทุนผ่าน Quran.com", "fundraising-sticky-banner": { "cta": "บริจาค", "title": "ให้ในช่วงวันที่ดีที่สุด!" @@ -217,6 +252,7 @@ "learn-more": "เรียนรู้เพิ่มเติม", "learning-plans": "แผนการเรียนรู้", "less": "น้อยลง", + "lessons": "บทเรียน", "loading": "กำลังโหลด", "login": "เข้าสู่ระบบ", "logout": "ออกจากระบบ", @@ -250,6 +286,7 @@ "off": "ปิด", "oldest": "เก่าแก่ที่สุด", "on": "เปิด", + "our-projects": "โครงการของเรา", "page": "หน้า", "pages": "หน้า", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} จาก {{totalNumberOfResults}} ผลการค้นหา", @@ -272,6 +309,7 @@ "privacy": "ความเป็นส่วนตัว", "product-updates": "อัพเดทผลิตภัณฑ์", "profile": "โปรไฟล์", + "projects-desc": "โครงการไม่แสวงหากำไรที่เป็นเจ้าของ บริหารจัดการ หรือได้รับการสนับสนุนโดย Quran.Foundation", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "วิทยุอัลกุรอาน", @@ -287,6 +325,7 @@ "reciters": "ผู้อ่าน", "reflect": "สะท้อน", "reflections": "ภาพสะท้อน", + "reflections-and-lessons": "ข้อคิดและบทเรียน", "remove": "ลบ", "rename": "เปลี่ยนชื่อ", "retry": "ลองอีกครั้ง", @@ -296,10 +335,12 @@ "save-to-collection": "บันทึกลงในคอลเล็กชัน", "search-for": "ค้นหา '{{searchQuery}}'", "search-results": "{{count}} ผลการค้นหา", + "search-results-no-count": "ผลการค้นหา", "search": { "filters": "ตัวกรอง", "hint": "ลองค้นหา", "jump-to": "ข้ามไปที่", + "more-results": "ผลลัพธ์เพิ่มเติม", "no-results": "ไม่พบผลลัพธ์", "no-results-suggestion": "เราไม่พบผลการค้นหาที่ตรงกันสำหรับ \" {{searchQuery}} \" ลองค้นหาด้วยคีย์เวิร์ดอื่น", "popular": "คำค้นหายอดนิยม", @@ -340,8 +381,10 @@ "search-juz": "ค้นหา ญุซ", "search-page": "ค้นหาหน้า", "search-surah": "ค้นหา ซูเราะห์", + "search-verse": "ค้นหาบทกวี", "try-navigating-with": "เคล็ดลับ: ลองนำทางด้วย" }, + "sign-in": "ลงชื่อเข้าใช้", "sitemap": "แผนผังเว็บไซต์", "sort": { "ascending": "จากน้อยไปมาก", @@ -362,10 +405,6 @@ "tafsirs-desc": "อ่านตัฟซีรต่างๆของโองกาารที่ {{ayahNumber}} ของซูเราะห์ {{surahName}} โดยนักวิชาการด้านตัฟซีร ที่เชื่อถือได้", "title": "ตัฟซีร" }, - "tarteel": { - "app": "แอพ Tarteel", - "name": "Tarteel.ai" - }, "terms-and-conditions": "ข้อกำหนดและเงื่อนไข", "theme": "ธีม", "themes": { @@ -400,13 +439,13 @@ "view": "ดู", "voice": { "ask-permission": "โปรดอนุญาตเปิดใช้งานไมโครโฟนเพื่อเริ่มใช้การค้นหาด้วยเสียง", - "error": "ตอนนี้ขัดข้องอยู่กรุณาลองใหม่ภายหลัง. หรือดาวน์โหลด", - "no-permission": "ดูเหมือนว่าคุณไม่ได้เปิดใช้งานการอนุญาตสำหรับไมโครโฟน โปรดเปิดใช้งานการอนุญาตไมโครโฟนแล้วลองอีกครั้งหรือดาวน์โหลด", - "not-supported": "ดูเหมือนว่าเบราว์เซอร์ของคุณไม่รองรับไมโครโฟน โปรดลองใช้เบราว์เซอร์อื่นหรือดาวน์โหลด", + "error": "เกิดข้อผิดพลาดกรุณาลองอีกครั้งในภายหลัง", + "no-permission": "ดูเหมือนว่าคุณไม่ได้เปิดใช้งานสิทธิ์การเข้าถึงไมโครโฟน โปรดเปิดใช้งานสิทธิ์การเข้าถึงไมโครโฟนแล้วลองอีกครั้ง", + "not-supported": "ดูเหมือนว่าเบราว์เซอร์ของคุณไม่รองรับไมโครโฟน โปรดลองใช้เบราว์เซอร์อื่น", "suggest": "โปรดเริ่มการอ่านและอายะห์ของคุณจะแสดงขึ้นมา", "suggest-subtitle": "อ่านอายะห์ใด ๆ ในภาษาอาหรับและตัวอายะห์จะปรากฏขึ้น", "suggest-title": "อ่านตอนนี้", - "voice-search-powered-by": "ค้นหาด้วยเสียงขับเคลื่อนโดย" + "voice-search-powered-by": "การค้นหาด้วยเสียงขับเคลื่อนโดย" }, "wbw": "คำต่อคำ", "wbw-lang-summary": "แหล่งที่มาของการแปลคำต่อคำ: {{source}} แหล่งข้อมูลนี้เป็นอิสระจากการแปลแบบรายอายะห์", diff --git a/locales/th/developers.json b/locales/th/developers.json index 3df78cfb6f..2c99aca58f 100644 --- a/locales/th/developers.json +++ b/locales/th/developers.json @@ -1,20 +1,19 @@ { - "footer": "- ทีมงาน Quran.com", - "header": "ความช่วยเหลือด้านการพัฒนา", - "issues-cta": "หากคุณมีคำถามหรือต้องการติดต่อผู้ดูแล เพียงแค่เขียนปัญหา! เราจะติดต่อกลับโดยเร็วที่สุด อินชาอัลลอฮ์", - "issues-guide": "โดยปกติเราใช้ <0> Github <\/0> เป็นแหล่งที่มาสำหรับสิ่งที่ต้องดำเนินการต่อไป สิ่งที่จะเกิดขึ้น และข้อบกพร่องใดบ้างที่ต้องแก้ไข ตัวอย่างเช่น <1> URL นี้ <\/1> มีรายการจุดบกพร่อง สิ่งที่เราต้องการความช่วยเหลือ และคุณลักษณะที่จะเกิดขึ้น", - "main-desc": "ก่อนอื่น ขอบคุณมากสำหรับความสนใจที่จะช่วยเราพัฒนา Quran.com และโครงการต่างๆ เรารู้สึกตื่นเต้นที่จะได้ร่วมงานกับคุณ!", - "projects": { - "all": "เรามีโปรเจ็กต์มากมายที่โฮสต์บน Github คุณสามารถค้นหาทั้งหมด <0> ที่นี่ <\/0> และเราขอสรุปไว้ดังรายการนี้:", - "q-android": "<0> Android Android <\/0> - เขียนด้วย Kotlin และ Java", - "q-api": "<0> Quran.com API <\/0> - เขียนด้วย Ruby on Rails", - "q-api-docs": "<0> Quran.com API Docs <\/0> - พอร์ทัลเอกสาร API ของเรา", - "q-audio": "<0> Quranic Audio <\/0> และ <1> Quranic Audio mobile apps <\/1>", - "q-audio-segments": "<0> เครื่องมือแยกเสียงอ่านกุรอาน <\/0>", - "q-ios": "<0> Quran iOS <\/0> เขียนด้วย Swift", - "q-next": "<0> ส่วนหน้า Quran.com <\/0> - เขียนใน Next.js", - "q-v2": "<0> Quran.com <\/0> - เขียนด้วย Ruby on Rails" - }, - "sub-main-desc": "เราคือทีมของโปรแกรมเมอร์ นักออกแบบ นักบริหารจัดการ และนักคิดที่ทำงานร่วมกับทีม <0>Tarteel<\/0> เพื่อนำเสนอประสบการณ์ใช้งานกุรอานแบบออนไลน์ที่ดีที่สุด. อัลฮัมดูลิละห์ เราได้รับความจำเริญในการทำงานให้กับทีมที่ยอดเยี่ยมจากทั่วทุกมุมโลก และเรารู้สึกว่านี่คือสิ่งที่อย่างน้อยที่สุดที่เราสามารถทำได้เพื่อช่วยให้อุมมะห์ของเราก้าวไปข้างหน้าในการเรียนรู้และศึกษาศาสนาของพวกเขา. การทำงานกับ Quran.com เป็นเรื่องน่ายินดีอย่างยิ่ง และขออัลลอฮ์ทรงตอบแทนเราทุกคน (รวมถึงคุณด้วย) สำหรับความพยายามของเรา", - "thanks": "เราหวังว่าคุณจะเข้ามาร่วมพัฒนาโค้ดกับเรา" -} \ No newline at end of file + "footer": "- ทีมงาน Quran.com", + "header": "ความช่วยเหลือด้านการพัฒนา", + "issues-cta": "หากคุณมีคำถามหรือต้องการติดต่อผู้ดูแล เพียงแค่เขียนปัญหา! เราจะติดต่อกลับโดยเร็วที่สุด อินชาอัลลอฮ์", + "issues-guide": "โดยปกติเราใช้ <0> Github เป็นแหล่งที่มาสำหรับสิ่งที่ต้องดำเนินการต่อไป สิ่งที่จะเกิดขึ้น และข้อบกพร่องใดบ้างที่ต้องแก้ไข ตัวอย่างเช่น <1> URL นี้ มีรายการจุดบกพร่อง สิ่งที่เราต้องการความช่วยเหลือ และคุณลักษณะที่จะเกิดขึ้น", + "main-desc": "ก่อนอื่น ขอบคุณมากสำหรับความสนใจที่จะช่วยเราพัฒนา Quran.com และโครงการต่างๆ เรารู้สึกตื่นเต้นที่จะได้ร่วมงานกับคุณ!", + "projects": { + "all": "เรามีโปรเจ็กต์มากมายที่โฮสต์บน Github คุณสามารถค้นหาทั้งหมด <0> ที่นี่ และเราขอสรุปไว้ดังรายการนี้:", + "q-android": "<0> Android Android - เขียนด้วย Kotlin และ Java", + "q-api": "<0> Quran.com API - เขียนด้วย Ruby on Rails", + "q-api-docs": "<0> Quran.com API Docs - พอร์ทัลเอกสาร API ของเรา", + "q-audio": "<0> Quranic Audio และ <1> Quranic Audio mobile apps ", + "q-audio-segments": "<0> เครื่องมือแยกเสียงอ่านกุรอาน ", + "q-ios": "<0> Quran iOS เขียนด้วย Swift", + "q-next": "<0> ส่วนหน้า Quran.com - เขียนใน Next.js", + "q-v2": "<0> Quran.com - เขียนด้วย Ruby on Rails" + }, + "thanks": "เราหวังว่าคุณจะเข้ามาร่วมพัฒนาโค้ดกับเรา" +} diff --git a/locales/th/home.json b/locales/th/home.json index 2a05566479..481676d55c 100644 --- a/locales/th/home.json +++ b/locales/th/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "บรรลุเป้าหมายการอ่านอัลกุรอานของคุณ", + "begin": "เริ่ม", + "chapters-and-verses": "บทและข้อพระคัมภีร์", + "continue-read": "อ่านต่อ", + "explore-topics": "สำรวจหัวข้อ", + "first-time-reading": "ใหม่สำหรับอัลกุรอาน? เริ่มต้นที่นี่ ", + "know-someone": "เติบโตไปพร้อมกับเรา รอมฎอน นี้", + "learning-plan": "แผนการเรียนรู้", + "listen-to-radio": "ฟังวิทยุอัลกุรอาน", + "my-quran": "อัลกุรอานของฉัน", + "navigate-quran": "นำทางอัลกุรอาน", "no-bookmarks": "คุณยังไม่มีบุ๊คมาร์กใดๆ", "no-recently-read": "คุณยังไม่มีเซสชันการอ่านใดๆ", "noble-quran": "คัมภีร์กุรอานอันสูงส่ง", + "popular": "เป็นที่นิยม", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "การเดินทางการเติบโตของอัลกุรอาน" }, - "ramadan-activities-cta": " ติดตาม ปฏิทินอัลกุรอานโลก <\/b> เพื่ออ่านเนื้อหารายสัปดาห์ พอดแคสต์ที่สร้างแรงบันดาลใจ และเชิญชวนให้ไตร่ตรอง! <\/link>", + "qr-community": "อ่านบทกวีและข้อคิดประจำวันนี้", + "ramadan-activities-cta": " ติดตาม ปฏิทินอัลกุรอานโลก เพื่ออ่านเนื้อหารายสัปดาห์ พอดแคสต์ที่สร้างแรงบันดาลใจ และเชิญชวนให้ไตร่ตรอง! ", + "ramadan": { + "header": "เครื่องมือที่จะทำให้คุณเชื่อมโยงกับอัลกุรอานได้ลึกซึ้งยิ่งขึ้น", + "title": "พร้อมสำหรับรอมฎอนหรือยัง?" + }, "read-juz": "อ่านญุซนี้", "recently-read": "รายการที่อ่านล่าสุด", - "revelation-order-disclaimer": "มุมมองนี้แสดงตามลำดับการประทานของซูเราะห์ต่าง ๆ ในคัมภีร์กุรอาน ตามเวลาที่ถูกประทานแก่ท่านศาสดามูฮัมหมัด ﷺ <\/hover> ลำดับเหตุการณ์อ้างอิงจากข้อมูลทางวิชาการ และบางซูเราะห์มีการประทานในหลายช่วงเวลาซึ่งแตกต่างกัน การเรียงลำดับนี้เป็นไปตามผลลัพธ์จาก Tanzil.net <\/link> [หมายเหตุ: การเรียงลำดับของซูเราะห์ต่าง ๆ ของมุศฮัฟ จาก อัล-ฟาตะฮะห์ ไปจนถึง อัน-นาซ เป็นเรื่องที่เห็นพ้องต้องกัน]", + "revelation-order-disclaimer": "มุมมองนี้แสดงตามลำดับการประทานของซูเราะห์ต่าง ๆ ในคัมภีร์กุรอาน ตามเวลาที่ถูกประทานแก่ท่านศาสดามูฮัมหมัด ลำดับเหตุการณ์อ้างอิงจากข้อมูลทางวิชาการ และบางซูเราะห์มีการประทานในหลายช่วงเวลาซึ่งแตกต่างกัน การเรียงลำดับนี้เป็นไปตามผลลัพธ์จาก Tanzil.net [หมายเหตุ: การเรียงลำดับของซูเราะห์ต่าง ๆ ของมุศฮัฟ จาก อัล-ฟาตะฮะห์ ไปจนถึง อัน-นาซ เป็นเรื่องที่เห็นพ้องต้องกัน]", + "see-more-learning-plans": "ดูเพิ่มเติม", + "set-custom-goal": "ตั้งเป้าหมาย", + "share-quran": { + "description": "ช่วยเผยแพร่อัลกุรอานให้กับผู้เรียนใหม่", + "title": "แบ่งปันอัลกุรอาน!" + }, + "start-read": "เริ่มอ่าน", + "stay-consistent": "ติดตามสตรีค สร้างเป้าหมายที่กำหนดเอง รักษาความสม่ำเสมอ", "tab": { "bookmarks": "บุ๊คมาร์ก", "popular": "เป็นที่นิยม" diff --git a/locales/th/learn.json b/locales/th/learn.json index 8e38aede4f..4767db3215 100644 --- a/locales/th/learn.json +++ b/locales/th/learn.json @@ -24,7 +24,9 @@ "feedback-success": "ขอบคุณสำหรับความคิดเห็นของคุณ!", "your-feedback": "ข้อเสนอแนะของคุณ" }, + "help-about-reflection": "ช่วยเหลือเกี่ยวกับคุณสมบัติการสะท้อน", "learn-duration": "ระยะเวลา", + "learn-more": "เรียนรู้เพิ่มเติม", "learning-plan-material": "สื่อการวางแผนการเรียนรู้", "learning-plan-meta-desc": "แผนการเรียนรู้นี้จะช่วยเปลี่ยนวิธีที่คุณมีส่วนร่วมกับอัลกุรอาน เริ่มต้นการเดินทางของคุณวันนี้!", "learning-plans-desc": "เพิ่มพูนความรู้ของคุณด้วยบทเรียนที่ปฏิบัติตามง่ายซึ่งจะทำให้คุณเติบโตในการเดินทางด้วยอัลกุรอาน

    เริ่มแผนการเรียนรู้วันนี้! ความคืบหน้าของคุณจะถูกติดตามจนกว่าคุณจะถึงเส้นชัย", @@ -34,9 +36,12 @@ "next-lesson": "บทเรียนถัดไป", "not-enrolled": "คุณยังไม่ได้ลงทะเบียนใน แผนการเรียนรู้ ", "prev-lesson": "บทเรียนก่อนหน้า", + "reflection-description-1": "การคลิก \"เพิ่มข้อคิดเห็น\" จะนำคุณไปที่ QuranReflect ซึ่งเป็นแพลตฟอร์มสำหรับแบ่งปันข้อคิดเห็นส่วนตัวเกี่ยวกับอัลกุรอาน ข้อคิดเห็นเป็นข้อมูลเชิงลึกและประสบการณ์ส่วนตัวที่เกี่ยวข้องกับโองการต่างๆ ซึ่งต่างจาก Tafsir (การตีความทางวิชาการ)", + "reflection-description-2": "หากคุณโพสต์เป็นสาธารณะ ความคิดเห็นของคุณจะถูกตรวจสอบโดยทีมตรวจสอบและปรากฏต่อชุมชน QuranReflect", "start-learning": "เริ่มการเรียนรู้", "tabs": { "main": "รายละเอียดหลัก", "syllabus": "หลักสูตร" - } + }, + "what-happens-when-you-click-add-reflection": "จะเกิดอะไรขึ้นเมื่อคุณคลิก \"เพิ่มการสะท้อน\"?" } diff --git a/locales/th/login.json b/locales/th/login.json index 7dd286ccbc..f0088667a6 100644 --- a/locales/th/login.json +++ b/locales/th/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "รอการยืนยัน", + "back": "กลับ", + "back-to-login": "กลับไปยังหน้าเข้าสู่ระบบ", + "check-email-title": "ตรวจสอบอีเมล์เพื่อลงทะเบียนให้เสร็จสมบูรณ์", + "confirm": "ยืนยัน", + "confirm-new-password-placeholder": "ยืนยันรหัสผ่านใหม่", + "confirm-password-placeholder": "ยืนยันรหัสผ่าน", + "continue": "ดำเนินการต่อ", "continue-apple": "ดำเนินการต่อด้วย Apple", "continue-email": "ดำเนินการต่อด้วยอีเมล", "continue-facebook": "ดำเนินการต่อด้วย Facebook", "continue-google": "ดำเนินการต่อด้วย Google", "email-placeholder": "ที่อยู่อีเมล", + "error": { + "email-required": "อีเมล์หายไป!", + "invalid-credentials": "อีเมลหรือรหัสผ่านไม่ถูกต้อง", + "invalid-email": "รูปแบบอีเมล์ไม่ถูกต้อง!", + "login-failed": "การเข้าสู่ระบบล้มเหลว กรุณาลองอีกครั้ง", + "password-required": "รหัสผ่านหายไป!" + }, + "errors": { + "account-banned": "ขออภัย บัญชีของคุณถูกระงับ ติดต่อมูลนิธิอัลกุรอาน", + "badRequest": "*คำขอไม่ถูกต้อง", + "banned": "*ขออภัย บัญชีของคุณถูกระงับ โปรดติดต่อมูลนิธิ Quran", + "confirm": "*ยืนยันรหัสผ่านไม่ตรงกับรหัสผ่าน", + "email": "*รูปแบบอีเมล์ไม่ถูกต้อง!", + "exactLength": "*ค่าต้องมีความยาวที่แน่นอน", + "expiredToken": "*โทเค็นนี้หมดอายุแล้ว", + "forgot-password-failed": "ไม่สามารถส่งอีเมลรีเซ็ตรหัสผ่านได้ โปรดลองอีกครั้ง", + "immutable": "*ค่านี้ไม่สามารถเปลี่ยนแปลงได้", + "invalid": "* {{fieldName}} นี้ไม่ถูกต้อง", + "invalidEmailOrPassword": "*อีเมลหรือรหัสผ่านไม่ถูกต้อง", + "max": "* {{fieldName}} ต้องน้อยกว่าหรือเท่ากับ {{max}} หลัก", + "min": "* {{fieldName}} จะต้องมากกว่าหรือเท่ากับ {{min}} หลัก", + "name": "* {{fieldName}} ควรเป็นตัวอักษรและตัวเลขเท่านั้น", + "notFound": "*ไม่พบ", + "required": "* {{fieldName}} หายไป!", + "reset-password-failed": "ไม่สามารถรีเซ็ตรหัสผ่านได้ กรุณาลองอีกครั้ง", + "signin-failed": "การลงชื่อเข้าใช้ล้มเหลว กรุณาลองอีกครั้ง", + "signup-failed": "การลงทะเบียนล้มเหลว กรุณาลองอีกครั้ง", + "taken": "* {{fieldName}} มีอยู่แล้ว!", + "usedToken": "*โทเค็นนี้ถูกใช้ไปแล้ว", + "username": "* {{fieldName}} ยอมรับเฉพาะเครื่องหมายขีดล่างและตัวอักษรเท่านั้น", + "verification-code-invalid": "รหัสตรวจสอบนี้ไม่ถูกต้อง", + "verification-code-length": "รหัสตรวจสอบจะต้องมี {{length}} หลัก", + "verification-failed": "การตรวจสอบล้มเหลว กรุณาลองอีกครั้ง", + "verification-resend-failed": "ไม่สามารถส่งรหัสยืนยันอีกครั้งได้" + }, "feature-1": "ติดตามเป้าหมายของคุณ", "feature-2": "รักษาแนวการอ่าน", "feature-3": "สร้างคอลเลกชัน", "feature-4": "ซิงค์ข้อมูลของคุณผ่านเบราว์เซอร์", "feature-5": "และอื่น ๆ!", "feature-6": " ใหม่! หมายเหตุและภาพสะท้อน", + "first-name-placeholder": "ชื่อจริง", + "forgot-password": "ลืมรหัสผ่าน", + "forgot-password-description": "ป้อนที่อยู่อีเมลของคุณและเราจะส่งคำแนะนำในการรีเซ็ตรหัสผ่านของคุณ", + "forgot-password-success": "ส่งอีเมลรีเซ็ตรหัสผ่านแล้ว! กรุณาตรวจสอบกล่องจดหมายของคุณ", + "forgot-password-title": "ลืมรหัสผ่าน?", + "last-name-placeholder": "นามสกุล", "login-cta": "เข้าสู่ระบบหรือลงทะเบียนตอนนี้:", "login-error": { "AuthenticationError": "รับรองความถูกต้องล้มเหลว. โปรดลองอีกครั้งในภายหลัง", + "BannedUserError": "ขออภัย บัญชีของคุณถูกระงับ โปรดติดต่อมูลนิธิอัลกุรอาน", "TokenExpiredError": "คุณออกจากระบบแล้ว กรุณาเข้าสู่ระบบใหม่อีกครั้ง" }, "login-title": "เข้าสู่ระบบ Quran.com", + "new-password-placeholder": "รหัสผ่านใหม่", "other-options": "ตัวเลือกการเข้าสู่ระบบอื่น ๆ", + "password-placeholder": "รหัสผ่าน", + "password-reset-success": "รีเซ็ตรหัสผ่านสำเร็จแล้ว!", + "password-rules": { + "lowercase": "อย่างน้อยต้องมีตัวอักษรพิมพ์เล็กหนึ่งตัว", + "max-length": "สูงสุด 20 ตัวอักษร", + "min-length": "ขั้นต่ำ 8 ตัวอักษร", + "number": "อย่างน้อยหนึ่งหมายเลข", + "special": "อย่างน้อยหนึ่งอักขระพิเศษ (!@#$%^&*_-)", + "uppercase": "อย่างน้อยต้องมีตัวอักษรพิมพ์ใหญ่หนึ่งตัว" + }, "privacy-policy": "การปกป้องความเป็นส่วนตัวของคุณคือสิ่งสำคัญที่สุดสำหรับเรา – เมื่อคุณลงทะเบียน แสดงว่าคุณยินยอมต่อ นโยบายความเป็นส่วนตัว และ ข้อกำหนดและเงื่อนไข ของเรา", - "verify-code": "กรุณาตรวจสอบว่ารหัสความปลอดภัยตรงกับข้อความต่อไปนี้:" + "quran-text": "อัลกุรอาน", + "quran-title": "อัลกุรอานดอทคอม", + "reflect-feature-1": "ไตร่ตรองถึงอัลกุรอาน", + "reflect-feature-2": "เข้าร่วมกลุ่ม", + "reflect-feature-3": "การโต้ตอบกับผู้อื่น", + "reflect-feature-4": "และอีกมากมาย!", + "reset-password": "รีเซ็ตรหัสผ่าน", + "reset-password-success": "รีเซ็ตรหัสผ่านสำเร็จแล้ว!", + "set-new-password": "ตั้งรหัสผ่านใหม่", + "sign-in": "ลงชื่อเข้าใช้", + "sign-in-or-sign-up": "ลงชื่อเข้าใช้หรือสมัครสมาชิก", + "sign-up": "สมัครสมาชิก", + "unified-registration-1": "การจดทะเบียนรวมของ ", + "unified-registration-2": "มูลนิธิอัลกุรอาน", + "unified-registration-3": ". คุณสามารถเข้าถึงเว็บไซต์ต่อไปนี้ได้ ", + "unified-registration-4": "ผ่านทางรายละเอียดการลงชื่อเข้าใช้ของคุณ", + "username-placeholder": "ชื่อผู้ใช้", + "verification-code-instruction": "กรุณากรอกรหัสที่ได้รับจากอีเมล์เพื่อทำการสมัครสมาชิกให้เสร็จสิ้น", + "verification-code-resend": "ส่งอีเมลอีกครั้ง", + "verification-code-resend-countdown": "ส่งอีเมลยืนยันอีกครั้งใน {{seconds}} วินาที...", + "verification-code-sent": "ส่งรหัสยืนยันแล้ว!", + "verification-code-sent-to": "เราเพิ่งส่งอีเมลถึง", + "verification-code-spam-note": "ไม่ได้รับอีเมล? ตรวจสอบโฟลเดอร์สแปม", + "verify-code": "กรุณาตรวจสอบว่ารหัสความปลอดภัยตรงกับข้อความต่อไปนี้:", + "welcome-description-1": "การจดทะเบียนรวมของ", + "welcome-description-2": ".พื้นฐาน", + "welcome-description-3": "คุณจะเข้าถึงเว็บไซต์ต่อไปนี้ได้ผ่านรายละเอียดการลงชื่อเข้าใช้ของคุณ", + "welcome-title": "ยินดีต้อนรับสู่" } diff --git a/locales/th/onboarding.json b/locales/th/onboarding.json index f0273227ed..6b24adb27f 100644 --- a/locales/th/onboarding.json +++ b/locales/th/onboarding.json @@ -87,10 +87,6 @@ "description": "เลือกจากการแปลที่หลากหลายในหลายภาษา เคล็ดลับ: เปรียบเทียบการแปลโดยเลือกหลายตัวเลือก", "title": "การแปล" }, - "voice-search": { - "description": "แตะไอคอนไมโครโฟนและอ่านข้อที่คุณกำลังค้นหา เคล็ดลับด่วน! หากต้องการค้นหาว่ามีคนท่องอยู่ที่ใด (เช่น คำอธิษฐานตะราวีห์) ให้แตะไอคอนไมโครโฟน หลังจากตรวจพบหนึ่งหรือสองข้อแล้ว ให้กดหยุดเพื่อค้นหาตำแหน่ง", - "title": "ค้นหาด้วยเสียง (Tarteel)" - }, "wbw-audio": { "description": "เลือกตัวเลือกนี้เพื่อฟังทุกคำทีละคำเพียงคลิกที่คำ!", "title": "ฟังการทับศัพท์แบบคำต่อคำโดยคลิกที่คำ" diff --git a/locales/th/question.json b/locales/th/question.json index 73d13a3725..c6544853ea 100644 --- a/locales/th/question.json +++ b/locales/th/question.json @@ -1,4 +1,5 @@ { "q-and-a": "คำถามและคำตอบที่เกี่ยวข้องกับ ", - "question": "คำถาม" + "question": "คำถาม", + "questions-meta-desc": "สำรวจคำตอบที่น่าเชื่อถือเพื่อให้คุณเข้าใจคัมภีร์อัลกุรอานได้ลึกซึ้งยิ่งขึ้น" } diff --git a/locales/th/quick-links.json b/locales/th/quick-links.json index 024cc3cbb1..d3bd080e1d 100644 --- a/locales/th/quick-links.json +++ b/locales/th/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "เกี่ยวกับอัลกุรอาน", - "ayat-ul-kursi": "อายะห์กุรซี", - "kahf": "อัลกะห์ฟ", - "mulk": "อัลมุลก์", - "muzzammil": "อัลมุซซัมมิล", - "qr": "เข้าร่วมรอมฎอนเดือนแห่งการทบทวน", - "rahman": "อัรเราะห์มาน", - "sunnah": "อายะห์ที่เกี่ยวกับซุนนะฮฺ", - "waqiah": "อัลวากิอะฮ์", - "yaseen": "ยาซีน" -} \ No newline at end of file + "about-quran": "เกี่ยวกับอัลกุรอาน", + "ayat-ul-kursi": "อายะห์กุรซี", + "jesus-in-quran": "พระเยซูในอัลกุรอาน", + "kahf": "อัลกะห์ฟ", + "mulk": "อัลมุลก์", + "muzzammil": "อัลมุซซัมมิล", + "qr": "เข้าร่วมรอมฎอนเดือนแห่งการทบทวน", + "rahman": "อัรเราะห์มาน", + "sunnah": "อายะห์ที่เกี่ยวกับซุนนะฮฺ", + "waqiah": "อัลวากิอะฮ์", + "what-is-ramadan": "รอมฎอน คืออะไร?", + "yaseen": "ยาซีน" +} diff --git a/locales/th/quran-reader.json b/locales/th/quran-reader.json index 8d64437b0c..38199b98fa 100644 --- a/locales/th/quran-reader.json +++ b/locales/th/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "จุดเริ่มต้นของฮิซบ์", "include-translator": "แสดงชื่อผู้แปล?", "juz-beginning": "ส่วนต้นของญุซ", + "lessons-desc": "อ่านและแบ่งปันบทเรียนอัลกุรอานจาก Ayah {{ayahNumber}} ของ Surah {{surahName}}", + "lessons-disclaimer": "บทเรียนเป็นความเข้าใจและการตีความคัมภีร์อัลกุรอานส่วนบุคคล ไม่ควรนำไปใช้เป็นหลักฐานอ้างอิง", + "lessons-not-available": "ไม่มีบทเรียนที่ทบทวนสำหรับอายะห์นี้", "mad-2": "มัด 2 วินาที", "mad-2-4-6": "อนุญาตให้ Maad 2 หรือ 4 หรือ 6 วินาที", "mad-4-5": "จำเป็น Maad 4 หรือ 5 วินาที", diff --git a/locales/th/radio.json b/locales/th/radio.json index 94bc068c24..283d87c323 100644 --- a/locales/th/radio.json +++ b/locales/th/radio.json @@ -1,26 +1,27 @@ { - "change": "เปลี่ยน", - "curated-station": { - "juz-amma": { - "description": "ฟังญุซสุดท้ายของคัมภีร์กุรอาน", - "title": "ญุซอัมมา" - }, - "popular-recitations": { - "description": "ฟีดที่รวบรวมทุกวันของการบรรยาย", - "title": "เสียงอ่านยอดนิยม" - }, - "surah-al-kahf": { - "description": "ฟังซ้ำซูเราะห์อัล-กะฮฟ์", - "title": "ซูเราะห์ อัล-กะฮฟ์" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "ซูเราะห์จากการคัดสรรของผู้อ่าน", - "title": "ยาซีน อัล-วากีอะห์ อัล-มุลก์" - } + "change": "เปลี่ยน", + "curated-station": { + "juz-amma": { + "description": "ฟังญุซสุดท้ายของคัมภีร์กุรอาน", + "title": "ญุซอัมมา" }, - "curated-stations": "สถานีดูแลจัดการ", - "pause-radio": "หยุดวิทยุชั่วคราว", - "play-radio": "เล่นวิทยุ", - "radio-desc": "ฟังการอ่านอัลกุรอานที่สวยงามไม่หยุดโดยผู้อ่านที่หลากหลาย", - "reciter-stations": "สถานีผู้อ่าน" -} \ No newline at end of file + "popular-recitations": { + "description": "ฟีดที่รวบรวมทุกวันของการบรรยาย", + "title": "เสียงอ่านยอดนิยม" + }, + "surah-al-kahf": { + "description": "ฟังซ้ำซูเราะห์อัล-กะฮฟ์", + "title": "ซูเราะห์ อัล-กะฮฟ์" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "ซูเราะห์จากการคัดสรรของผู้อ่าน", + "title": "ยาซีน อัล-วากีอะห์ อัล-มุลก์" + } + }, + "curated-stations": "สถานีดูแลจัดการ", + "pause-radio": "หยุดวิทยุชั่วคราว", + "play-radio": "เล่นวิทยุ", + "radio-desc": "ฟังการอ่านอัลกุรอานที่สวยงามไม่หยุดโดยผู้อ่านที่หลากหลาย", + "reciter-stations": "สถานีผู้อ่าน", + "station": "สถานี" +} diff --git a/locales/th/reading-goal.json b/locales/th/reading-goal.json index f11ded309a..4dc48c757a 100644 --- a/locales/th/reading-goal.json +++ b/locales/th/reading-goal.json @@ -1,125 +1,129 @@ { - "continue-reading": "อ่านต่อไป", - "continuous": { - "description": "เป้าหมายของคุณจะคำนวณความคืบหน้าของคุณในช่วงระยะเวลาหนึ่ง", - "title": "ในช่วงระยะเวลาหนึ่ง" - }, - "create-plan": "สร้างแผน", - "create-reading-goal": "สร้างเป้าหมาย", - "daily-progress": "ความคืบหน้ารายวัน", - "daily": { - "description": "เป้าหมายของคุณจะรีเซ็ตทุกวัน", - "title": "เป้าหมายรายวัน" - }, - "day-x": "วัน {{day}}", - "days": "วัน", - "duration": "ระยะเวลา (วัน)", - "ending-chapter": "จบซูเราะห์", - "ending-verse": "จบอายะห์", - "examples-subtitle": "นี่คือรายการของเป้าหมายทั่วไป คุณยังสามารถสร้างเป้าหมายของคุณเอง", - "examples-title": "เลือกเป้าหมายที่ตั้งไว้ล่วงหน้าหรือสร้างเป้าหมายของคุณเอง", - "examples": { - "custom": { - "description": "กำหนดเป้าหมายที่กำหนดเองที่เหมาะกับคุณ", - "title": "กำหนดเอง" - }, - "khatm": { - "description": "เป้าหมายเพื่อการคอตัม, อ่าน 1 ญุซ ต่อวัน", - "title": "อ่านอัลกุรอานใน 30 วัน" - }, - "time": { - "description": "เป้าหมายง่ายๆ ที่เป็นมิตรกับผู้เริ่มต้น", - "title": "อ่านวันละ 10 นาที" - }, - "year": { - "description": "อ่านอัลกุรอานด้วยตนเองในปีหน้า", - "title": "อ่านอัลกุรอานในหนึ่งปี" - } - }, - "frequency-tab": { - "description": "เป้าหมายของคุณควรรีเซ็ตทุกวันหรือหลายวันหรือไม่? ไม่ต้องกังวล เราจะติดตามความคืบหน้าของคุณโดยไม่คำนึงถึงความถี่ที่คุณเลือก", - "title": "เลือกความถี่สำหรับเป้าหมายของคุณ" - }, - "goal-done": { - "description": "การอ่านเพิ่มเติมหลังจากนี้ จะยังคงถูกบันทึกไว้", - "title": "คุณได้พิชิตเป้าหมายของวันนี้แล้ว" - }, - "goal-target": { - "description": "คุณควรอ่านเวลา กี่หน้า หรือหลายข้อเพื่อให้บรรลุเป้าหมาย", - "title": "กำหนดเป้าหมายสำหรับเป้าหมายของคุณ" - }, - "goal-type": { - "description": "เป้าหมายของคุณควรขึ้นอยู่กับเวลา จำนวนหน้า หรือช่วงที่กำหนดเอง (เช่น 3 ญุซ ของอัลกุรอาน)", - "title": "เลือกเกณฑ์สำหรับเป้าหมายของคุณ" - }, - "goal-types": { - "pages": { - "description": "เป้าหมายของคุณจะขึ้นอยู่กับเพจ", - "title": "หน้า" - }, - "range": { - "description": "เป้าหมายของคุณจะขึ้นอยู่กับช่วงของอายะห์ที่กำหนดเอง (อาจเป็นซูเราะห์, ญุซ หรือแม้แต่อัลกุรอานทั้งหมด)", - "title": "ช่วงที่กำหนดเอง" - }, - "time": { - "description": "เป้าหมายของคุณจะขึ้นอยู่กับเวลา", - "title": "เวลา" - } - }, - "plus-x-more-days": { - "other": "อีก {{days}} วัน" - }, - "preview-schedule": { - "description": "นี่คือลักษณะเป้าหมายของคุณ คุณสามารถเปลี่ยนได้ในภายหลัง", - "title": "นี่คือตัวอย่างกำหนดการของคุณ" - }, - "progress": { - "complete": "เป้าหมายวันนี้สำเร็จแล้ว 🎉", - "goal-complete": "เป้าหมายทั้งหมดของคุณเสร็จสมบูรณ์แล้ว 🎉", - "pages-goal": "อ่าน {{pages}} หน้าของอัลกุรอาน", - "range-goal": "อ่านจาก {{from}} ถึง {{to}}", - "time-goal": "อ่านอัลกุรอานเป็นเวลา {{time}}" - }, - "reading-goal": "เป้าหมายการอ่าน", - "reading-goal-description": "คุณพบว่ามันท้าทายในการรักษาความสอดคล้องกับเป้าหมายการอ่านอัลกุรอานของคุณหรือไม่? Quran Growth Journey เป็นคุณสมบัติไดนามิกที่พัฒนาขึ้นเพื่อช่วยให้คุณคงเส้นคงวาในการเดินทางกับคัมภีร์อัลกุรอาน ไม่ว่าคุณจะตั้งเป้าหมายที่จะอ่าน 10 นาทีต่อวัน ทำญุซให้เสร็จในหนึ่งเดือน หรืออ่านอัลกุรอานให้จบในหนึ่งปี ฯลฯ ตอนนี้ Quran.com สามารถช่วยคุณกำหนดเป้าหมายที่กำหนดเองและติดตามแนวการอ่านรายวันของคุณได้ ในขณะที่ ปรับเมื่อคุณก้าวหน้า ใช้งานได้ฟรีโดยสมบูรณ์และเราหวังว่ามันจะช่วยให้คุณมีแรงจูงใจในการบรรลุเป้าหมาย!", - "reading-goal-label": "คุณอยู่ใน", - "reading-goal-title": "แนะนำการเดินทางเติบโตของอัลกุรอาน", - "recommended": "ที่แนะนำ", - "remaining": "ที่เหลืออยู่สำหรับวันนี้", - "remaining-days": { - "other": "เหลืออีก {{days}} วัน" - }, - "set-reading-goal-success": "กำหนดเป้าหมายการอ่านของคุณสำเร็จแล้ว", - "start-journey": "เริ่มการเดินทางของคุณ!", - "start-reading": "เริ่มอ่าน", - "starting-chapter": "เริ่มซูเราะห์", - "starting-verse": "เริ่มอายะห์", - "streak": "ริ้ว", - "streak-definition": "ช่วงเวลา ในที่นี้หมายถึงช่วงระยะเวลาหนึ่งที่คุณตั้งไว้ในการอ่านอัลกุรอานอย่างต่อเนื่อง", - "timeline-meaning": "ไทม์ไลน์ของคุณหมายถึงอะไร?", - "timeline-states": { - "checked": "คุณบรรลุเป้าหมายของคุณแล้ว", - "filled": "คุณได้อ่านบางอย่างแต่ยังไม่เพียงพอที่จะบรรลุเป้าหมายของคุณ", - "none": "คุณยังไม่ได้อ่านอะไรเลยในวันนั้น", - "stroked": "วันนี้คุณยังไม่ได้อ่านอะไรเลย" - }, - "todays-goal": "เป้าหมายวันนี้", - "view-progress": "ดูความคืบหน้า", - "week-progress": "ความคืบหน้าในสัปดาห์นี้", - "x-days": { - "other": "{{days}} วัน" - }, - "x-days-streak": "ช่วงเวลา {{days}} วัน", - "x-hours": { - "other": "{{hours}} ชั่วโมง" - }, - "x-minutes": { - "other": "{{minutes}} นาที" - }, - "x-pages": { - "other": "{{pages}} หน้า" - }, - "x-seconds": { - "other": "{{seconds}} วินาที" + "continue-reading": "อ่านต่อไป", + "continuous": { + "description": "เป้าหมายของคุณจะคำนวณความคืบหน้าของคุณในช่วงระยะเวลาหนึ่ง", + "title": "ในช่วงระยะเวลาหนึ่ง" + }, + "create-plan": "สร้างแผน", + "create-reading-goal": "สร้างเป้าหมาย", + "daily-progress": "ความคืบหน้ารายวัน", + "daily-progress-completed": "เสร็จสมบูรณ์แล้ว! 🎉", + "daily": { + "description": "เป้าหมายของคุณจะรีเซ็ตทุกวัน", + "title": "เป้าหมายรายวัน" + }, + "day-x": "วัน {{day}}", + "days": "วัน", + "duration": "ระยะเวลา (วัน)", + "ending-chapter": "จบซูเราะห์", + "ending-verse": "จบอายะห์", + "examples-subtitle": "นี่คือรายการของเป้าหมายทั่วไป คุณยังสามารถสร้างเป้าหมายของคุณเอง", + "examples-title": "เลือกเป้าหมายที่ตั้งไว้ล่วงหน้าหรือสร้างเป้าหมายของคุณเอง", + "examples": { + "custom": { + "description": "กำหนดเป้าหมายที่กำหนดเองที่เหมาะกับคุณ", + "title": "กำหนดเอง" + }, + "khatm": { + "description": "เป้าหมายเพื่อการคอตัม, อ่าน 1 ญุซ ต่อวัน", + "title": "อ่านอัลกุรอานใน 30 วัน" + }, + "time": { + "description": "เป้าหมายง่ายๆ ที่เป็นมิตรกับผู้เริ่มต้น", + "title": "อ่านวันละ 10 นาที" + }, + "year": { + "description": "อ่านอัลกุรอานด้วยตนเองในปีหน้า", + "title": "อ่านอัลกุรอานในหนึ่งปี" + } + }, + "frequency-tab": { + "description": "เป้าหมายของคุณควรรีเซ็ตทุกวันหรือหลายวันหรือไม่? ไม่ต้องกังวล เราจะติดตามความคืบหน้าของคุณโดยไม่คำนึงถึงความถี่ที่คุณเลือก", + "title": "เลือกความถี่สำหรับเป้าหมายของคุณ" + }, + "goal-completed": "บรรลุเป้าหมายแล้ว! 🎉 ", + "goal-done": { + "description": "การอ่านเพิ่มเติมหลังจากนี้ จะยังคงถูกบันทึกไว้", + "title": "คุณได้พิชิตเป้าหมายของวันนี้แล้ว" + }, + "goal-target": { + "description": "คุณควรอ่านเวลา กี่หน้า หรือหลายข้อเพื่อให้บรรลุเป้าหมาย", + "title": "กำหนดเป้าหมายสำหรับเป้าหมายของคุณ" + }, + "goal-type": { + "description": "เป้าหมายของคุณควรขึ้นอยู่กับเวลา จำนวนหน้า หรือช่วงที่กำหนดเอง (เช่น 3 ญุซ ของอัลกุรอาน)", + "title": "เลือกเกณฑ์สำหรับเป้าหมายของคุณ" + }, + "goal-types": { + "pages": { + "description": "เป้าหมายของคุณจะขึ้นอยู่กับเพจ", + "title": "หน้า" + }, + "range": { + "description": "เป้าหมายของคุณจะขึ้นอยู่กับช่วงของอายะห์ที่กำหนดเอง (อาจเป็นซูเราะห์, ญุซ หรือแม้แต่อัลกุรอานทั้งหมด)", + "title": "ช่วงที่กำหนดเอง" + }, + "time": { + "description": "เป้าหมายของคุณจะขึ้นอยู่กับเวลา", + "title": "เวลา" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "other": "อีก {{days}} วัน" + }, + "preview-schedule": { + "description": "นี่คือลักษณะเป้าหมายของคุณ คุณสามารถเปลี่ยนได้ในภายหลัง", + "title": "นี่คือตัวอย่างกำหนดการของคุณ" + }, + "progress": { + "complete": "เป้าหมายวันนี้สำเร็จแล้ว 🎉", + "goal-complete": "เป้าหมายทั้งหมดของคุณเสร็จสมบูรณ์แล้ว 🎉", + "pages-goal": "อ่าน {{pages}} หน้าของอัลกุรอาน", + "range-goal": "อ่านจาก {{from}} ถึง {{to}}", + "time-goal": "อ่านอัลกุรอานเป็นเวลา {{time}}" + }, + "reading-goal": "เป้าหมายการอ่าน", + "reading-goal-description": "คุณพบว่าการรักษาความสม่ำเสมอในการอ่านอัลกุรอานของคุณเป็นเรื่องท้าทายหรือไม่?

    Quran Growth Journey เป็นฟีเจอร์แบบไดนามิกที่พัฒนาขึ้นเพื่อช่วยให้คุณรักษาความสม่ำเสมอในการอ่านอัลกุรอาน ไม่ว่าคุณจะตั้งเป้าหมายที่จะอ่าน 10 นาทีต่อวัน อ่าน Juz ให้จบภายในหนึ่งเดือน หรืออ่านอัลกุรอานจบทั้งเล่มภายในหนึ่งปี เป็นต้น Quran.com สามารถช่วยให้คุณตั้งเป้าหมายที่กำหนดเองได้ และติดตามสถิติการอ่านรายวันของคุณ พร้อมทั้งปรับเปลี่ยนตามความคืบหน้าของคุณ ใช้งานได้ฟรีโดยสิ้นเชิง และเราหวังว่าจะช่วยให้คุณมีแรงบันดาลใจในการบรรลุเป้าหมาย!", + "reading-goal-label": "คุณอยู่ใน", + "reading-goal-title": "แนะนำเส้นทางการเติบโตของอัลกุรอาน", + "recommended": "ที่แนะนำ", + "remaining": "ที่เหลืออยู่สำหรับวันนี้", + "remaining-base": "ที่เหลืออยู่", + "remaining-days": { + "other": "เหลืออีก {{days}} วัน" + }, + "set-a-new-goal": "ตั้งเป้าหมายใหม่", + "set-reading-goal-success": "กำหนดเป้าหมายการอ่านของคุณสำเร็จแล้ว", + "start-journey": "เริ่มการเดินทางของคุณ!", + "start-reading": "เริ่มอ่าน", + "starting-chapter": "เริ่มซูเราะห์", + "starting-verse": "เริ่มอายะห์", + "streak": "ริ้ว", + "streak-definition": "ช่วงเวลา ในที่นี้หมายถึงช่วงระยะเวลาหนึ่งที่คุณตั้งไว้ในการอ่านอัลกุรอานอย่างต่อเนื่อง", + "timeline-meaning": "ไทม์ไลน์ของคุณหมายถึงอะไร?", + "timeline-states": { + "checked": "คุณบรรลุเป้าหมายของคุณแล้ว", + "filled": "คุณได้อ่านบางอย่างแต่ยังไม่เพียงพอที่จะบรรลุเป้าหมายของคุณ", + "none": "คุณยังไม่ได้อ่านอะไรเลยในวันนั้น", + "stroked": "วันนี้คุณยังไม่ได้อ่านอะไรเลย" + }, + "todays-goal": "เป้าหมายวันนี้", + "view-progress": "ดูความคืบหน้า", + "week-progress": "ความคืบหน้าในสัปดาห์นี้", + "x-days": { + "other": "{{days}} วัน" + }, + "x-days-streak": "ช่วงเวลา {{days}} วัน", + "x-hours": { + "other": "{{hours}} ชั่วโมง" + }, + "x-minutes": { + "other": "{{minutes}} นาที" + }, + "x-pages": { + "other": "{{pages}} หน้า" + }, + "x-seconds": { + "other": "{{seconds}} วินาที" + } +} diff --git a/locales/th/support.json b/locales/th/support.json index 014f609fcf..a953c56c53 100644 --- a/locales/th/support.json +++ b/locales/th/support.json @@ -1,27 +1,25 @@ { - "bug-a": "โปรดรายงานข้อผิดพลาดนี้ <0> ที่นี่ <\/0> และเราจะแก้ไขข้อผิดพลาดนี้โดยเร็วที่สุด อินชาอัลลอฮ์", - "bug-q": "ฉันพบข้อบกพร่องในการแปล ฉันจะแจ้งมันได้ที่ไหน", - "developer-a": "โปรดดูที่ <0> หน้านักพัฒนา <\/0> สำหรับข้อมูลเพิ่มเติม", - "developer-q": "ฉันเป็นนักพัฒนา ฉันจะมีส่วนร่วมได้อย่างไร?", - "donate-a": "ประการแรก เราขอขอบคุณที่คุณให้ความสนใจมีส่วนร่วม กรุณาเยี่ยมชม <0> ลิงค์นี่ <\/0>", - "donate-q": "ฉันจะบริจาคได้อย่างไร", - "download-a": "น่าเสียดายที่ไม่มี เรายังไม่มีฟังก์ชันในการดาวน์โหลดเว็บไซต์หรืออัลกุรอานของเราลงในคอมพิวเตอร์ของคุณ อย่างไรก็ตาม คุณสามารถติดตั้งแอพมือถือของเราสำหรับการอ่านแบบออฟไลน์", - "download-q": "ฉันสามารถดาวน์โหลด Quran.com ลงในคอมพิวเตอร์ของฉันได้หรือไม่?", - "fiqh-a": "Quran.com เป็นเครื่องมืออ่าน ฟัง และเรียนออนไลน์ ทีมงานที่อยู่เบื้องหลัง Quran.com ประกอบด้วยวิศวกรซอฟต์แวร์ นักออกแบบ และนักจัดการ น่าเสียดาย นั่นเป็นข้อจำกัดของทักษะของเรา เราไม่มีนักวิชาการ อิหม่าม หรือเชคเป็นส่วนหนึ่งของทีมเพื่อช่วยเหลือเกี่ยวกับคำถามเกี่ยวกับอิสลาม ฟิกห์ หรือฟัตวา เราพยายามงดเว้นจากการตอบคำถามเหล่านี้ และแนะนำให้คุณพูดคุยกับอิหม่ามที่มัสยิดหรือกับผู้รู้ในพื้นที่ของคุณ", - "fiqh-q": "คำถามที่เกี่ยวข้องกับอิสลาม \/ ฟิกห์ \/ ฟัตวา", - "header": "ความช่วยเหลือและคำติชม", - "main-desc": "โปรดตรวจสอบคำถามที่พบบ่อยเพื่อดูว่าคำถามของคุณได้รับคำตอบแล้วหรือไม่ หากจำเป็น คุณสามารถ <0> ติดต่อเรา <\/0> และเราจะพยายามติดต่อกลับโดยเร็วที่สุด แต่เพื่อให้คุณรู้ว่าเราเป็นทีมเล็กๆ ดังนั้นกรุณาทำตัวดีๆ", - "mobile-a": "ใช่! โปรดไปที่ <0> หน้าแอพมือถือ <\/0> สำหรับข้อมูลเพิ่มเติม", - "mobile-q": "Quran.com มีแอพมือถือหรือไม่?", - "other-languages-a": "หากต้องการเปลี่ยนภาษาที่คุณต้องการ จะมีเมนูแบบเลื่อนลงที่มุมบนขวาในแต่ละหน้า (มุมบนซ้ายของภาษาที่อ่านจากขวาไปซ้าย) ใช้เมนูแบบเลื่อนลงนี้เพื่อเลือกภาษาที่คุณต้องการ", - "other-languages-q": "ฉันสามารถเรียกดูไซต์ในภาษาอื่นได้หรือไม่?", - "reciters-a": "ส่งข้อมูลเพิ่มเติมเกี่ยวกับนักอ่าน <0> ที่นี่ <\/0>", - "reciters-q": "เพิ่มเสียงนักอ่านมากขึ้น", - "site-down-a": "ที่ไม่ดี! หากไซต์ไม่ทำงานเลย หรือบางทีคุณอาจเห็นหน้าจอสีขาวที่มีข้อความ 'ขออภัย มีบางอย่างผิดพลาด' เรายินดีเป็นอย่างยิ่งหากคุณสามารถรายงานได้ <0> ที่นี่ <\/0>", - "site-down-q": "เว็บไซต์ใช้งานไม่ได้ ฉันจะบอกคุณได้อย่างไร?", - "support": "สนับสนุน", - "tafsir-a": "ใช่ เรามีตัฟซีรอยู่จำนวนหนึ่ง คลิกที่ไอคอนที่แสดงข้างๆอายะห์ จากนั้นคลิกที่ตัฟซีร แอพจะแสดงรายการของตัฟซีรที่มีอยู่ คลิกเลือกตัฟซีร ที่คุณต้องการอ่าน", - "tafsir-q": "มีตัฟซีรไหม?", - "translations-a": "เปิดกระทู้ปัญหาใหม่ <0> ที่นี่ <\/0> พร้อมรายละเอียดทั้งหมด ลิงก์ไปยังการแปล และเราจะพยายามอย่างเต็มที่เพื่อเพิ่มสิ่งนี้", - "translations-q": "เพิ่มคำแปลอื่น" -} \ No newline at end of file + "bug-a": "โปรดรายงานข้อผิดพลาดนี้ <0> ที่นี่ และเราจะแก้ไขข้อผิดพลาดนี้โดยเร็วที่สุด อินชาอัลลอฮ์", + "bug-q": "ฉันพบข้อบกพร่องในการแปล ฉันจะแจ้งมันได้ที่ไหน", + "developer-a": "โปรดดูที่ <0> หน้านักพัฒนา สำหรับข้อมูลเพิ่มเติม", + "developer-q": "ฉันเป็นนักพัฒนา ฉันจะมีส่วนร่วมได้อย่างไร?", + "donate-a": "ประการแรก เราขอขอบคุณที่คุณให้ความสนใจมีส่วนร่วม กรุณาเยี่ยมชม <0> ลิงค์นี่ ", + "donate-q": "ฉันจะบริจาคได้อย่างไร", + "download-a": "น่าเสียดายที่ไม่มี เรายังไม่มีฟังก์ชันในการดาวน์โหลดเว็บไซต์หรืออัลกุรอานของเราลงในคอมพิวเตอร์ของคุณ อย่างไรก็ตาม คุณสามารถติดตั้งแอพมือถือของเราสำหรับการอ่านแบบออฟไลน์", + "download-q": "ฉันสามารถดาวน์โหลด Quran.com ลงในคอมพิวเตอร์ของฉันได้หรือไม่?", + "header": "ความช่วยเหลือและคำติชม", + "main-desc": "โปรดตรวจสอบคำถามที่พบบ่อยเพื่อดูว่าคำถามของคุณได้รับคำตอบแล้วหรือไม่ หากจำเป็น คุณสามารถ <0> ติดต่อเรา และเราจะพยายามติดต่อกลับโดยเร็วที่สุด แต่เพื่อให้คุณรู้ว่าเราเป็นทีมเล็กๆ ดังนั้นกรุณาทำตัวดีๆ", + "mobile-a": "ใช่! โปรดไปที่ <0>Quran สำหรับ Android หรือ <1>Quran iOS เพื่อดาวน์โหลดแอป", + "mobile-q": "Quran.com มีแอพมือถือหรือไม่?", + "other-languages-a": "หากต้องการเปลี่ยนภาษาที่คุณต้องการ จะมีเมนูแบบเลื่อนลงที่มุมบนขวาในแต่ละหน้า (มุมบนซ้ายของภาษาที่อ่านจากขวาไปซ้าย) ใช้เมนูแบบเลื่อนลงนี้เพื่อเลือกภาษาที่คุณต้องการ", + "other-languages-q": "ฉันสามารถเรียกดูไซต์ในภาษาอื่นได้หรือไม่?", + "reciters-a": "ส่งข้อมูลเพิ่มเติมเกี่ยวกับนักอ่าน <0> ที่นี่ ", + "reciters-q": "เพิ่มเสียงนักอ่านมากขึ้น", + "site-down-a": "ที่ไม่ดี! หากไซต์ไม่ทำงานเลย หรือบางทีคุณอาจเห็นหน้าจอสีขาวที่มีข้อความ 'ขออภัย มีบางอย่างผิดพลาด' เรายินดีเป็นอย่างยิ่งหากคุณสามารถรายงานได้ <0> ที่นี่ ", + "site-down-q": "เว็บไซต์ใช้งานไม่ได้ ฉันจะบอกคุณได้อย่างไร?", + "support": "สนับสนุน", + "tafsir-a": "ใช่ เรามีตัฟซีรอยู่จำนวนหนึ่ง คลิกที่ไอคอนที่แสดงข้างๆอายะห์ จากนั้นคลิกที่ตัฟซีร แอพจะแสดงรายการของตัฟซีรที่มีอยู่ คลิกเลือกตัฟซีร ที่คุณต้องการอ่าน", + "tafsir-q": "มีตัฟซีรไหม?", + "translations-a": "เปิดกระทู้ปัญหาใหม่ <0> ที่นี่ พร้อมรายละเอียดทั้งหมด ลิงก์ไปยังการแปล และเราจะพยายามอย่างเต็มที่เพื่อเพิ่มสิ่งนี้", + "translations-q": "เพิ่มคำแปลอื่น" +} diff --git a/locales/tr/about.json b/locales/tr/about.json index 5d7da2539a..44752b2574 100644 --- a/locales/tr/about.json +++ b/locales/tr/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "Bu proje, kullandığımız birçok açık kaynak kütüphane ve proje olmadan mümkün olmazdı:", - "lokalize": "<0>Lokalize<\/0>: Verimlilik ve kalite güvencesine odaklanan ve sorunsuz bir yerelleştirme iş akışı sağlayan bilgisayar destekli bir çeviri sistemi.", - "quran-align": "<0>Collin Fair<\/0>: Kaydedilmiş Kur'an tilavetinin kelime-kesin olarak bölümlemesini üretmek için bir araç.", - "quran-complex": "<0>QuranComplex<\/0>: Kral Fehd Mushaf-ı Şerîf Basım Kurumu, Kur'an-ı Kerim'e ve Bilimlerine hizmet etmede, anlamlarını tercüme etmede ve Kuran Metnini bozulmadan korumada liderdir. baskı, ses kayıtları, elektronik yayıncılık ve dijital uygulamalar alanında ileri teknolojiler.", - "quran-enc": "<0>Kur'an-ı Kerim Ansiklopedisi<\/0>: Kur'an-ı Kerim'in birçok dünya dilindeki anlam ve tefsirlerinin ücretsiz ve güvenilir tercümelerini içeren bir portal.", - "tanzil": "<0>Tanzil<\/0>: Yüksek düzeyde doğrulanmış kesin bir Kuran metni sağlamayı amaçlayan uluslararası bir Kuran projesi.", - "title": "Katkıda Bulunanlar", - "vercel": "<0>Vercel<\/0> : ön uç geliştiricilere öncelik veren ve onlara yüksek performanslı web siteleri ve uygulamalar oluşturmaları için kapsamlı araçlar sunan bir dağıtım ve işbirliği platformudur.", - "zekr": "<0>Zekr<\/0>: Kuran'a göz atmak ve araştırmak için açık platform Kuran çalışma aracı" - }, - "main-description": "Quran.com 1995 yılında kuruldu. Web sitesi herkesin Kuran'ı okumasını, incelemesini ve öğrenmesini kolaylaştırmayı amaçlıyor. Proje açık kaynaktır ve çekirdek ekip üyeleri ile <0>Tarteel ekibi<\/0> arasında bir işbirliği olarak oluşturulmuştur." -} \ No newline at end of file + "credits": { + "desc": "Kuran-ı Kerim'in dünya çapında milyonlarca insana ulaşmasını sağlayan bu projeye destek veren ve katkıda bulunan herkese şükranlarımızı sunuyoruz.", + "lokalize": "<0>Lokalize: Verimliliğe ve kalite güvencesine odaklanan ve sorunsuz bir yerelleştirme iş akışı sağlayan bilgisayar destekli bir çeviri sistemidir.", + "quran-align": "<0>Collin Fair: Kaydedilmiş Kur'an-ı Kerim okumalarının kelime bazında kesin bölümlenmesini sağlayan bir araç.", + "quran-complex": "<0>QuranComplex: Kral Fahd Muhteşem Kur'an Basım Kompleksi, baskı, ses kayıtları, elektronik yayıncılık ve dijital uygulamalar alanında ileri teknolojilerin en iyi şekilde kullanılması yoluyla, Muhteşem Kur'an ve Bilimlerine hizmet etmede, Meallerini tercüme etmede ve Kur'an Metnini tahriften korumada lider bir kuruluştur.", + "quran-enc": "<0>QuranEnc: Kur'an-ı Kerim'in birçok dünya diline ait meâl ve tefsirlerinin ücretsiz ve güvenilir tercümelerini sunan bir portal.", + "tanzil": "<0>Tanzil: Son derece doğrulanmış kesin bir Kur'an metni sağlamayı amaçlayan uluslararası bir Kur'an projesi.", + "tarteel": "<0>Tarteel: Yapay zeka destekli bir Kur'an ezberleme uygulaması. İster bir ayet arayın, ister ilerlemenizi takip edin veya okumanızı takip edin, daha akıllıca ezberlemenize yardımcı olmak için tasarlanmıştır.", + "title": "Krediler", + "vercel": "<0>Vercel: Ön uç geliştiricileri ön planda tutan, onlara yüksek performanslı web siteleri ve uygulamalar inşa etmeleri için kapsamlı araçlar sunan bir dağıtım ve işbirliği platformudur.", + "zekr": "<0>Zekr: Kuran'ı incelemek ve araştırmak için açık platformlu bir Kuran çalışma aracı" + }, + "global-effort": { + "desc": "Dünyanın dört bir yanından milyonlarca insan, birincil dijital Kuran kaynağı olarak Quran.com'a güveniyor. İster okumak, ister düşünmek, ister ezberlemek veya çalışmak için gelsinler, ortak bir amaçları var: Allah'ın sözleriyle bağlantı kurmak için samimi bir arzu. \\n Büyümeye devam ederken, Quran.com'un Kuran ile etkileşim kurmak isteyen herkes için güvenilir, erişilebilir ve güzel tasarlanmış bir alan olmaya devam etmesini sağlamaya kararlıyız.", + "title": "Küresel Bir Çaba" + }, + "key-features": { + "desc": "Quran.com, Kur'an'la etkileşimin her aşamasını desteklemek için tasarlanmıştır: okuma ve ezberlemeden çalışma ve tefekküre kadar. Özelliklerimiz şunları içerir:", + "features": [ + "Kullanıcı Dostu Kur'an Arayüzü – Herhangi bir cihazda temiz ve sezgisel bir okuma deneyimi.", + "Çoklu Tercüme ve Tefsir – Tefsir ile birlikte birden fazla dilde tercümelere erişim.", + "Sesli Okumalar – Dünyaca ünlü Karilerin yüksek kaliteli okumalarını dinleyin ve kelime kelime takip edin.", + "Gelişmiş Arama ve Gezinme – Kuran'ın tamamında ayetleri anında konu veya anahtar kelimelere göre bulun.", + "Ayet İşaretleme ve Notlar – Ayetleri kaydedin ve daha sonra başvurmak üzere kişisel düşüncelerinizi yazın.", + "QuranReflect Entegrasyonu – Bilim insanları ve bireyler tarafından paylaşılan yansımalar ve içgörüler aracılığıyla küresel bir toplulukla etkileşim kurun.", + "Okuma İlerleme Takibi ve Hedefleri – Günlük hedeflerinizi ve okuma geçmişinizi takip edin", + "Geliştiriciler için API'ler – İslami uygulamaları ve Ar-Ge'yi güçlendirecek içerik ve özelliklere ücretsiz erişim.", + "Ve daha fazlası, Elhamdülillah." + ], + "title": "Temel Özellikler ve Teklifler" + }, + "main-description": "1995'teki kuruluşundan bu yana, Quran.com, Kuran'ı herkesin anlayabileceği, gerçek ve etkileşimi kolay bir şekilde erişilebilir kılmaya kendini adamıştır. Her gün, dünya çapında milyonlarca insan Kuran'ı okumak, dinlemek, incelemek ve üzerinde düşünmek için Quran.com'a yöneliyor; ister hayat boyu öğrenci, ister akademisyen olsunlar, ister yolculuklarına yeni başlamış olsunlar.", + "our-mission": { + "desc": "Kuran'ın okunması, anlaşılması ve üzerinde düşünülmesi amaçlanmıştır. Misyonumuz, güvenilir, iyi tasarlanmış ve derinlemesine zenginleştirici bir Kuran deneyimi sunarak erişim engellerini kaldırmak ve bireyleri ve toplulukları güçlendirmektir. Doğruluk, açıklık ve samimiyet ilkeleriyle yönlendirilen Kuran ile etkileşim kurmak isteyen herkes için güvenilir bir kaynak olmayı hedefliyoruz.", + "title": "Misyonumuz" + }, + "who-we-are": { + "desc": "Quran.com, Kuran'ın herkese ücretsiz ve ticari çıkarlar olmadan erişilebilir olmasını sağlamak için kamusal bir güven olarak kurulan bir vakıftır. 501(c)(3) kar amacı gütmeyen bir kuruluş olan Quran.Foundation tarafından yönetilir ve Kuran.com'u, dünyaya yüksek kaliteli, gerçek Kuran kaynakları sağlama misyonunun bir parçası olarak sürdürür ve geliştirir. Taahhüdümüz, Kuran'a ve okuyucularına mükemmellik, samimiyet ve sorumlulukla hizmet etmektir.", + "title": "Biz Kimiz" + } +} diff --git a/locales/tr/apps.json b/locales/tr/apps.json index a51138dc1f..ed94d9ba86 100644 --- a/locales/tr/apps.json +++ b/locales/tr/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Kuran.com'un temel geliştiricileri tarafından güzel ve reklamsız mushaf iOS ve Android uygulamaları geliyor. Hareket halindeyken Kuran'ı okumak, ezberlemek ve en sevdiğiniz okuyucuları dinlemek artık daha kolay.", - "tarteel-desc": "Tarteel, okuduğunuzla etkileşim kurmak ve hataları vurgulamak için AI araçlarını kullanan ilk Kuran uygulamasıdır. Avucunuzun içinde sesli bir Kuran arkadaşı olan Tarteel, Kuran'ı güvenle okumanıza, okumanıza, ezberlemenize ve anlamanıza yardımcı olmak için sezgisel olarak çalışır! <0><\/0><0><\/0> Tarteel, Kuran.com'un çekirdek geliştiricisi ve aynı zamanda yönetim kurullarının bir üyesi olmaktan gurur duyar." -} \ No newline at end of file + "quran-desc": "Kuran.com'un temel geliştiricileri tarafından güzel ve reklamsız mushaf iOS ve Android uygulamaları geliyor. Hareket halindeyken Kuran'ı okumak, ezberlemek ve en sevdiğiniz okuyucuları dinlemek artık daha kolay." +} diff --git a/locales/tr/common.json b/locales/tr/common.json index af440bf0a0..872de8112a 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "Navigasyonlar", "no-nav-results": "Navigasyon sonucu yok", - "placeholder": "Ne okumak istersiniz?", - "powered-by": "Tarteel.ai tarafından desteklenen sesli arama", + "placeholder": "Kuran'ı ara...", "recent-navigations": "Son gezinmeler", "search-by-voice": "Sesle ara", "try-navigating": "Gezinmeyi deneyin" @@ -122,9 +121,11 @@ } }, "continue": "Devam et", + "contribute-to-our-mission": "Misyonumuza katkıda bulunun", "copied": "kopyalandı", "copied-to-clipboard": "Panoya kopyalandı", "copy": "Kopyala", + "copylink": "Bağlantıyı kopyala", "counter": { "decrease": "Azalt", "increase": "Arttır" @@ -134,6 +135,7 @@ "developers": "Geliştiriciler", "display": "Görüntülemek", "donate": "Bağış Yapın", + "donate-now": "Şimdi bağış yapın", "donate_monthly": "Aylık bağış yapın", "donate_once": "Bir kez bağış yapın", "edit": "Düzenlemek", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*Maksimum {{maxNumberOfVerses}} Ayet", "ranges-wrong-order": "Başlangıç mısrası bitiş mısrasından önce olmalıdır." }, + "errors": { + "account-banned": "Üzgünüz, Hesabınız yasaklandı. Quran.Foundation ile iletişime geçin", + "badRequest": "*Geçersiz istek", + "banned": "*Üzgünüz, Hesabınız yasaklandı. Quran.Foundation ile iletişime geçin", + "confirm": "*Şifreyi onayla şifreyle uyuşmuyor", + "email": "*Geçersiz E-posta Biçimi!", + "exactLength": "*Değer tam uzunlukta olmalıdır", + "expiredToken": "*Bu token'ın süresi doldu", + "forgot-password-failed": "Şifre sıfırlama e-postası gönderilemedi. Lütfen tekrar deneyin.", + "immutable": "*Bu değer değiştirilemez", + "invalid": "*Bu {{fieldName}} geçersizdir", + "invalidEmailOrPassword": "*Geçersiz e-posta veya şifre", + "max": "* {{fieldName}} {{max}} basamaktan az veya eşit olmalıdır", + "min": "* {{fieldName}} {{min}} basamaktan fazla veya eşit olmalıdır", + "name": "* {{fieldName}} yalnızca harf ve sayılardan oluşmalıdır", + "notFound": "*Bulunamadı", + "required": "* {{fieldName}} eksik!", + "reset-password-failed": "Şifreyi sıfırlama başarısız. Lütfen tekrar deneyin.", + "signin-failed": "Giriş başarısız. Lütfen tekrar deneyin.", + "signup-failed": "Kayıt başarısız. Lütfen tekrar deneyin.", + "taken": "* {{fieldName}} zaten var!", + "usedToken": "*Bu token zaten kullanıldı", + "username": "* {{fieldName}} yalnızca alt çizgi ve harfleri kabul eder", + "verification-code-invalid": "Bu doğrulama kodu geçersiz", + "verification-code-length": "Doğrulama kodu {{length}} basamaklı olmalıdır", + "verification-failed": "Doğrulama başarısız oldu. Lütfen tekrar deneyin.", + "verification-resend-failed": "Doğrulama kodunu yeniden gönderme başarısız oldu" + }, "exciting-updates": "Heyecan Verici Güncellemeler", "feedback": "Geri Bildirim", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "Çeviri yazı tipi boyutu" }, "footer": { - "description": "Kuran.com bir sadaka-i cariyedir. Herkesin Kur'an-ı Kerim'i okumasını, incelemesini ve öğrenmesini kolaylaştırmayı umuyoruz. Kur'an-ı Kerim'in Al-Quran Al-Kareem, Al-Ketab, Al-Furqan, Al-Maw'itha, Al-Thikr ve Al-Noor gibi birçok ismi vardır.", + "description": "Quran.com, dünya çapında milyonlarca kişinin Kuran'ı birden fazla dilde okumak, aramak, dinlemek ve üzerinde düşünmek için kullandığı güvenilir bir platformdur. Çeviriler, tefsirler, okumalar, kelime kelime çeviriler ve daha derin çalışma araçları sunarak Kuran'ı herkes için erişilebilir hale getirir.

    Bir Sadaka Jariyah olarak, Quran.com insanların Kuran ile derin bir bağ kurmasına yardımcı olmaya kendini adamıştır. 501(c)(3) kar amacı gütmeyen bir kuruluş olan Quran.Foundation tarafından desteklenen Quran.com, herkes için ücretsiz ve değerli bir kaynak olarak büyümeye devam ediyor, Elhamdülillah”", "hiring": "İşe alıyoruz! Kuran Vakfı ekibine katılın ve misyonumuza katkıda bulunun. Şimdi başvurun! ", "rights": "Her hakkı saklıdır", - "title": "Kur'an-ı Kerim'i okuyun, inceleyin ve öğrenin." + "title": "Kuran'ı Oku, Dinle, Araştır ve Üzerinde Düşün" }, "form": { "body": "Vücut", "code": "Doğrulama kodu", + "confirm-password": "Şifreyi Onayla", "email": "E-posta", "firstName": "İlk adı", "lastName": "Soy isim", - "title": "Başlık" + "password": "Şifre", + "title": "Başlık", + "username": "Kullanıcı adı", + "verification-code": "Doğrulama Kodu" }, "from": "İtibaren", + "fundraising-share-title": "Quran.com Bağış Toplamasını Paylaşın", "fundraising-sticky-banner": { "cta": "Bağış yapmak", "title": "En iyi günlerde ver!" @@ -217,6 +252,7 @@ "learn-more": "Daha fazla bilgi edinin", "learning-plans": "Öğrenme Planları", "less": "Daha az", + "lessons": "Dersler", "loading": "Yükleniyor", "login": "Oturum aç", "logout": "Çıkış Yap", @@ -250,6 +286,7 @@ "off": "Kapalı", "oldest": "En eski", "on": "Açık", + "our-projects": "Projelerimiz", "page": "Sayfa", "pages": "Sayfalar", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} / {{totalNumberOfResults}} arama sonucu", @@ -272,6 +309,7 @@ "privacy": "Gizlilik", "product-updates": "Ürün Güncellemeleri", "profile": "Profil", + "projects-desc": "Kuran Vakfı'nın sahip olduğu, yönettiği veya sponsor olduğu kar amacı gütmeyen projeler", "q-reflect": "KuranYansıtmak", "quran-com": "Quran.com", "quran-radio": "Kuran Radyo", @@ -287,6 +325,7 @@ "reciters": "Okuyucular", "reflect": "Yansıt", "reflections": "Yansımalar", + "reflections-and-lessons": "Düşünceler ve Dersler", "remove": "Kaldırmak", "rename": "Yeniden Adlandır", "retry": "Yeniden dene", @@ -296,10 +335,12 @@ "save-to-collection": "Koleksiyona Kaydet", "search-for": "'{{searchQuery}}' için arama yapın", "search-results": "{{count}} arama sonucu", + "search-results-no-count": "Arama Sonuçları", "search": { "filters": "Filtreler", "hint": "Aramayı deneyin", "jump-to": "Atla", + "more-results": "Daha fazla sonuç", "no-results": "Sonuç bulunamadı", "no-results-suggestion": "{{searchQuery}} \" için eşleşen bir arama sonucu bulamadık. farklı bir anahtar kelime aramayı deneyin.", "popular": "Popüler aramalar", @@ -340,8 +381,10 @@ "search-juz": "Cüz ara", "search-page": "Arama Sayfası", "search-surah": "Sure ara", + "search-verse": "Ayet Ara", "try-navigating-with": "İpucu: ile gezinmeyi deneyin" }, + "sign-in": "Giriş yap", "sitemap": "Site Haritası", "sort": { "ascending": "Artan", @@ -362,10 +405,6 @@ "tafsirs-desc": "{{ayahNumber}} {{surahName}} tefsirlerini güvenilir tefsir alimleri tarafından okuyun", "title": "Tefsir" }, - "tarteel": { - "app": "Tarteel uygulaması", - "name": "Tarteel.ai" - }, "terms-and-conditions": "Şartlar ve koşullar", "theme": "Tema", "themes": { @@ -400,13 +439,13 @@ "view": "Görüş", "voice": { "ask-permission": "Sesli Arama'yı kullanmaya başlamak için lütfen mikrofon iznini etkinleştirin", - "error": "Bir hata oluştu, lütfen tekrar deneyin", - "no-permission": "Mikrofon izinlerini etkinleştirmemişsiniz gibi görünüyor. Lütfen mikrofon izinlerini etkinleştirin ve tekrar deneyin", - "not-supported": "Tarayıcınız mikrofonu desteklemiyor gibi görünüyor. Lütfen farklı bir tarayıcı deneyin", + "error": "Bir hata oluştu, lütfen daha sonra tekrar deneyin.", + "no-permission": "Mikrofon izinlerinizin etkinleştirilmemiş gibi görünüyor. Lütfen mikrofon izinlerini etkinleştirin ve tekrar deneyin.", + "not-supported": "Tarayıcınız mikrofonu desteklemiyor gibi görünüyor. Lütfen farklı bir tarayıcı deneyin.", "suggest": "Lütfen okumaya başlayın, ayetiniz görünecektir.", "suggest-subtitle": "Arapça herhangi bir ayeti okuyun ve ayet görünecektir", "suggest-title": "Şimdi oku", - "voice-search-powered-by": "Sesli Aramayı Destekleyen" + "voice-search-powered-by": "Sesli Arama Powered by" }, "wbw": "Kelime kelime", "wbw-lang-summary": "Kelime kelime çeviri kaynağı: {{source}} . Bu kaynak ayet çeviri seçiminden bağımsızdır.", diff --git a/locales/tr/developers.json b/locales/tr/developers.json index 4c0d14f41f..cf3e6b82b1 100644 --- a/locales/tr/developers.json +++ b/locales/tr/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Quran.com ekibi", - "header": "Geliştirme Yardımı", - "issues-cta": "Herhangi bir sorunuz varsa ve bizimle iletişime geçmek isterseniz, bize yazın! Mümkün olan en kısa sürede size geri döneceğiz, inşaAllah.", - "issues-guide": "Tipik olarak, daha sonra ne üzerinde çalışılacağı, ne olacağı ve çözülmesi gereken hangi hataların mevcut olduğu konusunda kaynak olarak <0>Github projelerini<\/0> Örneğin <1>bu url<\/1> hataların listesi, yardıma ihtiyacımız olan şeyler ve gelecek özellikler içeriyor.", - "main-desc": "Esselamü aleyküm, Öncelikle Kuran.com'u ve projelerini geliştirmemize yardımcı olmak için gösterdiğiniz ilgi için çok teşekkür ederiz. Sizinle çalışmaktan heyecan duyuyoruz!", - "projects": { - "all": "Tamamı Github'da barındırılan bir dizi projemiz var. Hepsi <0>burada<\/0> . Özetlemek gerekirse:", - "q-android": "<0>Kuran Android<\/0>", - "q-api": "<0>Quran.com API'si<\/0> - Ruby on Rails ile yazılmıştır.", - "q-api-docs": "<0> Kuran.com API Belgeleri <\/0> - API belgeleri portalımız.", - "q-audio": "<0>Kuran Sesleri<\/0> ve <1>Kuran Sesleri mobil uygulamaları<\/1>", - "q-audio-segments": "<0>Kuran Ses Bölümleri<\/0>", - "q-ios": "<0>Kuran iOS<\/0>", - "q-next": "<0>Quran.com Önyüzü<\/0> - Next.js ile yazılmıştır.", - "q-v2": "<0>Quran.com<\/0> - Ruby on Rails ile yazılmıştır." - }, - "sub-main-desc": "Kuran.com'da gönüllü olarak çalışan geliştiriciler, tasarımcılar, ürün yöneticileri ve düşünürlerden oluşan bir ekibiz. Elhamdülillah Silikon Vadisi, Toronto ve BAE'deki bazı büyük şirketlerde çalışmaktan dolayı mutluyuz - ve bunun Ümmetimizin dinlerini öğrenme ve çalışması konusunda ilerlemesine yardımcı olmak için yapabileceğimiz en iyi şey olduğunu düşünüyoruz. Kuran.com'da çalışmak çok sevindirici ve Allah hepimizi (ve sizi) çabalarımız için ödüllendirsin.", - "thanks": "Okuduğunuz için teşekkürler! Bazı kodlar işlediğinizi görmek için sabırsızlanıyorum!" -} \ No newline at end of file + "footer": "- Quran.com ekibi", + "header": "Geliştirme Yardımı", + "issues-cta": "Herhangi bir sorunuz varsa ve bizimle iletişime geçmek isterseniz, bize yazın! Mümkün olan en kısa sürede size geri döneceğiz, inşaAllah.", + "issues-guide": "Tipik olarak, daha sonra ne üzerinde çalışılacağı, ne olacağı ve çözülmesi gereken hangi hataların mevcut olduğu konusunda kaynak olarak <0>Github projelerini Örneğin <1>bu url hataların listesi, yardıma ihtiyacımız olan şeyler ve gelecek özellikler içeriyor.", + "main-desc": "Esselamü aleyküm, Öncelikle Kuran.com'u ve projelerini geliştirmemize yardımcı olmak için gösterdiğiniz ilgi için çok teşekkür ederiz. Sizinle çalışmaktan heyecan duyuyoruz!", + "projects": { + "all": "Tamamı Github'da barındırılan bir dizi projemiz var. Hepsi <0>burada . Özetlemek gerekirse:", + "q-android": "<0>Kuran Android", + "q-api": "<0>Quran.com API'si - Ruby on Rails ile yazılmıştır.", + "q-api-docs": "<0> Kuran.com API Belgeleri - API belgeleri portalımız.", + "q-audio": "<0>Kuran Sesleri ve <1>Kuran Sesleri mobil uygulamaları", + "q-audio-segments": "<0>Kuran Ses Bölümleri", + "q-ios": "<0>Kuran iOS", + "q-next": "<0>Quran.com Önyüzü - Next.js ile yazılmıştır.", + "q-v2": "<0>Quran.com - Ruby on Rails ile yazılmıştır." + }, + "thanks": "Okuduğunuz için teşekkürler! Bazı kodlar işlediğinizi görmek için sabırsızlanıyorum!" +} diff --git a/locales/tr/home.json b/locales/tr/home.json index ccb36dacc6..7d49f657ee 100644 --- a/locales/tr/home.json +++ b/locales/tr/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "Kuran Hedeflerinize Ulaşın", + "begin": "Başlamak", + "chapters-and-verses": "Bölümler ve Ayetler", + "continue-read": "Okumaya devam et", + "explore-topics": "Konuları Keşfedin", + "first-time-reading": "Kuran'a yeni misiniz? Buradan başlayın ", + "know-someone": "Bu Ramazan 'te bizimle büyüyün", + "learning-plan": "Öğrenme Planları", + "listen-to-radio": "Kuran Radyosunu Dinle", + "my-quran": "Benim Kuran'ım", + "navigate-quran": "Kuran'da gezinin", "no-bookmarks": "Henüz yer işaretiniz yok", "no-recently-read": "Henüz okuma oturumunuz yok", "noble-quran": "Kur'an-ı Kerim", + "popular": "Popüler", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "Kuran Büyüme Yolculuğu" }, - "ramadan-activities-cta": " Haftalık okumalar, ilham verici podcast'ler ve düşünmeye yönelik bir çağrı için Küresel Kuran Takvimi <\/b> 'ni takip edin! <\/link>", + "qr-community": "Bugünün öne çıkan Ayetlerini ve Düşüncelerini okuyun", + "ramadan-activities-cta": " Haftalık okumalar, ilham verici podcast'ler ve düşünmeye yönelik bir çağrı için Küresel Kuran Takvimi 'ni takip edin! ", + "ramadan": { + "header": "Kuran ile Bağlantınızı Derinleştirecek Araçlar", + "title": "Ramazan'a hazır mısınız?" + }, "read-juz": "Cüz oku", "recently-read": "Son Okunanlar", - "revelation-order-disclaimer": "Bu görüş, Kuran'daki surelerin Hz. Muhammed ﷺ <\/hover> >'e indirildikleri zamana göre kronolojik sırasını gösterir. Kronoloji ilmî bir görüş konusudur ve bazı sûreler farklı zamanlarda bölümler halinde nazil olmuştur. Buradaki sıralama Tanzil.net <\/link> çalışmasına dayanmaktadır. [Not: Fâtiha'dan Nâs'a kadar derlenen Mushaf düzeni, icma meselesidir.]", + "revelation-order-disclaimer": "Bu görüş, Kuran'daki surelerin Hz. Muhammed >'e indirildikleri zamana göre kronolojik sırasını gösterir. Kronoloji ilmî bir görüş konusudur ve bazı sûreler farklı zamanlarda bölümler halinde nazil olmuştur. Buradaki sıralama Tanzil.net çalışmasına dayanmaktadır. [Not: Fâtiha'dan Nâs'a kadar derlenen Mushaf düzeni, icma meselesidir.]", + "see-more-learning-plans": "Daha Fazlasını Gör", + "set-custom-goal": "Bir Hedef Belirleyin", + "share-quran": { + "description": "Kuran'ı yeni öğrenenlere yaymaya yardımcı olun", + "title": "Kuran'ı paylaş!" + }, + "start-read": "Okumaya Başla", + "stay-consistent": "Serileri Takip Edin, Özel Hedefler Oluşturun, Tutarlı Kalın", "tab": { "bookmarks": "Yer imleri", "popular": "Popüler" diff --git a/locales/tr/learn.json b/locales/tr/learn.json index 439e386cf0..164012bf63 100644 --- a/locales/tr/learn.json +++ b/locales/tr/learn.json @@ -24,7 +24,9 @@ "feedback-success": "Geri bildiriminiz için teşekkür ederiz!", "your-feedback": "Görüşleriniz" }, + "help-about-reflection": "Yansıma özelliği hakkında yardım", "learn-duration": "Süre", + "learn-more": "Daha fazla bilgi edin", "learning-plan-material": "Öğrenme Planı Materyali", "learning-plan-meta-desc": "Bu Öğrenme Planı, Kuran'la etkileşim şeklinizi değiştirmenize yardımcı olacak, yolculuğunuza bugün başlayın!", "learning-plans-desc": "Kuran yolculuğunuzda büyümenizi sağlayacak takip edilmesi kolay derslerle bilginizi artırın.

    Bugün bir Öğrenme Planı başlatın! Bitiş çizgisine ulaşana kadar ilerlemeniz takip edilir.", @@ -34,9 +36,12 @@ "next-lesson": "Gelecek ders", "not-enrolled": "Henüz Öğrenim Planına kaydolmadınız.", "prev-lesson": "Önceki Ders", + "reflection-description-1": "\"Yansıma Ekle\"ye tıklamak sizi Kuran'a dair kişisel düşünceleri paylaşmak için bir platform olan QuranReflect'e götürecektir. Tefsir'in (bilimsel yorumlama) aksine, düşünceler ayetlerle ilgili kişisel içgörüler ve deneyimlerdir.", + "reflection-description-2": "Herkese açık olarak paylaşım yapmanız durumunda, düşünceleriniz moderasyon ekibi tarafından incelenecek ve QuranReflect topluluğuna görünür hale gelecektir.", "start-learning": "Öğrenmeye başla", "tabs": { "main": "Ana Detaylar", "syllabus": "Müfredat" - } + }, + "what-happens-when-you-click-add-reflection": "\"Yansıma Ekle\"ye tıkladığınızda ne olur?" } diff --git a/locales/tr/login.json b/locales/tr/login.json index ef7a1567e5..28e3e3c7b3 100644 --- a/locales/tr/login.json +++ b/locales/tr/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "Onay bekleniyor", + "back": "Geri", + "back-to-login": "Girişe geri dön", + "check-email-title": "Kaydı tamamlamak için e-postanızı kontrol edin", + "confirm": "Onaylamak", + "confirm-new-password-placeholder": "Yeni şifreyi onayla", + "confirm-password-placeholder": "Şifreyi onayla", + "continue": "Devam etmek", "continue-apple": "Apple ile devam et", "continue-email": "E-posta ile devam et", "continue-facebook": "Facebook ile devam", "continue-google": "Google ile devam", "email-placeholder": "E-posta Adresi", + "error": { + "email-required": "E-postanız eksik!", + "invalid-credentials": "Geçersiz E-posta veya şifre", + "invalid-email": "Geçersiz E-posta Biçimi!", + "login-failed": "Giriş başarısız. Lütfen tekrar deneyin.", + "password-required": "Şifre eksik!" + }, + "errors": { + "account-banned": "Üzgünüz, Hesabınız yasaklandı. Quran.Foundation ile iletişime geçin", + "badRequest": "*Geçersiz istek", + "banned": "*Üzgünüz, Hesabınız yasaklandı. Quran.Foundation ile iletişime geçin", + "confirm": "*Şifreyi onayla şifreyle uyuşmuyor", + "email": "*Geçersiz E-posta Biçimi!", + "exactLength": "*Değer tam uzunlukta olmalıdır", + "expiredToken": "*Bu token'ın süresi doldu", + "forgot-password-failed": "Şifre sıfırlama e-postası gönderilemedi. Lütfen tekrar deneyin.", + "immutable": "*Bu değer değiştirilemez", + "invalid": "*Bu {{fieldName}} geçersizdir", + "invalidEmailOrPassword": "*Geçersiz e-posta veya şifre", + "max": "* {{fieldName}} {{max}} basamaktan az veya eşit olmalıdır", + "min": "* {{fieldName}} {{min}} basamaktan fazla veya eşit olmalıdır", + "name": "* {{fieldName}} yalnızca harf ve sayılardan oluşmalıdır", + "notFound": "*Bulunamadı", + "required": "* {{fieldName}} eksik!", + "reset-password-failed": "Şifre sıfırlanamadı. Lütfen tekrar deneyin.", + "signin-failed": "Giriş başarısız. Lütfen tekrar deneyin.", + "signup-failed": "Kayıt başarısız. Lütfen tekrar deneyin.", + "taken": "* {{fieldName}} zaten var!", + "usedToken": "*Bu token zaten kullanıldı", + "username": "* {{fieldName}} yalnızca alt çizgi ve harfleri kabul eder", + "verification-code-invalid": "Bu doğrulama kodu geçersiz", + "verification-code-length": "Doğrulama kodu {{length}} basamaklı olmalıdır", + "verification-failed": "Doğrulama başarısız oldu. Lütfen tekrar deneyin.", + "verification-resend-failed": "Doğrulama kodunu yeniden gönderme başarısız oldu" + }, "feature-1": "Hedeflerinizi takip edin", "feature-2": "Okuma çizgilerini koruyun", "feature-3": "Koleksiyonlar oluşturun", "feature-4": "Verilerinizi tarayıcılar arasında senkronize edin", "feature-5": "Ve dahası!", "feature-6": " Yeni! Notlar ve Düşünceler", + "first-name-placeholder": "İlk adı", + "forgot-password": "Parolanızı mı unuttunuz", + "forgot-password-description": "E-posta adresinizi girin, size şifrenizi sıfırlama talimatlarını gönderelim.", + "forgot-password-success": "Şifre sıfırlama e-postası gönderildi! Lütfen gelen kutunuzu kontrol edin.", + "forgot-password-title": "Parolanızı mı unuttunuz?", + "last-name-placeholder": "Soy isim", "login-cta": "Giriş yapın veya şimdi kaydolun:", "login-error": { "AuthenticationError": "Kimlik doğrulama başarısız oldu. Lütfen daha sonra tekrar deneyiniz", + "BannedUserError": "Üzgünüz, Hesabınız yasaklandı. Quran.Foundation ile iletişime geçin.", "TokenExpiredError": "Oturumunuz kapatıldı, lütfen tekrar giriş yapın." }, "login-title": "Quran.com'a giriş yapın", + "new-password-placeholder": "Yeni Şifre", "other-options": "Diğer Oturum Açma Seçenekleri", + "password-placeholder": "Şifre", + "password-reset-success": "Şifre sıfırlama işlemi başarıyla gerçekleştirildi!", + "password-rules": { + "lowercase": "En az bir küçük harf", + "max-length": "En fazla 20 karakter", + "min-length": "En az 8 karakter", + "number": "En az bir sayı", + "special": "En az bir özel karakter (!@#$%^&*_-)", + "uppercase": "En az bir büyük harf" + }, "privacy-policy": "Gizliliğinizi korumak önceliğimizdir – Kaydolduğunuzda Gizlilik Politikamızı ve Şartlar ve koşullarımızı kabul etmiş olursunuz.", - "verify-code": "Sağlanan güvenlik kodunun aşağıdaki metinle eşleştiğini doğrulayın:" + "quran-text": "Kuran", + "quran-title": "Kuran.com", + "reflect-feature-1": "Kuran'ı düşünün", + "reflect-feature-2": "Gruplara Katılın", + "reflect-feature-3": "Başkalarıyla etkileşim kurun", + "reflect-feature-4": "Ve daha fazlası!", + "reset-password": "Şifreyi Sıfırla", + "reset-password-success": "Şifre sıfırlama işlemi başarıyla gerçekleştirildi!", + "set-new-password": "Yeni bir şifre belirleyin", + "sign-in": "Giriş yap", + "sign-in-or-sign-up": "Giriş yapın veya Kaydolun", + "sign-up": "Üye olmak", + "unified-registration-1": "Birleşik kayıt ", + "unified-registration-2": "Kuran.Vakfı", + "unified-registration-3": "Aşağıdaki web sitelerine erişiminiz olacak ", + "unified-registration-4": "Giriş bilgileriniz aracılığıyla.", + "username-placeholder": "Kullanıcı adı", + "verification-code-instruction": "Lütfen kaydı tamamlamak için e-postada verilen kodu girin", + "verification-code-resend": "E-postayı yeniden gönder", + "verification-code-resend-countdown": "Doğrulama e-postasını {{seconds}} saniye içinde tekrar gönder...", + "verification-code-sent": "Doğrulama kodu gönderildi!", + "verification-code-sent-to": "Az önce bir e-posta gönderdik", + "verification-code-spam-note": "E-posta almadınız mı? Spam klasörünüzü kontrol edin", + "verify-code": "Sağlanan güvenlik kodunun aşağıdaki metinle eşleştiğini doğrulayın:", + "welcome-description-1": "Birleşik kayıt", + "welcome-description-2": ".Temel", + "welcome-description-3": "Giriş bilgileriniz ile aşağıdaki web sitelerine erişim sağlayabileceksiniz.", + "welcome-title": "Hoş geldiniz" } diff --git a/locales/tr/onboarding.json b/locales/tr/onboarding.json index bf9eab86dc..b3fcd3c22a 100644 --- a/locales/tr/onboarding.json +++ b/locales/tr/onboarding.json @@ -87,10 +87,6 @@ "description": "Birden çok dilde çeşitli çeviriler arasından seçim yapın. İpucu: Birden fazla seçenek belirleyerek çevirileri karşılaştırın", "title": "Çeviriler" }, - "voice-search": { - "description": "Mikrofon simgesine dokunun ve aradığınız ayeti okuyun. Hızlı ipucu! Birinin nerede okuduğunu öğrenmek için (Örn. Teravih namazı) mikrofon simgesine dokunun. Bir veya iki ayet tespit edildikten sonra konumu bulmak için dur tuşuna basın", - "title": "Sesli Arama (Tarteel)" - }, "wbw-audio": { "description": "Sadece kelimenin üzerine tıklayarak her kelimeyi ayrı ayrı dinlemek için bu seçeneği seçin!", "title": "Kelimenin üzerine tıklayarak kelime kelime harf çevirisini dinleyin" diff --git a/locales/tr/question.json b/locales/tr/question.json index 17b978afed..fcb72bf741 100644 --- a/locales/tr/question.json +++ b/locales/tr/question.json @@ -1,4 +1,5 @@ { "q-and-a": "İlgili Sorular ve Cevaplar ", - "question": "Soru" + "question": "Soru", + "questions-meta-desc": "Kuran'ı daha iyi anlamanızı sağlayacak güvenilir cevapları keşfedin." } diff --git a/locales/tr/quick-links.json b/locales/tr/quick-links.json index e8590efa23..6a82c043b9 100644 --- a/locales/tr/quick-links.json +++ b/locales/tr/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "Kuran Hakkında", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "Düşünme Ramazanına Katılın", - "rahman": "Surah Ar-Rahman", - "sunnah": "Sünnet Hakkında ayetler", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "Kuran Hakkında", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "Kuran'da İsa", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "Düşünme Ramazanına Katılın", + "rahman": "Surah Ar-Rahman", + "sunnah": "Sünnet Hakkında ayetler", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "Ramazan nedir?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/tr/quran-reader.json b/locales/tr/quran-reader.json index a7c810845f..9c181eec1d 100644 --- a/locales/tr/quran-reader.json +++ b/locales/tr/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Hizb'in Başlangıcı", "include-translator": "Çevirmen adı dahil edilsin mi?", "juz-beginning": "Cüz'ün Başlangıcı", + "lessons-desc": "{ {{surahName}} {{ayahNumber}} } Ayetinin Kuran derslerini okuyun ve paylaşın", + "lessons-disclaimer": "Dersler, Kuran'ın kişisel içgörüleri ve yorumlarıdır. Yetkili olarak alınmaları amaçlanmamıştır.", + "lessons-not-available": "Bu ayet için gözden geçirilmiş ders bulunmamaktadır", "mad-2": "2 saniye bekle", "mad-2-4-6": "İzin verilen Maad 2 veya 4 veya 6 saniye", "mad-4-5": "Gerekli Maad 4 veya 5 saniye", diff --git a/locales/tr/radio.json b/locales/tr/radio.json index 489dd59137..abd2b50312 100644 --- a/locales/tr/radio.json +++ b/locales/tr/radio.json @@ -1,26 +1,27 @@ { - "change": "Değiştir", - "curated-station": { - "juz-amma": { - "description": "Kuran'ın son Cüz'ünü dinleyin", - "title": "Amma cüzü" - }, - "popular-recitations": { - "description": "Günlük küratörlü okuma akışı", - "title": "Popüler Anlatımlar" - }, - "surah-al-kahf": { - "description": "Kehf Suresini tekrarlı dinleyin", - "title": "Kehf Suresi" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "Hafızların küratörlüğünden sureler", - "title": "Yasin, Vakı'a, Mülk" - } + "change": "Değiştir", + "curated-station": { + "juz-amma": { + "description": "Kuran'ın son Cüz'ünü dinleyin", + "title": "Amma cüzü" }, - "curated-stations": "Veli İstasyonları", - "pause-radio": "Radyoyu Duraklat", - "play-radio": "Radyo Çal", - "radio-desc": "Çeşitli okuyucular tarafından Kur'an-ı Kerim'in kesintisiz güzel okunuşunu dinleyin.", - "reciter-stations": "Okuyucu İstasyonları" -} \ No newline at end of file + "popular-recitations": { + "description": "Günlük küratörlü okuma akışı", + "title": "Popüler Anlatımlar" + }, + "surah-al-kahf": { + "description": "Kehf Suresini tekrarlı dinleyin", + "title": "Kehf Suresi" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "Hafızların küratörlüğünden sureler", + "title": "Yasin, Vakı'a, Mülk" + } + }, + "curated-stations": "Veli İstasyonları", + "pause-radio": "Radyoyu Duraklat", + "play-radio": "Radyo Çal", + "radio-desc": "Çeşitli okuyucular tarafından Kur'an-ı Kerim'in kesintisiz güzel okunuşunu dinleyin.", + "reciter-stations": "Okuyucu İstasyonları", + "station": "İstasyon" +} diff --git a/locales/tr/reading-goal.json b/locales/tr/reading-goal.json index 7b285a62ac..6979e08895 100644 --- a/locales/tr/reading-goal.json +++ b/locales/tr/reading-goal.json @@ -1,132 +1,136 @@ { - "continue-reading": "Okumaya devam et", - "continuous": { - "description": "Hedefiniz, ilerlemenizi bir gün boyunca hesaplar", - "title": "bir süre boyunca" - }, - "create-plan": "Plan oluştur", - "create-reading-goal": "Hedef Oluştur", - "daily-progress": "Günlük İlerleme", - "daily": { - "description": "Hedefiniz her gün sıfırlanacak", - "title": "günlük hedef" - }, - "day-x": "Gün {{day}}", - "days": "günler", - "duration": "Süre (gün)", - "ending-chapter": "Bitiş Suresi", - "ending-verse": "Biten Ayah", - "examples-subtitle": "İşte ortak hedeflerin bir listesi. Kendi hedefinizi de oluşturabilirsiniz.", - "examples-title": "Önceden ayarlanmış bir hedef seçin veya kendi hedefinizi oluşturun", - "examples": { - "custom": { - "description": "Size uygun özel bir hedef belirleyin", - "title": "Gelenek" - }, - "khatm": { - "description": "Klasik bir Hatm golü. Günde 1 Cüz okuyun", - "title": "Kuran'ı 30 günde okuyun" - }, - "time": { - "description": "Yeni başlayanlar için basit bir hedef", - "title": "Günde 10 dakika okuyun" - }, - "year": { - "description": "Gelecek yıl boyunca Kuran'ı kendi hızınızda okuyun", - "title": "Bir yılda Kur'an oku" - } - }, - "frequency-tab": { - "description": "Hedefiniz her gün mü yoksa her gün mü sıfırlanmalı? Endişelenmeyin, seçtiğiniz sıklıktan bağımsız olarak ilerlemenizi takip edeceğiz.", - "title": "Hedefiniz için bir sıklık seçin" - }, - "goal-done": { - "description": "Herhangi bir ek okuma yine de kaydedilecektir.", - "title": "Bugünün hedefini tamamladınız" - }, - "goal-target": { - "description": "Hedefinizi tamamlamak için ne kadar süre, sayfa veya ayet okumalısınız?", - "title": "Hedefiniz için bir hedef belirleyin" - }, - "goal-type": { - "description": "Hedefiniz zamana mı, sayfalara mı yoksa özel bir aralığa mı (yani Kuran'ın 3 Cüz'ü) dayalı mı olmalı?", - "title": "Hedefiniz için bir kriter seçin" - }, - "goal-types": { - "pages": { - "description": "Hedefiniz sayfalara dayalı olacak", - "title": "Sayfalar" - }, - "range": { - "description": "Hedefiniz, özel bir dizi ayete dayalı olacaktır (bu bir Sure, bir Cüz ve hatta Kuran'ın tamamı olabilir)", - "title": "özel aralık" - }, - "time": { - "description": "Hedefiniz zamana dayalı olacak", - "title": "Zaman" - } - }, - "plus-x-more-days": { - "one": "+{{days}} gün daha", - "other": "+{{days}} gün daha" - }, - "preview-schedule": { - "description": "Hedefiniz böyle görünecek. Daha sonra her zaman değiştirebilirsiniz.", - "title": "İşte programınızın bir önizlemesi" - }, - "progress": { - "complete": "Bugünün hedefi tamamlandı 🎉", - "goal-complete": "Tüm hedefiniz tamamlandı 🎉", - "pages-goal": "Kuran'ın {{pages}} sayfasını oku", - "range-goal": "{{from}} ile {{to}} arasında oku", - "time-goal": "Kuran'ı {{time}} oku" - }, - "reading-goal": "Okuma Hedefi", - "reading-goal-description": "Kuran okuma hedeflerinizle tutarlılığı korumayı zor buluyor musunuz? Kuran Büyüme Yolculuğu, Kuran yolculuğunuzda tutarlı kalmanıza yardımcı olmak için geliştirilmiş dinamik bir özelliktir. Hedefiniz ister günde 10 dakika okumayı, ister bir ayda bir cüz tamamlamayı veya bir yılda Kuran'ın tamamını bitirmeyi vb. hedefleyin, Kuran.com artık özel bir hedef belirlemenize ve günlük okuma serilerinizi takip etmenize yardımcı olabilir. ilerleme kaydettikçe ayarlanıyor. Kullanımı tamamen ücretsizdir ve umarız hedefinize ulaşmak için motive olmanıza yardımcı olur!", - "reading-goal-label": "sen bir", - "reading-goal-title": "Karşınızda Kuran Büyüme Yolculuğu", - "recommended": "Tavsiye edilen", - "remaining": "Bugün için kalan", - "remaining-days": { - "one": "{{days}} gün kaldı", - "other": "{{days}} gün kaldı" - }, - "set-reading-goal-success": "Okuma hedefiniz başarıyla belirlendi.", - "start-journey": "Yolculuğunuza başlayın!", - "start-reading": "Okumaya başlamak", - "starting-chapter": "Başlangıç Suresi", - "starting-verse": "Ayah'a Başlamak", - "streak": "Rüzgâr gibi geçmek", - "streak-definition": "Bir çizgi, Kuran'ı arka arkaya okuduğunuz günlerin sayısıdır.", - "timeline-meaning": "Zaman çizelgeniz ne anlama geliyor?", - "timeline-states": { - "checked": "hedefini tamamladın", - "filled": "Bir şey okudunuz ama hedefinizi tamamlamak için yeterli değil", - "none": "O gün henüz hiçbir şey okumadın", - "stroked": "bugün hiçbir şey okumadın" - }, - "todays-goal": "bugünün hedefi", - "view-progress": "İlerlemeyi Görüntüle", - "week-progress": "Bu haftaki ilerleme", - "x-days": { - "one": "{{days}} gün", - "other": "{{days}} gün" - }, - "x-days-streak": "{{days}} günlük seri", - "x-hours": { - "one": "{{hours}} saat", - "other": "{{hours}} saat" - }, - "x-minutes": { - "one": "{{minutes}} dakika", - "other": "{{minutes}} dakika" - }, - "x-pages": { - "one": "{{pages}} sayfa", - "other": "{{pages}} sayfa" - }, - "x-seconds": { - "one": "{{seconds}} saniye", - "other": "{{seconds}} saniye" + "continue-reading": "Okumaya devam et", + "continuous": { + "description": "Hedefiniz, ilerlemenizi bir gün boyunca hesaplar", + "title": "bir süre boyunca" + }, + "create-plan": "Plan oluştur", + "create-reading-goal": "Hedef Oluştur", + "daily-progress": "Günlük İlerleme", + "daily-progress-completed": "Tamamlandı! 🎉", + "daily": { + "description": "Hedefiniz her gün sıfırlanacak", + "title": "günlük hedef" + }, + "day-x": "Gün {{day}}", + "days": "günler", + "duration": "Süre (gün)", + "ending-chapter": "Bitiş Suresi", + "ending-verse": "Biten Ayah", + "examples-subtitle": "İşte ortak hedeflerin bir listesi. Kendi hedefinizi de oluşturabilirsiniz.", + "examples-title": "Önceden ayarlanmış bir hedef seçin veya kendi hedefinizi oluşturun", + "examples": { + "custom": { + "description": "Size uygun özel bir hedef belirleyin", + "title": "Gelenek" + }, + "khatm": { + "description": "Klasik bir Hatm golü. Günde 1 Cüz okuyun", + "title": "Kuran'ı 30 günde okuyun" + }, + "time": { + "description": "Yeni başlayanlar için basit bir hedef", + "title": "Günde 10 dakika okuyun" + }, + "year": { + "description": "Gelecek yıl boyunca Kuran'ı kendi hızınızda okuyun", + "title": "Bir yılda Kur'an oku" + } + }, + "frequency-tab": { + "description": "Hedefiniz her gün mü yoksa her gün mü sıfırlanmalı? Endişelenmeyin, seçtiğiniz sıklıktan bağımsız olarak ilerlemenizi takip edeceğiz.", + "title": "Hedefiniz için bir sıklık seçin" + }, + "goal-completed": "Hedef Tamamlandı! 🎉 ", + "goal-done": { + "description": "Herhangi bir ek okuma yine de kaydedilecektir.", + "title": "Bugünün hedefini tamamladınız" + }, + "goal-target": { + "description": "Hedefinizi tamamlamak için ne kadar süre, sayfa veya ayet okumalısınız?", + "title": "Hedefiniz için bir hedef belirleyin" + }, + "goal-type": { + "description": "Hedefiniz zamana mı, sayfalara mı yoksa özel bir aralığa mı (yani Kuran'ın 3 Cüz'ü) dayalı mı olmalı?", + "title": "Hedefiniz için bir kriter seçin" + }, + "goal-types": { + "pages": { + "description": "Hedefiniz sayfalara dayalı olacak", + "title": "Sayfalar" + }, + "range": { + "description": "Hedefiniz, özel bir dizi ayete dayalı olacaktır (bu bir Sure, bir Cüz ve hatta Kuran'ın tamamı olabilir)", + "title": "özel aralık" + }, + "time": { + "description": "Hedefiniz zamana dayalı olacak", + "title": "Zaman" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "one": "+{{days}} gün daha", + "other": "+{{days}} gün daha" + }, + "preview-schedule": { + "description": "Hedefiniz böyle görünecek. Daha sonra her zaman değiştirebilirsiniz.", + "title": "İşte programınızın bir önizlemesi" + }, + "progress": { + "complete": "Bugünün hedefi tamamlandı 🎉", + "goal-complete": "Tüm hedefiniz tamamlandı 🎉", + "pages-goal": "Kuran'ın {{pages}} sayfasını oku", + "range-goal": "{{from}} ile {{to}} arasında oku", + "time-goal": "Kuran'ı {{time}} oku" + }, + "reading-goal": "Okuma Hedefi", + "reading-goal-description": "Kuran okuma hedeflerinizle tutarlılığı sürdürmeyi zor mu buluyorsunuz?

    Kuran Büyüme Yolculuğu, Kuran ile yolculuğunuzda tutarlı kalmanıza yardımcı olmak için geliştirilen dinamik bir özelliktir. İster günde 10 dakika okumayı, ister bir ayda bir Cüz'ü tamamlamayı veya bir yılda tüm Kuran'ı bitirmeyi hedefleyin, Quran.com artık özel bir hedef belirlemenize ve günlük okuma serilerinizi takip etmenize yardımcı olabilirken, siz ilerledikçe ayarlamalar yapabilir. Kullanımı tamamen ücretsizdir ve hedefinize ulaşmanız için motivasyonunuzu korumanıza yardımcı olmasını umuyoruz!", + "reading-goal-label": "sen bir", + "reading-goal-title": "Kuran Büyüme Yolculuğunun Tanıtımı", + "recommended": "Tavsiye edilen", + "remaining": "Bugün için kalan", + "remaining-base": "Geriye kalan", + "remaining-days": { + "one": "{{days}} gün kaldı", + "other": "{{days}} gün kaldı" + }, + "set-a-new-goal": "Yeni Bir Hedef Belirleyin", + "set-reading-goal-success": "Okuma hedefiniz başarıyla belirlendi.", + "start-journey": "Yolculuğunuza başlayın!", + "start-reading": "Okumaya başlamak", + "starting-chapter": "Başlangıç Suresi", + "starting-verse": "Ayah'a Başlamak", + "streak": "Rüzgâr gibi geçmek", + "streak-definition": "Bir çizgi, Kuran'ı arka arkaya okuduğunuz günlerin sayısıdır.", + "timeline-meaning": "Zaman çizelgeniz ne anlama geliyor?", + "timeline-states": { + "checked": "hedefini tamamladın", + "filled": "Bir şey okudunuz ama hedefinizi tamamlamak için yeterli değil", + "none": "O gün henüz hiçbir şey okumadın", + "stroked": "bugün hiçbir şey okumadın" + }, + "todays-goal": "bugünün hedefi", + "view-progress": "İlerlemeyi Görüntüle", + "week-progress": "Bu haftaki ilerleme", + "x-days": { + "one": "{{days}} gün", + "other": "{{days}} gün" + }, + "x-days-streak": "{{days}} günlük seri", + "x-hours": { + "one": "{{hours}} saat", + "other": "{{hours}} saat" + }, + "x-minutes": { + "one": "{{minutes}} dakika", + "other": "{{minutes}} dakika" + }, + "x-pages": { + "one": "{{pages}} sayfa", + "other": "{{pages}} sayfa" + }, + "x-seconds": { + "one": "{{seconds}} saniye", + "other": "{{seconds}} saniye" + } +} diff --git a/locales/tr/support.json b/locales/tr/support.json index 1c5b7e5637..1080cd65ba 100644 --- a/locales/tr/support.json +++ b/locales/tr/support.json @@ -1,27 +1,25 @@ { - "bug-a": "Lütfen bu hatayı <0>buradan<\/0> bildirin ve bu hatayı en kısa sürede düzelteceğiz inşaAllah.", - "bug-q": "Bir çeviri hatası buldum, nereye dosyalayabilirim?", - "developer-a": "Daha fazla bilgi için <0>geliştiriciler sayfasına<\/0> göz atın", - "developer-q": "Ben bir geliştiriciyim. Nasıl katkıda bulunabilirim?", - "donate-a": "Öncelikle, katkıda bulunmak için gösterdiğiniz ilgi için gerçekten teşekkür ederiz. <0>bu<\/0> bağlantısını ziyaret edin", - "donate-q": "Nasıl bağış yapabilirim?", - "download-a": "Ne yazık ki hayır. Henüz web sitemizi veya Kuran'ı bilgisayarınıza indirme işlevi sağlamıyoruz. Ancak çevrimdışı okuma için mobil uygulamamızı yükleyebilirsiniz.", - "download-q": "Kuran.com'u bilgisayarıma indirebilir miyim?", - "fiqh-a": "Kuran.com çevrimiçi bir okuma, dinleme ve çalışma aracıdır. Kuran.com'un arkasındaki ekip, yazılım mühendisleri, tasarımcılar ve ürün yöneticilerinden oluşur. Ne yazık ki, bu bizim beceri setimizin sınırlılığıdır, ekibin bir parçası olarak İslami, Fıkıh veya Fetva ile ilgili sorulara yardımcı olacak alimler, imamlar veya şeyhler yoktur. Bu soruların herhangi birini yanıtlamaktan kaçınıyoruz ve yerel imamınızla veya bir şeyhle konuşmanızı tavsiye ediyoruz.", - "fiqh-q": "İslami \/ Fıkıh \/ Fetva ile ilgili sorular", - "header": "Yardım ve Geri Bildirim", - "main-desc": "Sorunuzun daha önce yanıtlanıp yanıtlanmadığını görmek için lütfen SSS'yi kontrol edin. Gerekirse <0>bizimle iletişime geçebilirsiniz<\/0> & size en kısa sürede geri dönmek için elimizden gelenin en iyisini yapacağız, ancak küçük bir ekip olduğumuz için lütfen nazik olun.", - "mobile-a": "Evet! Daha fazla bilgi için <0>mobil uygulamalar sayfamızı<\/0> ziyaret edin.", - "mobile-q": "Kuran.com'un mobil uygulaması var mı?", - "other-languages-a": "Tercih ettiğiniz dili değiştirmek için her sayfanın sağ üst köşesinde bir açılır menü bulunur (sağdan sola dillerde sol üst köşe). Tercih ettiğiniz dili seçmek için bu açılır menüyü kullanın.", - "other-languages-q": "Siteye başka dillerde göz atabilir miyim?", - "reciters-a": "Bu okuyucu hakkında daha fazla bilgi gönderin <0>buraya<\/0>", - "reciters-q": "Daha fazla okuyucu ekleme", - "site-down-a": "Bu iyi değil! Site hiç çalışmıyorsa veya 'Üzgünüz, bir şeyler ters gitti' yazan beyaz bir ekran görüyorsanız, bunu <0>buradan<\/0> bildirirseniz memnun oluruz.", - "site-down-q": "Site çalışmadığında size nasıl iletirim?", - "support": "Destek", - "tafsir-a": "Evet, bazı tefsirlerimiz var. Her ayetin yanında gösterilen simgeye tıklayın, ardından tefsirlere tıklayın. Uygulama size mevcut tefsirlerin listesini gösterecektir. Okumak istediğiniz tefsire tıklayın.", - "tafsir-q": "Tefsir mevcut mu?", - "translations-a": "<0>burada<\/0> tüm ayrıntılarıyla yeni bir konu açın, çeviriye bağlantı verin ve bunu eklemek için elimizden gelenin en iyisini yapacağız.", - "translations-q": "Başka çeviriler ekleyin" -} \ No newline at end of file + "bug-a": "Lütfen bu hatayı <0>buradan bildirin ve bu hatayı en kısa sürede düzelteceğiz inşaAllah.", + "bug-q": "Bir çeviri hatası buldum, nereye dosyalayabilirim?", + "developer-a": "Daha fazla bilgi için <0>geliştiriciler sayfasına göz atın", + "developer-q": "Ben bir geliştiriciyim. Nasıl katkıda bulunabilirim?", + "donate-a": "Öncelikle, katkıda bulunmak için gösterdiğiniz ilgi için gerçekten teşekkür ederiz. <0>bu bağlantısını ziyaret edin", + "donate-q": "Nasıl bağış yapabilirim?", + "download-a": "Ne yazık ki hayır. Henüz web sitemizi veya Kuran'ı bilgisayarınıza indirme işlevi sağlamıyoruz. Ancak çevrimdışı okuma için mobil uygulamamızı yükleyebilirsiniz.", + "download-q": "Kuran.com'u bilgisayarıma indirebilir miyim?", + "header": "Yardım ve Geri Bildirim", + "main-desc": "Sorunuzun daha önce yanıtlanıp yanıtlanmadığını görmek için lütfen SSS'yi kontrol edin. Gerekirse <0>bizimle iletişime geçebilirsiniz & size en kısa sürede geri dönmek için elimizden gelenin en iyisini yapacağız, ancak küçük bir ekip olduğumuz için lütfen nazik olun.", + "mobile-a": "Evet! Uygulamaları indirmek için lütfen <0>Quran for Android veya <1>Quran iOS adresini ziyaret edin", + "mobile-q": "Kuran.com'un mobil uygulaması var mı?", + "other-languages-a": "Tercih ettiğiniz dili değiştirmek için her sayfanın sağ üst köşesinde bir açılır menü bulunur (sağdan sola dillerde sol üst köşe). Tercih ettiğiniz dili seçmek için bu açılır menüyü kullanın.", + "other-languages-q": "Siteye başka dillerde göz atabilir miyim?", + "reciters-a": "Bu okuyucu hakkında daha fazla bilgi gönderin <0>buraya", + "reciters-q": "Daha fazla okuyucu ekleme", + "site-down-a": "Bu iyi değil! Site hiç çalışmıyorsa veya 'Üzgünüz, bir şeyler ters gitti' yazan beyaz bir ekran görüyorsanız, bunu <0>buradan bildirirseniz memnun oluruz.", + "site-down-q": "Site çalışmadığında size nasıl iletirim?", + "support": "Destek", + "tafsir-a": "Evet, bazı tefsirlerimiz var. Her ayetin yanında gösterilen simgeye tıklayın, ardından tefsirlere tıklayın. Uygulama size mevcut tefsirlerin listesini gösterecektir. Okumak istediğiniz tefsire tıklayın.", + "tafsir-q": "Tefsir mevcut mu?", + "translations-a": "<0>burada tüm ayrıntılarıyla yeni bir konu açın, çeviriye bağlantı verin ve bunu eklemek için elimizden gelenin en iyisini yapacağız.", + "translations-q": "Başka çeviriler ekleyin" +} diff --git a/locales/ur/about.json b/locales/ur/about.json index ab5381d770..ad5dc0c59c 100644 --- a/locales/ur/about.json +++ b/locales/ur/about.json @@ -1,14 +1,42 @@ { "credits": { - "desc": "یہ پروجیکٹ بہت ساری اوپن سورس لائبریریوں اور پروجیکٹس کے بغیر ممکن نہیں ہوتا جو ہم نے استعمال کیے ہیں:", - "lokalize": "<0>Lokalize: ایک کمپیوٹر کی مدد سے ترجمہ کرنے کا نظام ہے جو پیداواریت اور معیار کی یقین دہانی پر توجہ دیتا ہے اور ایک ہموار مقامی کاری کا ورک فلو فراہم کرتا ہے۔", - "quran-align": "<0>Collin Fair: ایک ایسا ٹول ہے جو ریکارڈ شدہ قرآنی تلاوت کی الفاظ کی صحیح تقسیم پیدا کرتا ہے۔", - "quran-complex": "<0>QuranComplex: کنگ فہد گلیریئس قرآن پرنٹنگ کمپلیکس قرآن پاک اور اس کی علوم کی خدمت، اس کے معانی کے تراجم، اور قرآنی متن کو تحریف سے محفوظ رکھنے میں ایک رہنما ہے، جو طباعت، صوتی ریکارڈنگز، الیکٹرانک پبلشنگ اور ڈیجیٹل ایپلی کیشنز کے میدان میں جدید ٹیکنالوجیز کے بہترین استعمال کے ذریعے کام کرتا ہے۔", - "quran-enc": "<0>QuranEnc: ایک پورٹل ہے جو قرآن پاک کے معانی اور تفاسیر کے مفت اور معتبر تراجم دنیا کی کئی زبانوں میں پیش کرتا ہے۔", - "tanzil": "<0>Tanzil: ایک بین الاقوامی قرآنی پراجیکٹ ہے جس کا مقصد انتہائی تصدیق شدہ، درست قرآنی متن فراہم کرنا ہے۔", + "desc": "ہم ان تمام لوگوں کا شکریہ ادا کرتے ہیں جنہوں نے اس پروجیکٹ میں تعاون کیا اور تعاون کیا، دنیا بھر کے لاکھوں لوگوں تک قرآن کی رسائی میں مدد کی۔", + "lokalize": "<0>لوکلائز: ایک کمپیوٹر کی مدد سے ترجمہ کا نظام جو پیداواریت اور کوالٹی ایشورنس پر فوکس کرتا ہے اور ایک ہموار لوکلائزیشن ورک فلو فراہم کرتا ہے۔", + "quran-align": "<0>کولن فیئر: ریکارڈ شدہ قرآنی تلاوت کے الفاظ کی قطعی تقسیم پیدا کرنے کا ایک ٹول۔", + "quran-complex": "<0>قرآن کمپلیکس: کنگ فہد گلوریس قرآن پرنٹنگ کمپلیکس پرنٹنگ، آڈیو ایپلی کیشنز اور ڈیجیٹل پبلشنگ کے میدان میں جدید ٹیکنالوجیز کے بہترین استعمال کے ذریعے شاندار قرآن اور اس کے علوم کی خدمت، اس کے معانی کا ترجمہ کرنے اور قرآنی متن کو تحریف سے بچانے میں ایک رہنما ہے۔", + "quran-enc": "<0>QuranEnc: ایک پورٹل جس میں متعدد عالمی زبانوں میں عظیم قرآن کے معانی اور تفسیر کے مفت اور قابل اعتماد تراجم پیش کیے گئے ہیں۔", + "tanzil": "<0>تنزیل: ایک بین الاقوامی قرآنی پروجیکٹ جس کا مقصد انتہائی تصدیق شدہ قرآنی متن فراہم کرنا ہے۔", + "tarteel": "<0>ترتیل: AI سے چلنے والی قرآن حفظ کرنے والی ایپ۔ اسے بہتر طریقے سے حفظ کرنے میں آپ کی مدد کرنے کے لیے ڈیزائن کیا گیا ہے، چاہے آپ کوئی آیت تلاش کر رہے ہوں، اپنی پیشرفت کو ٹریک کر رہے ہوں، یا اپنی تلاوت کے ساتھ ساتھ چل رہے ہوں۔", "title": "کریڈٹس", - "vercel": "<0> Vercel : فرنٹ اینڈ ڈویلپرز کے لیے ایک ڈپلائمنٹ اور تعاون پلیٹ فارم ہے جو فرنٹ اینڈ ڈویلپر کو اولین حیثیت دیتا ہے، انہیں اعلی کارکردگی والی ویب سائٹس اور ایپلی کیشنز بنانے کے لیے جامع آلات فراہم کرتا ہے۔", - "zekr": "<0>Zekr: قرآن کے مطالعہ کے لیے ایک اوپن پلیٹ فارم ٹول ہے جو قرآن میں براؤزنگ اور تحقیق کے لیے استعمال ہوتا ہے۔" + "vercel": "<0>Vercel: فرنٹ اینڈ ڈیولپرز کے لیے ایک تعیناتی اور تعاون کا پلیٹ فارم ہے جو فرنٹ اینڈ ڈیولپر کو پہلے رکھتا ہے، انہیں اعلیٰ کارکردگی والی ویب سائٹس اور ایپلیکیشنز بنانے کے لیے جامع ٹولز فراہم کرتا ہے۔", + "zekr": "<0>ذکر: قرآن پر براؤزنگ اور تحقیق کے لیے ایک کھلا پلیٹ فارم قرآن مطالعہ ٹول" }, - "main-description": "Quran.com کی بنیاد 1995 میں رکھی گئی تھی۔ اس ویب سائٹ کا مقصد ہر کسی کے لیے قرآن کو پڑھنا، مطالعہ کرنا اور سیکھنا آسان بنانا ہے۔ یہ پروجیکٹ اوپن سورس ہے اور اسے بنیادی ٹیم کے ارکان اور <0>ترتیل ٹیم کے درمیان تعاون کے طور پر بنایا گیا ہے۔" + "global-effort": { + "desc": "دنیا بھر سے لاکھوں لوگ قرآن ڈاٹ کام پر اپنے بنیادی ڈیجیٹل قرآن کے وسائل کے طور پر انحصار کرتے ہیں۔ چاہے وہ تلاوت کرنے، غور کرنے، حفظ کرنے یا مطالعہ کرنے کے لیے آتے ہیں، ان کا ایک مشترکہ مقصد ہے: اللہ کے کلام سے جڑنے کی مخلصانہ خواہش۔ \\n جیسے جیسے ہم ترقی کرتے جارہے ہیں، ہم اس بات کو یقینی بنانے کے لیے پرعزم ہیں کہ Quran.com قرآن کے ساتھ مشغول ہونے کے خواہاں ہر شخص کے لیے ایک قابل اعتماد، قابل رسائی، اور خوبصورتی سے ڈیزائن کی گئی جگہ رہے۔", + "title": "ایک عالمی کوشش" + }, + "key-features": { + "desc": "Quran.com کو قرآن کے ساتھ مشغولیت کے ہر مرحلے میں مدد فراہم کرنے کے لیے ڈیزائن کیا گیا ہے - پڑھنے اور حفظ کرنے سے لے کر مطالعہ اور غور و فکر تک۔ ہماری خصوصیات میں شامل ہیں:", + "features": [ + "یوزر فرینڈلی قرآن انٹرفیس- کسی بھی ڈیوائس پر پڑھنے کا صاف اور بدیہی تجربہ۔", + "متعدد تراجم اور تفسیر - تفسیر کے ساتھ متعدد زبانوں میں تراجم تک رسائی۔", + "آڈیو تلاوتیں - لفظ بہ لفظ پیروی کرنے کی صلاحیت کے ساتھ عالمی شہرت یافتہ قاریوں کی اعلیٰ قسم کی تلاوتیں سنیں۔", + "اعلی درجے کی تلاش اور نیویگیشن - پورے قرآن میں موضوع یا مطلوبہ الفاظ کے لحاظ سے فوری طور پر آیات تلاش کریں۔", + "آیاہ بک مارکنگ اور نوٹس - آیات کو محفوظ کریں اور بعد میں حوالہ کے لیے ذاتی عکاسی لکھیں۔", + "Quran Reflect Integration - علماء اور افراد کے اشتراک کردہ مظاہر اور بصیرت کے ذریعے عالمی برادری کے ساتھ مشغول ہوں۔", + "پڑھنے کی پیشرفت سے باخبر رہنا اور اہداف – اپنے روزمرہ کے اہداف اور پڑھنے کی تاریخ پر نظر رکھیں", + "APIs for Developers - اسلامک ایپس اور R&D کو طاقت دینے کے لیے مواد اور خصوصیات تک مفت رسائی۔", + "اور بہت کچھ، الحمدللہ۔" + ], + "title": "کلیدی خصوصیات اور پیشکشیں" + }, + "main-description": "1995 میں اپنے قیام کے بعد سے، Quran.com قرآن کو ہر ایک کے لیے اس طریقے سے دستیاب کرنے کے لیے پرعزم ہے جو صاف، مستند اور آسانی سے منسلک ہو۔ ہر روز، دنیا بھر میں لاکھوں لوگ قرآن کو پڑھنے، سننے، مطالعہ کرنے اور اس پر غور کرنے کے لیے Quran.com کا رخ کرتے ہیں- خواہ وہ زندگی بھر کے طالب علم ہوں، اسکالرز ہوں، یا ابھی اپنے سفر کا آغاز کریں۔", + "our-mission": { + "desc": "قرآن پڑھنے، سمجھنے اور اس پر غور کرنے کے لیے ہے۔ ہمارا مشن ایک قابل اعتماد، اچھی طرح سے ڈیزائن کردہ، اور گہرائی سے افزودہ قرآنی تجربہ فراہم کر کے افراد اور کمیونٹیز تک رسائی اور ان کو بااختیار بنانے میں حائل رکاوٹوں کو دور کرنا ہے۔ ہمارا مقصد ہر اس شخص کے لیے ایک بھروسہ مند ذریعہ کے طور پر کام کرنا ہے جو قرآن کے ساتھ منسلک ہونا چاہتے ہیں، درستگی، وضاحت اور اخلاص کے اصولوں سے رہنمائی کرتے ہیں۔", + "title": "ہمارا مشن" + }, + "who-we-are": { + "desc": "Quran.com ایک وقف (اوقاف) ہے، جو ایک عوامی ٹرسٹ کے طور پر قائم کیا گیا ہے تاکہ اس بات کو یقینی بنایا جا سکے کہ قرآن سب کے لیے مفت اور تجارتی مفادات کے بغیر قابل رسائی رہے۔ اس کا انتظام Quran.Foundation، ایک 501(c)(3) غیر منافع بخش تنظیم کے ذریعے کیا جاتا ہے، جو دنیا کو اعلیٰ معیار کے، مستند قرآنی وسائل فراہم کرنے کے اپنے مشن کے ایک حصے کے طور پر Quran.com کو برقرار اور ترقی دیتی ہے۔ ہمارا عزم قرآن اور اس کے قارئین کی بہترین، خلوص اور ذمہ داری کے ساتھ خدمت کرنا ہے۔", + "title": "ہم کون ہیں۔" + } } diff --git a/locales/ur/apps.json b/locales/ur/apps.json index ea561c2274..54edf226b1 100644 --- a/locales/ur/apps.json +++ b/locales/ur/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "Quran.com کے بنیادی ڈویلپرز کی جانب سے، خوبصورت اور بغیر اشتہارات کے مصحف iOS اور Android ایپس آتی ہیں۔ اب چلتے پھرتے قرآن پڑھنا، حفظ کرنا، اور اپنے پسندیدہ قاریوں کو سننا آسان ہو گیا ہے۔", - "tarteel-desc": "ترتیل قرآن کی پہلی ایپ ہے جو آپ کی تلاوت کے ساتھ تعامل کرنے اور غلطیوں کو اجاگر کرنے کے لیے AI ٹولز کا استعمال کرتی ہے۔ آپ کے ہاتھوں کی ہتھیلی میں آواز کے ساتھ قرآن کا ساتھی، ترتیل آپ کو اعتماد کے ساتھ قرآن پڑھنے، تلاوت کرنے، حفظ کرنے اور سمجھنے میں مدد کرنے کے لیے دانائی کے ساتھ کام کرتا ہے! <0><0> ترتیل کو Quran.com کا بنیادی ڈویلپر ہونے کے ساتھ ساتھ ان کے بورڈ آف گورننس کا رکن ہونے پر فخر ہے۔" + "quran-desc": "Quran.com کے بنیادی ڈویلپرز کی جانب سے، خوبصورت اور بغیر اشتہارات کے مصحف iOS اور Android ایپس آتی ہیں۔ اب چلتے پھرتے قرآن پڑھنا، حفظ کرنا، اور اپنے پسندیدہ قاریوں کو سننا آسان ہو گیا ہے۔" } diff --git a/locales/ur/common.json b/locales/ur/common.json index 079d5c87b0..4397bcc197 100644 --- a/locales/ur/common.json +++ b/locales/ur/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "نیویگیشن", "no-nav-results": "کوئی نیویگیشن نتائج نہیں ہیں۔", - "placeholder": "آپ کیا پڑھنا چاہتے ہیں؟", - "powered-by": "وائس سرچ Tarteel.ai کے ذریعے چلتی ہے", + "placeholder": "قرآن کو تلاش کریں...", "recent-navigations": "حالیہ نیویگیشنز", "search-by-voice": "آواز کے ذریعے سرچ کریں۔", "try-navigating": "تک نیویگیٹ کرنے کی کوشش کریں۔" @@ -122,9 +121,11 @@ } }, "continue": "جاری رکھیں", + "contribute-to-our-mission": "ہمارے مشن میں اپنا حصہ ڈالیں۔", "copied": "کاپی ہو گیا۔", "copied-to-clipboard": "کلپ بورڈ پر کاپی ہو گیا۔", "copy": "کاپی", + "copylink": "لنک کاپی کریں۔", "counter": { "decrease": "کمی", "increase": "اضافہ" @@ -134,6 +135,7 @@ "developers": "ڈویلپرز", "display": "ڈسپلے", "donate": "عطیہ کریں۔", + "donate-now": "ابھی عطیہ کریں۔", "donate_monthly": "ماہانہ عطیہ کریں۔", "donate_once": "ایک بار عطیہ کریں۔", "edit": "ایڈٹ کریں", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*زیادہ سے زیادہ {{maxNumberOfVerses}} آیات", "ranges-wrong-order": "ابتدائی آیت ختم ہونے والی آیت سے پہلے ہونی چاہیے۔" }, + "errors": { + "account-banned": "معذرت، آپ کے اکاؤنٹ پر پابندی لگا دی گئی ہے۔ قرآن فاؤنڈیشن سے رابطہ کریں۔", + "badRequest": "*غلط درخواست", + "banned": "*معذرت، آپ کے اکاؤنٹ پر پابندی لگا دی گئی ہے۔ قرآن فاؤنڈیشن سے رابطہ کریں۔", + "confirm": "* تصدیق کریں کہ پاس ورڈ پاس ورڈ سے مماثل نہیں ہے۔", + "email": "*غلط ای میل فارمیٹ!", + "exactLength": "*قدر درست لمبائی ہونی چاہیے۔", + "expiredToken": "*اس ٹوکن کی میعاد ختم ہوگئی ہے۔", + "forgot-password-failed": "پاس ورڈ ری سیٹ ای میل بھیجنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔", + "immutable": "*اس قدر کو تبدیل نہیں کیا جا سکتا", + "invalid": "*یہ {{fieldName}} غلط ہے۔", + "invalidEmailOrPassword": "*غلط ای میل یا پاس ورڈ", + "max": "* {{fieldName}} {{max}} ہندسوں سے کم یا اس کے برابر ہونا چاہیے۔", + "min": "* {{fieldName}} {{min}} ہندسوں سے زیادہ یا برابر ہونا چاہیے۔", + "name": "* {{fieldName}} صرف حروف اور اعداد ہونے چاہئیں", + "notFound": "*نہیں ملا", + "required": "* {{fieldName}} غائب ہے!", + "reset-password-failed": "پاس ورڈ دوبارہ ترتیب دینے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔", + "signin-failed": "سائن ان ناکام ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", + "signup-failed": "سائن اپ ناکام ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", + "taken": "* {{fieldName}} پہلے سے موجود ہے!", + "usedToken": "*یہ ٹوکن پہلے ہی استعمال ہو چکا ہے۔", + "username": "* {{fieldName}} صرف انڈر سکور اور حروف قبول کریں۔", + "verification-code-invalid": "یہ توثیقی کوڈ غلط ہے۔", + "verification-code-length": "تصدیقی کوڈ {{length}} ہندسوں کا ہونا چاہیے۔", + "verification-failed": "تصدیق ناکام ہوگئی۔ براہ کرم دوبارہ کوشش کریں۔", + "verification-resend-failed": "توثیقی کوڈ دوبارہ بھیجنے میں ناکام" + }, "exciting-updates": "دلچسپ اپڈیٹس", "feedback": "رائے", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "ترجمہ فونٹ سائز" }, "footer": { - "description": "Quran.com ایک صدقہ جاریہ ہے۔ ہم امید کرتے ہیں کہ سب کے لیے قرآن پاک پڑھنا، مطالعہ کرنا، اور سیکھنا آسان ہو جائے۔ قرآن پاک کے بہت سے نام ہیں جن میں القرآن الكريم، الکتاب، الفرقان، الموعظة، الذکر، اور النور شامل ہیں۔", + "description": "Quran.com ایک قابل اعتماد پلیٹ فارم ہے جسے دنیا بھر کے لاکھوں افراد قرآن کو متعدد زبانوں میں پڑھنے، تلاش کرنے، سننے اور اس پر غور کرنے کے لیے استعمال کرتے ہیں۔ یہ ترجمے، تفسیر، تلاوت، لفظ بہ لفظ ترجمہ، اور گہرے مطالعہ کے اوزار فراہم کرتا ہے، جس سے قرآن کو ہر کسی کے لیے قابل رسائی بنایا جاتا ہے۔

    صدقہ جاریہ کے طور پر، Quran.com لوگوں کو قرآن کے ساتھ گہرا تعلق قائم کرنے میں مدد کرنے کے لیے وقف ہے۔ Quran.Foundation کے تعاون سے، ایک 501(c)(3) غیر منافع بخش تنظیم، Quran.com سب کے لیے ایک مفت اور قیمتی وسائل کے طور پر ترقی کرتا جا رہا ہے، الحمدللہ\"", "hiring": "ہم بھرتی کر رہے ہیں! قرآن فاؤنڈیشن ٹیم میں شامل ہوں اور ہمارے مشن میں اپنا حصہ ڈالیں۔ ابھی اپلائی کریں! ", "rights": "جملہ حقوق محفوظ ہیں", - "title": "قرآن كريم پڑھیں، مطالعہ کریں اور سیکھیں۔" + "title": "قرآن کو پڑھیں، سنیں، تلاش کریں اور اس پر غور کریں۔" }, "form": { "body": "متن", "code": "تصدیقی کوڈ", + "confirm-password": "پاس ورڈ کی تصدیق کریں۔", "email": "ای میل", "firstName": "پہلا نام", "lastName": "آخری نام", - "title": "عنوان" + "password": "پاس ورڈ", + "title": "عنوان", + "username": "صارف نام", + "verification-code": "تصدیقی کوڈ" }, "from": "سے", + "fundraising-share-title": "Quran.com فنڈ ریزنگ شیئر کریں۔", "fundraising-sticky-banner": { "cta": "عطیہ کریں۔", "title": "بہترین دنوں کے دوران دیں!" @@ -217,6 +252,7 @@ "learn-more": " مزيد جانیے", "learning-plans": "سیکھنے کے پلانز", "less": "کم", + "lessons": "اسباق", "loading": "لوڈ ہو رہا ہے۔", "login": "لاگ ان", "logout": "لاگ آوٹ", @@ -250,6 +286,7 @@ "off": "آف", "oldest": "قدیم ترین", "on": "آن", + "our-projects": "ہمارے پروجیکٹس", "page": "صفحہ", "pages": "صفحات", "pagination-summary": "{{currentResultNumber}} - {{endOfResultNumber}} کی {{totalNumberOfResults}} سرچ کے نتائج", @@ -272,6 +309,7 @@ "privacy": "رازداری", "product-updates": "پروڈکٹ اپڈیٹس", "profile": "پروفائل", + "projects-desc": "قرآن فاؤنڈیشن کے زیر ملکیت، زیر انتظام یا سپانسر شدہ غیر منافع بخش منصوبے", "q-reflect": "QuranReflect", "quran-com": "Quran.com", "quran-radio": "قرآن ریڈیو", @@ -287,6 +325,7 @@ "reciters": "قراء", "reflect": "تدبر کریں۔", "reflections": "تدبرات", + "reflections-and-lessons": "مظاہر اور اسباق", "remove": "ہٹا دیں۔", "rename": "نام تبدیل کریں۔", "retry": "دوبارہ کوشش کریں۔", @@ -296,10 +335,12 @@ "save-to-collection": "کلیکشن میں سيو کریں۔", "search-for": "'{{searchQuery}}' سرچ کریں", "search-results": "{{count}} سرچ کے نتائج", + "search-results-no-count": "تلاش کے نتائج", "search": { "filters": "فلٹرز", "hint": "سرچ کرنے کی کوشش کریں۔", "jump-to": "پر جائیں", + "more-results": "مزید نتائج", "no-results": "کوئی نتائج نہیں ملے", "no-results-suggestion": "\"{{searchQuery}}\" کے لیے کوئی مماثل سرچ کے نتائج نہیں مل سکے۔ براہ کرم کسی مختلف کلیدی لفظ کے ساتھ دوبارہ سرچ کریں۔", "popular": "مقبول سرچز", @@ -340,8 +381,10 @@ "search-juz": "پارہ سرچ کریں۔", "search-page": "صفحہ سرچ کریں۔", "search-surah": "سورہ سرچ کریں۔", + "search-verse": "آیت تلاش کریں۔", "try-navigating-with": "ٹپ: اس کے ساتھ نیویگیٹ کرنے کی کوشش کریں۔" }, + "sign-in": "سائن ان کریں۔", "sitemap": "سائٹ کا نقشہ", "sort": { "ascending": "صعودی", @@ -362,10 +405,6 @@ "tafsirs-desc": "سورہ {{surahName}} سورہ {{ayahNumber}} کی مختلف تفسیریں معتبر علماء کے ذریعہ پڑھیں", "title": "تفسیر" }, - "tarteel": { - "app": "ترتیل ایپ", - "name": "tarteel.ai" - }, "terms-and-conditions": "شرائط و ضوابط", "theme": "تھیم", "themes": { @@ -400,13 +439,13 @@ "view": "دیکھیں", "voice": { "ask-permission": "براہ کرم وائس سرچ شروع کرنے کے لیے مائیکروفون کی اجازت کو فعال کریں۔", - "error": "ایک خامی پیش آگئی ہے. کچھ دیر بعد دوبارہ کوشش کریں. یا ڈاؤن لوڈ کریں۔", - "no-permission": "ایسا لگتا ہے کہ آپ کے پاس مائیکروفون کی اجازتیں فعال نہیں ہیں۔ براہ کرم مائیکروفون کی اجازتوں کو فعال کریں اور دوبارہ کوشش کریں یا ڈاؤن لوڈ کریں", - "not-supported": "ایسا لگتا ہے کہ آپ کا براؤزر مائیکروفون کو سپورٹ نہیں کرتا ہے۔ براہ کرم مختلف براؤزر آزمائیں یا ڈاؤن لوڈ کریں۔", + "error": "ایک خرابی پیش آ گئی ہے، براہ کرم بعد میں دوبارہ کوشش کریں۔", + "no-permission": "ایسا لگتا ہے کہ آپ کے پاس مائیکروفون کی اجازتیں فعال نہیں ہیں۔ براہ کرم مائیکروفون کی اجازتوں کو فعال کریں اور دوبارہ کوشش کریں۔", + "not-supported": "ایسا لگتا ہے کہ آپ کا براؤزر مائیکروفون کو سپورٹ نہیں کرتا ہے۔ براہ کرم ایک مختلف براؤزر آزمائیں۔", "suggest": "براہ کرم تلاوت شروع کریں اور آپ کی آیت ظاہر ہو جائے گی۔", "suggest-subtitle": "کوئی بھی آیت عربی میں پڑھیں، اور آیت ظاہر ہو جائے گی۔", "suggest-title": "ابھی تلاوت کریں۔", - "voice-search-powered-by": "وائس سرچ پاورڈ بائی" + "voice-search-powered-by": "آواز کی تلاش بذریعہ تقویت یافتہ" }, "wbw": "لفظ بہ لفظ", "wbw-lang-summary": "لفظ بہ لفظ ترجمہ ماخذ: {{source}} ۔ یہ ماخذ آیت کے ترجمے کے انتخاب سے آزاد ہے۔", diff --git a/locales/ur/developers.json b/locales/ur/developers.json index a5dfbe4c96..9a27a4bb86 100644 --- a/locales/ur/developers.json +++ b/locales/ur/developers.json @@ -15,6 +15,5 @@ "q-next": "<0> Quran.com فرنٹ اینڈ - Next.js میں لکھا گیا ہے۔", "q-v2": "<0>Quran.com - روبی آن ریلز میں لکھا گیا۔" }, - "sub-main-desc": "ہم ڈویلپرز، ڈیزائنرز، پروڈکٹ مینیجرز اور مفکرین کی ایک ٹیم ہیں جو <0>ترتیل ٹیم کے ساتھ مل کر بہترین آن لائن قرآن پڑھنے کا تجربہ فراہم کرنے کے لیے کام کر رہے ہیں۔ الحمدللہ، ہمیں دنیا بھر کی کچھ عظیم کمپنیوں کے ساتھ کام کرنے کی سعادت حاصل ہوئی ہے - اور ہمیں محسوس ہوتا ہے کہ یہ کم سے کم ہے جو ہم اپنی امت کی تعلیم اور مذہب کے مطالعہ میں مدد کرنے کے لیے کر سکتے ہیں۔ Quran.com پر کام کرنا بہت اطمینان بخش ہے اور اللہ ہمیں (اور آپ کو) ہماری کوششوں کا اجر دے۔", "thanks": "ہم آپ کی کنٹریبیوشن کے منتظر ہیں!" } diff --git a/locales/ur/home.json b/locales/ur/home.json index ab9b440cc4..b1b7ba6fde 100644 --- a/locales/ur/home.json +++ b/locales/ur/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "اپنے قرآنی مقاصد کو حاصل کریں۔", + "begin": "شروع کریں", + "chapters-and-verses": "ابواب اور آیات", + "continue-read": "پڑھنا جاری رکھیں", + "explore-topics": "عنوانات دریافت کریں۔", + "first-time-reading": "قرآن میں نیا؟ یہاں سے شروع کریں ", + "know-someone": "ہمارے ساتھ اس رمضان بڑھائیں۔", + "learning-plan": "سیکھنے کے منصوبے", + "listen-to-radio": "قرآن ریڈیو سنیں۔", + "my-quran": "میرا قرآن", + "navigate-quran": "قرآن کو نیویگیٹ کریں۔", "no-bookmarks": "آپ کے پاس ابھی تک کوئی بک مارکس نہیں ہیں۔", "no-recently-read": "آپ کے پاس ابھی تک پڑھائ کا کوئی سیشن نہیں ہے۔", "noble-quran": "قرآن پاک", + "popular": "مقبول", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "قرآن کی ترقی کا سفر" }, - "ramadan-activities-cta": " ہفتہ وار پڑھنے، متاثر کن پوڈکاسٹس، اور عکاسی کے لیے کال کے لیے عالمی قرآنی کیلنڈر<\/ <\/b> پر عمل کریں! <\/link>", + "qr-community": "آج کی نمایاں آیات اور مظاہر پڑھیں", + "ramadan-activities-cta": " ہفتہ وار پڑھنے، متاثر کن پوڈکاسٹس، اور عکاسی کے لیے کال کے لیے عالمی قرآنی کیلنڈر پر عمل کریں! ", + "ramadan": { + "header": "قرآن کے ساتھ اپنے تعلق کو گہرا کرنے کے اوزار", + "title": "رمضان کے لیے تیار ہیں؟" + }, "read-juz": "پارہ پڑھیں", "recently-read": "حال ہی میں پڑھا گیا۔", - "revelation-order-disclaimer": "یہ ویو قرآن مجید میں سورتوں کی زمانی ترتیب دکھاتا ہے جو نبی محمد ﷺ<\/hover> پر نازل ہوئی تھیں۔ ترتیب زمانی علماء کی رائے کا موضوع ہے اور کچھ سورتیں مختلف اوقات میں حصوں میں نازل ہوئی تھیں۔ یہ ترتیب تنزیل<\/link> ڈاٹ نیٹ کے کام پر مبنی ہے۔ [نوٹ: الفاتحہ سے الناس تک مصحف کی ترتیب اجماع ہے۔]", + "revelation-order-disclaimer": "یہ ویو قرآن مجید میں سورتوں کی زمانی ترتیب دکھاتا ہے جو نبی محمد پر نازل ہوئی تھیں۔ ترتیب زمانی علماء کی رائے کا موضوع ہے اور کچھ سورتیں مختلف اوقات میں حصوں میں نازل ہوئی تھیں۔ یہ ترتیب تنزیل ڈاٹ نیٹ کے کام پر مبنی ہے۔ [نوٹ: الفاتحہ سے الناس تک مصحف کی ترتیب اجماع ہے۔]", + "see-more-learning-plans": "مزید دیکھیں", + "set-custom-goal": "ایک گول سیٹ کریں۔", + "share-quran": { + "description": "قرآن کو نئے سیکھنے والوں تک پہنچانے میں مدد کریں۔", + "title": "قرآن کو شیئر کریں!" + }, + "start-read": "پڑھنا شروع کریں۔", + "stay-consistent": "اسٹریکس کو ٹریک کریں، حسب ضرورت اہداف بنائیں، مستقل رہیں", "tab": { "bookmarks": "بک مارکس", "popular": "مقبول" diff --git a/locales/ur/learn.json b/locales/ur/learn.json index fd0f562633..0563a227a1 100644 --- a/locales/ur/learn.json +++ b/locales/ur/learn.json @@ -24,7 +24,9 @@ "feedback-success": "آپ کی رائے کا شکریہ!", "your-feedback": "آپ کی رائے" }, + "help-about-reflection": "عکاسی کی خصوصیت کے بارے میں مدد کریں۔", "learn-duration": "دورانیہ", + "learn-more": "مزید جانیں", "learning-plan-material": "سیکھنے کے پلان کا مواد", "learning-plan-meta-desc": "یہ سیکھنے کا پلان آپ کے قرآن کے ساتھ مشغول ہونے کے طریقے کو تبدیل کرنے میں مدد کرے گا، آج ہی اپنا سفر شروع کریں!", "learning-plans-desc": "آسانی سے سمجھنے والے اسباق کے ساتھ اپنے علم میں اضافہ کریں جو آپ کو قرآن کے ساتھ آپ کے سفر میں آگے بڑھاتے رہیں۔

    آج ہی سیکھنے کا پلان شروع کریں! آپ کی پیشرفت اس وقت تک ٹریک کی جاتی ہے جب تک کہ آپ ختم لائن تک نہ پہنچ جائیں۔", @@ -34,9 +36,12 @@ "next-lesson": "اگلا سبق", "not-enrolled": "آپ ابھی تک سیکھنے کے پلان میں داخل نہیں ہوئے ہیں۔", "prev-lesson": "پچھلا سبق", + "reflection-description-1": "\"Add Reflection\" پر کلک کرنا آپ کو QuranReflect پر لے جائے گا، جو کہ قرآن پر ذاتی مظاہر بانٹنے کا ایک پلیٹ فارم ہے۔ تفسیر (علمی تشریح) کے برعکس، مظاہر آیات سے متعلق ذاتی بصیرت اور تجربات ہیں۔", + "reflection-description-2": "اگر آپ عوامی طور پر پوسٹ کرتے ہیں، تو آپ کی عکاسی کا جائزہ ماڈریشن ٹیم کی طرف سے لیا جائے گا اور وہ QuranReflect کمیونٹی کے لیے مرئی ہو جائے گا۔", "start-learning": "سیکھنا شروع کریں۔", "tabs": { "main": "اہم تفصیلات", "syllabus": "نصاب" - } + }, + "what-happens-when-you-click-add-reflection": "جب آپ \"عکاس شامل کریں\" پر کلک کرتے ہیں تو کیا ہوتا ہے؟" } diff --git a/locales/ur/login.json b/locales/ur/login.json index 2fad36b567..75f72234c1 100644 --- a/locales/ur/login.json +++ b/locales/ur/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "تصدیق کا انتظار ہے", + "back": "پیچھے", + "back-to-login": "لاگ ان پر واپس جائیں۔", + "check-email-title": "سائن اپ مکمل کرنے کے لیے ای میل چیک کریں۔", + "confirm": "تصدیق کریں۔", + "confirm-new-password-placeholder": "نئے پاس ورڈ کی تصدیق کریں۔", + "confirm-password-placeholder": "پاس ورڈ کی تصدیق کریں۔", + "continue": "جاری رکھیں", "continue-apple": "ایپل کے ساتھ جاری رکھیں", "continue-email": "ای میل کے ساتھ جاری رکھیں", "continue-facebook": "فیس بک کے ساتھ جاری رکھیں", "continue-google": "گوگل کے ساتھ جاری رکھیں", "email-placeholder": "ای میل اڈریس", + "error": { + "email-required": "ای میل غائب ہے!", + "invalid-credentials": "غلط ای میل یا پاس ورڈ", + "invalid-email": "غلط ای میل فارمیٹ!", + "login-failed": "لاگ ان ناکام ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", + "password-required": "پاس ورڈ غائب ہے!" + }, + "errors": { + "account-banned": "معذرت، آپ کے اکاؤنٹ پر پابندی لگا دی گئی ہے۔ قرآن فاؤنڈیشن سے رابطہ کریں۔", + "badRequest": "*غلط درخواست", + "banned": "*معذرت، آپ کے اکاؤنٹ پر پابندی لگا دی گئی ہے۔ قرآن فاؤنڈیشن سے رابطہ کریں۔", + "confirm": "* تصدیق کریں کہ پاس ورڈ پاس ورڈ سے مماثل نہیں ہے۔", + "email": "*غلط ای میل فارمیٹ!", + "exactLength": "*قدر قطعی لمبائی ہونی چاہیے۔", + "expiredToken": "*اس ٹوکن کی میعاد ختم ہوگئی ہے۔", + "forgot-password-failed": "پاس ورڈ ری سیٹ ای میل بھیجنے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔", + "immutable": "*اس قدر کو تبدیل نہیں کیا جا سکتا", + "invalid": "*یہ {{fieldName}} غلط ہے۔", + "invalidEmailOrPassword": "*غلط ای میل یا پاس ورڈ", + "max": "* {{fieldName}} {{max}} ہندسوں سے کم یا اس کے برابر ہونا چاہیے۔", + "min": "* {{fieldName}} {{min}} ہندسوں سے زیادہ یا برابر ہونا چاہیے۔", + "name": "* {{fieldName}} صرف حروف اور اعداد ہونے چاہئیں", + "notFound": "*نہیں ملا", + "required": "* {{fieldName}} غائب ہے!", + "reset-password-failed": "پاس ورڈ دوبارہ ترتیب دینے میں ناکام۔ براہ کرم دوبارہ کوشش کریں۔", + "signin-failed": "سائن ان ناکام ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", + "signup-failed": "سائن اپ ناکام ہو گیا۔ براہ کرم دوبارہ کوشش کریں۔", + "taken": "* {{fieldName}} پہلے سے موجود ہے!", + "usedToken": "*یہ ٹوکن پہلے ہی استعمال ہو چکا ہے۔", + "username": "* {{fieldName}} صرف انڈر سکور اور حروف قبول کریں۔", + "verification-code-invalid": "یہ توثیقی کوڈ غلط ہے۔", + "verification-code-length": "توثیقی کوڈ {{length}} ہندسوں کا ہونا چاہیے۔", + "verification-failed": "تصدیق ناکام ہوگئی۔ براہ کرم دوبارہ کوشش کریں۔", + "verification-resend-failed": "توثیقی کوڈ دوبارہ بھیجنے میں ناکام" + }, "feature-1": "اپنے اہداف کو ٹریک کریں۔", "feature-2": "پڑھنے کی اسٹریک برقرار رکھیں", "feature-3": "کلیکشنز بنائیں", "feature-4": "اپنے ڈیٹا کو براؤزرز میں ہم آہنگ کریں۔", "feature-5": "اور مزید!", "feature-6": " جديد! نوٹس اور تدبرات", + "first-name-placeholder": "پہلا نام", + "forgot-password": "پاس ورڈ بھول گئے۔", + "forgot-password-description": "اپنا ای میل ایڈریس درج کریں اور ہم آپ کو اپنا پاس ورڈ دوبارہ ترتیب دینے کے لیے ہدایات بھیجیں گے۔", + "forgot-password-success": "پاس ورڈ ری سیٹ ای میل بھیج دیا گیا! براہ کرم اپنا ان باکس چیک کریں۔", + "forgot-password-title": "پاس ورڈ بھول گئے؟", + "last-name-placeholder": "آخری نام", "login-cta": "ابھی لاگ ان یا سائن اپ کریں:", "login-error": { "AuthenticationError": "تصدیق ناکام ہو گئی۔ براہ کرم بعد میں دوبارہ کوشش کریں۔", + "BannedUserError": "معذرت، آپ کے اکاؤنٹ پر پابندی لگا دی گئی ہے۔ قرآن فاؤنڈیشن سے رابطہ کریں۔", "TokenExpiredError": "آپ لاگ آؤٹ ہو چکے ہیں، براہ کرم دوبارہ لاگ ان کریں۔" }, "login-title": "Quran.com میں لاگ ان کریں۔", + "new-password-placeholder": "نیا پاس ورڈ", "other-options": "لاگ ان کے دیگر اختیارات", + "password-placeholder": "پاس ورڈ", + "password-reset-success": "پاس ورڈ کامیابی سے دوبارہ ترتیب دیا!", + "password-rules": { + "lowercase": "کم از کم ایک چھوٹے حرف", + "max-length": "زیادہ سے زیادہ 20 حروف", + "min-length": "کم از کم 8 حروف", + "number": "کم از کم ایک نمبر", + "special": "کم از کم ایک خاص کردار (!@#$%^&*_-)", + "uppercase": "کم از کم ایک بڑے حرف" + }, "privacy-policy": "آپ کی رازداری کا تحفظ ہماری ترجیح ہے – سائن اپ کرکے، آپ ہماری رازداری کی پالیسی اور شرائط و ضوابط سے رضامندی ظاہر کرتے ہیں۔", - "verify-code": "تصدیق کریں کہ فراہم کردہ سیکیورٹی کوڈ درج ذیل متن سے میل کھاتا ہے:" + "quran-text": "قرآن", + "quran-title": "Quran.com", + "reflect-feature-1": "قرآن میں غور و فکر کریں۔", + "reflect-feature-2": "گروپس میں شامل ہوں۔", + "reflect-feature-3": "دوسروں کے ساتھ تعامل کریں۔", + "reflect-feature-4": "اور مزید!", + "reset-password": "پاس ورڈ ری سیٹ کریں۔", + "reset-password-success": "پاس ورڈ کامیابی سے دوبارہ ترتیب دیا!", + "set-new-password": "نیا پاس ورڈ سیٹ کریں۔", + "sign-in": "سائن ان کریں۔", + "sign-in-or-sign-up": "سائن ان کریں یا سائن اپ کریں۔", + "sign-up": "سائن اپ کریں۔", + "unified-registration-1": "کی متحد رجسٹریشن ", + "unified-registration-2": "قرآن فاؤنڈیشن", + "unified-registration-3": ". آپ کو درج ذیل ویب سائٹس تک رسائی حاصل ہوگی۔ ", + "unified-registration-4": "آپ کے سائن ان کی تفصیلات کے ذریعے۔", + "username-placeholder": "صارف نام", + "verification-code-instruction": "سائن اپ مکمل کرنے کے لیے براہ کرم ای میل میں فراہم کردہ کوڈ درج کریں۔", + "verification-code-resend": "ای میل دوبارہ بھیجیں۔", + "verification-code-resend-countdown": "توثیقی ای میل {{seconds}} سیکنڈ میں دوبارہ بھیجیں...", + "verification-code-sent": "توثیقی کوڈ بھیجا گیا!", + "verification-code-sent-to": "ہم نے ابھی ایک ای میل بھیجی ہے۔", + "verification-code-spam-note": "ای میل موصول نہیں ہوئی؟ اپنے اسپام فولڈر کو چیک کریں۔", + "verify-code": "تصدیق کریں کہ فراہم کردہ سیکیورٹی کوڈ درج ذیل متن سے میل کھاتا ہے:", + "welcome-description-1": "کی متحد رجسٹریشن", + "welcome-description-2": ".فاؤنڈیشن", + "welcome-description-3": "آپ کو اپنی سائن ان تفصیلات کے ذریعے درج ذیل ویب سائٹس تک رسائی حاصل ہوگی۔", + "welcome-title": "میں خوش آمدید" } diff --git a/locales/ur/onboarding.json b/locales/ur/onboarding.json index e8cccacfe5..b791d2aee4 100644 --- a/locales/ur/onboarding.json +++ b/locales/ur/onboarding.json @@ -87,10 +87,6 @@ "description": "متعدد زبانوں میں متعدد تراجم میں سے انتخاب کریں۔ ٹپ: متعدد اختیارات کو منتخب کرکے ترجمہ کا موازنہ کریں۔", "title": "ترجمے" }, - "voice-search": { - "description": "مائیک آئیکن پر ٹیپ کریں اور وہ آیت پڑھیں جسے آپ سرچ کر رہے ہیں۔ جلدی ٹپ! یہ معلوم کرنے کے لیے کہ کوئی کہاں تلاوت کر رہا ہے (مثلاً تراویح کی نماز)، مائیک آئیکن پر ٹیپ کریں۔ ایک یا دو آیات کا پتہ چلنے کے بعد، مقام جاننے کے لیے اسٹاپ دبائیں۔", - "title": "وائس سرچ (ترتیل)" - }, "wbw-audio": { "description": "اس آپشن کو منتخب کریں تاکہ ہر لفظ کو الگ الگ سن سکیں، صرف لفظ پر کلک کریں!", "title": "لفظ پر کلک کرکے لفظ بہ لفظ ترجمہ سنیں۔" diff --git a/locales/ur/question.json b/locales/ur/question.json index ea8aa143e3..42ac9e5ed5 100644 --- a/locales/ur/question.json +++ b/locales/ur/question.json @@ -1,4 +1,5 @@ { "q-and-a": "سے متعلق سوالات اور جوابات ", - "question": "سوال" + "question": "سوال", + "questions-meta-desc": "قرآن کی اپنی سمجھ کو گہرا کرنے کے لیے قابل اعتماد جوابات تلاش کریں۔" } diff --git a/locales/ur/quick-links.json b/locales/ur/quick-links.json index 5c64bb5213..3e8a4a2110 100644 --- a/locales/ur/quick-links.json +++ b/locales/ur/quick-links.json @@ -1,6 +1,7 @@ { "about-quran": "قرآن کے بارے میں", "ayat-ul-kursi": "آیت الکرسی", + "jesus-in-quran": "قرآن میں عیسیٰ", "kahf": "سورہ الكهف", "mulk": "سورہ الملک", "muzzammil": "سورہ المزمل", @@ -8,5 +9,6 @@ "rahman": "سورہ الرحمان", "sunnah": "سنت کے بارے میں آیات", "waqiah": "سورہ الواقعة", + "what-is-ramadan": "رمضان کیا ہے؟", "yaseen": "سورہ یسین" } diff --git a/locales/ur/quran-reader.json b/locales/ur/quran-reader.json index b5eb7c6df1..6c0561c979 100644 --- a/locales/ur/quran-reader.json +++ b/locales/ur/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "حزب کا آغاز", "include-translator": "مترجم کا نام شامل کریں؟", "juz-beginning": "پارے کا آغاز", + "lessons-desc": "سورہ {{surahName}} کی آیت {{ayahNumber}} کے قرآنی اسباق پڑھیں اور شیئر کریں", + "lessons-disclaimer": "اسباق قرآن کی ذاتی بصیرت اور تشریحات ہیں۔ ان کا مقصد مستند کے طور پر لیا جانا نہیں ہے۔", + "lessons-not-available": "اس آیت کے لیے کوئی جائزہ سبق نہیں ہے۔", "mad-2": "مد طبعی (2 حرکات)", "mad-2-4-6": "مد جائز منفصل (2 یا 4 یا 6 حرکات)", "mad-4-5": "مد واجب متصل (4 یا 5 حرکات)", diff --git a/locales/ur/radio.json b/locales/ur/radio.json index 51afd89d7c..503f83e2ea 100644 --- a/locales/ur/radio.json +++ b/locales/ur/radio.json @@ -22,5 +22,6 @@ "pause-radio": "وقفہ لیں", "play-radio": "ریڈیو چلائیں۔", "radio-desc": "مختلف قاریوں کے ذریعہ قرآن پاک کی نان اسٹاپ خوبصورت تلاوت سنیں۔", - "reciter-stations": "قاریوں کے اسٹیشنز" + "reciter-stations": "قاریوں کے اسٹیشنز", + "station": "اسٹیشن" } diff --git a/locales/ur/reading-goal.json b/locales/ur/reading-goal.json index b46460f328..b7a23dd91d 100644 --- a/locales/ur/reading-goal.json +++ b/locales/ur/reading-goal.json @@ -7,6 +7,7 @@ "create-plan": "پلان بنائیں", "create-reading-goal": "ہدف بنائیں", "daily-progress": "روزانہ کی پیشرفت", + "daily-progress-completed": "مکمل! 🎉", "daily": { "description": "آپ کا ہدف ہر روز دوبارہ شروع ہوگا۔", "title": "روزانہ کا ہدف" @@ -40,6 +41,7 @@ "description": "کیا آپ کا ہدف ہر روز دوبارہ شروع ہونا چاہیے یا ہر کچھ دنوں میں؟ فکر نہ کریں، ہم آپ کی پیشرفت کو آپ کی منتخب کردہ تعدد سے قطع نظر ره كر ٹریک کریں گے۔", "title": "اپنے ہدف کے لیے تعدد کا انتخاب کریں۔" }, + "goal-completed": "مقصد مکمل ہو گیا! 🎉 ", "goal-done": { "description": "کسی بھی اضافی پڑھائ کو پھر بھی ریکارڈ کیا جائے گا۔", "title": "آپ نے آج کا ہدف مکمل کر لیا ہے۔" @@ -82,13 +84,17 @@ "time-goal": "{{time}} قرآن پڑھیں" }, "reading-goal": "پڑھائ کا ہدف", + "reading-goal-description": "کیا آپ کو اپنے قرآن پڑھنے کے اہداف کے ساتھ مستقل مزاجی برقرار رکھنا مشکل لگتا ہے؟

    قرآن کی ترقی کا سفر ایک متحرک خصوصیت ہے جو آپ کو قرآن کے ساتھ اپنے سفر پر مستقل رہنے میں مدد کرنے کے لیے تیار کی گئی ہے۔ چاہے آپ کا مقصد روزانہ 10 منٹ پڑھنا ہے، ایک مہینے میں ایک جز مکمل کرنا ہے، یا ایک سال میں پورا قرآن ختم کرنا ہے، وغیرہ، Quran.com اب آپ کو ایک حسب ضرورت ہدف مقرر کرنے اور آپ کی روزانہ پڑھنے کی لکیروں کو ٹریک کرنے میں مدد کر سکتا ہے، جب کہ آپ ترقی کرتے ہوئے ایڈجسٹ کرتے ہیں۔ یہ استعمال کرنے کے لیے مکمل طور پر مفت ہے اور ہمیں امید ہے کہ یہ آپ کو اپنے مقصد تک پہنچنے کے لیے متحرک رہنے میں مدد کرے گا!", "reading-goal-label": "آپ ایک پر ہیں۔", + "reading-goal-title": "پیش ہے قرآن کی ترقی کا سفر", "recommended": "تجویز کردہ", "remaining": "آج کے لیے باقی ہے۔", + "remaining-base": "باقی", "remaining-days": { "one": "{{days}} دن باقی ہے۔", "other": "{{days}} دن باقی ہیں۔" }, + "set-a-new-goal": "ایک نیا مقصد طے کریں۔", "set-reading-goal-success": "آپ کا پڑھائ کا ہدف کامیابی کے ساتھ مقرر کر دیا گیا ہے۔۔", "start-journey": "اپنا سفر شروع کریں!", "start-reading": "پڑھنا شروع کریں۔", diff --git a/locales/ur/support.json b/locales/ur/support.json index 24f874882f..412db3d09f 100644 --- a/locales/ur/support.json +++ b/locales/ur/support.json @@ -7,11 +7,9 @@ "donate-q": "میں کیسے عطیہ کر سکتا ہوں؟", "download-a": "بد قسمتی سے نہیں. ہم ابھی تک آپ کے کمپیوٹر پر اپنی ویب سائٹ یا قرآن کو ڈاؤن لوڈ کرنے کی فعالیت فراہم نہیں کرتے ہیں۔ تاہم، آپ آف لائن پڑھنے کے لیے ہماری موبائل ایپ انسٹال کر سکتے ہیں۔", "download-q": "کیا میں قرآن ڈاٹ کام کو اپنے کمپیوٹر پر ڈاؤن لوڈ کر سکتا ہوں؟", - "fiqh-a": "Quran.com ایک آن لائن پڑھنے، سننے اور مطالعہ کرنے کا ٹول ہے۔ Quran.com کے پیچھے ٹیم سافٹ ویئر انجینئرز، ڈیزائنرز اور پروڈکٹ مینیجر پر مشتمل ہے۔ بدقسمتی سے، یہ ہماری مہارت کی حد ہے کہ ہمارے پاس اسلامی، فقہ یا فتویٰ سے متعلق سوالات میں مدد کرنے کے لیے ٹیم کے حصے کے طور پر علماء، ائمہ یا شیخ نہیں ہیں۔ ہم ان میں سے کسی بھی سوال کا جواب دینے سے گریز کرنے کی کوشش کرتے ہیں اور آپ کو مشورہ دیتے ہیں کہ آپ کسی مسجد میں اپنے مقامی امام یا کسی شیخ سے بات کریں۔", - "fiqh-q": "اسلامی/ فقہ/ فتاویٰ سے متعلق سوالات", "header": "مدد اور رائے", "main-desc": "براہ کرم یہ دیکھنے کے لیے عمومی سوالات (FAQ) چیک کریں کہ آیا آپ کے سوال کا جواب پہلے ہی دیا گیا ہے۔ اگر ضروری ہو تو، آپ <0>ہم سے رابطہ کریں اور ہم اپنی پوری کوشش کریں گے کہ جتنی جلدی ہو سکے آپ کو جواب دیں، لیکن براہ کرم نوٹ کریں کہ ہم ایک چھوٹی سی ٹیم ہیں، لہذا براہ کرم مہربان اور شائستہ رہیں۔", - "mobile-a": "جی ہاں! مزید معلومات کے لیے براہ کرم ہماری <0>موبائل ایپس کا صفحہ ملاحظہ کریں۔", + "mobile-a": "جی ہاں! ایپس ڈاؤن لوڈ کرنے کے لیے براہ کرم <0>Android کے لیے قرآن یا <1>قرآن iOS ملاحظہ کریں۔", "mobile-q": "کیا Quran.com کی موبائل ایپ ہے؟", "other-languages-a": "اپنی پسندیدہ زبان تبدیل کرنے کے لیے، ہر صفحے کے اوپری دائیں کونے میں ایک ڈراپ ڈاؤن ہے (دائیں سے بائیں زبانوں کے لیے اوپری بائیں کونے میں)۔ اپنی پسندیدہ زبان منتخب کرنے کے لیے اس ڈراپ ڈاؤن کو استعمال کریں۔", "other-languages-q": "کیا میں دوسری زبانوں میں سائٹ کو براؤز کر سکتا ہوں؟", diff --git a/locales/zh/about.json b/locales/zh/about.json index bfac07f830..bde355c54a 100644 --- a/locales/zh/about.json +++ b/locales/zh/about.json @@ -1,14 +1,42 @@ { - "credits": { - "desc": "如果没有我们使用的许多开源库和项目,就不可能有这个项目:", - "lokalize": "<0>Lokalize<\/0>:一种计算机辅助翻译系统,专注于生产力和质量保证,并提供无缝的本地化工作流程。", - "quran-align": "<0>Collin Fair<\/0>:一种用于对记录的古兰经背诵进行精确单词分割的工具。", - "quran-complex": "<0>QuranComplex<\/0>: 法赫德国王古兰经印刷厂是使用印刷、录音、电子出版和数字应用领域的先进技术,服务于古兰经及其科学、翻译和保护古兰经文本免受歪曲的领导者。", - "quran-enc": "<0>《古兰经》合辑<\/0>:一个门户网站,提供免费和值得信赖的高贵古兰经的含义和解释的翻译,以多种世界语言提供。", - "tanzil": "<0>Tanzil<\/0>:一个国际古兰经项目,旨在提供经过高度验证的精确古兰经文本。", - "title": "学分", - "vercel": "<0>Vercel<\/0>:是面向前端开发人员的部署和协作平台,将前端开发人员放在首位,为他们提供构建高性能网站和应用程序的综合工具。", - "zekr": "<0>Zekr<\/0>:一个开放的平台古兰经学习工具,用于浏览和研究古兰经" - }, - "main-description": "Quran.com 成立于 1995 年,该网站旨在让任何人都能轻松地诵读和学习《古兰经》。Quran.com是开源项目,由项目核心团队与<0> Tarteel 团队<\/0>合作开发。" -} \ No newline at end of file + "credits": { + "desc": "我们向所有支持和贡献该项目的人表示感谢,帮助全世界数百万人能够阅读《古兰经》。", + "lokalize": "<0>Lokalize:一种计算机辅助翻译系统,注重生产力和质量保证,并提供无缝的本地化工作流程。", + "quran-align": "<0>Collin Fair:一种对录制的《古兰经》朗诵进行单词精确分割的工具。", + "quran-complex": "<0>QuranComplex:法赫德国王辉煌的古兰经印刷综合体在服务辉煌的古兰经及其科学、翻译其含义以及保护古兰经文本免遭扭曲方面处于领先地位,通过最佳地利用印刷、录音、电子出版和数字应用领域的先进技术。", + "quran-enc": "<0>QuranEnc:一个门户网站,提供世界多种语言中对尊贵的《古兰经》的含义和注释的免费且可靠的翻译。", + "tanzil": "<0>Tanzil:一个国际古兰经项目,旨在提供经过高度验证的精确古兰经文本。", + "tarteel": "<0>Tarteel:一款人工智能古兰经记忆应用。它旨在帮助您更聪明地记忆,无论您是在搜索经文、跟踪进度还是跟着朗诵。", + "title": "致谢", + "vercel": "<0>Vercel:是一个面向前端开发人员的部署和协作平台,它将前端开发人员放在首位,为他们提供构建高性能网站和应用程序的综合工具。", + "zekr": "<0>Zekr:一个开放平台的古兰经学习工具,用于浏览和研究古兰经" + }, + "global-effort": { + "desc": "世界各地数以百万计的人将 Quran.com 作为他们的主要数字《古兰经》资源。无论他们是来背诵、反思、记忆还是学习,他们都有一个共同的目的:真诚地渴望与真主的话语产生共鸣。__ \\n随着我们不断发展,我们仍致力于确保 Quran.com 仍然是一个值得信赖、方便访问且设计精美的空间,适合任何想要接触《古兰经》的人。", + "title": "全球努力" + }, + "key-features": { + "desc": "Quran.com 旨在支持与《古兰经》接触的每个阶段——从阅读和记忆到学习和反思。我们的功能包括:", + "features": [ + "用户友好的《古兰经》界面——在任何设备上都能提供干净、直观的阅读体验。", + "多种翻译和注释——可获得多种语言的翻译以及注释。", + "音频朗诵——聆听世界著名卡里 (Qaris) 的高质量朗诵,并可以逐字逐句地跟读。", + "高级搜索和导航——通过主题或关键词立即查找整部《古兰经》中的诗句。", + "阿亚书签和注释——保存诗句并写下个人感想,以供日后参考。", + "QuranReflect 整合——通过学者和个人分享的反思和见解与全球社区互动。", + "阅读进度跟踪和目标——跟踪你的每日目标和阅读历史", + "开发人员 API – 免费访问内容和功能,为伊斯兰应用程序和研发提供支持。", + "还有更多,Alhamdullilah。" + ], + "title": "主要功能与产品" + }, + "main-description": "自 1995 年成立以来,Quran.com 一直致力于以清晰、真实且易于理解的方式向所有人提供《古兰经》。每天,全球有数百万人访问 Quran.com 阅读、聆听、研究和思考《古兰经》——无论他们是终身学生、学者还是刚刚开始他们的旅程。", + "our-mission": { + "desc": "《古兰经》旨在供人阅读、理解和思考。我们的使命是通过提供可靠、精心设计且内容丰富的《古兰经》体验,消除获取《古兰经》的障碍,并赋予个人和社区力量。我们的目标是成为任何想要接触《古兰经》的人的可靠来源,并以准确、清晰和真诚为指导原则。", + "title": "我们的使命" + }, + "who-we-are": { + "desc": "Quran.com 是一家 waqf(捐赠基金),作为公共信托基金设立,旨在确保所有人都能免费阅读《古兰经》,且不涉及任何商业利益。它由 Quran.Foundation 管理,Quran.Foundation 是一家 501(c)(3) 非营利组织,该组织负责维护和发展 Quran.com,以履行其为世界提供高质量、正宗的《古兰经》资源的使命。我们承诺以卓越、真诚和负责任的态度为《古兰经》及其读者服务。", + "title": "我们是谁" + } +} diff --git a/locales/zh/apps.json b/locales/zh/apps.json index d9937bca6d..1a539b79eb 100644 --- a/locales/zh/apps.json +++ b/locales/zh/apps.json @@ -1,4 +1,3 @@ { - "quran-desc": "由 Quran.com 的核心开发人员提供的漂亮且无广告的 mushaf iOS 和 Android 应用程序。现在可以更轻松地在旅途中阅读古兰经,记住它,并聆听您最喜欢的朗诵者。", - "tarteel-desc": "Tarteel 是第一个使用 AI 工具与您的背诵互动并突出错误的古兰经应用程序。 Tarteel 是您掌中的语音引导的古兰经伴侣,直观地帮助您阅读、背诵、记忆和理解古兰经! <0><\/0><0><\/0> Tarteel 很自豪能够成为 Quran.com 的核心开发人员以及其管理委员会的成员。" -} \ No newline at end of file + "quran-desc": "由 Quran.com 的核心开发人员提供的漂亮且无广告的 mushaf iOS 和 Android 应用程序。现在可以更轻松地在旅途中阅读古兰经,记住它,并聆听您最喜欢的朗诵者。" +} diff --git a/locales/zh/common.json b/locales/zh/common.json index 4e5fccb617..a95ea834e3 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -102,8 +102,7 @@ "command-bar": { "navigations": "导航", "no-nav-results": "没有导航结果", - "placeholder": "你想读什么?", - "powered-by": "由 Tarteel.ai 提供支持的语音搜索", + "placeholder": "搜索《古兰经》...", "recent-navigations": "最近的导航", "search-by-voice": "语音搜索", "try-navigating": "尝试导航到" @@ -122,9 +121,11 @@ } }, "continue": "继续", + "contribute-to-our-mission": "为我们的使命做出贡献", "copied": "已复制", "copied-to-clipboard": "复制到剪贴板", "copy": "复制", + "copylink": "复制链接", "counter": { "decrease": "减少", "increase": "增加" @@ -134,6 +135,7 @@ "developers": "开发者", "display": "展示", "donate": "捐", + "donate-now": "立即捐款", "donate_monthly": "每月捐款", "donate_once": "捐赠一次", "edit": "编辑", @@ -157,6 +159,34 @@ "ranges-too-many-verses": "*最多{{maxNumberOfVerses}}个章节", "ranges-wrong-order": "起始诗句必须位于结束诗句之前。" }, + "errors": { + "account-banned": "抱歉,您的帐户已被禁止。联系 Quran.Foundation", + "badRequest": "*请求无效", + "banned": "*抱歉,您的帐户已被禁止。联系 Quran.Foundation", + "confirm": "*确认密码与密码不匹配", + "email": "*电子邮件格式无效!", + "exactLength": "*值的长度必须准确", + "expiredToken": "*此令牌已过期", + "forgot-password-failed": "无法发送密码重置电子邮件。请重试。", + "immutable": "*此值无法更改", + "invalid": "*此{{fieldName}}无效", + "invalidEmailOrPassword": "*邮箱或密码无效", + "max": "* {{fieldName}}必须小于或等于{{max}}位数字", + "min": "* {{fieldName}}必须大于或等于{{min}}位数字", + "name": "* {{fieldName}}只能为字母和数字", + "notFound": "*未找到", + "required": "* {{fieldName}}缺失!", + "reset-password-failed": "重置密码失败。请重试。", + "signin-failed": "登录失败。请重试。", + "signup-failed": "注册失败。请重试。", + "taken": "* {{fieldName}}已经存在!", + "usedToken": "*此令牌已被使用", + "username": "* {{fieldName}}仅接受下划线和字母", + "verification-code-invalid": "此验证码无效", + "verification-code-length": "验证码必须为{{length}}位数字", + "verification-failed": "验证失败。请重试。", + "verification-resend-failed": "重新发送验证码失败" + }, "exciting-updates": "令人兴奋的更新", "feedback": "反馈问题", "fonts": { @@ -179,20 +209,25 @@ "translation-font-size": "翻译字体大小" }, "footer": { - "description": "Quran.com是一项持久的施舍。我们希望每个人都能轻松地阅读和学习尊贵的《古兰经》。尊贵的古兰经有很多名字,包括 Al-Quran Al-Kareem、Al-Ketab、Al-Furqan、Al-Maw'itha、Al-Thikr 和 Al-Noor。", + "description": "Quran.com 是一个值得信赖的平台,全球数百万人使用它来阅读、搜索、聆听和思考多种语言的《古兰经》。它提供翻译、注释、朗诵、逐字翻译和深入研究的工具,让每个人都能接触到《古兰经》。

    作为 Sadaqah Jariyah,Quran.com 致力于帮助人们与《古兰经》建立深厚的联系。在 501(c)(3) 非营利组织 Quran.Foundation 的支持下,Quran.com 继续发展成为所有人的免费和宝贵资源,Alhamdullilah”", "hiring": "我们正在招聘!加入古兰经基金会团队并为我们的使命做出贡献。 立即申请! ", "rights": "版权所有", - "title": "阅读、学习和学习《古兰经》。" + "title": "阅读、聆听、探索并思考《古兰经》" }, "form": { "body": "身体", "code": "验证码", + "confirm-password": "确认密码", "email": "电子邮件", "firstName": "名", "lastName": "姓", - "title": "标题" + "password": "密码", + "title": "标题", + "username": "用户名", + "verification-code": "验证码" }, "from": "从", + "fundraising-share-title": "分享 Quran.com 筹款活动", "fundraising-sticky-banner": { "cta": "捐", "title": "在最好的日子里赠送!" @@ -217,6 +252,7 @@ "learn-more": "学到更多", "learning-plans": "学习计划", "less": "较少的", + "lessons": "课程", "loading": "加载中", "login": "登录", "logout": "登出", @@ -250,6 +286,7 @@ "off": "离开", "oldest": "最老的", "on": "在", + "our-projects": "我们的项目", "page": "页", "pages": "页面", "pagination-summary": "{{currentResultNumber}} - {{totalNumberOfResults}}搜索结果,共{{endOfResultNumber}}", @@ -272,6 +309,7 @@ "privacy": "隐私", "product-updates": "产品更新", "profile": "轮廓", + "projects-desc": "古兰经基金会拥有、管理或赞助的非营利项目", "q-reflect": "古兰经反射", "quran-com": "Quran.com", "quran-radio": "在线听古兰经", @@ -287,6 +325,7 @@ "reciters": "朗诵者", "reflect": "参悟", "reflections": "反思", + "reflections-and-lessons": "反思与教训", "remove": "消除", "rename": "改名", "retry": "重试", @@ -296,10 +335,12 @@ "save-to-collection": "保存到收藏", "search-for": "搜索 '{{searchQuery}}'", "search-results": "{{count}}搜索结果", + "search-results-no-count": "搜索结果", "search": { "filters": "过滤器", "hint": "尝试搜索", "jump-to": "跳到", + "more-results": "更多结果", "no-results": "未找到结果", "no-results-suggestion": "{{searchQuery}} ”的任何匹配搜索结果。尝试搜索不同的关键字。", "popular": "热门搜索", @@ -340,8 +381,10 @@ "search-juz": "按卷搜索", "search-page": "按页搜索", "search-surah": "按章搜索", + "search-verse": "搜索诗句", "try-navigating-with": "提示:尝试导航" }, + "sign-in": "登入", "sitemap": "网站地图", "sort": { "ascending": "正序", @@ -362,10 +405,6 @@ "tafsirs-desc": "阅读由值得信赖的 Tafsir 学者撰写的各种 Ayah {{ayahNumber}} of Surah {{surahName}}的 Tafsirs", "title": "经注" }, - "tarteel": { - "app": "Tarteel 应用程序", - "name": "Tarteel.ai" - }, "terms-and-conditions": "条款和条件", "theme": "主题", "themes": { @@ -400,13 +439,13 @@ "view": "看法", "voice": { "ask-permission": "请启用麦克风权限以开始使用语音搜索", - "error": "发生错误,请稍后重试。或下载", - "no-permission": "您似乎没有启用麦克风权限。请启用麦克风权限并重试或下载", - "not-supported": "您的浏览器似乎不支持麦克风。请尝试不同的浏览器或下载", + "error": "发生错误,请稍后重试。", + "no-permission": "您似乎未启用麦克风权限。请启用麦克风权限,然后重试。", + "not-supported": "您的浏览器似乎不支持麦克风。请尝试使用其他浏览器。", "suggest": "请开始诵读,经文就会显示", "suggest-subtitle": "用阿拉伯语背诵任何一节经文,这节经文就会出现", "suggest-title": "现在背诵", - "voice-search-powered-by": "语音搜索 技术支持单位" + "voice-search-powered-by": "语音搜索由" }, "wbw": "在单词下方显示其译文", "wbw-lang-summary": "逐字翻译来源: {{source}} 。此来源独立于诗歌翻译选择。", diff --git a/locales/zh/developers.json b/locales/zh/developers.json index 978efc5979..2d201a3e1f 100644 --- a/locales/zh/developers.json +++ b/locales/zh/developers.json @@ -1,20 +1,19 @@ { - "footer": "- Quran.com 团队", - "header": "开发帮助", - "issues-cta": "如果您有任何问题或想联系维护人员,只需写一个问题!我们会尽快回复您,inshAllah。", - "issues-guide": "通常,我们使用<0>Github 项目<\/0>作为下一步工作的来源,即将发生的事情以及存在哪些需要解决的错误。例如<1>这个 url<\/1>包含错误列表、我们需要帮助的事情以及即将推出的功能。", - "main-desc": "Asalamu Alykom,首先,非常感谢您有兴趣帮助我们开发 Quran.com 及其项目。我们很高兴与您合作!", - "projects": { - "all": "我们有许多项目都托管在 Github 上。您可以在<0>此处找到它们。 <\/0>但要概述它们:", - "q-android": "<0>古兰经安卓<\/0>", - "q-api": "<0>Quran.com API<\/0> - 用 Ruby on Rails 编写。", - "q-api-docs": "<0>Quran.com API 文档<\/0> - 我们的 API 文档门户。", - "q-audio": "<0>古兰经音频<\/0>和<1>古兰经音频移动应用<\/1>", - "q-audio-segments": "<0>古兰经音频片段<\/0>", - "q-ios": "<0>古兰经iOS<\/0>", - "q-next": "<0>Quran.com 前端<\/0> - 用 Next.js 编写。", - "q-v2": "<0>Quran.com<\/0> - 用 Ruby on Rails 编写。" - }, - "sub-main-desc": "我们是一个由开发人员、设计师、产品经理和思想家组成的团队,他们自愿在 Quran.com 上工作。 Alhamdulilah,我们有幸为硅谷、多伦多和阿联酋的一些伟大公司工作——我们认为这是帮助我们的乌玛在学习和研究他们的宗教方面能做的最起码的事情。在 Quran.com 上工作非常令人欣慰,愿真主因我们的努力而奖励我们所有人(并奖励您)。", - "thanks": "谢谢阅读!期待看到你提交一些代码!" -} \ No newline at end of file + "footer": "- Quran.com 团队", + "header": "开发帮助", + "issues-cta": "如果您有任何问题或想联系维护人员,只需写一个问题!我们会尽快回复您,inshAllah。", + "issues-guide": "通常,我们使用<0>Github 项目作为下一步工作的来源,即将发生的事情以及存在哪些需要解决的错误。例如<1>这个 url包含错误列表、我们需要帮助的事情以及即将推出的功能。", + "main-desc": "Asalamu Alykom,首先,非常感谢您有兴趣帮助我们开发 Quran.com 及其项目。我们很高兴与您合作!", + "projects": { + "all": "我们有许多项目都托管在 Github 上。您可以在<0>此处找到它们。 但要概述它们:", + "q-android": "<0>古兰经安卓", + "q-api": "<0>Quran.com API - 用 Ruby on Rails 编写。", + "q-api-docs": "<0>Quran.com API 文档 - 我们的 API 文档门户。", + "q-audio": "<0>古兰经音频和<1>古兰经音频移动应用", + "q-audio-segments": "<0>古兰经音频片段", + "q-ios": "<0>古兰经iOS", + "q-next": "<0>Quran.com 前端 - 用 Next.js 编写。", + "q-v2": "<0>Quran.com - 用 Ruby on Rails 编写。" + }, + "thanks": "谢谢阅读!期待看到你提交一些代码!" +} diff --git a/locales/zh/home.json b/locales/zh/home.json index 61fa479d72..92a1a4578d 100644 --- a/locales/zh/home.json +++ b/locales/zh/home.json @@ -1,7 +1,19 @@ { + "achieve-quran-goals": "实现您的《古兰经》目标", + "begin": "开始", + "chapters-and-verses": "章节和诗句", + "continue-read": "继续阅读", + "explore-topics": "探索主题", + "first-time-reading": "第一次阅读《古兰经》? 从这里开始", + "know-someone": "这个斋月与我们一起成长", + "learning-plan": "学习计划", + "listen-to-radio": "收听《古兰经》电台", + "my-quran": "我的古兰经", + "navigate-quran": "浏览古兰经", "no-bookmarks": "您还没有任何书签", "no-recently-read": "您还没有任何读书会", "noble-quran": "尊贵的古兰经", + "popular": "受欢迎的", "qgj": { "learning-plans": { "cta": { @@ -23,10 +35,23 @@ }, "title": "古兰经成长之旅" }, - "ramadan-activities-cta": "关注全球古兰经日历<\/b>获取每周阅读、启发性播客和反思呼吁! <\/link>", + "qr-community": "阅读今天的精选经文和感想", + "ramadan-activities-cta": "关注全球古兰经日历获取每周阅读、启发性播客和反思呼吁! ", + "ramadan": { + "header": "加深与《古兰经》联系的工具", + "title": "准备好迎接斋月了吗?" + }, "read-juz": "读朱兹", "recently-read": "最近阅读", - "revelation-order-disclaimer": "此视图显示古兰经中古兰经的时间顺序,基于它们被启示给先知穆罕默德 ﷺ <\/hover>的时间。年表是一个学术观点的主题,一些 Surahs 在不同的时间部分被揭示。此处的排序基于 Tanzil.net <\/link>的工作。 [注意:从 al-Fatiha 到 al-Nas 的编译 Mushaf 命令是一个共识问题。]", + "revelation-order-disclaimer": "此视图显示古兰经中古兰经的时间顺序,基于它们被启示给先知穆罕默德的时间。年表是一个学术观点的主题,一些 Surahs 在不同的时间部分被揭示。此处的排序基于 Tanzil.net 的工作。 [注意:从 al-Fatiha 到 al-Nas 的编译 Mushaf 命令是一个共识问题。]", + "see-more-learning-plans": "查看更多", + "set-custom-goal": "设定目标", + "share-quran": { + "description": "帮助向新学习者传播《古兰经》", + "title": "分享古兰经!" + }, + "start-read": "开始阅读", + "stay-consistent": "追踪连胜记录,创建自定义目标,保持一致", "tab": { "bookmarks": "书签", "popular": "受欢迎的" diff --git a/locales/zh/learn.json b/locales/zh/learn.json index d26d9c8134..06adb50fd6 100644 --- a/locales/zh/learn.json +++ b/locales/zh/learn.json @@ -24,7 +24,9 @@ "feedback-success": "感谢您的反馈意见!", "your-feedback": "您的反馈" }, + "help-about-reflection": "有关反射功能的帮助", "learn-duration": "期间", + "learn-more": "了解更多", "learning-plan-material": "学习计划材料", "learning-plan-meta-desc": "该学习计划将帮助您改变学习《古兰经》的方式,今天就开始您的旅程吧!", "learning-plans-desc": "通过简单易懂的课程来增长您的知识,让您在《古兰经》的旅程中不断成长。

    今天就开始制定学习计划!系统会跟踪您的进度,直到您到达终点线。", @@ -34,9 +36,12 @@ "next-lesson": "下一课", "not-enrolled": "您尚未加入学习计划 。", "prev-lesson": "上一课", + "reflection-description-1": "点击“添加反思”将带您进入 QuranReflect,这是一个分享个人对《古兰经》反思的平台。与 Tafsir(学术解释)不同,反思是与经文相关的个人见解和经验。", + "reflection-description-2": "如果您公开发布,您的反思将由审核团队审核,并向 QuranReflect 社区公开。", "start-learning": "开始学习", "tabs": { "main": "主要细节", "syllabus": "教学大纲" - } + }, + "what-happens-when-you-click-add-reflection": "当您点击“添加反射”时会发生什么?" } diff --git a/locales/zh/login.json b/locales/zh/login.json index 0b013ad887..13507ad891 100644 --- a/locales/zh/login.json +++ b/locales/zh/login.json @@ -1,23 +1,110 @@ { "awaiting-confirmation": "等待确认", + "back": "后退", + "back-to-login": "返回登录", + "check-email-title": "查看电子邮件以完成注册", + "confirm": "确认", + "confirm-new-password-placeholder": "确认新密码", + "confirm-password-placeholder": "确认密码", + "continue": "继续", "continue-apple": "继续使用苹果", "continue-email": "继续使用电子邮件", "continue-facebook": "继续使用 Facebook", "continue-google": "继续使用 Google", "email-placeholder": "电子邮件地址", + "error": { + "email-required": "電子郵件缺失!", + "invalid-credentials": "邮箱或密码无效", + "invalid-email": "电子邮件格式无效!", + "login-failed": "登录失败。请重试。", + "password-required": "缺少密码!" + }, + "errors": { + "account-banned": "抱歉,您的帐户已被禁止。联系 Quran.Foundation", + "badRequest": "*请求无效", + "banned": "*抱歉,您的帐户已被禁止。联系 Quran.Foundation", + "confirm": "*确认密码与密码不匹配", + "email": "*电子邮件格式无效!", + "exactLength": "*值的长度必须准确", + "expiredToken": "*此令牌已过期", + "forgot-password-failed": "无法发送密码重置电子邮件。请重试。", + "immutable": "*此值无法更改", + "invalid": "*此{{fieldName}}无效", + "invalidEmailOrPassword": "*邮箱或密码无效", + "max": "* {{fieldName}}必须小于或等于{{max}}位数字", + "min": "* {{fieldName}}必须大于或等于{{min}}位数字", + "name": "* {{fieldName}}只能为字母和数字", + "notFound": "*未找到", + "required": "* {{fieldName}}缺失!", + "reset-password-failed": "重置密码失败。请重试。", + "signin-failed": "登录失败。请重试。", + "signup-failed": "注册失败。请重试。", + "taken": "* {{fieldName}}已经存在!", + "usedToken": "*此令牌已被使用", + "username": "* {{fieldName}}仅接受下划线和字母", + "verification-code-invalid": "此验证码无效", + "verification-code-length": "验证码必须为{{length}}位数字", + "verification-failed": "验证失败。请重试。", + "verification-resend-failed": "重新发送验证码失败" + }, "feature-1": "追踪你的目标", "feature-2": "保持连续阅读", "feature-3": "创建收藏", "feature-4": "跨浏览器同步您的数据", "feature-5": "和更多!", "feature-6": "新! 笔记和思考", + "first-name-placeholder": "名", + "forgot-password": "忘记密码", + "forgot-password-description": "输入您的电子邮件地址,我们将向您发送重置密码的说明。", + "forgot-password-success": "密码重置电子邮件已发送!请检查您的收件箱。", + "forgot-password-title": "忘记密码?", + "last-name-placeholder": "姓", "login-cta": "立即登录或注册:", "login-error": { "AuthenticationError": "身份验证失败。请稍后再试", + "BannedUserError": "抱歉,您的帐户已被禁止。请联系 Quran.Foundation。", "TokenExpiredError": "您已登出,请重新登入。" }, "login-title": "登录 Quran.com", + "new-password-placeholder": "新密码", "other-options": "其他登录选项", + "password-placeholder": "密码", + "password-reset-success": "密码重置成功!", + "password-rules": { + "lowercase": "至少一个小写字母", + "max-length": "最多 20 个字符", + "min-length": "最少 8 个字符", + "number": "至少一个数字", + "special": "至少一个特殊字符 (!@#$%^&*_-)", + "uppercase": "至少一个大写字母" + }, "privacy-policy": "保护您的隐私是我们的首要任务——通过注册,您同意我们的隐私政策和条款和条件 。", - "verify-code": "验证提供的安全代码是否与以下文本匹配:" + "quran-text": "古兰经", + "quran-title": "古兰经网", + "reflect-feature-1": "反思《古兰经》", + "reflect-feature-2": "加入群组", + "reflect-feature-3": "与他人互动", + "reflect-feature-4": "还有更多!", + "reset-password": "重设密码", + "reset-password-success": "密码重置成功!", + "set-new-password": "设置新密码", + "sign-in": "登入", + "sign-in-or-sign-up": "登录或注册", + "sign-up": "报名", + "unified-registration-1": "统一登记 ", + "unified-registration-2": "古兰经基金会", + "unified-registration-3": ". 您将可以访问以下网站 ", + "unified-registration-4": "通过您的登录详细信息。", + "username-placeholder": "用户名", + "verification-code-instruction": "请输入电子邮件中提供的代码以完成注册", + "verification-code-resend": "重新发送电子邮件", + "verification-code-resend-countdown": "在{{seconds}}秒内重新发送验证电子邮件...", + "verification-code-sent": "验证码已发送!", + "verification-code-sent-to": "我们刚刚发送了一封电子邮件至", + "verification-code-spam-note": "没有收到电子邮件?检查您的垃圾邮件文件夹", + "verify-code": "验证提供的安全代码是否与以下文本匹配:", + "welcome-description-1": "统一登记", + "welcome-description-2": "。基础", + "welcome-description-3": "您将可以通过您的登录详细信息访问以下网站。", + "welcome-title": "欢迎来到" } diff --git a/locales/zh/onboarding.json b/locales/zh/onboarding.json index 9812ccbd0e..4555132bba 100644 --- a/locales/zh/onboarding.json +++ b/locales/zh/onboarding.json @@ -87,10 +87,6 @@ "description": "从多种语言的各种翻译中进行选择。提示:通过选择多个选项来比较翻译", "title": "翻译" }, - "voice-search": { - "description": "点击麦克风图标并背诵您正在搜索的经文。小建议!要发现有人在哪里背诵(例如 Taraweeh 祈祷),请点击麦克风图标。检测到一两节经文后,按停止键查找位置", - "title": "语音搜索(Tarteel)" - }, "wbw-audio": { "description": "选择此选项,只需单击单词即可单独收听每个单词!", "title": "点击单词即可收听逐字音译" diff --git a/locales/zh/question.json b/locales/zh/question.json index 75db5b5caf..977856c83e 100644 --- a/locales/zh/question.json +++ b/locales/zh/question.json @@ -1,4 +1,5 @@ { "q-and-a": "相关问题和解答 ", - "question": "问题" + "question": "问题", + "questions-meta-desc": "探索可靠的答案以加深您对《古兰经》的理解。" } diff --git a/locales/zh/quick-links.json b/locales/zh/quick-links.json index a50e736a71..8d825e7be0 100644 --- a/locales/zh/quick-links.json +++ b/locales/zh/quick-links.json @@ -1,12 +1,14 @@ { - "about-quran": "关于《古兰经》", - "ayat-ul-kursi": "Ayatul Kursi", - "kahf": "Surah Al Kahf", - "mulk": "Surah Al Mulk", - "muzzammil": "Surah Al Muzzammil", - "qr": "加入反省的斋月", - "rahman": "Surah Ar-Rahman", - "sunnah": "经文关于 圣训", - "waqiah": "Surah Al Waqi'ah", - "yaseen": "Surah Yaseen" -} \ No newline at end of file + "about-quran": "关于《古兰经》", + "ayat-ul-kursi": "Ayatul Kursi", + "jesus-in-quran": "古兰经中的耶稣", + "kahf": "Surah Al Kahf", + "mulk": "Surah Al Mulk", + "muzzammil": "Surah Al Muzzammil", + "qr": "加入反省的斋月", + "rahman": "Surah Ar-Rahman", + "sunnah": "经文关于 圣训", + "waqiah": "Surah Al Waqi'ah", + "what-is-ramadan": "什么是斋月?", + "yaseen": "Surah Yaseen" +} diff --git a/locales/zh/quran-reader.json b/locales/zh/quran-reader.json index 565523802d..0d9b76212a 100644 --- a/locales/zh/quran-reader.json +++ b/locales/zh/quran-reader.json @@ -30,6 +30,9 @@ "hizb-beginning": "Hizb的开始", "include-translator": "包括译者姓名?", "juz-beginning": "回到本卷开头", + "lessons-desc": "阅读并分享《古兰经》第{{surahName}} {{ayahNumber}} } 节的课程", + "lessons-disclaimer": "课程是个人对《古兰经》的见解和解读。不作为权威依据。", + "lessons-not-available": "此节经文没有复习过的课文", "mad-2": "马德 2秒", "mad-2-4-6": "允许Maad 2或4或6秒", "mad-4-5": "需要Maad 4或5秒", diff --git a/locales/zh/radio.json b/locales/zh/radio.json index e1f05de931..632fd87f1e 100644 --- a/locales/zh/radio.json +++ b/locales/zh/radio.json @@ -1,26 +1,27 @@ { - "change": "修改", - "curated-station": { - "juz-amma": { - "description": "聆听《古兰经》的最后一卷", - "title": "尤兹阿玛" - }, - "popular-recitations": { - "description": "每日精选的诵读", - "title": "广泛收听的诵读" - }, - "surah-al-kahf": { - "description": "重复听山洞章", - "title": "山洞章" - }, - "yaseen-alwaqiah-al-mulk": { - "description": "朗诵者策展的古兰经", - "title": "雅辛章、大事章、国权章" - } + "change": "修改", + "curated-station": { + "juz-amma": { + "description": "聆听《古兰经》的最后一卷", + "title": "尤兹阿玛" }, - "curated-stations": "策划站", - "pause-radio": "暂停播放", - "play-radio": "在线听古兰经", - "radio-desc": "聆听各种朗诵者不停优美地朗诵《古兰经》。", - "reciter-stations": "朗诵站" -} \ No newline at end of file + "popular-recitations": { + "description": "每日精选的诵读", + "title": "广泛收听的诵读" + }, + "surah-al-kahf": { + "description": "重复听山洞章", + "title": "山洞章" + }, + "yaseen-alwaqiah-al-mulk": { + "description": "朗诵者策展的古兰经", + "title": "雅辛章、大事章、国权章" + } + }, + "curated-stations": "策划站", + "pause-radio": "暂停播放", + "play-radio": "在线听古兰经", + "radio-desc": "聆听各种朗诵者不停优美地朗诵《古兰经》。", + "reciter-stations": "朗诵站", + "station": "车站" +} diff --git a/locales/zh/reading-goal.json b/locales/zh/reading-goal.json index 1fb190cba7..615821714b 100644 --- a/locales/zh/reading-goal.json +++ b/locales/zh/reading-goal.json @@ -1,125 +1,129 @@ { - "continue-reading": "继续阅读", - "continuous": { - "description": "您的目标将计算您在几天内的进度", - "title": "在一段时间内" - }, - "create-plan": "创建计划", - "create-reading-goal": "创建目标", - "daily-progress": "每日进度", - "daily": { - "description": "您的目标每天都会重置", - "title": "每日目标" - }, - "day-x": "第{{day}}天", - "days": "天", - "duration": "持续时间(天)", - "ending-chapter": "结束古兰经", - "ending-verse": "结束 Ayah", - "examples-subtitle": "以下是共同目标的列表。您也可以创建自己的目标。", - "examples-title": "选择一个预设目标或创建您自己的目标", - "examples": { - "custom": { - "description": "设定适合您的自定义目标", - "title": "风俗" - }, - "khatm": { - "description": "一个经典的 Khatm 目标。每天阅读 1 Juz", - "title": "在 30 天内阅读古兰经" - }, - "time": { - "description": "一个简单的初学者友好的目标", - "title": "每天阅读10分钟" - }, - "year": { - "description": "明年按照自己的节奏阅读《古兰经》", - "title": "一年内阅读古兰经" - } - }, - "frequency-tab": { - "description": "您的目标应该每天重置还是每隔几天重置一次?别担心,无论您选择的频率如何,我们都会跟踪您的进度。", - "title": "为您的目标选择一个频率" - }, - "goal-done": { - "description": "任何额外的读数仍将被记录", - "title": "你完成了今天的目标" - }, - "goal-target": { - "description": "您应该阅读多少时间、页数或经文来完成您的目标?", - "title": "为你的目标设定目标" - }, - "goal-type": { - "description": "您的目标应该基于时间、页数还是自定义范围(即 3 Juzs of the Quran)?", - "title": "为您的目标选择一个标准" - }, - "goal-types": { - "pages": { - "description": "您的目标将基于页面", - "title": "页数" - }, - "range": { - "description": "您的目标将基于一系列自定义的经文(这可以是古兰经、经文,甚至是整本古兰经)", - "title": "自定义范围" - }, - "time": { - "description": "你的目标将取决于时间", - "title": "时间" - } - }, - "plus-x-more-days": { - "other": "+{{days}} 天" - }, - "preview-schedule": { - "description": "这就是您的目标的样子。您以后可以随时更改它。", - "title": "这是您的日程安排的预览" - }, - "progress": { - "complete": "今天的目标完成啦🎉", - "goal-complete": "您的整个目标已完成 🎉", - "pages-goal": "阅读《古兰经》的{{pages}}页", - "range-goal": "阅读{{from}}到{{to}}", - "time-goal": "阅读《古兰经》 {{time}}" - }, - "reading-goal": "阅读目标", - "reading-goal-description": "您是否觉得与古兰经阅读目标保持一致具有挑战性? 《古兰经成长之旅》是一项动态功能,旨在帮助您在《古兰经》的旅程中保持一致。无论您的目标是每天阅读 10 分钟、在一个月内完成一个 Juz 还是在一年内完成整个古兰经等,Quran.com 现在都可以帮助您设定自定义目标并跟踪您的每日阅读记录,同时随着您的进步进行调整。它完全免费使用,我们希望它能帮助您保持实现目标的动力!", - "reading-goal-label": "你在一个", - "reading-goal-title": "介绍古兰经成长之旅", - "recommended": "受到推崇的", - "remaining": "今天剩余", - "remaining-days": { - "other": "还剩 {{days}} 天" - }, - "set-reading-goal-success": "您的阅读目标已成功设定。", - "start-journey": "开始你的旅程!", - "start-reading": "开始阅读", - "starting-chapter": "开始古兰经", - "starting-verse": "启动 Ayah", - "streak": "条纹", - "streak-definition": "连胜是您连续阅读《古兰经》的天数。", - "timeline-meaning": "你的时间表是什么意思?", - "timeline-states": { - "checked": "你已经完成了你的目标", - "filled": "您已经阅读了一些内容,但还不足以完成您的目标", - "none": "那天你还没有读过任何东西", - "stroked": "你今天什么都没读" - }, - "todays-goal": "今天的目标", - "view-progress": "查看进度", - "week-progress": "本周进展", - "x-days": { - "other": "{{days}} 天" - }, - "x-days-streak": "{{days}}天连续", - "x-hours": { - "other": "{{hours}} 小时" - }, - "x-minutes": { - "other": "{{minutes}} 分钟" - }, - "x-pages": { - "other": "{{pages}} 页数" - }, - "x-seconds": { - "other": "{{seconds}} 秒" + "continue-reading": "继续阅读", + "continuous": { + "description": "您的目标将计算您在几天内的进度", + "title": "在一段时间内" + }, + "create-plan": "创建计划", + "create-reading-goal": "创建目标", + "daily-progress": "每日进度", + "daily-progress-completed": "完成!🎉", + "daily": { + "description": "您的目标每天都会重置", + "title": "每日目标" + }, + "day-x": "第{{day}}天", + "days": "天", + "duration": "持续时间(天)", + "ending-chapter": "结束古兰经", + "ending-verse": "结束 Ayah", + "examples-subtitle": "以下是共同目标的列表。您也可以创建自己的目标。", + "examples-title": "选择一个预设目标或创建您自己的目标", + "examples": { + "custom": { + "description": "设定适合您的自定义目标", + "title": "风俗" + }, + "khatm": { + "description": "一个经典的 Khatm 目标。每天阅读 1 Juz", + "title": "在 30 天内阅读古兰经" + }, + "time": { + "description": "一个简单的初学者友好的目标", + "title": "每天阅读10分钟" + }, + "year": { + "description": "明年按照自己的节奏阅读《古兰经》", + "title": "一年内阅读古兰经" + } + }, + "frequency-tab": { + "description": "您的目标应该每天重置还是每隔几天重置一次?别担心,无论您选择的频率如何,我们都会跟踪您的进度。", + "title": "为您的目标选择一个频率" + }, + "goal-completed": "目标完成!🎉 ", + "goal-done": { + "description": "任何额外的读数仍将被记录", + "title": "你完成了今天的目标" + }, + "goal-target": { + "description": "您应该阅读多少时间、页数或经文来完成您的目标?", + "title": "为你的目标设定目标" + }, + "goal-type": { + "description": "您的目标应该基于时间、页数还是自定义范围(即 3 Juzs of the Quran)?", + "title": "为您的目标选择一个标准" + }, + "goal-types": { + "pages": { + "description": "您的目标将基于页面", + "title": "页数" + }, + "range": { + "description": "您的目标将基于一系列自定义的经文(这可以是古兰经、经文,甚至是整本古兰经)", + "title": "自定义范围" + }, + "time": { + "description": "你的目标将取决于时间", + "title": "时间" } -} \ No newline at end of file + }, + "plus-x-more-days": { + "other": "+{{days}} 天" + }, + "preview-schedule": { + "description": "这就是您的目标的样子。您以后可以随时更改它。", + "title": "这是您的日程安排的预览" + }, + "progress": { + "complete": "今天的目标完成啦🎉", + "goal-complete": "您的整个目标已完成 🎉", + "pages-goal": "阅读《古兰经》的{{pages}}页", + "range-goal": "阅读{{from}}到{{to}}", + "time-goal": "阅读《古兰经》 {{time}}" + }, + "reading-goal": "阅读目标", + "reading-goal-description": "您是否发现坚持阅读《古兰经》的目标很困难?

    《古兰经成长之旅》是一项动态功能,旨在帮助您坚持阅读《古兰经》。无论您的目标是每天阅读 10 分钟、在一个月内读完一卷还是在一年内读完整本《古兰经》,等等,Quran.com 现在都可以帮助您设定自定义目标并跟踪您的每日阅读进度,同时随着您的进步进行调整。它完全免费使用,我们希望它能帮助您保持动力,实现目标!", + "reading-goal-label": "你在一个", + "reading-goal-title": "介绍《古兰经》成长之旅", + "recommended": "受到推崇的", + "remaining": "今天剩余", + "remaining-base": "其余的", + "remaining-days": { + "other": "还剩 {{days}} 天" + }, + "set-a-new-goal": "设定新目标", + "set-reading-goal-success": "您的阅读目标已成功设定。", + "start-journey": "开始你的旅程!", + "start-reading": "开始阅读", + "starting-chapter": "开始古兰经", + "starting-verse": "启动 Ayah", + "streak": "条纹", + "streak-definition": "连胜是您连续阅读《古兰经》的天数。", + "timeline-meaning": "你的时间表是什么意思?", + "timeline-states": { + "checked": "你已经完成了你的目标", + "filled": "您已经阅读了一些内容,但还不足以完成您的目标", + "none": "那天你还没有读过任何东西", + "stroked": "你今天什么都没读" + }, + "todays-goal": "今天的目标", + "view-progress": "查看进度", + "week-progress": "本周进展", + "x-days": { + "other": "{{days}} 天" + }, + "x-days-streak": "{{days}}天连续", + "x-hours": { + "other": "{{hours}} 小时" + }, + "x-minutes": { + "other": "{{minutes}} 分钟" + }, + "x-pages": { + "other": "{{pages}} 页数" + }, + "x-seconds": { + "other": "{{seconds}} 秒" + } +} diff --git a/locales/zh/support.json b/locales/zh/support.json index aae20776c5..fe11f4c3d5 100644 --- a/locales/zh/support.json +++ b/locales/zh/support.json @@ -1,27 +1,25 @@ { - "bug-a": "请在此处报告此错误<0> <\/0> ,我们将尽快修复此错误 inshAllah。", - "bug-q": "我发现了一个翻译错误,我应该在哪里提交它?", - "developer-a": "有关详细信息,请参阅<0>开发人员页面<\/0>", - "developer-q": "我是开发人员。我怎样才能做出贡献?", - "donate-a": "首先,我们非常感谢您有兴趣做出贡献。请访问<0>这个<\/0>链接", - "donate-q": "我如何捐款?", - "download-a": "抱歉不行。我们尚不提供将我们的网站或古兰经下载到您的计算机的功能。但是,您可以安装我们的移动应用程序进行离线阅读。", - "download-q": "我可以将 Quran.com 下载到我的电脑上吗?", - "fiqh-a": "Quran.com 是一个在线阅读、聆听和学习的平台。 Quran.com 背后的团队由软件工程师、设计师和产品经理组成。然而,Quran.com团队中间没有学者和阿訇,无法解决有关伊斯兰教法和法特瓦的问题。我们尽量避免回答这些问题,并建议您与当地阿訇或学者交流。", - "fiqh-q": "伊斯兰\/教义\/法特瓦相关问题", - "header": "帮助和反馈", - "main-desc": "请检查常见问题解答以查看您的问题是否已得到解答。如果需要,您可以<0>联系我们<\/0> ,我们会尽最大努力尽快与您联系,但只是为了让您知道我们是一个小团队,所以请保持友善。", - "mobile-a": "是的!请访问我们的<0>移动应用页面<\/0>了解更多信息。", - "mobile-q": "Quran.com 有手机App吗?", - "other-languages-a": "要更改您的首选语言,每个页面的右上角都有一个下拉菜单(从右到左的语言的左上角)。使用此下拉菜单选择您的首选语言。", - "other-languages-q": "我可以浏览其他语言的网站吗?", - "reciters-a": "在此处提交有关此朗诵者的更多信息<0> <\/0>", - "reciters-q": "添加更多诵读家", - "site-down-a": "这不好!如果该站点根本无法运行,或者您可能会看到带有文本“抱歉,出了点问题”的白屏,如果您能在<0>此处<\/0>报告,我们将不胜感激。", - "site-down-q": "网站打不开的话,如何反馈?", - "support": "支持", - "tafsir-a": "是的,我们确实有一些 Tafsir。单击每个 ayah 旁边显示的图标,然后单击 tafisrs。应用程序将向您显示可用的 tafsirs 列表。单击您要阅读的 tafsir。", - "tafsir-q": "提供经注吗?", - "translations-a": "打开一个新的问题<0>在这里<\/0>与所有的细节,链接到翻译,我们会尽最大努力来补充这一点。", - "translations-q": "添加其他翻译" -} \ No newline at end of file + "bug-a": "请在此处报告此错误<0> ,我们将尽快修复此错误 inshAllah。", + "bug-q": "我发现了一个翻译错误,我应该在哪里提交它?", + "developer-a": "有关详细信息,请参阅<0>开发人员页面", + "developer-q": "我是开发人员。我怎样才能做出贡献?", + "donate-a": "首先,我们非常感谢您有兴趣做出贡献。请访问<0>这个链接", + "donate-q": "我如何捐款?", + "download-a": "抱歉不行。我们尚不提供将我们的网站或古兰经下载到您的计算机的功能。但是,您可以安装我们的移动应用程序进行离线阅读。", + "download-q": "我可以将 Quran.com 下载到我的电脑上吗?", + "header": "帮助和反馈", + "main-desc": "请检查常见问题解答以查看您的问题是否已得到解答。如果需要,您可以<0>联系我们 ,我们会尽最大努力尽快与您联系,但只是为了让您知道我们是一个小团队,所以请保持友善。", + "mobile-a": "是的!请访问<0>Android 版《古兰经》或<1>iOS 版《古兰经》下载应用程序", + "mobile-q": "Quran.com 有手机App吗?", + "other-languages-a": "要更改您的首选语言,每个页面的右上角都有一个下拉菜单(从右到左的语言的左上角)。使用此下拉菜单选择您的首选语言。", + "other-languages-q": "我可以浏览其他语言的网站吗?", + "reciters-a": "在此处提交有关此朗诵者的更多信息<0> ", + "reciters-q": "添加更多诵读家", + "site-down-a": "这不好!如果该站点根本无法运行,或者您可能会看到带有文本“抱歉,出了点问题”的白屏,如果您能在<0>此处报告,我们将不胜感激。", + "site-down-q": "网站打不开的话,如何反馈?", + "support": "支持", + "tafsir-a": "是的,我们确实有一些 Tafsir。单击每个 ayah 旁边显示的图标,然后单击 tafisrs。应用程序将向您显示可用的 tafsirs 列表。单击您要阅读的 tafsir。", + "tafsir-q": "提供经注吗?", + "translations-a": "打开一个新的问题<0>在这里与所有的细节,链接到翻译,我们会尽最大努力来补充这一点。", + "translations-q": "添加其他翻译" +} diff --git a/package.json b/package.json index 0b27b54090..4e35d81178 100644 --- a/package.json +++ b/package.json @@ -66,11 +66,11 @@ "@radix-ui/react-tooltip": "^1.1.2", "@radix-ui/react-visually-hidden": "^1.1.0", "@reduxjs/toolkit": "^2.2.7", - "@remotion/bundler": "4.0.206", - "@remotion/cli": "4.0.206", - "@remotion/eslint-plugin": "4.0.206", - "@remotion/lambda": "4.0.206", - "@remotion/player": "4.0.206", + "@remotion/bundler": "4.0.266", + "@remotion/cli": "4.0.266", + "@remotion/eslint-plugin": "4.0.266", + "@remotion/lambda": "4.0.266", + "@remotion/player": "4.0.266", "@sanity/client": "^5.2.1", "@sanity/image-url": "^1.0.2", "@sentry/nextjs": "^7.77.0", @@ -103,13 +103,15 @@ "react-hotkeys-hook": "^4.5.0", "react-joyride": "^2.7.2", "react-redux": "^9.1.2", + "react-share": "^5.2.0", "react-toastify": "^9.0.8", + "react-verification-input": "^4.2.2", "react-virtuoso": "^2.19.0", "redux": "^5.0.1", "redux-persist": "^6.0.0", "refresh-fetch": "^0.8.0", "remark-directive": "^3.0.0", - "remotion": "4.0.206", + "remotion": "^4.0.266", "swr": "1.2.1", "xstate": "^4.33.6" }, diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p1.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p1.ttf index 03ae2a2602..f462d751a6 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p1.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p1.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p11.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p11.ttf index 060cdb0584..ae4e48ffd7 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p11.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p11.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p16.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p16.ttf index f7adcb27cf..fd6be02604 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p16.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p16.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p18.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p18.ttf index 03afa4fd70..e17585a9b7 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p18.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p18.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p19.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p19.ttf index 4dec2b658e..7efbc8f031 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p19.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p19.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p203.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p203.ttf index 9988fd77ff..3177c85be1 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p203.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p203.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p21.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p21.ttf index 70be86b26d..0043a22f59 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p21.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p21.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p22.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p22.ttf index 7a8853aebb..36908bd277 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p22.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p22.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p26.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p26.ttf index d145b2eda0..c1cc61a936 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p26.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p26.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p266.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p266.ttf index 11ff7e2435..cfcf342029 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p266.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p266.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p30.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p30.ttf index 9dcc7520c1..b9038f8541 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p30.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p30.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p303.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p303.ttf index 4da83ae74e..eb7f3060e9 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p303.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p303.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p31.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p31.ttf index d8153083a1..52a5e9bc8f 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p31.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p31.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p33.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p33.ttf index f2fc837461..5575d18287 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p33.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p33.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p34.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p34.ttf index 7b29a096ea..c655537a33 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p34.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p34.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p4.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p4.ttf index 6f1e9dae5b..f4201a28a5 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p4.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p4.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p42.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p42.ttf index d8d8977380..58eb4ac241 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p42.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p42.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p445.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p445.ttf index 0e431f2f3f..eb9c5af610 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p445.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p445.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p453.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p453.ttf index ca95c04d45..22bc84dff0 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p453.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p453.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p47.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p47.ttf index c8d3b69c3b..ded5edda24 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p47.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p47.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p49.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p49.ttf index 779bb183eb..0414e07337 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p49.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p49.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p518.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p518.ttf index b8048adad7..c9c1528b2f 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p518.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p518.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p52.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p52.ttf index 4b73f4b7a1..481509bf61 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p52.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p52.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p535.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p535.ttf index cf575212fc..e1eb22fb24 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p535.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p535.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p62.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p62.ttf index cb9507128f..d1409c6a22 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p62.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p62.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p65.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p65.ttf index e6b11d6c67..7229ce9b2b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p65.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p65.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p66.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p66.ttf index 39074c3868..d4a766654c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p66.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p66.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p67.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p67.ttf index f3905ce3c7..e99f518ff3 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p67.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p67.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p76.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p76.ttf index d36b7a7fbd..b22033e84b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p76.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p76.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p77.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p77.ttf index 165bf195e2..fc36bce74c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p77.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p77.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p78.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p78.ttf index b41076e6aa..0712f43c6f 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p78.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p78.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p8.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p8.ttf index 8fa2d6b94a..c7070b9874 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p8.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p8.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p90.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p90.ttf index edf560fb2c..0ddd96a272 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p90.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p90.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p91.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p91.ttf index d3574dd898..1c91e558a8 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p91.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p91.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p93.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p93.ttf index 91d5d3b7f7..3624d4d0a3 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p93.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p93.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/ttf/p94.ttf b/public/fonts/quran/hafs/v4/colrv1/ttf/p94.ttf index 9217f1597e..f9d6fc9537 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/ttf/p94.ttf and b/public/fonts/quran/hafs/v4/colrv1/ttf/p94.ttf differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p1.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p1.woff index eb5d0022c5..ca038b601b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p1.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p1.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p11.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p11.woff index fa3994dc5f..ce5d5cc446 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p11.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p11.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p16.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p16.woff index e0453ca755..e50cb7e638 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p16.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p16.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p18.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p18.woff index 2bd5d5c105..37b9489059 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p18.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p18.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p19.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p19.woff index 456c1e5fbb..5105960534 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p19.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p19.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p203.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p203.woff index 74b515ed39..48c83a59f1 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p203.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p203.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p21.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p21.woff index 7481fb971a..0c50a76b0c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p21.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p21.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p22.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p22.woff index 7dd2de0fde..fbb90bddc1 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p22.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p22.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p26.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p26.woff index fe908a1375..fd94afbeb5 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p26.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p26.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p266.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p266.woff index 12ea0ccd8b..feea790376 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p266.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p266.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p30.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p30.woff index 21008165cf..70c55f7179 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p30.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p30.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p303.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p303.woff index 6988ae3cf9..fee0966fe2 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p303.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p303.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p31.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p31.woff index f736546bc6..a835297e0d 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p31.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p31.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p33.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p33.woff index c7f8942bec..21b7c34078 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p33.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p33.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p34.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p34.woff index 3396a208e6..7c1649efa0 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p34.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p34.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p4.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p4.woff index c6277bd222..add1de8877 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p4.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p4.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p42.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p42.woff index 9d65f10ae0..32fbfd0179 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p42.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p42.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p445.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p445.woff index ae731d5aa9..914a6a244e 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p445.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p445.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p453.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p453.woff index 0aa8777591..2b97648e2d 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p453.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p453.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p47.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p47.woff index fcd309426a..02cb1db14f 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p47.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p47.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p49.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p49.woff index 331da846e8..54bee99809 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p49.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p49.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p518.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p518.woff index 83b8f23238..d70e67c9ee 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p518.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p518.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p52.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p52.woff index fc5676f745..ef9e82a144 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p52.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p52.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p535.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p535.woff index b1ac010b94..c6b5765f08 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p535.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p535.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p62.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p62.woff index 988cb56ef1..38e63f47e8 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p62.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p62.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p65.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p65.woff index 32c4ec828f..1e28ecc147 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p65.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p65.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p66.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p66.woff index d1d3774205..bc25facd58 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p66.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p66.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p67.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p67.woff index 939187718d..f51b882a48 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p67.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p67.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p76.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p76.woff index 7e433c4270..e85bd0b651 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p76.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p76.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p77.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p77.woff index 10bd007880..ccc760698b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p77.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p77.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p78.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p78.woff index 53ad0def0f..d957670f2b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p78.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p78.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p8.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p8.woff index a7553ae8d1..620f1b0079 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p8.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p8.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p90.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p90.woff index 2a07e9cd26..2fbdc10521 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p90.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p90.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p91.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p91.woff index 5426fe5653..981c1b0f76 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p91.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p91.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p93.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p93.woff index 1167ac29eb..dee643defb 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p93.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p93.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff/p94.woff b/public/fonts/quran/hafs/v4/colrv1/woff/p94.woff index 2777774fbe..d780d711bc 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff/p94.woff and b/public/fonts/quran/hafs/v4/colrv1/woff/p94.woff differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p1.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p1.woff2 index 9e3ff20ba7..1363309096 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p1.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p1.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p11.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p11.woff2 index fed80690fa..c64684e008 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p11.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p11.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p16.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p16.woff2 index 7e11151678..c824d61357 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p16.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p16.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p18.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p18.woff2 index bf958950bc..c47e9dedd9 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p18.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p18.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p19.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p19.woff2 index 70367411bf..0e65de07de 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p19.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p19.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p203.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p203.woff2 index 5622904311..2cb2ce9905 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p203.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p203.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p21.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p21.woff2 index 3adc3e137b..9c7d9fa0ec 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p21.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p21.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p22.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p22.woff2 index 0882699dcf..5d04fb8ee6 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p22.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p22.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p26.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p26.woff2 index abb5c5acd8..5351d3fa15 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p26.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p26.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p266.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p266.woff2 index dc44551c35..3e97f6f4c4 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p266.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p266.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p30.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p30.woff2 index 0d4e9db9d4..8830dddd3d 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p30.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p30.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p303.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p303.woff2 index a4a13ca1ab..2335340e21 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p303.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p303.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p31.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p31.woff2 index 0e137c10ab..107fc719dd 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p31.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p31.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p33.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p33.woff2 index 94cb09c0a4..f3c0ae3642 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p33.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p33.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p34.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p34.woff2 index 7ec0cfd2e5..d780c54a5b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p34.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p34.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p4.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p4.woff2 index 3896568586..7bf3f9bf5b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p4.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p4.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p42.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p42.woff2 index 70629ac337..0db938f5f1 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p42.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p42.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p445.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p445.woff2 index b2933a3dd3..e8ee0fdebf 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p445.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p445.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p453.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p453.woff2 index f83d9adb3b..46c437b12c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p453.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p453.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p47.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p47.woff2 index 8d5a3a0fcc..9d0e53877a 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p47.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p47.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p49.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p49.woff2 index 9973baabac..44ffeeafc0 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p49.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p49.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p518.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p518.woff2 index b6d63210e5..37c3a83ebe 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p518.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p518.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p52.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p52.woff2 index e47cd82b9c..20010e8b20 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p52.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p52.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p535.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p535.woff2 index 0d08a05f7c..3c3bd70ae7 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p535.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p535.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p62.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p62.woff2 index a32314c259..8d8380af4b 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p62.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p62.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p65.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p65.woff2 index 648d08ac7a..e8292fba3c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p65.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p65.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p66.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p66.woff2 index 4be2dca8f0..b5fb8d4925 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p66.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p66.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p67.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p67.woff2 index 87c92e7af9..0ebce498ed 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p67.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p67.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p76.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p76.woff2 index 63c0d9519a..c5afa0c7fc 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p76.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p76.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p77.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p77.woff2 index bb1b5169f9..1a6b35cac6 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p77.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p77.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p78.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p78.woff2 index acb0fe2695..28f615e840 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p78.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p78.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p8.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p8.woff2 index dd71f58a1c..e5be95ea3c 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p8.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p8.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p90.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p90.woff2 index 18dcfadf7e..7232b0cf94 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p90.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p90.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p91.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p91.woff2 index d54cebdb77..597288a29a 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p91.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p91.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p93.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p93.woff2 index c7f4fc8222..31c73db355 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p93.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p93.woff2 differ diff --git a/public/fonts/quran/hafs/v4/colrv1/woff2/p94.woff2 b/public/fonts/quran/hafs/v4/colrv1/woff2/p94.woff2 index d0ebb9f620..62986a0d53 100644 Binary files a/public/fonts/quran/hafs/v4/colrv1/woff2/p94.woff2 and b/public/fonts/quran/hafs/v4/colrv1/woff2/p94.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p1.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p1.ttf index 89b2b98a99..d188211b80 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p1.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p1.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p11.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p11.ttf index e83a753f4c..b3693f5276 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p11.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p11.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p16.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p16.ttf index 4271918ce2..a87a625047 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p16.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p16.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p18.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p18.ttf index bed1ffdde6..81b62ef90b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p18.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p18.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p19.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p19.ttf index 32053611a3..770a54c2f3 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p19.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p19.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p203.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p203.ttf index 108e286ba4..48c8941eb8 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p203.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p203.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p21.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p21.ttf index 93f8ddf65e..d5db5aa336 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p21.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p21.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p22.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p22.ttf index 1e81e57e84..d9c8016fd0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p22.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p22.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p26.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p26.ttf index 872d4a34fc..dcb6e0f97d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p26.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p26.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p266.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p266.ttf index 3db3cd8a43..59ce4b9a6a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p266.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p266.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p30.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p30.ttf index f79f95ce54..f0f7417a07 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p30.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p30.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p303.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p303.ttf index d2542a463e..a6b1733058 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p303.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p303.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p31.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p31.ttf index afad258e75..d29679d2ee 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p31.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p31.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p33.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p33.ttf index 329e13e301..a33ee36d1c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p33.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p33.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p34.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p34.ttf index 4af701fe66..220b14322f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p34.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p34.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p4.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p4.ttf index 6d4b32a478..a206569d71 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p4.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p4.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p42.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p42.ttf index 6dfe66b8fb..1f1059c7db 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p42.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p42.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p445.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p445.ttf index e2c891f2b8..1ecb19fb0c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p445.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p445.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p453.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p453.ttf index 772b704f7a..708e51f03f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p453.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p453.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p47.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p47.ttf index 14baaf9691..0d7e150b27 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p47.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p47.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p49.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p49.ttf index 17bbdaa45c..c3387e09cf 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p49.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p49.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p518.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p518.ttf index d7ecdf790e..94f4a00865 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p518.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p518.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p52.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p52.ttf index 979cfd4ba1..cdb5942ec2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p52.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p52.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p535.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p535.ttf index b7b452b117..4377be07f9 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p535.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p535.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p62.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p62.ttf index 1661a65997..6b2d0b192b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p62.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p62.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p65.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p65.ttf index 9ec836c1d6..c8ee5a242f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p65.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p65.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p66.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p66.ttf index 1580c76670..f0e001ff03 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p66.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p66.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p67.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p67.ttf index 844f36a6a9..c8396fdc9b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p67.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p67.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p76.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p76.ttf index 054d7c6439..612e45dd36 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p76.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p76.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p77.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p77.ttf index 1e5e2f3145..65223c6b14 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p77.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p77.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p78.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p78.ttf index 08657bfa48..229eefecd2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p78.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p78.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p8.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p8.ttf index 2c20240dce..c25339d3c4 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p8.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p8.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p90.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p90.ttf index 3d518b4dda..cbad7132fa 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p90.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p90.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p91.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p91.ttf index 5c88017b19..aaf2ed5fd8 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p91.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p91.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p93.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p93.ttf index 07414eaf5b..b559988f39 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p93.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p93.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p94.ttf b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p94.ttf index 52c34e5a63..a8d409094b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p94.ttf and b/public/fonts/quran/hafs/v4/ot-svg/dark/ttf/p94.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p1.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p1.woff index 69457c1d3e..e4bed4e2a7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p1.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p1.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p11.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p11.woff index b8ecfb1d13..b6b24e8bdc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p11.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p11.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p16.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p16.woff index 7c71efa337..cfc84f749d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p16.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p16.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p18.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p18.woff index 433896148d..b6e5827aee 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p18.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p18.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p19.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p19.woff index 12d6a885b7..22133cbe0e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p19.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p19.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p203.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p203.woff index cda3931fca..8b254dbf11 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p203.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p203.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p21.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p21.woff index 3808370a93..8e901d327a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p21.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p21.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p22.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p22.woff index 08197cfb6e..3d31ac7580 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p22.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p22.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p26.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p26.woff index 1988dd9d0d..1e8c412b1a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p26.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p26.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p266.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p266.woff index c389709b7d..910801756d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p266.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p266.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p30.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p30.woff index c0551568e3..9b83d76c65 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p30.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p30.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p303.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p303.woff index 5cd9cf47ab..36c022d039 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p303.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p303.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p31.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p31.woff index 2ae07a62fc..1dd4b429d8 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p31.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p31.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p33.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p33.woff index 32e9c2cfbc..6e15354497 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p33.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p33.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p34.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p34.woff index 17cd4ddc34..d461753669 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p34.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p34.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p4.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p4.woff index 8f1639849b..5e7f6550d6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p4.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p4.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p42.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p42.woff index 0cfcddc0ec..d6f8745a4c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p42.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p42.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p445.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p445.woff index df674c782d..f56c7ce0e6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p445.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p445.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p453.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p453.woff index 2a04700362..b37fde43cd 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p453.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p453.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p47.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p47.woff index e257f3d1f9..6464851449 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p47.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p47.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p49.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p49.woff index d8b3610d4f..9bce5d5d01 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p49.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p49.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p518.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p518.woff index 42ea36560c..162286266f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p518.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p518.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p52.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p52.woff index d1f0e4adcf..c1f867593e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p52.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p52.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p535.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p535.woff index 68f256508e..386fbe9bae 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p535.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p535.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p62.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p62.woff index add0ed0f37..7f8e4fd2f2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p62.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p62.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p65.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p65.woff index 4aa9c02e19..07130eeab3 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p65.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p65.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p66.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p66.woff index adff749292..ffe2ff10d4 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p66.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p66.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p67.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p67.woff index 7ada9fe1ce..52cff2ab0b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p67.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p67.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p76.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p76.woff index aac61a7445..f0e81bd40c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p76.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p76.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p77.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p77.woff index dc44682973..1163849069 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p77.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p77.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p78.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p78.woff index a1c74a6e2c..ef92d3980b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p78.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p78.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p8.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p8.woff index b16bba8f66..eff4a79bf6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p8.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p8.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p90.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p90.woff index 27a7157914..7f198bb74c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p90.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p90.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p91.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p91.woff index d5dc511a1c..a3b3c429a2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p91.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p91.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p93.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p93.woff index 30863a752d..8440b58754 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p93.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p93.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p94.woff b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p94.woff index e58b5ba94c..df62a2f772 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p94.woff and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff/p94.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p1.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p1.woff2 index 337ee1951e..c1b60fd4d6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p1.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p1.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p11.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p11.woff2 index 16cbf55af2..de264fe2df 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p11.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p11.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p16.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p16.woff2 index 8f4ebf5f0c..e467e1b08c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p16.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p16.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p18.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p18.woff2 index 2739f97c9f..16c6e34751 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p18.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p18.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p19.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p19.woff2 index b4370533fb..eba52fc272 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p19.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p19.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p203.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p203.woff2 index 387e86658e..b739912e3a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p203.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p203.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p21.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p21.woff2 index 13e623cecd..01c35511e7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p21.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p21.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p22.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p22.woff2 index 98b9b5e198..1189cdfc4a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p22.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p22.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p26.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p26.woff2 index 9eb5026816..046b90925d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p26.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p26.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p266.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p266.woff2 index 8a15640818..39bf4759a2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p266.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p266.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p30.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p30.woff2 index 236122f073..f4f2f64470 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p30.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p30.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p303.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p303.woff2 index 6d0696e651..a4a95f2ed5 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p303.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p303.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p31.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p31.woff2 index bffa3d5721..e911972778 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p31.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p31.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p33.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p33.woff2 index 720f2b1482..5a7594d912 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p33.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p33.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p34.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p34.woff2 index 8de72bbe26..398faeea4a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p34.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p34.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p4.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p4.woff2 index 16af66d1d8..6a43465f16 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p4.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p4.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p42.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p42.woff2 index f3570ee587..e61240c77e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p42.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p42.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p445.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p445.woff2 index 7efd671288..1f21e6bb83 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p445.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p445.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p453.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p453.woff2 index a0b22b6c96..292c989cbc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p453.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p453.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p47.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p47.woff2 index 7e31f396f9..0dea33f30b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p47.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p47.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p49.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p49.woff2 index 65c1767ef6..6f275c29b9 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p49.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p49.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p518.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p518.woff2 index de55a1a12b..25eab3c7f0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p518.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p518.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p52.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p52.woff2 index 0da1536457..4f3ba17154 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p52.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p52.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p535.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p535.woff2 index d1af22eadd..94ff458647 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p535.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p535.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p62.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p62.woff2 index 15ab323851..50f17c65ca 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p62.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p62.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p65.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p65.woff2 index febf0f5980..848028fdc9 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p65.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p65.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p66.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p66.woff2 index 426d281d10..e58400773c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p66.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p66.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p67.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p67.woff2 index 7a7c2c55f4..aa189f51a0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p67.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p67.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p76.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p76.woff2 index 7fcb2494d7..0dec0744bb 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p76.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p76.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p77.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p77.woff2 index 004d26efde..65ed187a94 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p77.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p77.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p78.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p78.woff2 index 9ec6e1ece0..c84833b499 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p78.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p78.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p8.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p8.woff2 index 7ab1d96aff..64c2942f78 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p8.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p8.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p90.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p90.woff2 index 6209adee95..c92c2c9425 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p90.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p90.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p91.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p91.woff2 index 9cf19c8005..3eb3879306 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p91.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p91.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p93.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p93.woff2 index 9b697e0a77..f264b525fe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p93.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p93.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p94.woff2 b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p94.woff2 index 8163d3c215..e1e13ecb01 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p94.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/dark/woff2/p94.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p1.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p1.ttf index f9d2ad54d1..8627a26f75 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p1.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p1.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p11.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p11.ttf index 8afc8f9221..98346bde39 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p11.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p11.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p16.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p16.ttf index 571548ff01..938fecafed 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p16.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p16.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p18.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p18.ttf index d06aa87cd7..66f8333ffe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p18.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p18.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p19.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p19.ttf index cfa7792fad..eb2b420dac 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p19.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p19.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p203.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p203.ttf index c55242968b..20a12e679e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p203.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p203.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p21.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p21.ttf index 0cc64033b4..6b9b95da50 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p21.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p21.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p22.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p22.ttf index 9140b3d3a1..a5534737bc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p22.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p22.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p26.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p26.ttf index 9c0b924921..ae4bb5fdcc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p26.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p26.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p266.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p266.ttf index fd5df951f4..7ce7248761 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p266.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p266.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p30.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p30.ttf index f6deb0e716..3c10cc143e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p30.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p30.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p303.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p303.ttf index 15a9502590..21bc4c4d92 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p303.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p303.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p31.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p31.ttf index 91fa6f4c7b..c9d011d31c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p31.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p31.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p33.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p33.ttf index 01bd1b99b3..6a7f48f4b2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p33.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p33.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p34.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p34.ttf index 3f77f97406..b69fb4e09f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p34.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p34.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p4.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p4.ttf index 9088942160..461cec83c4 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p4.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p4.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p42.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p42.ttf index a28bc240e2..259cd15eb5 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p42.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p42.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p445.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p445.ttf index 9bddd2cf9e..3e90e04396 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p445.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p445.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p453.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p453.ttf index aad856f6f8..f50ad5f219 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p453.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p453.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p47.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p47.ttf index 852d7f508c..80f1868722 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p47.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p47.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p49.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p49.ttf index eea3829113..21dcc4f18e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p49.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p49.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p518.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p518.ttf index 0acebcfd13..1ed3be0079 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p518.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p518.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p52.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p52.ttf index e369aa3711..57de95d77d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p52.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p52.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p535.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p535.ttf index 89a5f4ea60..35b32c0386 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p535.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p535.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p62.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p62.ttf index f6c9a39d27..1b64bc5603 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p62.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p62.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p65.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p65.ttf index d00f312d20..abebdb9991 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p65.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p65.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p66.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p66.ttf index c151ac95a0..cbc92f1b7d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p66.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p66.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p67.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p67.ttf index 86a43d8959..2fd08a3b0c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p67.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p67.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p76.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p76.ttf index d19aa3ea25..3d96759125 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p76.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p76.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p77.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p77.ttf index 0676ea0d4e..eedec11d67 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p77.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p77.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p78.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p78.ttf index 2471139dca..5dbe6a9450 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p78.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p78.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p8.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p8.ttf index 39de3427af..9e4b59b2d0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p8.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p8.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p90.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p90.ttf index 9460336dc6..780def3ee3 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p90.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p90.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p91.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p91.ttf index 36875b1c2f..874430f43a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p91.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p91.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p93.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p93.ttf index 39127876f4..226525c424 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p93.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p93.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p94.ttf b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p94.ttf index d297125da1..b2629c0155 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p94.ttf and b/public/fonts/quran/hafs/v4/ot-svg/light/ttf/p94.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p1.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p1.woff index 879733465f..9f77a32b47 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p1.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p1.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p11.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p11.woff index 768361c441..76ff6eb4b9 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p11.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p11.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p16.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p16.woff index 4ca4a9fdd0..146a5c5021 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p16.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p16.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p18.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p18.woff index b8c4cc7031..55edd35218 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p18.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p18.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p19.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p19.woff index 3494c4ba92..8f9c3e0094 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p19.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p19.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p203.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p203.woff index e4cd6bb61a..7b4441c9a5 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p203.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p203.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p21.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p21.woff index 3a3f11e79a..5548fca330 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p21.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p21.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p22.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p22.woff index 685fde0930..0c713c047c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p22.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p22.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p26.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p26.woff index 02ae050415..c80cbe32f6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p26.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p26.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p266.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p266.woff index 345af55fa0..9d78df1631 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p266.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p266.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p30.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p30.woff index cabe109ca3..c94d1ec98f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p30.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p30.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p303.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p303.woff index eafedc0fd6..0f4d64b451 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p303.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p303.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p31.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p31.woff index a5d83e1810..22ff7f61b2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p31.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p31.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p33.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p33.woff index f24fe99432..72dbeaa7ee 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p33.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p33.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p34.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p34.woff index f16623c046..428748809e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p34.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p34.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p4.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p4.woff index 16487c06c4..1a233d19fe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p4.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p4.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p42.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p42.woff index b240a80275..571d86d61b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p42.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p42.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p445.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p445.woff index b0584cf130..c3082e0e80 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p445.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p445.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p453.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p453.woff index 61dc427eb9..570f22855c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p453.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p453.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p47.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p47.woff index 858ad43a29..33a1018755 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p47.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p47.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p49.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p49.woff index e63fa82018..fa8546a81c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p49.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p49.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p518.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p518.woff index a95854a926..63ff644acb 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p518.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p518.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p52.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p52.woff index 64fa4ae3f7..da9e10e42b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p52.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p52.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p535.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p535.woff index 2bbb026cd9..51e1a9fdd9 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p535.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p535.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p62.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p62.woff index a6b41553a4..0a7999770d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p62.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p62.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p65.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p65.woff index b32f97c449..c832920212 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p65.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p65.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p66.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p66.woff index 6dd496133c..687c8c33b8 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p66.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p66.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p67.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p67.woff index 63f831df6d..0bb3f01a4a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p67.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p67.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p76.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p76.woff index 73662b9ba2..ddb40fa76e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p76.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p76.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p77.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p77.woff index e51cca1b07..fcb8235aae 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p77.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p77.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p78.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p78.woff index 33aad997e7..7a7617097c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p78.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p78.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p8.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p8.woff index 104bc5d894..92223e7dec 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p8.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p8.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p90.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p90.woff index 15e7c4b4de..5d2c1b9786 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p90.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p90.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p91.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p91.woff index 453e72d922..740abe88fc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p91.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p91.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p93.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p93.woff index be4e36c21f..c70fb7705d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p93.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p93.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p94.woff b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p94.woff index 8471752de9..57ecee4c8b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff/p94.woff and b/public/fonts/quran/hafs/v4/ot-svg/light/woff/p94.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p1.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p1.woff2 index b1f7d28557..83bf953f27 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p1.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p1.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p11.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p11.woff2 index 755271adbc..14f07a0b07 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p11.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p11.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p16.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p16.woff2 index fe98313690..5d5ec59527 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p16.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p16.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p18.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p18.woff2 index 88d1fd9a96..00b015a462 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p18.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p18.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p19.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p19.woff2 index ffba3de456..6298a40d8e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p19.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p19.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p203.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p203.woff2 index 7007ba1593..57412ca9ba 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p203.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p203.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p21.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p21.woff2 index d18f2fa9d9..eae039343f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p21.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p21.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p22.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p22.woff2 index c3a09a1e8c..75621bb0df 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p22.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p22.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p26.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p26.woff2 index f338aa0128..0d6e8bd052 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p26.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p26.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p266.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p266.woff2 index db6bacd058..c0e2d52951 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p266.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p266.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p30.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p30.woff2 index 9ed797548e..ddfa142324 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p30.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p30.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p303.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p303.woff2 index 2feeee75cd..6e77d5b9ea 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p303.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p303.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p31.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p31.woff2 index 005bf65719..19905a052f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p31.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p31.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p33.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p33.woff2 index 23f11e4477..c5325535df 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p33.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p33.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p34.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p34.woff2 index 1949710202..4dc58b1090 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p34.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p34.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p4.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p4.woff2 index 42b6f6bbfa..d7ad5fe44c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p4.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p4.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p42.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p42.woff2 index d7726f3262..4fd3c808af 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p42.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p42.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p445.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p445.woff2 index c4cac2009e..311838f892 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p445.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p445.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p453.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p453.woff2 index e4fe7f4110..b371874dd1 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p453.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p453.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p47.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p47.woff2 index a9c187aa52..2edfa6a1fe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p47.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p47.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p49.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p49.woff2 index bdbc67a732..621510656b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p49.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p49.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p518.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p518.woff2 index 7a8b49fbb8..aa3f253aa7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p518.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p518.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p52.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p52.woff2 index 368e1235de..0e9e6fa90c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p52.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p52.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p535.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p535.woff2 index fd0bb8d246..7d3af5309d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p535.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p535.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p62.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p62.woff2 index d729dd814f..99091833e1 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p62.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p62.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p65.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p65.woff2 index 26e57c0209..04fd58d2e1 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p65.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p65.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p66.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p66.woff2 index 7431b2ce7e..9addce5791 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p66.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p66.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p67.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p67.woff2 index 94a823f838..e8eb152838 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p67.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p67.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p76.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p76.woff2 index ee3692528f..1e0af6f44f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p76.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p76.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p77.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p77.woff2 index 288f63ab36..1fa5e78866 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p77.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p77.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p78.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p78.woff2 index e02a7627ed..8f10d8db86 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p78.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p78.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p8.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p8.woff2 index 825357c896..e1cb9de571 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p8.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p8.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p90.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p90.woff2 index 88e254d355..05ed10becc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p90.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p90.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p91.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p91.woff2 index c44b20542a..514fcf2ba1 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p91.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p91.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p93.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p93.woff2 index 7a1493f5ba..c362cd4260 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p93.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p93.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p94.woff2 b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p94.woff2 index b015c4ccb8..efbdbe58d7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p94.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/light/woff2/p94.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p1.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p1.ttf index 430509dc9c..253c4986eb 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p1.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p1.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p11.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p11.ttf index bb1c5fa58d..6d30beb1a3 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p11.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p11.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p16.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p16.ttf index 1f0f93a930..6504fe478b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p16.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p16.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p18.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p18.ttf index a6b9c3fb5f..1e4518d921 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p18.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p18.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p19.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p19.ttf index ff75b8ce6e..e515ef7780 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p19.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p19.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p203.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p203.ttf index f94639e67b..5b5f332162 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p203.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p203.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p21.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p21.ttf index 6b7743879a..206317c651 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p21.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p21.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p22.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p22.ttf index 017c324b9c..016e660574 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p22.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p22.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p26.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p26.ttf index b3c89ab7bb..e019d182b1 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p26.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p26.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p266.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p266.ttf index 1f55f9c634..e197c65eab 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p266.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p266.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p30.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p30.ttf index 144741d501..f105377d38 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p30.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p30.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p303.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p303.ttf index 2c928b1d03..6a1be83215 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p303.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p303.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p31.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p31.ttf index 3efd08b4e2..22d262141e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p31.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p31.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p33.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p33.ttf index e72bc23f10..681969ce08 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p33.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p33.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p34.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p34.ttf index b32d47df16..c4f37c9fa6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p34.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p34.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p4.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p4.ttf index c38a763e2e..e10036e747 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p4.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p4.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p42.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p42.ttf index 5343e220d0..0c5b4429a6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p42.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p42.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p445.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p445.ttf index 1bf718843a..893ec896e5 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p445.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p445.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p453.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p453.ttf index bbc875c5fe..338dfdcd19 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p453.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p453.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p47.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p47.ttf index a2118ee529..ba267f29a2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p47.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p47.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p49.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p49.ttf index 5498fde9c0..869a39a5f2 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p49.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p49.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p518.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p518.ttf index cc66f33baf..20244da9b6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p518.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p518.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p52.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p52.ttf index da4c790bf1..2260efb313 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p52.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p52.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p535.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p535.ttf index 08a4aa6669..a5f2432c4b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p535.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p535.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p62.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p62.ttf index 388e0ea0f7..c031372d4c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p62.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p62.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p65.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p65.ttf index 097b68f808..c57af15bab 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p65.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p65.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p66.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p66.ttf index 522e249806..cd2a931781 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p66.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p66.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p67.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p67.ttf index 7750122054..ccc9d20ec6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p67.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p67.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p76.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p76.ttf index f52ec06e00..f5f6751de7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p76.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p76.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p77.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p77.ttf index 46c86af61e..1e07f0385b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p77.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p77.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p78.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p78.ttf index 7b2f25aeb2..ad08c66e7f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p78.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p78.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p8.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p8.ttf index 19fd3e0105..1a72d35c56 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p8.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p8.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p90.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p90.ttf index a22fe9315c..c9d67db7a0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p90.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p90.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p91.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p91.ttf index 86aec5892d..dea85cf71f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p91.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p91.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p93.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p93.ttf index cc0d247dc6..51a705c65a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p93.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p93.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p94.ttf b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p94.ttf index 4d3c92f4c8..d5518612ae 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p94.ttf and b/public/fonts/quran/hafs/v4/ot-svg/sepia/ttf/p94.ttf differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p1.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p1.woff index 9dc1dfbb85..3e47eb6795 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p1.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p1.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p11.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p11.woff index da3c0ce5db..91a5cfa350 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p11.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p11.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p16.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p16.woff index f1d06407e5..82faa56ffe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p16.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p16.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p18.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p18.woff index 19905ab3cb..4f8fea1aff 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p18.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p18.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p19.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p19.woff index 1dc0777337..c91ef12e7e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p19.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p19.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p203.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p203.woff index 2c422a68c7..6495c9c2dc 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p203.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p203.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p21.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p21.woff index 01dc281f67..d2679e5030 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p21.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p21.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p22.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p22.woff index 10348dc3b2..a7e4b4234e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p22.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p22.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p26.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p26.woff index a8e6a6cf99..703ec39198 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p26.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p26.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p266.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p266.woff index 07f267a590..65af92acd5 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p266.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p266.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p30.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p30.woff index 477c34de4a..692c9b1f18 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p30.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p30.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p303.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p303.woff index de0650c6f6..767473f660 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p303.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p303.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p31.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p31.woff index a6e9f8c556..9028c0eaab 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p31.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p31.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p33.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p33.woff index cd75e80eec..e307bda1df 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p33.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p33.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p34.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p34.woff index 2b73e52a6b..992009f728 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p34.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p34.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p4.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p4.woff index cb69e3a348..a017128d59 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p4.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p4.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p42.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p42.woff index d9195dbf9d..5c3e0e2f6f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p42.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p42.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p445.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p445.woff index 207270642e..857d01d5e7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p445.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p445.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p453.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p453.woff index 0e843a434f..e10146d03b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p453.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p453.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p47.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p47.woff index 179812c47b..6f3ab40d0f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p47.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p47.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p49.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p49.woff index c5baca0119..ce79c42e3a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p49.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p49.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p518.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p518.woff index b7c68bccd9..76120279ce 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p518.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p518.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p52.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p52.woff index 9ec68e23b4..7a3ffb748d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p52.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p52.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p535.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p535.woff index 9818121dc0..6ecf7bda27 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p535.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p535.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p62.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p62.woff index 5c7e73633f..b978e7953b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p62.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p62.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p65.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p65.woff index cdbfb0f4b4..bb870959f8 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p65.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p65.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p66.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p66.woff index 9e573f29fc..bb2a277b54 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p66.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p66.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p67.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p67.woff index fcb2b64eaf..d961115a94 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p67.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p67.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p76.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p76.woff index c006b0c862..6184085983 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p76.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p76.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p77.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p77.woff index 4310b43178..69244e6e36 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p77.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p77.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p78.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p78.woff index d701e1a643..1945e830aa 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p78.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p78.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p8.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p8.woff index 61999b57d4..ca0de5824b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p8.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p8.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p90.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p90.woff index c405f2614b..4eab8ef057 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p90.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p90.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p91.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p91.woff index 33e2559eb8..7b6b31d804 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p91.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p91.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p93.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p93.woff index a8c2b53b9b..4af2d40224 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p93.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p93.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p94.woff b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p94.woff index 413e538db8..15a0bc0409 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p94.woff and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff/p94.woff differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p1.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p1.woff2 index d17d90770a..b386d47550 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p1.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p1.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p11.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p11.woff2 index 8e79f6f5e3..e247a18455 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p11.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p11.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p16.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p16.woff2 index 3c96265639..f4d15c705d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p16.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p16.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p18.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p18.woff2 index 1ccc802e1e..aade060218 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p18.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p18.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p19.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p19.woff2 index 1d8c4e22b2..7a8089585f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p19.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p19.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p203.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p203.woff2 index 75fd2fd59e..30a92b4f51 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p203.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p203.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p21.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p21.woff2 index 02131fbb09..ae4628a8a7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p21.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p21.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p22.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p22.woff2 index 37a581baea..acef490718 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p22.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p22.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p26.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p26.woff2 index f3abe68834..b4fc52a8d0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p26.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p26.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p266.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p266.woff2 index 263543a328..615d0c4f0a 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p266.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p266.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p30.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p30.woff2 index d8d0a88524..76718c1117 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p30.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p30.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p303.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p303.woff2 index 07634cc1f3..6e159d415c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p303.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p303.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p31.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p31.woff2 index 342fdea41d..474e347f1d 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p31.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p31.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p33.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p33.woff2 index abaa4dbb42..2a89e44168 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p33.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p33.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p34.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p34.woff2 index ddd9d80400..f63491dae7 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p34.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p34.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p4.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p4.woff2 index 7baa47f278..06ba2664b0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p4.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p4.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p42.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p42.woff2 index 5a331a6ac9..cf3bcb5b9f 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p42.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p42.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p445.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p445.woff2 index 8e02d18d39..b28ee714a6 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p445.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p445.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p453.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p453.woff2 index 9c50e7bf62..724583d5a0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p453.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p453.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p47.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p47.woff2 index 677978a56b..f0919300b4 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p47.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p47.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p49.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p49.woff2 index c67e4eb8d1..5c47c18597 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p49.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p49.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p518.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p518.woff2 index 67615e236a..44e3411058 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p518.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p518.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p52.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p52.woff2 index e125e450c1..073847db75 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p52.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p52.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p535.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p535.woff2 index 74b387d765..eb0be1b310 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p535.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p535.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p62.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p62.woff2 index 3286ce1508..886ae05efa 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p62.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p62.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p65.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p65.woff2 index 263959ed36..e351132854 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p65.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p65.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p66.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p66.woff2 index e5038a2eb1..e2d773bd34 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p66.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p66.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p67.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p67.woff2 index ea8d2b1c4e..ae41e9548c 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p67.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p67.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p76.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p76.woff2 index 19f57ffe81..65267e1dbe 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p76.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p76.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p77.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p77.woff2 index ff4cb1fd18..c4c3cac92e 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p77.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p77.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p78.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p78.woff2 index e9809a9eba..ca6a804862 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p78.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p78.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p8.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p8.woff2 index 0a7718042e..36a6ff5fe0 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p8.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p8.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p90.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p90.woff2 index a4639c1628..d705ff2676 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p90.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p90.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p91.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p91.woff2 index 3618a6c761..c29d6fd2ff 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p91.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p91.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p93.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p93.woff2 index ebf60ca0bc..a17f38ca05 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p93.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p93.woff2 differ diff --git a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p94.woff2 b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p94.woff2 index 6540b5a331..a4ba83057b 100644 Binary files a/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p94.woff2 and b/public/fonts/quran/hafs/v4/ot-svg/sepia/woff2/p94.woff2 differ diff --git a/public/icons/arrow.svg b/public/icons/arrow.svg new file mode 100644 index 0000000000..ab5cf24c41 --- /dev/null +++ b/public/icons/arrow.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/background.svg b/public/icons/background.svg new file mode 100644 index 0000000000..8d1fbdbe55 --- /dev/null +++ b/public/icons/background.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/public/icons/bookmark_remove.svg b/public/icons/bookmark_remove.svg new file mode 100644 index 0000000000..069cca49af --- /dev/null +++ b/public/icons/bookmark_remove.svg @@ -0,0 +1,6 @@ + + + + diff --git a/public/icons/calendar_new.svg b/public/icons/calendar_new.svg new file mode 100644 index 0000000000..72ce383303 --- /dev/null +++ b/public/icons/calendar_new.svg @@ -0,0 +1,8 @@ + + + + diff --git a/public/icons/circles.svg b/public/icons/circles.svg new file mode 100644 index 0000000000..be1ff967ff --- /dev/null +++ b/public/icons/circles.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/public/icons/copy-link-new.svg b/public/icons/copy-link-new.svg new file mode 100644 index 0000000000..87adfdac94 --- /dev/null +++ b/public/icons/copy-link-new.svg @@ -0,0 +1,8 @@ + + + + diff --git a/public/icons/diamond.svg b/public/icons/diamond.svg new file mode 100644 index 0000000000..75ddb3f269 --- /dev/null +++ b/public/icons/diamond.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/fb.svg b/public/icons/fb.svg new file mode 100644 index 0000000000..6cdebed9a6 --- /dev/null +++ b/public/icons/fb.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/hide.svg b/public/icons/hide.svg new file mode 100644 index 0000000000..ef37d04c23 --- /dev/null +++ b/public/icons/hide.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/logo_main.svg b/public/icons/logo_main.svg new file mode 100644 index 0000000000..16645e461a --- /dev/null +++ b/public/icons/logo_main.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/person.svg b/public/icons/person.svg index 40e48dea11..b44138656e 100644 --- a/public/icons/person.svg +++ b/public/icons/person.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + diff --git a/public/icons/plant.svg b/public/icons/plant.svg new file mode 100644 index 0000000000..231fe55c93 --- /dev/null +++ b/public/icons/plant.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/qr-colored.svg b/public/icons/qr-colored.svg new file mode 100644 index 0000000000..329eefeeb3 --- /dev/null +++ b/public/icons/qr-colored.svg @@ -0,0 +1,17 @@ + + + + + + + diff --git a/public/icons/qr-logo.svg b/public/icons/qr-logo.svg new file mode 100644 index 0000000000..6f040518fd --- /dev/null +++ b/public/icons/qr-logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + diff --git a/public/icons/search/arabic.svg b/public/icons/search/arabic.svg new file mode 100644 index 0000000000..ecdc4e375f --- /dev/null +++ b/public/icons/search/arabic.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/search/ayah-range.svg b/public/icons/search/ayah-range.svg new file mode 100644 index 0000000000..18e4ccaf4d --- /dev/null +++ b/public/icons/search/ayah-range.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/public/icons/search/juz.svg b/public/icons/search/juz.svg new file mode 100644 index 0000000000..706b46de0f --- /dev/null +++ b/public/icons/search/juz.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/search/page.svg b/public/icons/search/page.svg new file mode 100644 index 0000000000..9d78539173 --- /dev/null +++ b/public/icons/search/page.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/search/surah.svg b/public/icons/search/surah.svg new file mode 100644 index 0000000000..1be7fb12d1 --- /dev/null +++ b/public/icons/search/surah.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/public/icons/search/translation.svg b/public/icons/search/translation.svg new file mode 100644 index 0000000000..37ed847dbe --- /dev/null +++ b/public/icons/search/translation.svg @@ -0,0 +1,8 @@ + + + + diff --git a/public/icons/search/transliteration.svg b/public/icons/search/transliteration.svg new file mode 100644 index 0000000000..b1c37fec4e --- /dev/null +++ b/public/icons/search/transliteration.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/show.svg b/public/icons/show.svg new file mode 100644 index 0000000000..17c93c3122 --- /dev/null +++ b/public/icons/show.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/sun-login.svg b/public/icons/sun-login.svg new file mode 100644 index 0000000000..4ee4d4dab5 --- /dev/null +++ b/public/icons/sun-login.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/public/icons/sun.svg b/public/icons/sun.svg new file mode 100644 index 0000000000..8e1d88eba9 --- /dev/null +++ b/public/icons/sun.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/public/icons/the_list.svg b/public/icons/the_list.svg new file mode 100644 index 0000000000..85b2b1b06f --- /dev/null +++ b/public/icons/the_list.svg @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/public/icons/ticket.svg b/public/icons/ticket.svg new file mode 100644 index 0000000000..b06d2a5e51 --- /dev/null +++ b/public/icons/ticket.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/icons/trend_up.svg b/public/icons/trend_up.svg new file mode 100644 index 0000000000..b8798b0d60 --- /dev/null +++ b/public/icons/trend_up.svg @@ -0,0 +1,5 @@ + + + diff --git a/public/images/background.jpg b/public/images/background.jpg deleted file mode 100644 index fadad9b59a..0000000000 Binary files a/public/images/background.jpg and /dev/null differ diff --git a/public/images/background.png b/public/images/background.png new file mode 100644 index 0000000000..653997d7d2 Binary files /dev/null and b/public/images/background.png differ diff --git a/public/images/tarteel-app.png b/public/images/tarteel-app.png deleted file mode 100644 index 992b62938b..0000000000 Binary files a/public/images/tarteel-app.png and /dev/null differ diff --git a/src/api.ts b/src/api.ts index f70a27c84c..fe54cfb912 100644 --- a/src/api.ts +++ b/src/api.ts @@ -12,7 +12,6 @@ import { makeAudioTimestampsUrl, makeChapterAudioDataUrl, makeAvailableRecitersUrl, - makeSearchResultsUrl, makeTranslationsInfoUrl, makeTranslationsUrl, makeVersesUrl, @@ -32,10 +31,9 @@ import { } from '@/utils/apiPaths'; import generateSignature from '@/utils/auth/signature'; import { isStaticBuild } from '@/utils/build'; -import { SearchRequest, AdvancedCopyRequest, PagesLookUpRequest } from 'types/ApiRequests'; +import { AdvancedCopyRequest, PagesLookUpRequest } from 'types/ApiRequests'; import { TranslationsResponse, - SearchResponse, AdvancedCopyRawResultResponse, LanguagesResponse, RecitersResponse, @@ -53,13 +51,6 @@ import { } from 'types/ApiResponses'; import AudioData from 'types/AudioData'; -export const SEARCH_FETCH_OPTIONS = { - headers: { - // eslint-disable-next-line @typescript-eslint/naming-convention - 'x-api-key': process.env.NEXT_PUBLIC_SEARCH_API_KEY, - }, -}; - export const OFFLINE_ERROR = 'OFFLINE'; export const X_AUTH_SIGNATURE = 'x-auth-signature'; @@ -244,15 +235,6 @@ export const getAdvancedCopyRawResult = async ( params: AdvancedCopyRequest, ): Promise => fetcher(makeAdvancedCopyUrl(params)); -/** - * Get the search results of a query. - * - * @param {SearchRequest} params - * @returns {Promise} - */ -export const getSearchResults = async (params: SearchRequest): Promise => - fetcher(makeSearchResultsUrl(params)); - /** * Get the search results of a query. * @@ -261,7 +243,7 @@ export const getSearchResults = async (params: SearchRequest): Promise( params: SearchRequestParams, -): Promise => fetcher(makeNewSearchResultsUrl(params), SEARCH_FETCH_OPTIONS); +): Promise => fetcher(makeNewSearchResultsUrl(params)); /** * Get the list of tafsirs. diff --git a/src/components/Banner/Banner.module.scss b/src/components/Banner/Banner.module.scss index e22c549ee6..6e94a4fa80 100644 --- a/src/components/Banner/Banner.module.scss +++ b/src/components/Banner/Banner.module.scss @@ -79,4 +79,5 @@ .text { line-height: normal; + color: var(--color-text-default-new); } diff --git a/src/components/CommandBar/CommandBar.module.scss b/src/components/CommandBar/CommandBar.module.scss deleted file mode 100644 index 2b737bcfdd..0000000000 --- a/src/components/CommandBar/CommandBar.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -@use "src/styles/breakpoints"; - -.loadingContainer { - flex: 1; - display: flex; - justify-content: center; - align-items: center; -} diff --git a/src/components/CommandBar/CommandBarBase/CommandBarBase.module.scss b/src/components/CommandBar/CommandBarBase/CommandBarBase.module.scss deleted file mode 100644 index d56db90499..0000000000 --- a/src/components/CommandBar/CommandBarBase/CommandBarBase.module.scss +++ /dev/null @@ -1,109 +0,0 @@ -@use "src/styles/theme"; - -$content-animation-easing: cubic-bezier(0.16, 1, 0.3, 1); -$overlay-background-light: hsla(0, 0%, 100%, 0.8); -$overlay-background-dark: rgba(0, 0, 0, 0.8); -$overlay-background-sepia: rgba(239, 226, 205, 0.7); -$shadow: 0 16px 70px rgb(0 0 0 / 20%); // using custom shadow for now until we fix our token and design in dark theme; -$width: 95vw; -$max-width: calc(20 * var(--spacing-mega)); -$max-height: 85vh; -$min-height: calc(9 * var(--spacing-mega)); - -@keyframes contentShow { - 0% { - opacity: 0; - transform: var(--content-translate-position) scale(0.96); - } - 100% { - opacity: 1; - transform: var(--content-translate-position) scale(1); - } -} - -@keyframes contentHide { - 0% { - opacity: 1; - transform: var(--content-translate-position) scale(1); - } - 100% { - opacity: 0; - transform: var(--content-translate-position) scale(0.96); - } -} - -.content { - --content-translate-position: translate(-50%, -50%); - [dir="rtl"] & { - --content-translate-position: translate(50%, -50%); - } - - background-color: var(--color-background-default); - border-radius: var(--border-radius-rounded); - box-shadow: $shadow; - position: fixed; - inset-block-start: 50%; - inset-inline-start: 50%; - transform: var(--content-translate-position); - width: $width; - max-width: $max-width; - max-height: $max-height; - min-height: $min-height; - display: flex; - flex-direction: column; - @media (prefers-reduced-motion: no-preference) { - &[data-state="open"] { - animation: contentShow var(--transition-fast) $content-animation-easing; - } - &[data-state="closed"] { - animation: contentHide var(--transition-fast) $content-animation-easing; - } - } - &:focus { - outline: none; - } - z-index: var(--z-index-modal); -} - -@keyframes overlayShow { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -@keyframes overlayHide { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -.overlay { - @include theme.light { - background-color: $overlay-background-light; - } - @include theme.dark { - background-color: $overlay-background-dark; - } - @include theme.sepia { - background-color: $overlay-background-sepia; - } - backdrop-filter: blur(6px); - position: fixed; - inset: 0; - - @media (prefers-reduced-motion: no-preference) { - &[data-state="open"] { - animation: overlayShow var(--transition-fast) ease; - } - &[data-state="closed"] { - animation: overlayHide var(--transition-fast) ease; - } - } - z-index: var(--z-index-overlay); -} diff --git a/src/components/CommandBar/CommandBarBase/CommandBarBase.tsx b/src/components/CommandBar/CommandBarBase/CommandBarBase.tsx deleted file mode 100644 index b4a7f720e4..0000000000 --- a/src/components/CommandBar/CommandBarBase/CommandBarBase.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import * as Dialog from '@radix-ui/react-dialog'; - -import styles from './CommandBarBase.module.scss'; - -type CommandBarBaseProps = { - onClickOutside: () => void; - children: React.ReactNode; - isOpen: boolean; -}; - -const CommandBarBase = ({ onClickOutside, children, isOpen }: CommandBarBaseProps) => { - return ( - - - - - {children} - - - - ); -}; - -export default CommandBarBase; diff --git a/src/components/CommandBar/CommandBarTrigger/CommandBarTrigger.module.scss b/src/components/CommandBar/CommandBarTrigger/CommandBarTrigger.module.scss deleted file mode 100644 index 6200496df3..0000000000 --- a/src/components/CommandBar/CommandBarTrigger/CommandBarTrigger.module.scss +++ /dev/null @@ -1,60 +0,0 @@ -@use "src/styles/breakpoints"; -@use "src/styles/theme"; - -$width: calc(11 * var(--spacing-mega)); - -.leftSection { - display: flex; - align-items: center; - - > svg { - fill: var(--color-text-faded); - opacity: var(--opacity-50); - width: calc(1.4 * var(--spacing-medium)); - } - - .placeholder { - margin-inline-start: var(--spacing-small); - } -} - -.container { - position: relative; - transition: - box-shadow var(--transition-fast) ease, - top var(--transition-fast) ease; - box-sizing: border-box; - - background: var(--color-background-elevated); - - width: 100%; - display: flex; - align-items: center; - padding: 0 calc(1.5 * var(--spacing-medium)); - color: var(--color-text-faded); - min-height: calc(3 * var(--spacing-large)); - border-radius: var(--border-radius-pill); - cursor: pointer; - outline: inherit; - font-size: var(--font-size-large); - inset-block-start: 0; - @include theme.light { - box-shadow: var(--shadow-small); - &:hover { - color: var(--color-text-default); - box-shadow: var(--shadow-large); - } - } - justify-content: space-between; -} - -.actionsContainer { - display: flex; - justify-content: center; - align-items: center; -} - -.searchButtonWrapper { - margin-inline-end: calc(-1 * var(--spacing-xsmall)); - margin-inline-start: calc(var(--spacing-xsmall)); -} diff --git a/src/components/CommandBar/CommandBarTrigger/index.tsx b/src/components/CommandBar/CommandBarTrigger/index.tsx deleted file mode 100644 index 39c405007a..0000000000 --- a/src/components/CommandBar/CommandBarTrigger/index.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React, { useCallback } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; -import { useDispatch } from 'react-redux'; - -import styles from './CommandBarTrigger.module.scss'; - -import TarteelVoiceSearchTrigger from '@/components/TarteelVoiceSearch/Trigger'; -import KeyboardInput from '@/dls/KeyboardInput'; -import IconSearch from '@/icons/search.svg'; -import { toggleIsOpen } from '@/redux/slices/CommandBar/state'; -import { logButtonClick } from '@/utils/eventLogger'; - -const CommandBarTrigger: React.FC = () => { - const { t } = useTranslation('common'); - const dispatch = useDispatch(); - const onClick = useCallback(() => { - logButtonClick('command_bar_homepage_trigger'); - dispatch({ type: toggleIsOpen.type }); - }, [dispatch]); - - return ( -
    -
    - - {t('command-bar.placeholder')} -
    -
    - -
    - { - logButtonClick('command_bar_homepage_voice_search_trigger'); - }} - /> -
    -
    -
    - ); -}; - -export default CommandBarTrigger; diff --git a/src/components/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss b/src/components/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss deleted file mode 100644 index 33e6ae3695..0000000000 --- a/src/components/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss +++ /dev/null @@ -1,21 +0,0 @@ -.commandPrefix { - margin-inline-end: var(--spacing-small); - display: flex; - align-items: center; - > svg { - width: var(--spacing-large); - height: var(--spacing-large); - } -} - -.container { - display: flex; - align-items: center; - max-width: 90%; -} - -.name { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/src/components/CommandBar/CommandsList/CommandPrefix/index.tsx b/src/components/CommandBar/CommandsList/CommandPrefix/index.tsx deleted file mode 100644 index e85697e3e8..0000000000 --- a/src/components/CommandBar/CommandsList/CommandPrefix/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './CommandPrefix.module.scss'; - -import NavigateIcon from '@/icons/east.svg'; -import { SearchNavigationType } from 'types/SearchNavigationResult'; - -interface Props { - name: string; - type: SearchNavigationType; -} - -const CommandPrefix: React.FC = ({ name, type }) => { - const { t } = useTranslation('common'); - return ( -
    - - - -

    - {type === SearchNavigationType.SEARCH_PAGE - ? t('search-for', { - searchQuery: name, - }) - : name} -

    -
    - ); -}; - -export default CommandPrefix; diff --git a/src/components/CommandBar/index.tsx b/src/components/CommandBar/index.tsx deleted file mode 100644 index 83354c9f3e..0000000000 --- a/src/components/CommandBar/index.tsx +++ /dev/null @@ -1,77 +0,0 @@ -/* eslint-disable react/no-multi-comp */ -import React, { useCallback } from 'react'; - -import dynamic from 'next/dynamic'; -import { useHotkeys } from 'react-hotkeys-hook'; -import { shallowEqual, useDispatch, useSelector } from 'react-redux'; - -import styles from './CommandBar.module.scss'; -import CommandBarBase from './CommandBarBase/CommandBarBase'; - -import Spinner from '@/dls/Spinner/Spinner'; -import { selectCommandBarIsOpen, setIsOpen, toggleIsOpen } from '@/redux/slices/CommandBar/state'; -import { stopCommandBarVoiceFlow } from '@/redux/slices/voiceSearch'; -import { logEvent } from '@/utils/eventLogger'; - -const CommandBarBody = dynamic(() => import('./CommandBarBody'), { - ssr: false, - loading: () => ( -
    - -
    - ), -}); - -const getPressedShortcut = (event: KeyboardEvent): string => { - let shortcut = ''; - if (event.metaKey) { - shortcut = 'cmd'; - } else if (event.ctrlKey) { - shortcut = 'ctrl'; - } - return `${shortcut}_${event.key}`; -}; - -const CommandBar: React.FC = () => { - const dispatch = useDispatch(); - const isOpen = useSelector(selectCommandBarIsOpen, shallowEqual); - const toggleShowCommandBar = useCallback( - (event: KeyboardEvent) => { - // eslint-disable-next-line i18next/no-literal-string - logEvent(`command_bar_${isOpen ? 'close' : 'open'}`, { - // eslint-disable-next-line @typescript-eslint/naming-convention - keyboard_shortcut: getPressedShortcut(event), - }); - event.preventDefault(); - dispatch({ type: toggleIsOpen.type }); - }, - [dispatch, isOpen], - ); - const closeCommandBar = useCallback( - (event?: KeyboardEvent) => { - const isClickedOutside = !event; - // eslint-disable-next-line i18next/no-literal-string - logEvent(`command_bar_close_${isClickedOutside ? 'outside_click' : 'esc_key'}`); - dispatch({ type: setIsOpen.type, payload: false }); - dispatch({ type: stopCommandBarVoiceFlow.type }); - }, - [dispatch], - ); - useHotkeys( - 'meta+k, ctrl+k, meta+p, ctrl+p', - toggleShowCommandBar, - { enableOnFormTags: ['INPUT'] }, - [dispatch], - ); - useHotkeys('Escape', closeCommandBar, { enabled: isOpen, enableOnFormTags: ['INPUT'] }, [ - dispatch, - ]); - - return ( - closeCommandBar()}> - - - ); -}; - -export default CommandBar; diff --git a/src/components/Course/LessonView/ActionButtons/ActionButtons.module.scss b/src/components/Course/LessonView/ActionButtons/ActionButtons.module.scss index 73010ceac8..baa6792f72 100644 --- a/src/components/Course/LessonView/ActionButtons/ActionButtons.module.scss +++ b/src/components/Course/LessonView/ActionButtons/ActionButtons.module.scss @@ -16,3 +16,55 @@ align-items: center; flex-direction: column; } + +.helpIconContainer { + margin-left: 8px; +} + +.helpIcon { + background: none; + border: none; + cursor: pointer; + padding: 4px; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-medium); + + &:hover { + color: var(--color-primary-medium); + } +} + +.reflectionButtonContainer { + position: relative; + display: inline-flex; + align-items: center; +} + +.helpIconInButton { + position: absolute; + right: -12px; + top: calc(-1 * var(--spacing-xsmall-px)); + background: var(--color-background-default); + border: 1px solid var(--color-borders-hairline); + border-radius: 50%; + width: var(--spacing-medium2-px); + height: var(--spacing-medium2-px); + display: flex; + align-items: center; + justify-content: center; + padding: 0; + cursor: pointer; + color: var(--color-text-medium); + + &:hover { + color: var(--color-primary-medium); + border-color: var(--color-primary-medium); + } + + svg { + width: 12px; + height: 12px; + } +} diff --git a/src/components/Course/LessonView/ActionButtons/AddReflectionModal.module.scss b/src/components/Course/LessonView/ActionButtons/AddReflectionModal.module.scss new file mode 100644 index 0000000000..f00f5af7ca --- /dev/null +++ b/src/components/Course/LessonView/ActionButtons/AddReflectionModal.module.scss @@ -0,0 +1,23 @@ +.contentModal { + padding: var(--spacing-medium); +} + +.header { + font-weight: var(--font-weight-bold); +} + +.closeIcon { + color: var(--color-text-default); + padding-block-start: 0; + margin-block-start: var(--spacing-small-px); +} + +.modalContent { + max-width: 100%; + padding-block-start: var(--spacing-small-px); + + p { + margin-bottom: var(--spacing-small-px); + font-size: var(--font-medium-small); + } +} diff --git a/src/components/Course/LessonView/ActionButtons/AddReflectionModal.tsx b/src/components/Course/LessonView/ActionButtons/AddReflectionModal.tsx new file mode 100644 index 0000000000..d27984404b --- /dev/null +++ b/src/components/Course/LessonView/ActionButtons/AddReflectionModal.tsx @@ -0,0 +1,50 @@ +/* eslint-disable i18next/no-literal-string */ +import { useRef } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './AddReflectionModal.module.scss'; + +import ContentModal, { ContentModalSize } from '@/dls/ContentModal/ContentModal'; +import ContentModalHandles from '@/dls/ContentModal/types/ContentModalHandles'; +import Link from '@/dls/Link/Link'; + +interface Props { + isOpen: boolean; + onClose: () => void; +} + +const AddReflectionModal: React.FC = ({ isOpen, onClose }) => { + const { t } = useTranslation('learn'); + const contentModalRef = useRef(); + + return ( + + {isOpen && ( +
    +

    {t('reflection-description-1')}

    +

    {t('reflection-description-2')}

    +

    + {t('learn-more')}: + + QuranReflect.com/faq + +

    +
    + )} +
    + ); +}; + +export default AddReflectionModal; diff --git a/src/components/Course/LessonView/ActionButtons/ReflectionButton.tsx b/src/components/Course/LessonView/ActionButtons/ReflectionButton.tsx new file mode 100644 index 0000000000..f7cbd20b46 --- /dev/null +++ b/src/components/Course/LessonView/ActionButtons/ReflectionButton.tsx @@ -0,0 +1,61 @@ +import React, { useState } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './ActionButtons.module.scss'; +import AddReflectionModal from './AddReflectionModal'; + +import Button, { ButtonSize, ButtonType } from '@/dls/Button/Button'; +import QuestionMarkIcon from '@/icons/question-mark.svg'; +import { logButtonClick } from '@/utils/eventLogger'; + +interface Props { + lessonId: string; + isCompleted: boolean; +} + +const ReflectionButton: React.FC = ({ lessonId, isCompleted }) => { + const { t } = useTranslation('learn'); + const [isReflectionModalOpen, setIsReflectionModalOpen] = useState(false); + + const onAddReflectionClick = () => { + logButtonClick('add_lesson_reflection', { + lessonId, + isCompleted, + }); + }; + + return ( + <> +
    + + +
    + setIsReflectionModalOpen(false)} + /> + + ); +}; + +export default ReflectionButton; diff --git a/src/components/Course/LessonView/ActionButtons/index.tsx b/src/components/Course/LessonView/ActionButtons/index.tsx index aac5ece6d3..b7951ef31e 100644 --- a/src/components/Course/LessonView/ActionButtons/index.tsx +++ b/src/components/Course/LessonView/ActionButtons/index.tsx @@ -5,13 +5,14 @@ import useTranslation from 'next-translate/useTranslation'; import styles from './ActionButtons.module.scss'; import CompleteButton from './CompleteButton'; +import ReflectionButton from './ReflectionButton'; import CourseFeedback, { FeedbackSource } from '@/components/Course/CourseFeedback'; import { mutateCachedCourseAfterCompletion, mutateCachedLessonsAfterCompletion, } from '@/components/Course/utils/mutations'; -import Button, { ButtonSize, ButtonType } from '@/dls/Button/Button'; +import Button, { ButtonSize } from '@/dls/Button/Button'; import { ToastStatus, useToast } from '@/dls/Toast/Toast'; import useMutateMultipleKeys from '@/hooks/useMutateMultipleKeys'; import useMutateWithoutRevalidation from '@/hooks/useMutateWithoutRevalidation'; @@ -94,13 +95,6 @@ const ActionButtons: React.FC = ({ lesson, courseSlug }) => { navigateToLesson(course.slug, nextLessonSlug); }; - const onAddReflectionClick = () => { - logButtonClick('add_lesson_reflection', { - lessonId: id, - isCompleted, - }); - }; - const shouldShowAddFeedbackButton = course?.userHasFeedback === false && (course?.isCompleted === true || shouldOpenFeedbackModal === true); @@ -137,15 +131,7 @@ const ActionButtons: React.FC = ({ lesson, courseSlug }) => { )}
    - + {shouldShowAddFeedbackButton && ( ({ } }; + const renderExtraSection = (formField: FormBuilderFormField, value: string) => { + if (!formField.extraSection) return null; + if (typeof formField.extraSection === 'function') { + return formField.extraSection(value); + } + return formField.extraSection; + }; + return (
    {formFields?.map((formField) => { @@ -78,6 +86,20 @@ const FormBuilder = ({ rules={buildReactHookFormRules(formField)} name={formField.field} render={({ field, fieldState: { error } }) => { + if (formField.customRender) { + return ( +
    + {formField.customRender({ + value: field.value, + onChange: field.onChange, + placeholder: formField.placeholder, + })} + {error && {error.message}} + {renderExtraSection(formField, field.value)} +
    + ); + } + const inputFieldProps = { key: formField.field, value: field.value, @@ -85,7 +107,7 @@ const FormBuilder = ({ name: formField.field, containerClassName: formField.containerClassName, fieldSetLegend: formField.fieldSetLegend, - label: formField.label, + label: formField.label as string, placeholder: formField.placeholder, onChange: (val) => { field.onChange(val); @@ -107,7 +129,7 @@ const FormBuilder = ({
    {error && {error.message}} - {formField.extraSection &&
    {formField.extraSection}
    } + {renderExtraSection(formField, field.value)}
    ); }} diff --git a/src/components/FormBuilder/FormBuilderTypes.ts b/src/components/FormBuilder/FormBuilderTypes.ts index 9c9215c056..b8252d0f66 100644 --- a/src/components/FormBuilder/FormBuilderTypes.ts +++ b/src/components/FormBuilder/FormBuilderTypes.ts @@ -1,15 +1,22 @@ +import { ReactNode } from 'react'; + import FieldRule from 'types/FieldRule'; import FormField from 'types/FormField'; export type FormBuilderFieldRule = Pick & { errorMessage: string }; export type FormBuilderFormField = Pick & { defaultValue?: any; - label?: string | JSX.Element; + label?: string | ReactNode; placeholder?: string; rules?: FormBuilderFieldRule[]; containerClassName?: string; checked?: boolean; fieldSetLegend?: string; onChange?: (value: unknown) => void; - extraSection?: JSX.Element; + extraSection?: ReactNode | ((value: string) => ReactNode); + customRender?: (props: { + value: string; + onChange: (value: string) => void; + placeholder?: string; + }) => ReactNode; }; diff --git a/src/components/Fundraising/HomepageFundraisingBanner.module.scss b/src/components/Fundraising/HomepageFundraisingBanner.module.scss new file mode 100644 index 0000000000..d4f00c510c --- /dev/null +++ b/src/components/Fundraising/HomepageFundraisingBanner.module.scss @@ -0,0 +1,147 @@ +@use "src/styles/theme"; +@use "src/styles/breakpoints"; + +.container { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + border-radius: var(--border-radius-rounded); + padding: var(--spacing-medium); + @include theme.light { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.1); + } + @include theme.dark { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.8); + } + @include theme.sepia { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.1); + } +} + +.content { + flex: 1; +} + +.title { + font-size: var(--font-size-normal-px); + font-weight: var(--font-weight-bold); + margin-bottom: var(--spacing-xsmall); + color: var(--color-text-default); + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.description { + font-size: var(--font-size-xsmall-px); + @include breakpoints.tablet { + font-size: var(--font-size-medium-px); + } + color: var(--color-text-default); + margin-bottom: var(--spacing-small); +} + +.actions { + display: flex; + align-items: center; + gap: var(--spacing-medium); +} + +.rightActions { + display: flex; + align-items: center; + gap: var(--spacing-medium); +} + +.shareButton { + padding-inline: var(--spacing-xxlarge-px); + background-color: var(--color-success-faded); + --themed-bg: var(--color-success-faded); + --themed-border: var(--color-success-faded); + color: var(--color-text-link-new); + font-weight: var(--font-weight-bold); + display: flex; + align-items: center; + gap: var(--spacing-xsmall); + + font-size: var(--font-size-xsmall-px); + @include breakpoints.tablet { + font-size: var(--font-size-medium-px); + } + + &:hover { + --themed-bg: var(--color-success-faded); + --themed-border: var(--color-success-faded); + color: var(--color-text-link-new); + } + svg { + padding-inline-end: var(--spacing-small-px); + } +} + +.donateButton { + padding-inline: var(--spacing-medium2-px); + color: var(--color-text-link-new); + font-size: var(--font-size-xsmall-px); + --themed-border: var(--color-blue-buttons-and-icons); + --themed-bg: var(--color-blue-buttons-and-icons); + @include breakpoints.tablet { + font-size: var(--font-size-medium-px); + } + font-weight: var(--font-weight-bold); + display: flex; + align-items: center; + gap: var(--spacing-xsmall); + svg { + padding-inline-end: var(--spacing-small-px); + path { + fill: var(--color-blue-buttons-and-icons); + } + } + + span { + align-items: center; + } +} + +.learnMoreLink { + text-decoration: underline; +} + +.closeButton { + position: absolute; + top: var(--spacing-xsmall); + right: var(--spacing-xsmall); + color: var(--color-text-faded); + background: none; + border: none; + cursor: pointer; + padding: var(--spacing-xsmall); + display: flex; + align-items: center; + justify-content: center; + + &:hover { + color: var(--color-text-default); + } +} + +/* Modal styles */ +.modalCloseButton { + position: absolute; + top: var(--spacing-medium); + right: var(--spacing-medium); + color: var(--color-text-faded); + background: none; + border: none; + cursor: pointer; + padding: var(--spacing-xsmall); + display: flex; + align-items: center; + justify-content: center; + + &:hover { + color: var(--color-text-default); + } +} diff --git a/src/components/Fundraising/HomepageFundraisingBanner.tsx b/src/components/Fundraising/HomepageFundraisingBanner.tsx new file mode 100644 index 0000000000..3c5b2ed135 --- /dev/null +++ b/src/components/Fundraising/HomepageFundraisingBanner.tsx @@ -0,0 +1,151 @@ +import React, { useState } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; +import { useDispatch, useSelector } from 'react-redux'; + +import styles from './HomepageFundraisingBanner.module.scss'; + +import Button, { ButtonSize, ButtonType, ButtonVariant } from '@/components/dls/Button/Button'; +import { ModalSize } from '@/components/dls/Modal/Content'; +import Modal from '@/components/dls/Modal/Modal'; +import ShareButtons from '@/components/dls/ShareButtons'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import CloseIcon from '@/icons/close.svg'; +import DiamondIcon from '@/icons/diamond.svg'; +import { + selectIsHomepageBannerVisible, + setIsHomepageBannerVisible, +} from '@/redux/slices/fundraisingBanner'; +import DonateButtonClickSource from '@/types/DonateButtonClickSource'; +import DonateButtonType from '@/types/DonateButtonType'; +import LearnMoreClickSource from '@/types/LearnMoreClickSource'; +import { makeDonatePageUrl, makeDonateUrl } from '@/utils/apiPaths'; +import { logButtonClick, logEvent } from '@/utils/eventLogger'; +import { navigateToExternalUrl } from '@/utils/url'; + +interface HomepageFundraisingBannerProps { + /** + * Whether the banner can be dismissed by the user + * When false, the banner will always be shown and cannot be closed + * When true, the banner visibility is controlled by Redux state + * @default true + */ + isDismissible?: boolean; +} + +const HomepageFundraisingBanner = ({ isDismissible = true }: HomepageFundraisingBannerProps) => { + const { t } = useTranslation('common'); + const dispatch = useDispatch(); + const isVisible = useSelector(selectIsHomepageBannerVisible); + const [isShareModalOpen, setIsShareModalOpen] = useState(false); + + // If dismissible and not visible in Redux state, don't render + if (isDismissible && !isVisible) { + return null; + } + + const onDonateClicked = () => { + const href = makeDonatePageUrl(false, true); // Monthly donation with provider URL + logEvent('donate_button_clicked', { + source: `${DonateButtonClickSource.BANNER}_${DonateButtonType.MONTHLY}`, + }); + navigateToExternalUrl(href); + }; + + const onShareClicked = () => { + logButtonClick('fundraising_banner_share_button_clicked'); + setIsShareModalOpen(true); + }; + + const onCloseShareModal = () => { + setIsShareModalOpen(false); + }; + + const onLearnMoreClicked = () => { + logEvent('learn_more_button_clicked', { + source: LearnMoreClickSource.SIDEBAR_BANNER, + }); + }; + + const onCloseClicked = () => { + logEvent('fundraising_banner_closed', { + source: 'homepage_banner', + }); + dispatch(setIsHomepageBannerVisible(false)); + }; + + const shareURL = makeDonateUrl(); + const shareTitle = t('fundraising.title'); + + return ( + <> +
    +
    +

    {t('fundraising.title')}

    +
    + {`${t('fundraising.description')} `} + + {t('learn-more')} + +
    +
    + +
    + +
    +
    +
    + {isDismissible && ( + + )} +
    + + + + + {t('fundraising-share-title')} + + + + + ); +}; + +export default HomepageFundraisingBanner; diff --git a/src/components/GlobalKeyboardListeners.tsx b/src/components/GlobalKeyboardListeners.tsx index 7a77a979fb..c491dde7c0 100644 --- a/src/components/GlobalKeyboardListeners.tsx +++ b/src/components/GlobalKeyboardListeners.tsx @@ -1,13 +1,43 @@ -import React from 'react'; +import React, { useCallback } from 'react'; -import CommandBar from '@/components/CommandBar'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { shallowEqual, useSelector, useDispatch } from 'react-redux'; + +import { selectIsSearchDrawerOpen, toggleSearchDrawerIsOpen } from '@/redux/slices/navbar'; +import { logEvent } from '@/utils/eventLogger'; + +const getPressedShortcut = (event: KeyboardEvent): string => { + let shortcut = ''; + if (event.metaKey) { + shortcut = 'cmd'; + } else if (event.ctrlKey) { + shortcut = 'ctrl'; + } + return `${shortcut}_${event.key}`; +}; const GlobalKeyboardListeners: React.FC = () => { - return ( - <> - - + const dispatch = useDispatch(); + const isOpen = useSelector(selectIsSearchDrawerOpen, shallowEqual); + const toggleShowCommandBar = useCallback( + (event: KeyboardEvent) => { + // eslint-disable-next-line i18next/no-literal-string + logEvent(`search_drawer_${isOpen ? 'close' : 'open'}`, { + // eslint-disable-next-line @typescript-eslint/naming-convention + keyboard_shortcut: getPressedShortcut(event), + }); + event.preventDefault(); + dispatch({ type: toggleSearchDrawerIsOpen.type }); + }, + [dispatch, isOpen], + ); + useHotkeys( + 'meta+k, ctrl+k, meta+p, ctrl+p', + toggleShowCommandBar, + { enableOnFormTags: ['INPUT'] }, + [dispatch], ); + return <>; }; export default GlobalKeyboardListeners; diff --git a/src/components/HomePage/Card/Card.module.scss b/src/components/HomePage/Card/Card.module.scss new file mode 100644 index 0000000000..3d63b64d22 --- /dev/null +++ b/src/components/HomePage/Card/Card.module.scss @@ -0,0 +1,19 @@ +@use "src/styles/theme"; + +.card { + @include theme.light { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.1); + } + @include theme.dark { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.8); + } + @include theme.sepia { + box-shadow: 0px 4px 25px 0px rgba(0, 0, 0, 0.1); + } + border-radius: var(--border-radius-rounded); + padding: var(--spacing-medium); +} + +.cardWithLink { + cursor: pointer; +} diff --git a/src/components/HomePage/Card/index.tsx b/src/components/HomePage/Card/index.tsx new file mode 100644 index 0000000000..35a38f3a9a --- /dev/null +++ b/src/components/HomePage/Card/index.tsx @@ -0,0 +1,37 @@ +import React from 'react'; + +import classNames from 'classnames'; + +import styles from './Card.module.scss'; + +import Link from '@/dls/Link/Link'; + +interface CardProps { + children: React.ReactNode; + link?: string; + isNewTab?: boolean; + className?: string; + linkClassName?: string; + onClick?: () => void; +} + +const Card: React.FC = ({ + children, + link, + isNewTab = false, + className, + linkClassName, + onClick, +}) => { + if (link) { + return ( + +
    {children}
    + + ); + } + + return
    {children}
    ; +}; + +export default Card; diff --git a/src/components/HomePage/CommunitySection/CommunitySection.module.scss b/src/components/HomePage/CommunitySection/CommunitySection.module.scss new file mode 100644 index 0000000000..a54a892bef --- /dev/null +++ b/src/components/HomePage/CommunitySection/CommunitySection.module.scss @@ -0,0 +1,118 @@ +@use "src/styles/breakpoints"; + +.header { + padding-block-end: var(--spacing-medium); + @include breakpoints.tablet { + padding-block-end: var(--spacing-large-px); + } + + h1 { + font-size: var(--font-size-xlarge-px); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xxlarge-px); + } + } +} + +.cardsContainer { + display: flex; + flex-direction: row; + @include breakpoints.smallerThanTablet { + flex-direction: column; + } + gap: var(--spacing-medium); + justify-content: space-between; + width: 100%; +} + +.ramadanTitle { + display: flex; + flex-direction: row; + justify-content: space-between; + gap: var(--spacing-micro); + font-size: var(--font-size-large); + align-items: center; + color: var(--color-text-default-new); +} + +.titleWithIcon { + display: flex; + align-items: center; + gap: var(--spacing-micro); + font-size: var(--font-size-large); + font-weight: var(--font-weight-semibold); +} + +.cardDescription { + color: var(--color-text-faded-new); + @include breakpoints.smallerThanTablet { + font-size: var(--font-size-small); + } + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.qrIcons { + display: flex; + flex-direction: row; + gap: var(--spacing-micro); + align-items: center; +} + +.coloredIcon { + @include breakpoints.smallerThanTablet { + width: var(--spacing-medium2-px) !important; + height: var(--spacing-medium2-px) !important; + } +} + +.logoIcon { + @include breakpoints.smallerThanTablet { + height: 14px !important; + width: 83px !important; + } +} +.cardContent { + display: flex; + flex-direction: column; + gap: var(--spacing-small); + @include breakpoints.smallerThanTablet { + gap: var(--spacing-xxsmall-px); + } + + justify-content: space-between; + height: 100%; +} + +.card { + height: 100%; +} + +.link { + width: 50%; + @include breakpoints.smallerThanTablet { + width: 100%; + } + display: flex; + flex-direction: column; +} + +.title { + @include breakpoints.smallerThanTablet { + font-size: var(--font-size-normal); + } + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.arrowIcon { + svg { + @include breakpoints.smallerThanTablet { + width: 12px !important; + height: 12px !important; + } + } +} diff --git a/src/components/HomePage/CommunitySection/index.tsx b/src/components/HomePage/CommunitySection/index.tsx new file mode 100644 index 0000000000..9e64f2905d --- /dev/null +++ b/src/components/HomePage/CommunitySection/index.tsx @@ -0,0 +1,85 @@ +import React from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './CommunitySection.module.scss'; + +import Card from '@/components/HomePage/Card'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import QRColoredIcon from '@/icons/qr-colored.svg'; +import QRLogoIcon from '@/icons/qr-logo.svg'; +import TicketIcon from '@/icons/ticket.svg'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getRamadanNavigationUrl } from '@/utils/navigation'; +import { getQRNavigationUrl } from '@/utils/quranReflect/navigation'; + +const CommunitySection = () => { + const { t } = useTranslation('home'); + + const onRamadanCardClicked = () => { + logButtonClick('homepage_community_ramadan_card'); + }; + + const onQRCardClicked = () => { + logButtonClick('homepage_community_qr_card'); + }; + + return ( + <> +
    +

    {t('common:community.title')}

    +
    +
    + +
    +
    +
    + +

    {t('ramadan.title')}

    +
    + } + shouldForceSetColors={false} + className={styles.arrowIcon} + /> +
    +

    {t('ramadan.header')}

    +
    +
    + +
    +
    +
    + + +
    + } + shouldForceSetColors={false} + className={styles.arrowIcon} + /> +
    +

    {t('qr-community')}

    +
    +
    +
    + + ); +}; + +export default CommunitySection; diff --git a/src/components/HomePage/ExploreTopicsSection/ExploreTopicsSection.module.scss b/src/components/HomePage/ExploreTopicsSection/ExploreTopicsSection.module.scss new file mode 100644 index 0000000000..6af72cd402 --- /dev/null +++ b/src/components/HomePage/ExploreTopicsSection/ExploreTopicsSection.module.scss @@ -0,0 +1,44 @@ +@use "src/styles/breakpoints"; + +.header { + padding-block-end: var(--spacing-medium); + @include breakpoints.tablet { + padding-block-end: var(--spacing-large-px); + } + + h1 { + font-size: var(--font-size-xlarge-px); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xxlarge-px); + } + } +} + +.topic { + background-color: var(--color-topics-grey); + padding: var(--spacing-medium-px) !important; + min-width: max-content; + display: flex; + flex-direction: row; + align-items: center; + color: var(--color-text-default-new); + + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.container { + display: flex; + flex-wrap: wrap; + width: 100%; + gap: var(--spacing-small); + @include breakpoints.smallerThanTablet { + gap: var(--spacing-xxsmall); + } +} + +.highlighted { + background-color: var(--color-topics-gold); +} diff --git a/src/components/HomePage/ExploreTopicsSection/index.tsx b/src/components/HomePage/ExploreTopicsSection/index.tsx new file mode 100644 index 0000000000..74321d2afb --- /dev/null +++ b/src/components/HomePage/ExploreTopicsSection/index.tsx @@ -0,0 +1,72 @@ +import React from 'react'; + +import classNames from 'classnames'; +import useTranslation from 'next-translate/useTranslation'; + +import styles from './ExploreTopicsSection.module.scss'; + +import Button, { ButtonShape, ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { logButtonClick } from '@/utils/eventLogger'; + +const TOPICS = [ + { + slug: 'what-is-ramadan', + logKey: 'what-is-ramadan', + key: 'what-is-ramadan', + isHighlighted: true, + }, + { + slug: 'about-the-quran', + logKey: 'about-quran', + key: 'about-quran', + }, + // { + // slug: 'jesus-in-the-quran', + // logKey: 'jesus-in-quran', + // key: 'jesus-in-quran', + // }, + { + slug: 'collections/the-authority-and-importance-of-the-sunnah-clem7p7lf15921610rsdk4xzulfj', + key: 'sunnah', + logKey: 'sunnah_collection', + }, +]; + +const ExploreTopicsSection = () => { + const { t } = useTranslation('quick-links'); + return ( + <> +
    +

    {t('home:explore-topics')}

    +
    +
    + {TOPICS.map((topic) => { + return ( + + ); + })} +
    + + ); +}; + +export default ExploreTopicsSection; diff --git a/src/components/HomePage/HeroButtons/HeroButtons.module.scss b/src/components/HomePage/HeroButtons/HeroButtons.module.scss new file mode 100644 index 0000000000..69326d28a9 --- /dev/null +++ b/src/components/HomePage/HeroButtons/HeroButtons.module.scss @@ -0,0 +1,45 @@ +@use "src/styles/breakpoints"; + +.button { + color: var(--color-text-faded-new); + background: var(--color-background-elevated); + &:hover { + background: var(--color-background-elevated); + color: var(--color-text-faded-new); + } + border: none; + padding: var(--spacing-medium2-px); + box-shadow: var(--shadow-small); + @include breakpoints.smallerThanTablet { + padding: var(--spacing-small-px); + } +} + +.buttonContent { + display: flex; + align-items: center; + gap: var(--spacing-xsmall); + + @include breakpoints.smallerThanTablet { + svg { + width: 12px; + height: 12px; + } + } +} + +.popularText { + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.navigateQuranText { + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.buttonContainer { + background: var(--color-background-elevated); +} diff --git a/src/components/HomePage/HeroButtons/NavigationButton/index.tsx b/src/components/HomePage/HeroButtons/NavigationButton/index.tsx new file mode 100644 index 0000000000..7f42d70e63 --- /dev/null +++ b/src/components/HomePage/HeroButtons/NavigationButton/index.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import useTranslation from 'next-translate/useTranslation'; +import { useDispatch } from 'react-redux'; + +import heroButtonStyles from '@/components/HomePage/HeroButtons/HeroButtons.module.scss'; +import Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import TheListIcon from '@/icons/the_list.svg'; +import { toggleIsVisible } from '@/redux/slices/QuranReader/sidebarNavigation'; +import { logButtonClick } from '@/utils/eventLogger'; + +const NavigationButton = () => { + const dispatch = useDispatch(); + const { t } = useTranslation('home'); + const onClick = () => { + dispatch({ type: toggleIsVisible.type }); + logButtonClick('home_navigate_quran'); + }; + return ( + + ); +}; + +export default NavigationButton; diff --git a/src/components/HomePage/HeroButtons/PopularButton/PopularButton.module.scss b/src/components/HomePage/HeroButtons/PopularButton/PopularButton.module.scss new file mode 100644 index 0000000000..6a7c629418 --- /dev/null +++ b/src/components/HomePage/HeroButtons/PopularButton/PopularButton.module.scss @@ -0,0 +1,85 @@ +@use "src/styles/breakpoints"; + +@keyframes slideUpFade { + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.buttonWrapper { + display: flex; + flex-direction: column; + align-items: center; + width: 125px; + @include breakpoints.smallerThanTablet { + width: 85px; + } +} + +.dropdownContainer { + width: 750px; + margin-inline-start: -230px; + margin-top: -42%; + border-radius: var(--border-radius-rounded); + box-shadow: var(--shadow-medium); + background: var(--color-background-elevated); + z-index: var(--z-index-default); + animation: slideUpFade 0.1s ease-out forwards; + + @include breakpoints.smallerThanTablet { + width: 360px; + margin-inline-start: -160px; + margin-top: -35px; + } + + hr { + background: var(--color-borders-hairline); + height: 1px; + border: none; + padding: 0; + margin: var(--spacing-micro); + } +} + +.container { + padding: var(--spacing-medium2-px); + background: var(--color-background-elevated); + box-sizing: border-box; + border-radius: var(--border-radius-circle); +} + +.bodyContainer { + padding-inline-start: 0; + padding-inline-end: var(--spacing-xxsmall); + overflow-y: auto; + position: relative; + box-sizing: border-box; +} + +.header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.popularHeader { + display: flex; + align-items: center; + gap: var(--spacing-xsmall); + color: var(--color-text-faded-new); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.chaptersAndVerses { + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} diff --git a/src/components/HomePage/HeroButtons/PopularButton/index.tsx b/src/components/HomePage/HeroButtons/PopularButton/index.tsx new file mode 100644 index 0000000000..f56d3c47ba --- /dev/null +++ b/src/components/HomePage/HeroButtons/PopularButton/index.tsx @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './PopularButton.module.scss'; + +import heroButtonStyles from '@/components/HomePage/HeroButtons/HeroButtons.module.scss'; +import PlayRadioButton from '@/components/HomePage/PlayRadioButton'; +import QuickLinks from '@/components/HomePage/QuickLinks'; +import Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import CloseIcon from '@/icons/close.svg'; +import PopularIcon from '@/icons/trend_up.svg'; +import { logButtonClick } from '@/utils/eventLogger'; + +const PopularButton = () => { + const { t } = useTranslation('home'); + const [isExpanded, setIsExpanded] = useState(false); + const onClick = () => { + logButtonClick('home_popular'); + setIsExpanded((prev) => !prev); + }; + + const onCloseClicked = () => { + logButtonClick('home_popular_close'); + setIsExpanded(false); + }; + return ( +
    + + {isExpanded && ( +
    +
    +
    +
    +
    + } + shouldForceSetColors={false} + /> + {t('popular')} +
    + +
    +
    +
    +

    {t('chapters-and-verses')}

    + +
    + +
    +
    +
    +
    + )} +
    + ); +}; + +export default PopularButton; diff --git a/src/components/HomePage/HomePageHero.module.scss b/src/components/HomePage/HomePageHero.module.scss index 489737b8b0..1efcf223fe 100644 --- a/src/components/HomePage/HomePageHero.module.scss +++ b/src/components/HomePage/HomePageHero.module.scss @@ -5,26 +5,15 @@ position: relative; } -$fallbackColor: #22a5ad; - .backgroundImage { position: absolute; z-index: -1; inset: 0; - background-color: $fallbackColor; - background-image: url("/images/background.jpg"); - background-size: cover; - - @include theme.dark { - filter: saturate(0.1) brightness(0.3) contrast(1.1); - } + background-color: var(--color-search-background); - @include theme.light { - filter: none; - } - - @include theme.sepia { - filter: sepia(1); + svg { + width: 100%; + transform: translateY(-40%); } } @@ -34,31 +23,29 @@ $fallbackColor: #22a5ad; height: 100%; align-items: center; padding-inline: var(--spacing-small); + padding-block: var(--spacing-medium2-px); @include breakpoints.tablet { - max-width: calc(25 * var(--spacing-mega)); + padding-block: var(--spacing-large-px); } margin-inline: auto; } -.imageContainer { - height: calc(5 * var(--spacing-mega)); - width: 100%; - max-width: calc(8 * var(--spacing-mega)); - margin-block-end: var(--spacing-medium); - margin-block-start: var(--spacing-mega); - - @include breakpoints.tablet { - margin-block-end: var(--spacing-mega); - margin-block-start: var(--spacing-xxsmall); - } - - & > svg { - fill: var(--color-text-inverse); +.logoContainer { + padding-bottom: var(--spacing-medium2-px); + @include breakpoints.smallerThanTablet { + display: none; + padding: 0; } } -.quickLinksContainer { - margin-block-start: var(--spacing-xxsmall); +.buttonsContainer { + display: flex; + gap: var(--spacing-medium2-px); + margin-block-start: var(--spacing-medium); + @include breakpoints.smallerThanTablet { + gap: var(--spacing-medium-px); + margin-block-start: var(--spacing-small-px); + } } diff --git a/src/components/HomePage/HomePageHero.tsx b/src/components/HomePage/HomePageHero.tsx index 5c1b115407..c86334f332 100644 --- a/src/components/HomePage/HomePageHero.tsx +++ b/src/components/HomePage/HomePageHero.tsx @@ -1,26 +1,37 @@ -import dynamic from 'next/dynamic'; import Head from 'next/head'; +import useTranslation from 'next-translate/useTranslation'; +import NavigationButton from './HeroButtons/NavigationButton'; +import PopularButton from './HeroButtons/PopularButton'; import styles from './HomePageHero.module.scss'; -import QuickLinks from './QuickLinks'; -import CommandBarTrigger from '@/components/CommandBar/CommandBarTrigger'; - -const PlayRadioButton = dynamic(() => import('./PlayRadioButton')); +import SearchInput from '@/components/Search/SearchInput'; +import Background from '@/icons/background.svg'; +import Logo from '@/icons/logo_main.svg'; const HomePageHero = () => { + const { t } = useTranslation('common'); return (
    - + -
    -
    - +
    + +
    +
    - -
    - +
    + +
    + +
    + +
    diff --git a/src/components/HomePage/HomePageMessage.module.scss b/src/components/HomePage/HomePageMessage.module.scss index 8cbe00f59d..94a2353712 100644 --- a/src/components/HomePage/HomePageMessage.module.scss +++ b/src/components/HomePage/HomePageMessage.module.scss @@ -10,7 +10,7 @@ border: 1px solid var(--color-success-medium); background-color: var(--color-background-elevated); - color: var(--color-text-default); + color: var(--color-text-default-new); } .title { diff --git a/src/components/HomePage/LearningPlansSection/LearningPlansSection.module.scss b/src/components/HomePage/LearningPlansSection/LearningPlansSection.module.scss new file mode 100644 index 0000000000..f4892fdf3d --- /dev/null +++ b/src/components/HomePage/LearningPlansSection/LearningPlansSection.module.scss @@ -0,0 +1,183 @@ +@use "src/styles/breakpoints"; + +$mobile-size: calc(var(--spacing-small-px) + var(--spacing-micro-px)); + +.header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-block-end: var(--spacing-medium); + @include breakpoints.tablet { + padding-block-end: var(--spacing-large-px); + } + + h1 { + font-size: var(--font-size-xlarge-px); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xxlarge-px); + } + } +} + +.thumbnail { + border-radius: var(--border-radius-rounded); + @include breakpoints.smallerThanTablet { + display: none; + } +} + +.cardsContainer { + max-width: 98.5%; + display: flex; + flex-direction: row; + gap: var(--spacing-medium); + overflow-x: auto; + padding-inline: var(--spacing-large); + margin-inline: calc(-1 * var(--spacing-large)); + padding-block: var(--spacing-large); + margin-block: calc(-1 * var(--spacing-large)); + + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } +} + +.learnPlanCard { + flex: 0 0 45%; + min-width: 45%; + @include breakpoints.smallerThanTablet { + flex: 0 0 75%; + min-width: 75%; + } +} + +.card { + height: 100%; + display: flex; + gap: var(--spacing-medium-px); + padding: 0; +} + +.cardWrapper { + display: flex; + flex-direction: row; + gap: var(--spacing-medium); + padding: var(--spacing-medium); + flex: 1; +} + +.cardContent { + display: flex; + flex-direction: column; + width: 100%; +} + +.startLearningLink { + display: flex; + flex-direction: row-reverse; + gap: var(--spacing-xsmall); + color: var(--color-text-faded-new); +} + +.startLearningLinkContent { + display: flex; + flex-direction: row; + gap: var(--spacing-micro); + color: var(--color-text-faded-new); + align-items: center; + @include breakpoints.tablet { + font-size: var(--font-size-medium-px); + } +} + +.startLearningLinkIcon { + @include breakpoints.smallerThanTablet { + svg { + width: $mobile-size; + height: $mobile-size; + } + } +} + +.learningPlanTitle { + font-weight: var(--font-weight-semibold); + font-size: var(--font-size-large); + @include breakpoints.smallerThanTablet { + font-size: var(--font-size-small-px); + } + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.learningPlanStatus { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + gap: var(--spacing-xsmall); + margin-top: auto; + @include breakpoints.smallerThanTablet { + font-size: $mobile-size; + } +} + +.enrolledPlanStatus { + justify-content: space-between; +} + +.enrolledPill { + background-color: var(--color-qdc-faint-blue); + padding-inline: var(--spacing-xsmall); + border-radius: var(--border-radius-rounded); + color: var(--color-text-black); + @include breakpoints.tablet { + font-size: var(--font-size-xsmall-px); + } +} + +.completedPill { + background-color: var(--color-topics-gold); + padding-inline: var(--spacing-xsmall); + border-radius: var(--border-radius-rounded); + color: var(--color-text-default-new); + @include breakpoints.tablet { + font-size: var(--font-size-xsmall-px); + } +} + +.thumbnailSkeleton { + width: 150px; + height: 100px; + border-radius: var(--border-radius-rounded); +} + +.titleSkeleton { + width: 100%; + max-width: 250px; + height: 24px; + margin-bottom: var(--spacing-medium); + border-radius: var(--border-radius-default); +} + +.pillSkeleton { + width: 80px; + height: 24px; + border-radius: var(--border-radius-rounded); +} + +.buttonSkeleton { + width: 120px; + height: 36px; + border-radius: var(--border-radius-default); +} + +.seeMore { + color: var(--color-text-faded-new); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} diff --git a/src/components/HomePage/LearningPlansSection/Loading.tsx b/src/components/HomePage/LearningPlansSection/Loading.tsx new file mode 100644 index 0000000000..eb1557f526 --- /dev/null +++ b/src/components/HomePage/LearningPlansSection/Loading.tsx @@ -0,0 +1,35 @@ +import React from 'react'; + +import styles from './LearningPlansSection.module.scss'; + +import Skeleton from '@/components/dls/Skeleton/Skeleton'; +import Card from '@/components/HomePage/Card'; + +const Loading = () => ( +
    + {/* eslint-disable-next-line @typescript-eslint/naming-convention */} + {Array.from({ length: 3 }, (_, index) => ( +
    + +
    + + +
    +
    + +
    + +
    + {/* Add a small pill skeleton to match enrolled/completed state */} + + +
    +
    +
    +
    +
    + ))} +
    +); + +export default Loading; diff --git a/src/components/HomePage/LearningPlansSection/index.tsx b/src/components/HomePage/LearningPlansSection/index.tsx new file mode 100644 index 0000000000..9b3ba36b6e --- /dev/null +++ b/src/components/HomePage/LearningPlansSection/index.tsx @@ -0,0 +1,161 @@ +import React from 'react'; + +import classNames from 'classnames'; +import Image from 'next/image'; +import useTranslation from 'next-translate/useTranslation'; + +import styles from './LearningPlansSection.module.scss'; +import Loading from './Loading'; + +import DataFetcher from '@/components/DataFetcher'; +import Card from '@/components/HomePage/Card'; +import NewLabel from '@/dls/Badge/NewLabel'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { Course, CoursesResponse } from '@/types/auth/Course'; +import { privateFetcher } from '@/utils/auth/api'; +import { makeGetCoursesUrl } from '@/utils/auth/apiPaths'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getCourseNavigationUrl, getCoursesNavigationUrl } from '@/utils/navigation'; + +const learningPlansSorter = (a: Course, b: Course) => { + // Enrolled but unfinished courses come first + if (a.isCompleted === false && b.isCompleted !== false) return -1; + if (a.isCompleted !== false && b.isCompleted === false) return 1; + + // New courses (isCompleted undefined) come second + if (a.isCompleted === undefined && b.isCompleted === true) return -1; + if (a.isCompleted === true && b.isCompleted === undefined) return 1; + + return 0; +}; + +const LearningPlansSection = () => { + const { t } = useTranslation('home'); + + const onSeeMoreClicked = () => { + logButtonClick('homepage_learning_plans_see_more'); + }; + + const onLearningPlanCardClicked = (slug: string) => { + logButtonClick('homepage_learning_plans_card', { + slug, + }); + }; + + const onStartOrContinueLearningClicked = (isCompleted: boolean, slug: string) => { + logButtonClick('homepage_learning_plans_start_or_continue', { + slug, + enrolledButNotCompleted: isCompleted, + }); + }; + + return ( + <> +
    +

    {t('learning-plan')}

    +
    + + {t('see-more-learning-plans')} + +
    +
    + { + const sortedCourses = [...data.data].sort(learningPlansSorter); + const firstNonEnrolledIndex = sortedCourses.findIndex( + (c) => typeof c.isCompleted === 'undefined', + ); + + return ( +
    + {sortedCourses.map((course, index) => { + const { isCompleted } = course; + const courseUrl = getCourseNavigationUrl(course.slug); + const userHasEnrolled = typeof isCompleted !== 'undefined'; + const enrolledButNotCompleted = userHasEnrolled && !isCompleted; + const isFirstNonEnrolledCourse = + !userHasEnrolled && index === firstNonEnrolledIndex; + + return ( +
    + onLearningPlanCardClicked(course.slug)} + > +
    + {course.title} +
    +
    + {course.title} + {isFirstNonEnrolledCourse && } +
    + +
    + {enrolledButNotCompleted && ( +
    {t('learn:enrolled')}
    + )} + {userHasEnrolled && isCompleted && ( +
    {t('learn:completed')}
    + )} + + onStartOrContinueLearningClicked( + enrolledButNotCompleted, + course.slug, + ) + } + > +
    + + {enrolledButNotCompleted + ? t('learn:continue-learning') + : t('learn:start-learning')} + + } + shouldForceSetColors={false} + className={styles.startLearningLinkIcon} + /> +
    + +
    +
    +
    +
    +
    + ); + })} +
    + ); + }} + /> + + ); +}; + +export default LearningPlansSection; diff --git a/src/components/HomePage/MobileHomepageSections/index.tsx b/src/components/HomePage/MobileHomepageSections/index.tsx new file mode 100644 index 0000000000..33269e3bc1 --- /dev/null +++ b/src/components/HomePage/MobileHomepageSections/index.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import classNames from 'classnames'; + +import CommunitySection from '../CommunitySection'; +import ExploreTopicsSection from '../ExploreTopicsSection'; +import LearningPlansSection from '../LearningPlansSection'; + +import styles from '@/pages/index.module.scss'; + +type Props = { + isUserLoggedIn: boolean; +}; + +const MobileHomepageSections: React.FC = ({ isUserLoggedIn }) => { + return isUserLoggedIn ? ( + <> +
    + +
    +
    + +
    +
    + +
    + + ) : ( + <> +
    + +
    +
    + +
    +
    + +
    + + ); +}; + +export default MobileHomepageSections; diff --git a/src/components/HomePage/PlayRadioButton.module.scss b/src/components/HomePage/PlayRadioButton.module.scss index 38f6928bc4..89db3a7dd4 100644 --- a/src/components/HomePage/PlayRadioButton.module.scss +++ b/src/components/HomePage/PlayRadioButton.module.scss @@ -1,6 +1,5 @@ @use "src/styles/breakpoints"; -$text-colors: #fff; // text color should be white on both light and dark theme $button-hover-color: rgba( $color: #000000, $alpha: 0.3 @@ -12,45 +11,34 @@ $button-hover-color: rgba( font-weight: var(--font-weight-bold); } +.listenToRadio { + color: var(--color-text-default-new); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + .container { inset-block-start: 0; inset-inline: 0; - display: flex; - justify-content: flex-end; - box-sizing: border-box; - padding-inline: calc(1.3 * var(--spacing-medium)); - padding-block-start: var(--spacing-medium); - padding-block-end: var(--spacing-xsmall); - @include breakpoints.tablet { - padding-inline: calc(1.3 * var(--spacing-mega)); - } -} -.playRadioSection { display: flex; + align-items: center; flex-direction: column; - align-items: flex-end; + text-align: center; } .stationTitle { margin-block-start: var(--spacing-medium); - color: $text-colors; } .editStationButton { margin-inline-end: var(--spacing-xsmall); - color: $text-colors; text-decoration: underline; } -.playPauseButton { - background-color: transparent; - border: none; - color: $text-colors; - &:hover { - color: $text-colors; - background-color: $button-hover-color; - } +.station { + font-weight: var(--font-weight-bold); } diff --git a/src/components/HomePage/PlayRadioButton.tsx b/src/components/HomePage/PlayRadioButton.tsx index 5d9e2224ab..dbfd010963 100644 --- a/src/components/HomePage/PlayRadioButton.tsx +++ b/src/components/HomePage/PlayRadioButton.tsx @@ -10,7 +10,7 @@ import { StationType } from '../Radio/types'; import styles from './PlayRadioButton.module.scss'; import RadioInformation from './RadioInformation'; -import Button, { ButtonType, ButtonSize } from '@/dls/Button/Button'; +import Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button'; import Spinner from '@/dls/Spinner/Spinner'; import PauseIcon from '@/icons/pause.svg'; import PlayIcon from '@/icons/play-arrow.svg'; @@ -55,33 +55,29 @@ const PlayRadioButton = () => { const { radioActor } = audioService.getSnapshot().context; return (
    -
    - {isAudioPlaying && isRadioMode ? ( - - ) : ( - - )} - {radioActor && } -
    + {isAudioPlaying && isRadioMode ? ( + + ) : ( + + )} + {radioActor && }
    ); }; diff --git a/src/components/HomePage/QuickLinks/QuickLink.tsx b/src/components/HomePage/QuickLinks/QuickLink.tsx deleted file mode 100644 index 8b81d542be..0000000000 --- a/src/components/HomePage/QuickLinks/QuickLink.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; - -import Button, { ButtonShape, ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button'; -import { logButtonClick } from '@/utils/eventLogger'; - -interface Props { - slug: string; - text: string; - logKey: string; - className?: string; - isExternalLink?: boolean; -} - -const QuickLink: React.FC = ({ text, slug, className, logKey, isExternalLink = false }) => ( - -); - -export default QuickLink; diff --git a/src/components/HomePage/QuickLinks/QuickLinks.module.scss b/src/components/HomePage/QuickLinks/QuickLinks.module.scss index 69c9373012..172e58789f 100644 --- a/src/components/HomePage/QuickLinks/QuickLinks.module.scss +++ b/src/components/HomePage/QuickLinks/QuickLinks.module.scss @@ -1,31 +1,32 @@ @use "src/styles/breakpoints"; -@use "src/styles/theme"; -$link-shadow: 0px 3px 11px 1px rgb(0 0 0 / 3%); - -.header { - margin-block-end: var(--spacing-xsmall); - padding-inline-start: var(--flow-side-spacing, var(--spacing-small)); +.quickLink { + background-color: var(--color-topics-grey); + padding: var(--spacing-xxsmall-px) var(--spacing-small-px); + @include breakpoints.tablet { + padding: var(--spacing-small-px); + } + min-width: max-content; + display: flex; + flex-direction: row; + align-items: center; } -.quickLinksContainer { - width: 100%; +.container { display: flex; flex-wrap: wrap; - justify-content: center; - overflow-x: auto; - margin-inline: auto; - &::-webkit-scrollbar { - -webkit-appearance: none; - height: 0; - } + width: 100%; + gap: var(--spacing-xxsmall-px); + padding-block: var(--spacing-small-px); } -.link { - margin-inline: var(--spacing-xxsmall); - margin-block-end: var(--spacing-xxsmall); - &:hover { - box-shadow: var(--shadow-large); - color: var(--color-text-inverse); +.quickLinkText { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-small); + font-size: var(--font-size-xsmall); + @include breakpoints.tablet { + font-size: var(--font-size-small-px); } } diff --git a/src/components/HomePage/QuickLinks/index.tsx b/src/components/HomePage/QuickLinks/index.tsx index 8290720404..a1c08edd20 100644 --- a/src/components/HomePage/QuickLinks/index.tsx +++ b/src/components/HomePage/QuickLinks/index.tsx @@ -1,65 +1,95 @@ -import React from 'react'; +import React, { useContext } from 'react'; import useTranslation from 'next-translate/useTranslation'; -import QuickLink from './QuickLink'; import styles from './QuickLinks.module.scss'; -import { isLoggedIn } from '@/utils/auth/login'; +import DataContext from '@/contexts/DataContext'; +import Button, { ButtonShape, ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { getChapterData } from '@/utils/chapter'; +import { logButtonClick } from '@/utils/eventLogger'; +import { toLocalizedNumber } from '@/utils/locale'; -const isProduction = process.env.NEXT_PUBLIC_VERCEL_ENV === 'production'; +enum QuickLinkType { + Surah = 'surah', + Ayah = 'ayah', + Range = 'range', +} const QUICK_LINKS = [ { - slug: 'about-the-quran', - logKey: 'about-quran', - key: 'about-quran', + slug: 'al-mulk', + type: QuickLinkType.Surah, + surah: 67, }, { - slug: 'surah-al-mulk', - logKey: 'surah-al-mulk', - key: 'mulk', + slug: 'al-kahf', + type: QuickLinkType.Surah, + surah: 18, }, { - slug: 'surah-ya-sin', - logKey: 'surah-ya-sin', - key: 'yaseen', + slug: 'ya-sin', + type: QuickLinkType.Surah, + surah: 36, }, { - slug: 'surah-al-kahf', - logKey: 'surah-al-kahf', - key: 'kahf', + slug: 'ayatul-kursi', + type: QuickLinkType.Ayah, + translationKey: 'ayat-ul-kursi', }, { - slug: 'surah-al-waqiah', - logKey: 'surah-al-waqiah', - key: 'waqiah', + slug: 'al-baqarah', + number: [285, 286], + type: QuickLinkType.Range, + surah: 2, }, ]; -// TODO: this is temporary and needs to be updated. -if (isLoggedIn() && isProduction) { - QUICK_LINKS.push({ - slug: 'collections/the-authority-and-importance-of-the-sunnah-clem7p7lf15921610rsdk4xzulfj', - key: 'sunnah', - logKey: 'sunnah_collection', - }); -} - const QuickLinks: React.FC = () => { - const { t } = useTranslation('quick-links'); + const { t, lang } = useTranslation('quick-links'); + const chaptersData = useContext(DataContext); return ( -
    - {QUICK_LINKS.map((quickLink) => ( - - ))} +
    + {QUICK_LINKS.map((quickLink) => { + let text = ''; + if (quickLink.type === QuickLinkType.Ayah) { + text = t(quickLink.translationKey); + } else { + const chapterData = getChapterData(chaptersData, String(quickLink.surah)); + text = `${toLocalizedNumber(quickLink.surah, lang)}. ${chapterData?.transliteratedName}`; + if (quickLink.type === QuickLinkType.Range) { + text = `${text} ${toLocalizedNumber(quickLink.number[0], lang)}-${toLocalizedNumber( + quickLink.number[1], + lang, + )}`; + } + } + + return ( + + ); + })}
    ); }; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/CallToActionButtons.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/CallToActionButtons.module.scss deleted file mode 100644 index d8f762b61d..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/CallToActionButtons.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -.viewPlansBtn { - margin-inline-end: var(--spacing-small); -} - -.buttonsContainer { - display: flex; - padding-block-start: var(--spacing-xxsmall); -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/LearningPlansButtons.tsx b/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/LearningPlansButtons.tsx deleted file mode 100644 index 1d1ea6c4cf..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/LearningPlansButtons.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; -import useSWRImmutable from 'swr/immutable'; - -import styles from './CallToActionButtons.module.scss'; - -import Button, { ButtonSize, ButtonType } from '@/dls/Button/Button'; -import { getUserCoursesCount } from '@/utils/auth/api'; -import { makeGetUserCoursesCountUrl } from '@/utils/auth/apiPaths'; -import { isLoggedIn } from '@/utils/auth/login'; -import { logButtonClick } from '@/utils/eventLogger'; -import { getCoursesNavigationUrl, getMyCoursesNavigationUrl } from '@/utils/navigation'; - -const LearningPlansButtons = () => { - const { t } = useTranslation('home'); - const { data, isValidating, error } = useSWRImmutable( - isLoggedIn() ? makeGetUserCoursesCountUrl() : null, - async () => { - const response = await getUserCoursesCount(); - return response; - }, - ); - - const onViewPlansButtonClicked = (e) => { - // don't toggle collapsible parent when clicking - e.stopPropagation(); - logButtonClick('homepage_qgj_view_plans'); - }; - - const onMyPlansButtonClicked = (e) => { - e.stopPropagation(); - logButtonClick('homepage_qgj_my_plans'); - }; - - const viewPlansButton = ( - - ); - - if (!isLoggedIn()) { - return
    {viewPlansButton}
    ; - } - - /** - * If we are loading, or if we have an error, or if we have no data, we show the message - */ - if ((isValidating && !data) || error || (data?.count ?? 0) === 0) { - return
    {viewPlansButton}
    ; - } - - // user has already 1 plan - return ( -
    - {viewPlansButton} - -
    - ); -}; - -export default LearningPlansButtons; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/QuranGoalsButtons.tsx b/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/QuranGoalsButtons.tsx deleted file mode 100644 index d4a1c28370..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/QuranGoalsButtons.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './CallToActionButtons.module.scss'; - -import GoalButtons from '@/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons'; -import Button, { ButtonSize, ButtonType } from '@/dls/Button/Button'; -import useGetRecentlyReadVerseKeys from '@/hooks/auth/useGetRecentlyReadVerseKeys'; -import useGetStreakWithMetadata from '@/hooks/auth/useGetStreakWithMetadata'; -import { isLoggedIn } from '@/utils/auth/login'; -import { logButtonClick } from '@/utils/eventLogger'; -import { getLoginNavigationUrl, getReadingGoalNavigationUrl } from '@/utils/navigation'; - -const QuranGoalsButtons = () => { - const { t } = useTranslation('reading-goal'); - const { goal, currentActivityDay } = useGetStreakWithMetadata({ - disableIfNoGoalExists: false, - }); - const { recentlyReadVerseKeys } = useGetRecentlyReadVerseKeys(); - - const nextVerseToRead = goal?.progress?.nextVerseToRead ?? recentlyReadVerseKeys[0]; - - const onCreateReadingGoalClick = (e) => { - // don't toggle collapsible parent when clicking - e.stopPropagation(); - logButtonClick('homepage_qgj_create_goal'); - }; - - if (goal) { - return ( - - ); - } - - const url = getReadingGoalNavigationUrl(); - - return ( -
    - -
    - ); -}; - -export default QuranGoalsButtons; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleSection.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleSection.module.scss deleted file mode 100644 index d474aed6da..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleSection.module.scss +++ /dev/null @@ -1,18 +0,0 @@ -.container { - border: 1px var(--color-borders-hairline) solid; - border-radius: var(--border-radius-default); - padding-inline: var(--spacing-xsmall); - padding-block: var(--spacing-xxsmall); - margin-block: var(--spacing-xxsmall); -} - -.body { - padding: var(--spacing-xxsmall); -} - -.prefixSVG { - path { - stroke: var(--color-background-inverse); - stroke-width: 3px; - } -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/CollapsibleTitle.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/CollapsibleTitle.module.scss deleted file mode 100644 index 9376c22841..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/CollapsibleTitle.module.scss +++ /dev/null @@ -1,8 +0,0 @@ -.container { - display: flex; - align-items: center; -} - -.iconContainer { - margin-inline-end: var(--spacing-xxsmall); -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/index.tsx deleted file mode 100644 index 1ed0cb298a..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/CollapsibleTitle/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -import styles from './CollapsibleTitle.module.scss'; - -import IconContainer from '@/dls/IconContainer/IconContainer'; - -type Props = { - title: string; - icon: React.ReactNode; -}; - -const CollapsibleTitle: React.FC = ({ title, icon }) => { - return ( -
    - - {title} -
    - ); -}; - -export default CollapsibleTitle; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/LearningPlans.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/LearningPlans.module.scss deleted file mode 100644 index 45266a19f3..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/LearningPlans.module.scss +++ /dev/null @@ -1,3 +0,0 @@ -.desc { - margin-block-end: var(--spacing-small); -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/index.tsx deleted file mode 100644 index aed1a4be87..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/LearningPlans/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; -import useSWRImmutable from 'swr/immutable'; - -import styles from './LearningPlans.module.scss'; - -import { getUserCoursesCount } from '@/utils/auth/api'; -import { makeGetUserCoursesCountUrl } from '@/utils/auth/apiPaths'; -import { isLoggedIn } from '@/utils/auth/login'; - -const LearningPlans = () => { - const { t } = useTranslation('home'); - - const { data, isValidating, error } = useSWRImmutable( - isLoggedIn() ? makeGetUserCoursesCountUrl() : null, - async () => { - const response = await getUserCoursesCount(); - return response; - }, - ); - - if (!isLoggedIn()) { - return

    {t('qgj.learning-plans.desc.logged-out')}

    ; - } - - /** - * If we are loading, or if we have an error, or if we have no data, we show the message - */ - if ((isValidating && !data) || error || (data?.count ?? 0) === 0) { - return

    {t('qgj.learning-plans.desc.logged-in-no-plans')}

    ; - } - // user has at least 1 plan - return

    {t('qgj.learning-plans.desc.logged-in')}

    ; -}; - -export default LearningPlans; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/DaysCounter.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/DaysCounter.module.scss deleted file mode 100644 index 94f9543d0f..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/DaysCounter.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.streakTitle { - color: var(--color-success-medium); - font-size: var(--font-size-jumbo); - font-weight: bold; - display: flex; - align-items: center; -} - -.streakTitleWarning { - color: var(--color-warning-medium); -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/index.tsx deleted file mode 100644 index 7c5d63e8a0..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/DaysCounter/index.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; - -import classNames from 'classnames'; -import useTranslation from 'next-translate/useTranslation'; - -import styles from './DaysCounter.module.scss'; - -import StreakDefinitionModal from '@/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal'; -import { toLocalizedNumber } from '@/utils/locale'; - -type Props = { - streak: number; - // TODO: strongly type this - currentActivityDay: any; -}; - -const DaysCounter: React.FC = ({ streak, currentActivityDay }) => { - const { t, lang } = useTranslation('reading-goal'); - const localizedStreak = toLocalizedNumber(streak, lang); - const hasUserReadToday = currentActivityDay?.hasRead; - return ( -
    0 && styles.streakTitleWarning, - )} - > - {t('x-days-streak', { days: localizedStreak })} - -
    - ); -}; - -export default DaysCounter; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/GoalButtons.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/GoalButtons.module.scss deleted file mode 100644 index 37d38239c7..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/GoalButtons.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.actionsContainer { - padding-block-start: var(--spacing-xxsmall); - display: flex; - align-items: center; - - & > :first-child { - margin-inline-end: var(--spacing-xxsmall); - } -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/index.tsx deleted file mode 100644 index 5b9c490d9e..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalButtons/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './GoalButtons.module.scss'; - -import Button, { ButtonSize, ButtonType, ButtonVariant } from '@/dls/Button/Button'; -import { CurrentQuranActivityDay } from '@/types/auth/ActivityDay'; -import { logButtonClick } from '@/utils/eventLogger'; -import { - getChapterWithStartingVerseUrl, - getReadingGoalProgressNavigationUrl, -} from '@/utils/navigation'; - -type Props = { - nextVerseToRead: string; - currentActivityDay: CurrentQuranActivityDay; -}; - -const GoalButtons: React.FC = ({ nextVerseToRead, currentActivityDay }) => { - const { t } = useTranslation('reading-goal'); - const onViewProgressClick = (e) => { - // don't toggle collapsible parent when clicking - e.stopPropagation(); - logButtonClick('homepage_streak_widget_view_progress'); - }; - - const onContinueReadingClick = (e) => { - // don't toggle collapsible parent when clicking - e.stopPropagation(); - logButtonClick('homepage_streak_widget_continue_reading', { - // eslint-disable-next-line @typescript-eslint/naming-convention - verse_key: nextVerseToRead, - }); - }; - - return ( -
    - - -
    - ); -}; - -export default GoalButtons; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalStatus/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalStatus/index.tsx deleted file mode 100644 index 815d55c76f..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/GoalStatus/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import ReadingGoalAmount, { - ReadingGoalAmountContext, -} from '@/components/ReadingGoal/ReadingGoalAmount'; -import { CurrentQuranActivityDay } from '@/types/auth/ActivityDay'; -import { QuranGoalStatus } from '@/types/auth/Goal'; - -type Props = { - currentActivityDay: CurrentQuranActivityDay; - goal: QuranGoalStatus; - percent: number; - isQuranReader: boolean; -}; - -const GoalStatus: React.FC = ({ currentActivityDay, goal, percent, isQuranReader }) => { - const { t } = useTranslation('reading-goal'); - if (!goal) return null; - - if (goal.isCompleted) { - return t('progress.goal-complete'); - } - - if (percent < 100) { - return ( - - ); - } - return t('progress.complete'); -}; - -export default GoalStatus; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/ReadingStreak.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/ReadingStreak.module.scss index ba9bef309f..08761134b8 100644 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/ReadingStreak.module.scss +++ b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/ReadingStreak.module.scss @@ -18,7 +18,7 @@ .streakSubtitle { font-size: var(--font-size-small); text-transform: uppercase; - color: var(--color-text-default); + color: var(--color-text-default-new); } .weekProgressLabel { diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/StreakDefinitionModal.module.scss b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/StreakDefinitionModal.module.scss deleted file mode 100644 index ba42697991..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/StreakDefinitionModal.module.scss +++ /dev/null @@ -1,46 +0,0 @@ -@use "src/styles/theme"; - -.button { - display: flex; - background: none; - border: none; - align-items: center; - color: var(--color-background-alternative-deep); - margin-inline: var(--spacing-xsmall); - - & > svg { - width: var(--spacing-large); - } -} - -.timelineSection { - margin-block-start: var(--spacing-mega); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - - h2 { - font-size: var(--font-size-large); - font-weight: var(--font-weight-semibold); - } - - ul { - margin-block-start: var(--spacing-large); - gap: var(--spacing-large); - display: flex; - flex-direction: column; - - li { - display: flex; - align-items: center; - font-size: var(--font-size-small); - color: var(--color-text-default); - } - } -} - -.dayCircleWrapper { - position: relative; - margin-inline-end: var(--spacing-mega); -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/index.tsx deleted file mode 100644 index 6f6ec1aed4..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakDefinitionModal/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable jsx-a11y/control-has-associated-label */ -import { useState } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import DayCircle, { DayState } from '../DayCircle'; - -import styles from './StreakDefinitionModal.module.scss'; - -import Modal from '@/dls/Modal/Modal'; -import QuestionMarkIcon from '@/icons/help-circle.svg'; - -const states = [ - { - state: DayState.None, - label: 'none', - }, - { - state: DayState.Stroked, - label: 'stroked', - }, - { - state: DayState.Filled, - label: 'filled', - }, - { - state: DayState.Checked, - label: 'checked', - }, -]; - -const StreakDefinitionModal = () => { - const { t } = useTranslation('reading-goal'); - const [open, setOpen] = useState(false); - - const onOpen = () => setOpen(true); - const onClose = () => setOpen(false); - - return ( - <> - - - - - - {t('streak')} - {t('streak-definition')} - - -
    -

    {t('timeline-meaning')}

    -
      - {states.map(({ state, label }) => ( -
    • -
      - -
      - {t(`timeline-states.${label}`)} -
    • - ))} -
    -
    -
    -
    - - ); -}; - -export default StreakDefinitionModal; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakIntroductionWidget.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakIntroductionWidget.tsx deleted file mode 100644 index c2c337c260..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/StreakIntroductionWidget.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import useTranslation from 'next-translate/useTranslation'; - -import styles from './ReadingStreak.module.scss'; - -import Button, { ButtonSize } from '@/dls/Button/Button'; -import { isLoggedIn } from '@/utils/auth/login'; -import { logButtonClick } from '@/utils/eventLogger'; -import { getLoginNavigationUrl, getReadingGoalNavigationUrl } from '@/utils/navigation'; - -const StreakIntroductionWidget = () => { - const { t } = useTranslation('home'); - - const onCreateReadingGoalClicked = () => { - logButtonClick('homepage_qgj_create_goal_clicked', { - isLoggedIn: isLoggedIn(), - }); - }; - - const url = getReadingGoalNavigationUrl(); - - return ( - <> -

    {t('qgj.quran-reading-goals.desc.logged-out')}

    -
    - -
    - - ); -}; - -export default StreakIntroductionWidget; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/index.tsx deleted file mode 100644 index 8eac98ea0c..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals/index.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import useTranslation from 'next-translate/useTranslation'; - -import CurrentWeekProgress from './CurrentWeekProgress'; -import DaysCounter from './DaysCounter'; -import GoalStatus from './GoalStatus'; -import styles from './ReadingStreak.module.scss'; - -import Skeleton from '@/dls/Skeleton/Skeleton'; -import useGetStreakWithMetadata from '@/hooks/auth/useGetStreakWithMetadata'; -import { convertFractionToPercent } from '@/utils/number'; - -const HomePageReadingStreak = () => { - const { t } = useTranslation('reading-goal'); - - const { isLoading, error, streak, goal, weekData, currentActivityDay } = useGetStreakWithMetadata( - { - disableIfNoGoalExists: false, - }, - ); - - const percent = convertFractionToPercent(currentActivityDay?.progress || 0); - - if (error || (!isLoading && streak === 0 && !goal)) { - return

    {t('home:qgj.quran-reading-goals.desc.logged-out')}

    ; - } - - return ( -
    -
    - <> -
    - {t('reading-goal-label')} - {isLoading ? ( - - - - ) : ( - - )} -
    - - -
    - - {goal && ( -
    - -
    - )} -
    - ); -}; - -export default HomePageReadingStreak; diff --git a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/index.tsx deleted file mode 100644 index 1d7d9aa055..0000000000 --- a/src/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/index.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import React, { useState } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './CollapsibleSection.module.scss'; -import CollapsibleTitle from './CollapsibleTitle'; -import LearningPlans from './LearningPlans'; - -import LearningPlansButtons from '@/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/LearningPlansButtons'; -import QuranGoalsButtons from '@/components/HomePage/QuranGrowthJourneySection/CallToActionButtons/QuranGoalsButtons'; -import QuranReadingGoals from '@/components/HomePage/QuranGrowthJourneySection/CollapsibleSection/QuranReadingGoals'; -import Collapsible, { CollapsibleDirection } from '@/dls/Collapsible/Collapsible'; -import ChevronDownIcon from '@/icons/chevron-down.svg'; -import GoalIcon from '@/icons/goal-1.svg'; -import ReaderIcon from '@/icons/learning-plan.svg'; - -export enum CollapsibleType { - QuranReadingGoalsType = 'quran_reading_goals', - LearningPlansType = 'learning_plans', -} - -type Props = { - type: CollapsibleType; - onOpenChange: (collapsibleType: CollapsibleType, isOpen: boolean) => void; -}; - -const CollapsibleSection: React.FC = ({ onOpenChange, type }) => { - const { t } = useTranslation('home'); - const [isOpen, setIsOpen] = useState(false); - return ( -
    - { - setIsOpen(newIsOpen); - onOpenChange(type, isOpen); - }} - shouldOpen={isOpen} - title={ - type === CollapsibleType.QuranReadingGoalsType ? ( -
    - } /> - -
    - ) : ( -
    - } /> - -
    - ) - } - prefix={ -
    - -
    - } - shouldRotatePrefixOnToggle - > - {({ isOpen: isCollapsibleOpen }) => { - if (!isCollapsibleOpen) return null; - return ( -
    - {type === CollapsibleType.QuranReadingGoalsType ? ( - - ) : ( - - )} -
    - ); - }} -
    -
    - ); -}; - -export default CollapsibleSection; diff --git a/src/components/HomePage/QuranGrowthJourneySection/QuranGrowthJourneySection.module.scss b/src/components/HomePage/QuranGrowthJourneySection/QuranGrowthJourneySection.module.scss index 7fae3a07e3..7d551d8d14 100644 --- a/src/components/HomePage/QuranGrowthJourneySection/QuranGrowthJourneySection.module.scss +++ b/src/components/HomePage/QuranGrowthJourneySection/QuranGrowthJourneySection.module.scss @@ -1,43 +1,16 @@ -@use "src/styles/theme"; @use "src/styles/breakpoints"; -$widget-wrapper-background-color: var(--color-success-faded); - -.wrapper { - background-color: $widget-wrapper-background-color; - padding: var(--spacing-small); - position: relative; - +.header { + padding-block-end: var(--spacing-medium); @include breakpoints.tablet { - border-radius: var(--border-radius-default); + padding-block-end: var(--spacing-large-px); } - --day-circle-color: #{$widget-wrapper-background-color}; -} - -.header { - display: flex; - align-items: center; - justify-content: space-between; -} - -.title { - color: var(--color-success-medium); - font-weight: var(--font-weight-bold); - font-size: var(--font-size-jumbo); - - @include breakpoints.smallerThanTablet { - font-size: var(--font-size-xlarge); + h1 { + font-size: var(--font-size-xlarge-px); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xxlarge-px); + } } } - -.illustrationContainer { - width: calc(5 * var(--spacing-mega)); - height: calc(5 * var(--spacing-mega)); - position: absolute; - inset-block-end: calc(-1 * var(--spacing-medium)); - inset-inline-end: 0; - opacity: var(--opacity-10); - color: var(--color-success-deep); - pointer-events: none; -} diff --git a/src/components/HomePage/QuranGrowthJourneySection/index.tsx b/src/components/HomePage/QuranGrowthJourneySection/index.tsx index 32efebf269..30d21b59c4 100644 --- a/src/components/HomePage/QuranGrowthJourneySection/index.tsx +++ b/src/components/HomePage/QuranGrowthJourneySection/index.tsx @@ -2,37 +2,28 @@ import React from 'react'; import useTranslation from 'next-translate/useTranslation'; -import CollapsibleSection, { CollapsibleType } from './CollapsibleSection'; import styles from './QuranGrowthJourneySection.module.scss'; -import MoonIllustrationSVG from '@/public/images/moon-illustration.svg'; -import { logEvent } from '@/utils/eventLogger'; +import NoGoalOrStreakCard from '@/components/HomePage/ReadingSection/NoGoalOrStreakCard'; +import useGetStreakWithMetadata from '@/hooks/auth/useGetStreakWithMetadata'; const QuranGrowthJourneySection = () => { const { t } = useTranslation('home'); + const { goal, streak } = useGetStreakWithMetadata({ + showDayName: true, + }); - const logOpenChange = (collapsibleType: CollapsibleType, isOpen: boolean) => { - if (isOpen) { - logEvent(`homepage_${collapsibleType}_collapse_opened`); - } else { - logEvent(`homepage_${collapsibleType}_collapse_closed`); - } - }; + if (goal || streak) { + return null; + } return ( -
    -
    - -
    + <>
    -

    {t('qgj.title')}

    +

    {t('qgj.title')}

    - - -
    + + ); }; diff --git a/src/components/HomePage/RadioInformation.tsx b/src/components/HomePage/RadioInformation.tsx index 3c5801692e..a123a28140 100644 --- a/src/components/HomePage/RadioInformation.tsx +++ b/src/components/HomePage/RadioInformation.tsx @@ -2,7 +2,7 @@ import { useActor } from '@xstate/react'; import useTranslation from 'next-translate/useTranslation'; -import Link from '../dls/Link/Link'; +import Link, { LinkVariant } from '../dls/Link/Link'; import styles from './PlayRadioButton.module.scss'; @@ -21,8 +21,15 @@ const RadioInformation = ({ radioActor }) => { return (
    - {stationInfo.title}{' '} - + + {t('station')}: {stationInfo.title} + {' '} + ({t('change')})
    diff --git a/src/components/HomePage/RamadanActivitiesSection/RamadanActivitiesSection.module.scss b/src/components/HomePage/RamadanActivitiesSection/RamadanActivitiesSection.module.scss deleted file mode 100644 index 857ea3b04a..0000000000 --- a/src/components/HomePage/RamadanActivitiesSection/RamadanActivitiesSection.module.scss +++ /dev/null @@ -1,30 +0,0 @@ -@use "src/styles/breakpoints"; - -.container { - background-color: var(--color-success-faded); - padding: var(--spacing-small); - display: flex; - align-items: center; - @include breakpoints.tablet { - border-radius: var(--border-radius-default); - } -} - -.illustrationContainer { - display: flex; - @include breakpoints.tablet { - display: inline-flex; - } - height: var(--spacing-mega); - width: var(--spacing-mega); - margin-inline-end: var(--spacing-xxsmall); -} - -.cta { - font-size: var(--font-size-large); - font-weight: var(--font-weight-semibold); -} - -.bold { - font-weight: bold; -} diff --git a/src/components/HomePage/RamadanActivitiesSection/index.tsx b/src/components/HomePage/RamadanActivitiesSection/index.tsx deleted file mode 100644 index 43e76f7481..0000000000 --- a/src/components/HomePage/RamadanActivitiesSection/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; - -import Trans from 'next-translate/Trans'; - -import styles from './RamadanActivitiesSection.module.scss'; - -import Link, { LinkVariant } from '@/dls/Link/Link'; -import { logButtonClick } from '@/utils/eventLogger'; -import { getQuranicCalendarNavigationUrl } from '@/utils/navigation'; - -const RamadanActivitiesSection = () => { - const onLinkClicked = () => { - logButtonClick('homepage_quranic_calendar_cta'); - }; - - return ( -
    -

    - - ), - b: , - }} - i18nKey="home:ramadan-activities-cta" - values={{ source: 'quranwbw' }} - /> -

    -
    - ); -}; - -export default RamadanActivitiesSection; diff --git a/src/components/HomePage/ReadingSection/ChapterCard/ChapterCard.module.scss b/src/components/HomePage/ReadingSection/ChapterCard/ChapterCard.module.scss new file mode 100644 index 0000000000..0b2dec7e42 --- /dev/null +++ b/src/components/HomePage/ReadingSection/ChapterCard/ChapterCard.module.scss @@ -0,0 +1,95 @@ +@use "src/styles/breakpoints"; + +.surahName { + line-height: normal; + font-family: "surahnames" !important; + font-size: calc(2.5 * var(--font-size-jumbo-px)); + margin-inline-start: -20px; + @include breakpoints.smallerThanTablet { + font-size: calc(1.2 * var(--font-size-jumbo)); + padding-inline-end: var(--spacing-medium-px); + margin-inline-start: -15px; + } +} + +.surahInfo { + display: flex; + flex-direction: row; + gap: var(--spacing-medium); + align-items: center; + justify-content: space-between; + @include breakpoints.smallerThanTablet { + align-items: center; + width: 100%; + } + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.chapterCard { + @include breakpoints.smallerThanTablet { + padding: calc(var(--spacing-small-px) + var(--spacing-micro-px)) var(--spacing-small-px) + calc(var(--spacing-small-px) + var(--spacing-micro-px)) var(--spacing-medium-px); + } + height: 100%; + box-sizing: border-box; +} + +.surahContainer { + display: flex; + flex-direction: column; + height: 100%; + justify-content: space-between; + @include breakpoints.smallerThanTablet { + justify-content: start; + align-items: center; + flex-direction: row; + } +} + +.translatedName { + color: var(--color-text-faded-new); + @include breakpoints.smallerThanTablet { + display: block; + font-size: var(--font-size-xsmall-px); + } +} + +.continueReading { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-micro); + color: var(--color-text-faded-new); + @include breakpoints.smallerThanTablet { + font-size: var(--spacing-medium-px); + } + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.transliteratedName { + font-weight: var(--font-weight-semibold); + @include breakpoints.smallerThanTablet { + font-size: var(--font-size-small-px); + } +} + +.beginButton { + border-radius: var(--border-radius-rounded); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + padding: var(--spacing-small-px) var(--spacing-medium-px); + } +} + +.continueReadingArrowIcon { + svg { + @include breakpoints.smallerThanTablet { + width: 12px !important; + height: 12px !important; + } + } +} diff --git a/src/components/HomePage/ReadingSection/ChapterCard/index.tsx b/src/components/HomePage/ReadingSection/ChapterCard/index.tsx new file mode 100644 index 0000000000..469a154a72 --- /dev/null +++ b/src/components/HomePage/ReadingSection/ChapterCard/index.tsx @@ -0,0 +1,88 @@ +import React, { useContext } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './ChapterCard.module.scss'; + +import Card from '@/components/HomePage/Card'; +import DataContext from '@/contexts/DataContext'; +import Button, { ButtonSize } from '@/dls/Button/Button'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import ArrowIcon from '@/icons/arrow.svg'; +import { getChapterData } from '@/utils/chapter'; +import { logButtonClick } from '@/utils/eventLogger'; +import { toLocalizedNumber } from '@/utils/locale'; +import { getChapterWithStartingVerseUrl } from '@/utils/navigation'; +import { isMobile } from '@/utils/responsive'; + +type Props = { + surahNumber: number; + verseNumber?: number; + isContinueReading?: boolean; +}; + +const ChapterCard: React.FC = ({ + surahNumber, + verseNumber = 1, + isContinueReading = false, +}) => { + const { t, lang } = useTranslation('home'); + const chaptersData = useContext(DataContext); + const surahNumberString = surahNumber.toString(); + const chapterData = getChapterData(chaptersData, surahNumberString); + + const onContinueReadingClicked = () => { + logButtonClick('homepage_chapter_card_continue_reading'); + }; + + const onBeginClicked = () => { + logButtonClick('homepage_chapter_card_begin'); + }; + + const link = getChapterWithStartingVerseUrl(`${surahNumber}:${verseNumber}`); + + return ( + +
    +
    {surahNumberString.padStart(3, '0')}
    +
    +
    + + {toLocalizedNumber(surahNumber, lang)}. {chapterData.transliteratedName} + + + {' '} + {isMobile() ? `${chapterData.translatedName}` : `(${chapterData.translatedName})`} + +
    + {isContinueReading ? ( + +
    + {t('common:verse')} + {toLocalizedNumber(verseNumber, lang)} + } + shouldForceSetColors={false} + className={styles.continueReadingArrowIcon} + /> +
    + + ) : ( + + )} +
    +
    +
    + ); +}; + +export default ChapterCard; diff --git a/src/components/HomePage/ReadingSection/NewCard/NewCard.module.scss b/src/components/HomePage/ReadingSection/NewCard/NewCard.module.scss new file mode 100644 index 0000000000..004c806eb4 --- /dev/null +++ b/src/components/HomePage/ReadingSection/NewCard/NewCard.module.scss @@ -0,0 +1,67 @@ +@use "src/styles/breakpoints"; + +.cardWithIcon { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-micro); + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } + + @include breakpoints.smallerThanTablet { + margin: auto; + } +} + +.iconContainer { + display: flex; + padding-inline-end: var(--spacing-small-px); + svg { + width: var(--spacing-large-px); + height: var(--spacing-large-px); + } + + @include breakpoints.smallerThanTablet { + padding-inline-end: var(--spacing-xxsmall-px); + svg { + width: var(--spacing-medium-px); + height: var(--spacing-medium-px); + } + } +} + +.cardOuterContainer { + justify-content: space-between; + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-micro); + font-weight: var(--font-weight-semibold); + width: 100%; +} + +.link { + @include breakpoints.smallerThanTablet { + color: var(--color-text-faded-new); + } +} + +.linkHref { + color: var(--color-text-link); +} + +.firstTimeReadingCard { + @include breakpoints.smallerThanTablet { + font-size: var(--font-size-xsmall-px); + box-shadow: none !important; + border-radius: 0; + padding: 0 !important; + } +} + +.arrowIcon { + @include breakpoints.smallerThanTablet { + display: none; + } +} diff --git a/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.module.scss b/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.module.scss new file mode 100644 index 0000000000..a831a8223d --- /dev/null +++ b/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.module.scss @@ -0,0 +1,37 @@ +@use "src/styles/breakpoints"; + +.subtitle { + text-align: center; + margin-block: var(--spacing-medium); + color: var(--color-text-default); + font-size: var(--spacing-medium2-px); +} + +.title { + font-size: calc(var(--spacing-large-px) + var(--spacing-micro-px)); +} + +.closeButton { + position: absolute; + top: var(--spacing-medium); + right: var(--spacing-medium); + background: none; + border: none; + padding: 0; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-default); + width: 24px; + height: 24px; + + &:hover { + opacity: 0.7; + } + + svg { + width: 100%; + height: 100%; + } +} diff --git a/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.tsx b/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.tsx new file mode 100644 index 0000000000..ac19ffd66c --- /dev/null +++ b/src/components/HomePage/ReadingSection/NewCard/ShareQuranModal.tsx @@ -0,0 +1,44 @@ +/* eslint-disable i18next/no-literal-string */ +import React from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './ShareQuranModal.module.scss'; + +import { ModalSize } from '@/dls/Modal/Content'; +import Modal from '@/dls/Modal/Modal'; +import ShareButtons from '@/dls/ShareButtons'; +import CloseIcon from '@/icons/close.svg'; +import { getFirstTimeReadingGuideNavigationUrl } from '@/utils/navigation'; +import { getBasePath } from '@/utils/url'; + +interface Props { + isOpen: boolean; + onClose: () => void; +} + +const ShareQuranModal: React.FC = ({ isOpen, onClose }) => { + const { t } = useTranslation('home'); + const shareURL = `${getBasePath()}${getFirstTimeReadingGuideNavigationUrl()}`; + + return ( + + + + +

    {t('share-quran.title')}

    +
    +
    {t('share-quran.description')}
    + +
    +
    + ); +}; + +export default ShareQuranModal; diff --git a/src/components/HomePage/ReadingSection/NewCard/index.tsx b/src/components/HomePage/ReadingSection/NewCard/index.tsx new file mode 100644 index 0000000000..f104b8b743 --- /dev/null +++ b/src/components/HomePage/ReadingSection/NewCard/index.tsx @@ -0,0 +1,69 @@ +/* eslint-disable i18next/no-literal-string */ +import React, { useState } from 'react'; + +import dynamic from 'next/dynamic'; +import Trans from 'next-translate/Trans'; + +import styles from './NewCard.module.scss'; + +import Card from '@/components/HomePage/Card'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getRamadanNavigationUrl } from '@/utils/navigation'; + +const ShareQuranModal = dynamic(() => import('./ShareQuranModal'), { + ssr: false, +}); + +const NewCard: React.FC = () => { + const [isShareModalOpen, setIsShareModalOpen] = useState(false); + + const onShareQuranClicked = () => { + logButtonClick('homepage_share_quran'); + }; + + const onCloseShareModal = () => { + setIsShareModalOpen(false); + }; + + return ( + <> + +
    +
    +
    ☪️
    +
    + + ), + }} + /> +
    +
    + } + shouldForceSetColors={false} + /> +
    +
    + {isShareModalOpen && ( + + )} + + ); +}; + +export default NewCard; diff --git a/src/components/HomePage/ReadingSection/NoGoalOrStreakCard/index.tsx b/src/components/HomePage/ReadingSection/NoGoalOrStreakCard/index.tsx new file mode 100644 index 0000000000..7cc0445718 --- /dev/null +++ b/src/components/HomePage/ReadingSection/NoGoalOrStreakCard/index.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import Card from '@/components/HomePage/Card'; +import styles from '@/components/HomePage/ReadingSection/ReadingSection.module.scss'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import CirclesIcon from '@/icons/circles.svg'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import { isLoggedIn } from '@/utils/auth/login'; +import { getLoginNavigationUrl, getReadingGoalNavigationUrl } from '@/utils/navigation'; + +const NoGoalOrStreakCard = () => { + const { t } = useTranslation('home'); + + return ( + +
    +
    +
    + +
    + {t('achieve-quran-goals')} +
    + } + shouldForceSetColors={false} + className={styles.arrowIconRight} + /> +
    +

    {t('stay-consistent')}

    +
    + ); +}; + +export default NoGoalOrStreakCard; diff --git a/src/components/HomePage/ReadingSection/ReadingSection.module.scss b/src/components/HomePage/ReadingSection/ReadingSection.module.scss new file mode 100644 index 0000000000..deaecbbe15 --- /dev/null +++ b/src/components/HomePage/ReadingSection/ReadingSection.module.scss @@ -0,0 +1,166 @@ +@use "src/styles/breakpoints"; + +.header { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-block-start: var(--spacing-medium2-px); + padding-block-end: var(--spacing-medium); + @include breakpoints.tablet { + padding-block-end: var(--spacing-large-px); + padding-block-start: var(--spacing-xlarge-px); + } + + h1 { + font-size: var(--font-size-xlarge-px); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xxlarge-px); + } + } +} + +.cardsContainer { + display: flex; + align-items: stretch; + justify-content: space-between; + gap: var(--spacing-medium); + + @include breakpoints.smallerThanTablet { + gap: 0; + flex-direction: column; + } +} + +.cardContainer { + @include breakpoints.smallerThanTablet { + width: 100%; + padding-block-end: var(--spacing-small-px); + } + width: 50%; + display: flex; + flex-direction: column; + gap: var(--spacing-medium); + + &:first-child { + > :first-child { + height: 100%; + } + } +} + +.myQuranText { + font-size: var(--font-size-small-px); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.stayConsistentText { + padding-block-start: var(--spacing-xxsmall-px); + font-size: var(--font-size-xsmall-px); + @include breakpoints.tablet { + padding-block-start: var(--spacing-small-px); + font-size: var(--font-size-normal-px); + } +} + +.iconContainer { + display: flex; + padding-inline-end: var(--spacing-xxsmall-px); + @include breakpoints.tablet { + padding-inline-end: var(--spacing-small-px); + } + + svg { + width: var(--spacing-medium2-px); + height: var(--spacing-medium2-px); + @include breakpoints.tablet { + width: var(--spacing-large-px); + height: var(--spacing-large-px); + } + } +} + +.myQuranContainer { + display: flex; + @include breakpoints.smallerThanTablet { + svg { + width: 12px !important; + height: 12px !important; + } + } +} + +.cardWithIcon { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-micro); + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.streakCardLeft { + width: 100%; +} + +.cardOuterContainer { + justify-content: space-between; + display: flex; + flex-direction: row; + align-items: center; + gap: var(--spacing-micro); + font-weight: var(--font-weight-semibold); + width: 100%; +} + +.streakCard { + box-shadow: none !important; + padding-inline: var(--spacing-medium-px); + background-color: var(--color-streaks-light); + @include breakpoints.smallerThanTablet { + padding: var(--spacing-small-px) var(--spacing-small-px) var(--spacing-small-px) var(--spacing-medium-px); + } +} + +.readingSectionContainer { + @include breakpoints.smallerThanTablet { + padding: var(--spacing-small-px); + } +} + +.link { + @include breakpoints.smallerThanTablet { + color: var(--color-text-faded-new); + } +} + +.linkHref { + color: var(--color-text-link); +} + +.firstTimeReadingCard { + @include breakpoints.smallerThanTablet { + box-shadow: none !important; + border-radius: 0; + padding: var(--spacing-xxsmall); + } +} + +.arrowIcon { + @include breakpoints.smallerThanTablet { + display: none; + } +} + +.arrowIconRight { + @include breakpoints.smallerThanTablet { + svg { + width: 12px !important; + height: 12px !important; + } + } +} diff --git a/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/GoalStatus.module.scss b/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/GoalStatus.module.scss new file mode 100644 index 0000000000..6723fb9afc --- /dev/null +++ b/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/GoalStatus.module.scss @@ -0,0 +1,31 @@ +@use "src/styles/breakpoints"; + +.header { + font-size: var(--font-size-small); + font-weight: var(--font-weight-bold); + @include breakpoints.tablet { + font-size: var(--font-size-xlarge); + } + color: var(--color-text-black); +} + +.subSection { + color: var(--color-text-black); +} + +.remainingValue { + font-weight: var(--font-weight-normal); + color: var(--color-text-gray); + font-size: var(--font-size-xsmall); + @include breakpoints.tablet { + font-size: var(--font-size-normal); + } +} + +.remaining { + font-weight: var(--font-weight-bold); + font-size: var(--font-size-xsmall); + @include breakpoints.tablet { + font-size: var(--font-size-normal); + } +} diff --git a/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/index.tsx b/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/index.tsx new file mode 100644 index 0000000000..b4b0b8482b --- /dev/null +++ b/src/components/HomePage/ReadingSection/StreakOrGoalCard/GoalStatus/index.tsx @@ -0,0 +1,119 @@ +import React, { useContext } from 'react'; + +import Trans from 'next-translate/Trans'; +import useTranslation from 'next-translate/useTranslation'; + +import styles from './GoalStatus.module.scss'; + +import DataContext from '@/contexts/DataContext'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import { CurrentQuranActivityDay } from '@/types/auth/ActivityDay'; +import { GoalType, QuranGoalStatus } from '@/types/auth/Goal'; +import { getChapterData } from '@/utils/chapter'; +import { secondsToShortReadableFormat } from '@/utils/datetime'; +import { logButtonClick } from '@/utils/eventLogger'; +import { toLocalizedNumber } from '@/utils/locale'; +import { getChapterWithStartingVerseUrl, getReadingGoalNavigationUrl } from '@/utils/navigation'; +import { convertNumberToDecimal } from '@/utils/number'; +import { parseVerseRange } from '@/utils/verseKeys'; + +type Props = { + currentActivityDay: CurrentQuranActivityDay; + goal: QuranGoalStatus; + percent: number; +}; + +const GoalStatus: React.FC = ({ currentActivityDay, goal, percent }) => { + const { t, lang } = useTranslation('reading-goal'); + const chaptersData = useContext(DataContext); + if (!goal) return null; + const goalType = goal.type; + + const onSetNewGoalClicked = () => { + logButtonClick('homepage_reading_goal_status_set_new_goal'); + }; + + const onChapterClicked = () => { + logButtonClick('homepage_reading_goal_status_continue_from'); + }; + + let header = t('daily-progress'); + let subSection = <>; + if (goal.isCompleted) { + header = t('goal-completed'); + subSection = ( + + {t('set-a-new-goal')} + + ); + } else if (percent >= 100) { + subSection = t('daily-progress-completed'); + } else if (typeof goal.progress.daysLeft === 'number') { + subSection = ( + , + span: , + }} + values={{ + count: goal.progress.daysLeft, + days: toLocalizedNumber(goal.progress.daysLeft, lang), + }} + i18nKey="reading-goal:remaining-days" + /> + ); + } else if (goalType === GoalType.TIME) { + subSection = ( + <> + {`${t('remaining-base')}:`}{' '} + + {secondsToShortReadableFormat(goal.progress.amountLeft, lang)} + + + ); + } else if (goalType === GoalType.PAGES) { + subSection = ( + <> + {`${t('remaining-base')}:`}{' '} + {`(${toLocalizedNumber( + convertNumberToDecimal(goal.progress.amountLeft, 2), + lang, + )} ${t('pages')})`} + + ); + } else if (goalType === GoalType.RANGE) { + const ranges = currentActivityDay?.remainingDailyTargetRanges || []; + if (ranges.length > 0) { + const [{ chapter: fromChapter, verse: fromVerse, verseKey: rangeFrom }] = parseVerseRange( + ranges[0], + ); + subSection = ( + <> + {`${t('remaining-base')}:`}{' '} + + {`(${ + getChapterData(chaptersData, fromChapter).transliteratedName + } ${toLocalizedNumber(Number(fromVerse), lang)})`} + + + ); + } + } + + return ( +
    +
    {header}
    +
    {subSection}
    +
    + ); +}; + +export default GoalStatus; diff --git a/src/components/HomePage/ReadingSection/StreakOrGoalCard/StreakOrGoalCard.module.scss b/src/components/HomePage/ReadingSection/StreakOrGoalCard/StreakOrGoalCard.module.scss new file mode 100644 index 0000000000..73e354c638 --- /dev/null +++ b/src/components/HomePage/ReadingSection/StreakOrGoalCard/StreakOrGoalCard.module.scss @@ -0,0 +1,107 @@ +@use "src/styles/breakpoints"; + +.streakCard { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; +} + +.streak { + padding-inline-end: var(--spacing-small-px); + font-size: var(--font-size-jumbo); + font-weight: var(--font-weight-bold); + color: var(--color-text-black); + @include breakpoints.tablet { + font-size: var(--font-size-xjumbo-px); + } +} + +.streakCardLeft { + display: flex; + align-items: center; + gap: var(--spacing-micro); + & > svg:first-child { + padding-inline-start: var(--spacing-small-px); + padding-inline-end: var(--spacing-small-px); + + width: var(--spacing-medium2-px); + height: var(--spacing-medium2-px); + @include breakpoints.tablet { + width: var(--spacing-large-px); + height: var(--spacing-large-px); + padding-inline-start: var(--spacing-medium-px); + padding-inline-end: var(--spacing-medium2-px); + width: 60px; + height: 60px; + } + } +} + +.customGoalButton { + background-color: var(--color-streaks-dark); + color: var(--color-text-white); + font-weight: var(--font-weight-bold); + svg { + path { + fill: var(--color-text-white); + } + } + &:hover { + background-color: var(--color-streaks-dark); + } + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } +} + +.circularProgressbar { + height: 60px; + width: 60px; +} + +.circularProgressbarContainer { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: var(--spacing-micro); +} + +.streakDay { + font-size: var(--font-size-normal); + color: var(--color-text-gray); + font-weight: var(--font-weight-semibold); + @include breakpoints.tablet { + font-size: var(--font-size-large-px); + } +} + +.circularProgressbarPath { + stroke: var(--color-streaks-dark); + stroke-linecap: round; + transition: stroke-dashoffset 0.5s ease 0s; +} + +.circularProgressbarTrail { + stroke: var(--color-daily-progress); + /* Used when trail is not full diameter, i.e. when props.circleRatio is set */ + stroke-linecap: round; +} + +.circularProgressbarText { + fill: var(--color-text-black); + font-size: 20px; + dominant-baseline: middle; + text-anchor: middle; + font-weight: var(--font-weight-bold); +} + +.goalArrowIcon { + svg { + @include breakpoints.smallerThanTablet { + width: 12px !important; + height: 12px !important; + } + } +} diff --git a/src/components/HomePage/ReadingSection/StreakOrGoalCard/index.tsx b/src/components/HomePage/ReadingSection/StreakOrGoalCard/index.tsx new file mode 100644 index 0000000000..c398741385 --- /dev/null +++ b/src/components/HomePage/ReadingSection/StreakOrGoalCard/index.tsx @@ -0,0 +1,117 @@ +import React from 'react'; + +import Trans from 'next-translate/Trans'; +import useTranslation from 'next-translate/useTranslation'; + +import GoalStatus from './GoalStatus'; +import styles from './StreakOrGoalCard.module.scss'; + +import Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button'; +import CircularProgressbar from '@/dls/CircularProgress'; +import IconContainer, { IconSize } from '@/dls/IconContainer/IconContainer'; +import Link from '@/dls/Link/Link'; +import PlantIcon from '@/icons/plant.svg'; +import ArrowIcon from '@/public/icons/arrow.svg'; +import CirclesIcon from '@/public/icons/circles.svg'; +import { CurrentQuranActivityDay } from '@/types/auth/ActivityDay'; +import { QuranGoalStatus } from '@/types/auth/Goal'; +import { logButtonClick } from '@/utils/eventLogger'; +import { toLocalizedNumber } from '@/utils/locale'; +import { + getReadingGoalNavigationUrl, + getReadingGoalProgressNavigationUrl, +} from '@/utils/navigation'; + +type Props = { + currentActivityDay: CurrentQuranActivityDay; + goal: QuranGoalStatus; + streak: number; +}; + +const StreakOrGoalCard: React.FC = ({ goal, streak, currentActivityDay }) => { + const { t, lang } = useTranslation('home'); + + const onStreakCardClicked = () => { + logButtonClick('homepage_reading_streak_card'); + }; + + const onGoalArrowClicked = () => { + logButtonClick('homepage_reading_goal_card_arrow'); + }; + + const onSetGoalButtonClicked = () => { + logButtonClick('homepage_reading_goal_card_set_goal'); + }; + + return ( +
    + +
    + + , + span: , + }} + values={{ + days: toLocalizedNumber(streak, lang), + }} + i18nKey="reading-goal:x-days-streak" + /> + {!goal && ( + } + shouldForceSetColors={false} + /> + )} +
    + +
    + {goal ? ( +
    +
    + +
    + + + } + shouldForceSetColors={false} + className={styles.goalArrowIcon} + /> + +
    + ) : ( + + )} +
    +
    + ); +}; + +export default StreakOrGoalCard; diff --git a/src/components/HomePage/ReadingSection/index.tsx b/src/components/HomePage/ReadingSection/index.tsx new file mode 100644 index 0000000000..5af9aec8e6 --- /dev/null +++ b/src/components/HomePage/ReadingSection/index.tsx @@ -0,0 +1,169 @@ +/* eslint-disable max-lines */ +import React from 'react'; + +import classNames from 'classnames'; +import useTranslation from 'next-translate/useTranslation'; +import { useSelector } from 'react-redux'; + +import ChapterCard from './ChapterCard'; +import NewCard from './NewCard'; +import NoGoalOrStreakCard from './NoGoalOrStreakCard'; +import styles from './ReadingSection.module.scss'; +import StreakOrGoalCard from './StreakOrGoalCard'; + +import Card from '@/components/HomePage/Card'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import useGetStreakWithMetadata from '@/hooks/auth/useGetStreakWithMetadata'; +import BookmarkRemoveIcon from '@/icons/bookmark_remove.svg'; +import { selectUserState } from '@/redux/slices/session'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getProfileNavigationUrl } from '@/utils/navigation'; +import { isMobile } from '@/utils/responsive'; +import { getVerseNumberFromKey } from '@/utils/verse'; + +interface Props {} + +const ReadingSection: React.FC = () => { + const { t } = useTranslation('home'); + const { isFirstTimeGuest, isGuest, hasReadingSessions, lastReadVerse } = + useSelector(selectUserState); + const isGuestWithReadingSessions = isGuest && hasReadingSessions; + const isUserWithReadingSessions = !isGuest && hasReadingSessions; + const { goal, streak, currentActivityDay } = useGetStreakWithMetadata({ + showDayName: true, + }); + + const onMyQuranClicked = () => { + logButtonClick('homepage_my_quran'); + }; + + let headerText = ''; + if (isGuestWithReadingSessions || isUserWithReadingSessions) { + headerText = t('continue-read'); + } else if (isFirstTimeGuest || !isUserWithReadingSessions) { + headerText = t('start-read'); + } + + const header = ( +
    +

    {headerText}

    +
    +
    + +
    + +

    {t('my-quran')}

    + +
    +
    + ); + + const continueReadingCard = ( + + ); + + const goalsOrStreakCard = + streak || goal ? ( + +
    +
    + +
    +
    +
    + ) : ( + <>{!isMobile() && } + ); + + const newCard = ; + + if (isGuestWithReadingSessions) { + return ( + <> + {header} +
    +
    {continueReadingCard}
    +
    + {goalsOrStreakCard} + {newCard} +
    +
    + + ); + } + + if (isFirstTimeGuest || !isUserWithReadingSessions) { + return ( + <> + {header} +
    +
    + +
    +
    + {newCard} + {goalsOrStreakCard} +
    +
    + + ); + } + + if (!isGuest) { + if (isMobile()) { + return ( + <> + {header} +
    +
    {goalsOrStreakCard}
    +
    {continueReadingCard}
    +
    {newCard}
    +
    + + ); + } + return ( + <> + {header} +
    +
    {continueReadingCard}
    +
    + {goalsOrStreakCard} + {newCard} +
    +
    + + ); + } + + if (isFirstTimeGuest) { + return ( + <> + {header} +
    +
    + +
    +
    + {newCard} + {goalsOrStreakCard} +
    +
    + + ); + } + + return <>; +}; + +export default ReadingSection; diff --git a/src/components/Login/AuthHeader.tsx b/src/components/Login/AuthHeader.tsx new file mode 100644 index 0000000000..ec58a9dc98 --- /dev/null +++ b/src/components/Login/AuthHeader.tsx @@ -0,0 +1,24 @@ +import { FC } from 'react'; + +import styles from './login.module.scss'; + +import QuranLogo from '@/icons/logo_main.svg'; +import QRColoredLogo from '@/icons/qr-colored.svg'; +import QuranReflectLogo from '@/icons/qr-logo.svg'; + +const AuthHeader: FC = () => { + return ( + <> +
    + +
    + + +
    +
    +
    + + ); +}; + +export default AuthHeader; diff --git a/src/components/Login/AuthTabs.tsx b/src/components/Login/AuthTabs.tsx new file mode 100644 index 0000000000..2c4a6ce554 --- /dev/null +++ b/src/components/Login/AuthTabs.tsx @@ -0,0 +1,62 @@ +import { FC } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import AuthHeader from './AuthHeader'; +import styles from './login.module.scss'; +import SignInForm from './SignInForm'; +import SignUpForm from './SignUpForm'; + +import Switch, { SwitchSize } from '@/dls/Switch/Switch'; +import SignUpRequest from 'types/auth/SignUpRequest'; + +export enum AuthTab { + SignIn = 'signin', + SignUp = 'signup', +} + +interface Props { + activeTab: AuthTab; + onTabChange: (tab: AuthTab) => void; + redirect?: string; + onSignUpSuccess: (data: SignUpRequest) => void; +} + +const AuthTabs: FC = ({ activeTab, onTabChange, redirect, onSignUpSuccess }) => { + const { t } = useTranslation('login'); + + const items = [ + { + name: t('sign-in'), + value: AuthTab.SignIn, + }, + { + name: t('sign-up'), + value: AuthTab.SignUp, + }, + ]; + + return ( +
    + +
    +

    {t('sign-in-or-sign-up')}

    +
    + +
    + {activeTab === AuthTab.SignIn ? ( + + ) : ( + + )} +
    +
    + ); +}; + +export default AuthTabs; diff --git a/src/components/Login/CompleteSignupForm.tsx b/src/components/Login/CompleteSignupForm.tsx index 8f2e891153..4a8027d5ed 100644 --- a/src/components/Login/CompleteSignupForm.tsx +++ b/src/components/Login/CompleteSignupForm.tsx @@ -2,18 +2,20 @@ import useTranslation from 'next-translate/useTranslation'; import { useSWRConfig } from 'swr'; import buildFormBuilderFormField from '../FormBuilder/buildFormBuilderFormField'; -import FormBuilder from '../FormBuilder/FormBuilder'; import styles from './CompleteSignupForm.module.scss'; import EmailVerificationForm from './EmailVerificationForm'; +import getFormErrors, { ErrorType } from './SignUpForm/errors'; -import { completeSignup } from '@/utils/auth/api'; +import FormBuilder from '@/components/FormBuilder/FormBuilder'; import { makeUserProfileUrl } from '@/utils/auth/apiPaths'; +import { completeSignup } from '@/utils/auth/authRequests'; import { logFormSubmission } from '@/utils/eventLogger'; import FormField from 'types/FormField'; type CompleteSignupFormProps = { requiredFields: FormField[]; + onSuccess?: () => void; }; /** @@ -21,16 +23,32 @@ type CompleteSignupFormProps = { * otherwise, return normal user information form */ -const CompleteSignupForm: React.FC = ({ requiredFields }) => { +const CompleteSignupForm: React.FC = ({ requiredFields, onSuccess }) => { const { mutate } = useSWRConfig(); const { t } = useTranslation('common'); - const onSubmit = (data) => { + const handleSubmit = async (data) => { logFormSubmission('complete_signUp'); - completeSignup(data).then(() => { + + try { + const { data: response, errors } = await completeSignup(data); + + if (!response?.success) { + return getFormErrors(t, ErrorType.API, errors); + } + // mutate the cache version of users/profile - mutate(makeUserProfileUrl()); - }); + await mutate(makeUserProfileUrl()); + + // Call onSuccess callback if provided + if (onSuccess) { + onSuccess(); + } + + return undefined; + } catch (error) { + return getFormErrors(t, ErrorType.SIGNUP); + } }; const emailFormField = requiredFields.find((field) => field.field === 'email'); @@ -53,7 +71,7 @@ const CompleteSignupForm: React.FC = ({ requiredFields formFields={requiredFields.map((field) => buildFormBuilderFormField({ ...field, placeholder: t(`form.${field.field}`) }, t), )} - onSubmit={onSubmit} + onSubmit={handleSubmit} actionText={t('submit')} />
    diff --git a/src/components/Login/CompleteSignupForm/EmailVerificationSection.tsx b/src/components/Login/CompleteSignupForm/EmailVerificationSection.tsx new file mode 100644 index 0000000000..17e2820a65 --- /dev/null +++ b/src/components/Login/CompleteSignupForm/EmailVerificationSection.tsx @@ -0,0 +1,58 @@ +import { FC } from 'react'; + +import { useSWRConfig } from 'swr'; + +import VerificationCodeBase from '../VerificationCode/VerificationCodeBase'; + +import SignUpRequest from '@/types/auth/SignUpRequest'; +import { makeUserProfileUrl } from '@/utils/auth/apiPaths'; +import { signUp } from '@/utils/auth/authRequests'; + +interface Props { + email: string; + formData: SignUpRequest; + onBack: () => void; + onVerified: () => void; +} + +const EmailVerificationSection: FC = ({ email, formData, onBack, onVerified }) => { + const { mutate } = useSWRConfig(); + + const handleSubmitCode = async (code: string) => { + const { data: response } = await signUp({ + ...formData, + verificationCode: code, + }); + + if (!response.success) { + throw new Error('Invalid verification code'); + } + + mutate(makeUserProfileUrl()); + onVerified(); + }; + + const handleResendCode = async () => { + const { data: response } = await signUp(formData); + + if (!response.success) { + throw new Error('Failed to resend verification code'); + } + }; + + return ( + + ); +}; + +export default EmailVerificationSection; diff --git a/src/components/Login/CompleteSignupForm/index.tsx b/src/components/Login/CompleteSignupForm/index.tsx new file mode 100644 index 0000000000..edaec8332f --- /dev/null +++ b/src/components/Login/CompleteSignupForm/index.tsx @@ -0,0 +1,130 @@ +import { useState } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; +import { useSWRConfig } from 'swr'; + +import styles from '../CompleteSignupForm.module.scss'; + +import EmailVerificationSection from './EmailVerificationSection'; + +import buildFormBuilderFormField from '@/components/FormBuilder/buildFormBuilderFormField'; +import FormBuilder from '@/components/FormBuilder/FormBuilder'; +import { makeUserProfileUrl } from '@/utils/auth/apiPaths'; +import { signUp } from '@/utils/auth/authRequests'; +import { logFormSubmission } from '@/utils/eventLogger'; +import SignUpRequest from 'types/auth/SignUpRequest'; +import FormField from 'types/FormField'; + +type CompleteSignupFormProps = { + requiredFields: FormField[]; +}; + +const CompleteSignupForm: React.FC = ({ requiredFields }) => { + const { mutate } = useSWRConfig(); + const { t } = useTranslation('common'); + const [isEmailSubmitted, setIsEmailSubmitted] = useState(false); + const [isEmailVerified, setIsEmailVerified] = useState(false); + const [email, setEmail] = useState(); + const [formData, setFormData] = useState({ + firstName: '', + lastName: '', + email: '', + username: '', + password: '', + confirmPassword: '', + verificationCode: '', + }); + + const emailFormField = requiredFields.find((field) => field.field === 'email'); + const isEmailRequired = !!emailFormField; + + const handleEmailVerification = async (signUpData: SignUpRequest) => { + try { + const { data: response } = await signUp(signUpData); + + if (!response.success) { + throw new Error('Failed to send verification code'); + } + + setFormData(signUpData); + setIsEmailSubmitted(true); + setEmail(signUpData.email); + return undefined; + } catch (error) { + return { + errors: { + email: error?.message, + }, + }; + } + }; + + const handleDirectSignup = async (signUpData: SignUpRequest) => { + try { + const { data: response } = await signUp(signUpData); + + if (!response.success) { + throw new Error('Signup failed'); + } + + mutate(makeUserProfileUrl()); + return undefined; + } catch (error) { + return { + errors: { + firstName: error?.message, + lastName: error?.message, + email: error?.message, + username: error?.message, + password: error?.message, + confirmPassword: error?.message, + }, + }; + } + }; + + const onFormSubmit = async (data: Partial) => { + logFormSubmission('complete_signUp'); + const signUpData: SignUpRequest = { ...formData, ...data }; + + if (isEmailRequired) { + return handleEmailVerification(signUpData); + } + + return handleDirectSignup(signUpData); + }; + + const onBackFromVerification = () => { + setIsEmailSubmitted(false); + }; + + const onVerified = () => { + setIsEmailVerified(true); + }; + + if (isEmailRequired && isEmailSubmitted && !isEmailVerified) { + return ( + + ); + } + + return ( +
    +

    {t('complete-sign-up')}

    + + buildFormBuilderFormField({ ...field, placeholder: t(`form.${field.field}`) }, t), + )} + onSubmit={onFormSubmit} + actionText={t('submit')} + /> +
    + ); +}; + +export default CompleteSignupForm; diff --git a/src/components/Login/EmailVerificationForm.tsx b/src/components/Login/EmailVerificationForm.tsx index 3cb639240d..ba32553b36 100644 --- a/src/components/Login/EmailVerificationForm.tsx +++ b/src/components/Login/EmailVerificationForm.tsx @@ -1,22 +1,17 @@ import { useState } from 'react'; -import Trans from 'next-translate/Trans'; import useTranslation from 'next-translate/useTranslation'; import { useSWRConfig } from 'swr'; -import buildTranslatedErrorMessageByErrorId from '../FormBuilder/buildTranslatedErrorMessageByErrorId'; import FormBuilder from '../FormBuilder/FormBuilder'; import { FormBuilderFormField } from '../FormBuilder/FormBuilderTypes'; import styles from './CompleteSignupForm.module.scss'; -import ResendEmailSection from './ResendEmailSection'; +import VerificationCodeBase from './VerificationCode/VerificationCodeBase'; import { completeSignup, requestVerificationCode } from '@/utils/auth/api'; import { makeUserProfileUrl } from '@/utils/auth/apiPaths'; import { logFormSubmission } from '@/utils/eventLogger'; -import ErrorMessageId from 'types/ErrorMessageId'; -import { RuleType } from 'types/FieldRule'; -import { FormFieldType } from 'types/FormField'; type EmailVerificationFormProps = { emailFormField: FormBuilderFormField; @@ -25,16 +20,11 @@ type EmailFormData = { email: string; }; -type VerificationCodeFormData = { - code: string; -}; - const EmailVerificationForm = ({ emailFormField }: EmailVerificationFormProps) => { const [isSubmitted, setIsSubmitted] = useState(false); const { mutate } = useSWRConfig(); const [email, setEmail] = useState(); const { t } = useTranslation('common'); - const [forceRerenderKey, setForceRerenderKey] = useState(0); const onEmailSubmitted = (data: EmailFormData) => { logFormSubmission('email_verification'); @@ -43,62 +33,47 @@ const EmailVerificationForm = ({ emailFormField }: EmailVerificationFormProps) = setEmail(data.email); }; - const verificationCodeFormField: FormBuilderFormField = { - field: 'code', - type: FormFieldType.Number, - placeholder: t('form.code'), - rules: [ - { - type: RuleType.Required, - value: true, - errorMessage: buildTranslatedErrorMessageByErrorId(ErrorMessageId.RequiredField, 'code', t), - }, - ], + const onBack = () => { + setEmail(undefined); }; - const onVerificationCodeSubmitted = (data: VerificationCodeFormData) => { - logFormSubmission('verification_code'); - return completeSignup({ email, verificationCode: data.code.toString() }) - .then(() => { - // mutate the cache version of users/profile - mutate(makeUserProfileUrl()); - }) - .catch(async (err) => { - const result = { errors: { code: err?.message } }; - return result; - }); + const handleResendCode = async () => { + if (!email) { + throw new Error('Email is required'); + } + + await requestVerificationCode(email); }; - const onResendEmailRequested = () => { - requestVerificationCode(email); - setForceRerenderKey((preVal) => preVal + 1); + const handleSubmitCode = async (code: string) => { + if (!email) { + throw new Error('Email is required'); + } + + const response = await completeSignup({ email, verificationCode: code }); + if (!response) { + throw new Error('Invalid verification code'); + } + + mutate(makeUserProfileUrl()); }; return (

    {t('email-verification.email-verification')}

    {isSubmitted ? ( - <> -

    - , - }} - /> -

    - - - - + ) : ( void; +} + +const EmailVerificationForm: FC = ({ onBack }) => { + const { mutate } = useSWRConfig(); + const { t } = useTranslation('common'); + const [email, setEmail] = useState(''); + const [isEmailSubmitted, setIsEmailSubmitted] = useState(false); + const [error, setError] = useState(); + + const handleSubmitCode = async (code: string) => { + if (!email) { + throw new Error('Email is required'); + } + + const response = await completeSignup({ email, verificationCode: code }); + if (!response) { + throw new Error('Invalid verification code'); + } + + mutate(makeUserProfileUrl()); + }; + + const handleResendCode = async () => { + if (!email) { + throw new Error('Email is required'); + } + + await requestVerificationCode(email); + }; + + const handleBack = () => { + setIsEmailSubmitted(false); + setError(undefined); + if (onBack) { + onBack(); + } + }; + + const handleEmailSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setError(undefined); + + if (!email) { + setError(t('form.email-required')); + return; + } + + try { + logFormSubmission('email_verification'); + await requestVerificationCode(email); + setIsEmailSubmitted(true); + } catch (err) { + setError(err?.message || t('errors.something-went-wrong')); + } + }; + + if (!isEmailSubmitted) { + return ( +
    +

    {t('email-verification.email-verification')}

    + + + {error &&
    {error}
    } + + +
    + ); + } + + return ( + + ); +}; + +export default EmailVerificationForm; diff --git a/src/components/Login/Feature.tsx b/src/components/Login/Feature.tsx new file mode 100644 index 0000000000..70f65ff7c0 --- /dev/null +++ b/src/components/Login/Feature.tsx @@ -0,0 +1,25 @@ +import { FC } from 'react'; + +import styles from './login.module.scss'; + +import useDirection from '@/hooks/useDirection'; +import SunIcon from '@/icons/sun-login.svg'; + +interface Props { + label: string; +} + +const Feature: FC = ({ label }) => { + const direction = useDirection(); + + return ( +
    +
    + +

    {label}

    +
    +
    + ); +}; + +export default Feature; diff --git a/src/components/Login/ForgotPassword/ForgotPasswordForm.tsx b/src/components/Login/ForgotPassword/ForgotPasswordForm.tsx new file mode 100644 index 0000000000..fbf89e86fa --- /dev/null +++ b/src/components/Login/ForgotPassword/ForgotPasswordForm.tsx @@ -0,0 +1,87 @@ +import React, { useState } from 'react'; + +import { useRouter } from 'next/router'; +import useTranslation from 'next-translate/useTranslation'; + +import AuthHeader from '../AuthHeader'; +import styles from '../login.module.scss'; +import getFormErrors, { ErrorType } from '../SignUpForm/errors'; +import { getEmailField } from '../SignUpFormFields/credentialFields'; + +import Button, { ButtonShape, ButtonType, ButtonVariant } from '@/components/dls/Button/Button'; +import FormBuilder from '@/components/FormBuilder/FormBuilder'; +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import { useToast, ToastStatus } from '@/dls/Toast/Toast'; +import ArrowLeft from '@/icons/west.svg'; +import { requestPasswordReset } from '@/utils/auth/authRequests'; +import { logButtonClick, logFormSubmission } from '@/utils/eventLogger'; +import { getLoginNavigationUrl } from '@/utils/navigation'; + +const ForgotPasswordForm: React.FC = () => { + const { t } = useTranslation('login'); + const router = useRouter(); + const [isSubmitting, setIsSubmitting] = useState(false); + const toast = useToast(); + + const formFields: FormBuilderFormField[] = [getEmailField(t)]; + + const handleSubmit = async (values: { email: string }) => { + logFormSubmission('forgot_password'); + try { + setIsSubmitting(true); + const { data: response, errors } = await requestPasswordReset(values.email); + + if (!response.success) { + setIsSubmitting(false); + return getFormErrors(t, ErrorType.API, errors); + } + + toast(t('forgot-password-success'), { status: ToastStatus.Success }); + router.push(getLoginNavigationUrl()); + return undefined; + } catch (error) { + setIsSubmitting(false); + return getFormErrors(t, ErrorType.FORGOT_PASSWORD); + } + }; + + const handleBack = () => { + logButtonClick('forgot_password_back'); + router.push(getLoginNavigationUrl()); + }; + + const renderAction = (props) => ( + + ); + + return ( +
    +
    + +

    {t('forgot-password-title')}

    +

    {t('forgot-password-description')}

    +
    + + +
    +
    +
    + ); +}; + +export default ForgotPasswordForm; diff --git a/src/components/Login/LoginContainer.tsx b/src/components/Login/LoginContainer.tsx index 3ad69de125..9844d9f287 100644 --- a/src/components/Login/LoginContainer.tsx +++ b/src/components/Login/LoginContainer.tsx @@ -1,140 +1,146 @@ import { useState } from 'react'; import { useRouter } from 'next/router'; -import Trans from 'next-translate/Trans'; import useTranslation from 'next-translate/useTranslation'; -import EmailSent from './EmailSent'; -import Feature from './Feature'; -import styles from './login.module.scss'; -import ResendEmailSection from './ResendEmailSection'; - -import { SubmissionResult } from '@/components/FormBuilder/FormBuilder'; -import EmailLogin, { EmailLoginData, sendMagicLink } from '@/components/Login/EmailLogin'; -import SocialLogin from '@/components/Login/SocialLogin'; -import Button, { ButtonType, ButtonVariant } from '@/dls/Button/Button'; -import Link, { LinkVariant } from '@/dls/Link/Link'; -import CalendarIcon from '@/icons/calendar-1.svg'; -import GoalIcon from '@/icons/goal-1.svg'; -import HeartIcon from '@/icons/love.svg'; -import MobileIcon from '@/icons/mobile-1.svg'; -import NotesIcon from '@/icons/notes-empty.svg'; -import MoreIcon from '@/icons/sun-outline.svg'; -import { logButtonClick, logFormSubmission } from '@/utils/eventLogger'; -import AuthType from 'types/auth/AuthType'; - -enum LoginType { - Social = 'social', - Email = 'email', +import AuthTabs, { AuthTab } from './AuthTabs'; +import ServiceCard from './ServiceCard'; +import VerificationCodeForm from './VerificationCode/VerificationCodeForm'; + +import Button, { ButtonVariant } from '@/dls/Button/Button'; +import ArrowLeft from '@/icons/west.svg'; +import authStyles from '@/styles/auth/auth.module.scss'; +import QueryParam from '@/types/QueryParam'; +import { signUp } from '@/utils/auth/authRequests'; +import { logButtonClick, logEvent } from '@/utils/eventLogger'; +import SignUpRequest from 'types/auth/SignUpRequest'; + +enum LoginView { + SOCIAL = 'social', + EMAIL = 'email', + VERIFICATION = 'verification', } const LoginContainer = () => { - const [loginType, setLoginType] = useState(LoginType.Social); - const { t } = useTranslation(); + const { t } = useTranslation('login'); + const [loginView, setLoginView] = useState(LoginView.SOCIAL); + const [activeTab, setActiveTab] = useState(AuthTab.SignIn); + const [signUpData, setSignUpData] = useState | null>(null); + const router = useRouter(); const { query } = useRouter(); - const redirect = query.r ? decodeURIComponent(query.r.toString()) : undefined; - - const [magicLinkVerificationCode, setMagicLinkVerificationCode] = useState(''); - const [email, setEmail] = useState(''); - - const onEmailLoginSubmit = ({ email: emailInput }): SubmissionResult => { - setEmail(emailInput); - return sendMagicLink(emailInput, redirect) - .then(setMagicLinkVerificationCode) - .catch(() => { - return { - errors: { - email: t('common:error.email-login-fail'), - }, - }; - }); + const redirect = query?.[QueryParam.REDIRECT_TO] + ? decodeURIComponent(query?.[QueryParam.REDIRECT_TO]?.toString()) + : undefined; + + const onBack = () => { + logButtonClick('login_back'); + if (loginView === LoginView.VERIFICATION) { + setLoginView(LoginView.EMAIL); + } else if (loginView === LoginView.EMAIL) { + setLoginView(LoginView.SOCIAL); + } else { + router.back(); + } }; - const onMagicLinkClicked = () => { - setLoginType(LoginType.Email); - // eslint-disable-next-line i18next/no-literal-string - logButtonClick(`${AuthType.Email}_login`); + const onEmailLoginClick = () => { + logEvent('login_email_click'); + setLoginView(LoginView.EMAIL); }; - const onOtherOptionsClicked = () => { - setLoginType(LoginType.Social); - logButtonClick('other_auth_options'); + const onTabChange = (tab: AuthTab) => { + logEvent('login_tab_change', { tab }); + setActiveTab(tab); }; - const onResendEmailButtonClicked = () => { - onEmailLoginSubmit({ email }); - logButtonClick('resend_email'); + const handleEmailLoginSubmit = async (data: { + email: string; + }): Promise => { + setSignUpData(data); + setLoginView(LoginView.VERIFICATION); }; - const onLoginWithEmailSubmit = (data) => { - logFormSubmission('email_login'); - return onEmailLoginSubmit(data); + const handleResendCode = async () => { + if (!signUpData?.email) return; + + try { + const { data: response } = await signUp(signUpData as SignUpRequest); + + if (!response.success) { + throw new Error('Failed to resend verification code'); + } + } catch (error) { + throw new Error('Failed to resend verification code'); + } }; - if (magicLinkVerificationCode) { + const renderContent = () => { + if (loginView === LoginView.VERIFICATION) { + return ( +
    + +
    + ); + } + + if (loginView === LoginView.EMAIL) { + return ( + <> + + + + ); + } + + const benefits = { + quran: [ + { id: 'feature-6', label: t('feature-6') }, + { id: 'feature-1', label: t('feature-1') }, + { id: 'feature-2', label: t('feature-2') }, + { id: 'feature-3', label: t('feature-3') }, + { id: 'feature-4', label: t('feature-4') }, + { id: 'feature-5', label: t('feature-5') }, + ], + reflect: [ + { id: 'reflect-1', label: t('reflect-feature-1') }, + { id: 'reflect-2', label: t('reflect-feature-2') }, + { id: 'reflect-3', label: t('reflect-feature-3') }, + { id: 'reflect-4', label: t('reflect-feature-4') }, + ], + }; + return ( -
    - - -
    + ); - } + }; return ( -
    -
    -
    {t('login:login-title')}
    - {loginType === LoginType.Email ? ( - - ) : ( - <> - } - text={ - , - }} - /> - } - /> - } text={t('login:feature-1')} /> - } text={t('login:feature-2')} /> - } text={t('login:feature-3')} /> - } text={t('login:feature-4')} /> - } text={t('login:feature-5')} /> -

    {t('login:login-cta')}

    - - )} - - {loginType === LoginType.Social && ( - <> - - {process.env.NEXT_PUBLIC_ENABLE_MAGIC_LINK_LOGIN === 'true' && ( - - )} - - )} - - , - link1: , - }} - i18nKey="login:privacy-policy" - /> - +
    +
    + {renderContent()}
    ); diff --git a/src/components/Login/ResendEmailSection.tsx b/src/components/Login/ResendEmailSection.tsx deleted file mode 100644 index 35cba0af6a..0000000000 --- a/src/components/Login/ResendEmailSection.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { useEffect, useState } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import Button, { ButtonVariant } from '../dls/Button/Button'; - -import styles from './login.module.scss'; - -type ResendEmailSectionProps = { - onResendButtonClicked: () => void; - initialRemainingTimeInSeconds?: number; -}; - -const ResendEmailSection = ({ - onResendButtonClicked, - initialRemainingTimeInSeconds = 60, -}: ResendEmailSectionProps) => { - const [remainingTimeInSeconds, setRemainingTimeInSeconds] = useState( - initialRemainingTimeInSeconds, - ); - const { t } = useTranslation('common'); - - const disabled = remainingTimeInSeconds > 0; - - useEffect(() => { - const interval = setInterval(() => { - setRemainingTimeInSeconds((prevRemainingTime) => { - if (prevRemainingTime > 0) { - return prevRemainingTime - 1; - } - return prevRemainingTime; - }); - }, 1000); - - return () => clearInterval(interval); - }, []); - - return ( -
    -
    {t('email-verification.check-spam')}
    - -
    - ); -}; - -export default ResendEmailSection; diff --git a/src/components/Login/ResetPassword/ResetPasswordForm.tsx b/src/components/Login/ResetPassword/ResetPasswordForm.tsx new file mode 100644 index 0000000000..efef601009 --- /dev/null +++ b/src/components/Login/ResetPassword/ResetPasswordForm.tsx @@ -0,0 +1,99 @@ +import React, { useState } from 'react'; + +import { useRouter } from 'next/router'; +import useTranslation from 'next-translate/useTranslation'; + +import AuthHeader from '../AuthHeader'; +import styles from '../login.module.scss'; +import getFormErrors, { ErrorType } from '../SignUpForm/errors'; +import getPasswordFields from '../SignUpForm/PasswordFields'; + +import Button, { ButtonShape, ButtonType, ButtonVariant } from '@/components/dls/Button/Button'; +import FormBuilder from '@/components/FormBuilder/FormBuilder'; +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import { useToast, ToastStatus } from '@/dls/Toast/Toast'; +import ArrowLeft from '@/icons/west.svg'; +import QueryParam from '@/types/QueryParam'; +import { resetPassword } from '@/utils/auth/authRequests'; +import { logButtonClick, logFormSubmission } from '@/utils/eventLogger'; +import { getLoginNavigationUrl } from '@/utils/navigation'; + +const ResetPasswordForm: React.FC = () => { + const { t } = useTranslation('login'); + const router = useRouter(); + const [isSubmitting, setIsSubmitting] = useState(false); + const toast = useToast(); + const token = router.query[QueryParam.TOKEN] as string; + + const formFields: FormBuilderFormField[] = getPasswordFields( + t, + 'new-password-placeholder', + 'confirm-new-password-placeholder', + ); + + const handleSubmit = async (values: { password: string; confirmPassword: string }) => { + logFormSubmission('reset_password'); + try { + if (values.password !== values.confirmPassword) { + return getFormErrors(t, ErrorType.MISMATCH); + } + + setIsSubmitting(true); + const { data: response, errors } = await resetPassword(values.password, token); + + if (!response.success) { + setIsSubmitting(false); + if (errors.token) { + toast(t('errors.expiredToken'), { status: ToastStatus.Error }); + } + return getFormErrors(t, ErrorType.API, errors); + } + + toast(t('reset-password-success'), { status: ToastStatus.Success }); + router.push(getLoginNavigationUrl()); + return undefined; + } catch (error) { + setIsSubmitting(false); + return getFormErrors(t, ErrorType.RESET_PASSWORD); + } + }; + + const handleBack = () => { + logButtonClick('reset_password_back'); + router.push(getLoginNavigationUrl()); + }; + + const renderAction = (props) => ( + + ); + + return ( +
    +
    + +

    {t('set-new-password')}

    +
    + + +
    +
    +
    + ); +}; + +export default ResetPasswordForm; diff --git a/src/components/Login/ServiceCard.tsx b/src/components/Login/ServiceCard.tsx new file mode 100644 index 0000000000..fc34a0e10d --- /dev/null +++ b/src/components/Login/ServiceCard.tsx @@ -0,0 +1,110 @@ +import { FC } from 'react'; + +import classNames from 'classnames'; +import Link from 'next/link'; +import Trans from 'next-translate/Trans'; +import useTranslation from 'next-translate/useTranslation'; + +import Feature from './Feature'; +import styles from './login.module.scss'; +import SocialButtons from './SocialButtons'; + +import { SubmissionResult } from '@/components/FormBuilder/FormBuilder'; +import EmailLogin, { EmailLoginData } from '@/components/Login/EmailLogin'; +import QuranLogo from '@/icons/logo_main.svg'; +import QRColoredLogo from '@/icons/qr-colored.svg'; +import QRLogo from '@/icons/qr-logo.svg'; +import ArrowLeft from '@/icons/west.svg'; + +interface Benefit { + id: string; + label: string; +} + +interface Props { + benefits: { + quran: Benefit[]; + reflect: Benefit[]; + }; + isEmailLogin?: boolean; + onEmailLoginSubmit?: (data: { email: string }) => SubmissionResult; + onOtherOptionsClicked?: () => void; + onBackClick?: () => void; + redirect?: string; +} + +const ServiceCard: FC = ({ + benefits, + isEmailLogin, + onEmailLoginSubmit, + onOtherOptionsClicked, + onBackClick, + redirect, +}) => { + const { t } = useTranslation('login'); + + const renderServiceSection = (isQuranReflect: boolean) => ( +
    +
    + {isQuranReflect ? ( +
    + + +
    + ) : ( + + )} +
    +
    + {(isQuranReflect ? benefits.reflect : benefits.quran).map(({ id, label }) => ( + + ))} +
    +
    + ); + + return ( +
    + {!isEmailLogin && ( + <> +

    {t('welcome-title')}

    +

    + {t('welcome-description-1')} {t('quran-text')} + {t('welcome-description-2')} +
    + {t('welcome-description-3')} +

    + + )} + {isEmailLogin ? ( + + ) : ( + <> +
    + {renderServiceSection(false)} +
    + {renderServiceSection(true)} +
    +

    {t('login-cta')}

    + +

    + , + link1: , + }} + /> +

    + {onBackClick && ( + + )} + + )} +
    + ); +}; + +export default ServiceCard; diff --git a/src/components/Login/SignInForm.tsx b/src/components/Login/SignInForm.tsx new file mode 100644 index 0000000000..5d3f55e08d --- /dev/null +++ b/src/components/Login/SignInForm.tsx @@ -0,0 +1,104 @@ +import { FC, useState } from 'react'; + +import { useRouter } from 'next/router'; +import useTranslation from 'next-translate/useTranslation'; + +import styles from './login.module.scss'; +import SignInPasswordField from './SignInForm/SignInPasswordField'; +import getFormErrors, { ErrorType } from './SignUpForm/errors'; +import { getEmailField } from './SignUpFormFields/credentialFields'; + +import FormBuilder from '@/components/FormBuilder/FormBuilder'; +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import Button, { ButtonShape, ButtonType } from '@/dls/Button/Button'; +import Link, { LinkVariant } from '@/dls/Link/Link'; +import { RuleType } from '@/types/FieldRule'; +import { FormFieldType } from '@/types/FormField'; +import { signIn } from '@/utils/auth/authRequests'; +import { logFormSubmission } from '@/utils/eventLogger'; +import { getForgotPasswordNavigationUrl } from '@/utils/navigation'; + +interface FormData { + email: string; + password: string; +} + +interface Props { + redirect?: string; +} + +const SignInForm: FC = ({ redirect }) => { + const { t } = useTranslation('login'); + const router = useRouter(); + const [isSubmitting, setIsSubmitting] = useState(false); + + const formFields: FormBuilderFormField[] = [ + getEmailField(t), + { + field: 'password', + type: FormFieldType.Password, + placeholder: t('password-placeholder'), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('error.password-required'), + }, + ], + customRender: SignInPasswordField, + }, + ]; + + const handleSubmit = async (data: FormData) => { + setIsSubmitting(true); + logFormSubmission('sign_in'); + try { + const { data: response, errors } = await signIn(data.email, data.password); + + if (!response.success) { + setIsSubmitting(false); + return getFormErrors(t, ErrorType.API, errors); + } + + router.push(redirect || '/'); + return undefined; + } catch (error) { + setIsSubmitting(false); + return getFormErrors(t, ErrorType.SIGN_IN); + } + }; + + const renderAction = (props) => ( + + ); + + return ( +
    + +
    + + {t('forgot-password')}? + +
    +
    + ); +}; + +export default SignInForm; diff --git a/src/components/Login/SignInForm/SignInPasswordField.tsx b/src/components/Login/SignInForm/SignInPasswordField.tsx new file mode 100644 index 0000000000..52c2c6e831 --- /dev/null +++ b/src/components/Login/SignInForm/SignInPasswordField.tsx @@ -0,0 +1,15 @@ +import { FC } from 'react'; + +import PasswordInput from '../SignUpForm/PasswordInput'; + +interface Props { + value: string; + onChange: (value: string) => void; + placeholder?: string; +} + +const SignInPasswordField: FC = ({ value = '', onChange, placeholder }) => ( + +); + +export default SignInPasswordField; diff --git a/src/components/Login/SignUpForm.tsx b/src/components/Login/SignUpForm.tsx new file mode 100644 index 0000000000..12d0087420 --- /dev/null +++ b/src/components/Login/SignUpForm.tsx @@ -0,0 +1,64 @@ +import useTranslation from 'next-translate/useTranslation'; + +import styles from './login.module.scss'; +import getFormErrors, { ErrorType } from './SignUpForm/errors'; + +import FormBuilder from '@/components/FormBuilder/FormBuilder'; +import getSignUpFormFields from '@/components/Login/SignUpFormFields'; +import Button, { ButtonShape, ButtonType } from '@/dls/Button/Button'; +import { signUp } from '@/utils/auth/authRequests'; +import { logFormSubmission } from '@/utils/eventLogger'; +import SignUpRequest from 'types/auth/SignUpRequest'; + +interface Props { + onSuccess: (data: SignUpRequest) => void; +} + +const SignUpForm = ({ onSuccess }: Props) => { + const { t } = useTranslation('login'); + + const handleSubmit = async (data: SignUpRequest) => { + logFormSubmission('sign_up'); + + if (data.password !== data.confirmPassword) { + return getFormErrors(t, ErrorType.MISMATCH); + } + + try { + const { data: response, errors } = await signUp(data); + + if (!response.success) { + return getFormErrors(t, ErrorType.API, errors); + } + + onSuccess(data); + return undefined; + } catch (error) { + return getFormErrors(t, ErrorType.SIGNUP); + } + }; + + const renderAction = (props) => ( + + ); + + return ( +
    + +
    + ); +}; + +export default SignUpForm; diff --git a/src/components/Login/SignUpForm/ConfirmPasswordField.tsx b/src/components/Login/SignUpForm/ConfirmPasswordField.tsx new file mode 100644 index 0000000000..354cad4b4c --- /dev/null +++ b/src/components/Login/SignUpForm/ConfirmPasswordField.tsx @@ -0,0 +1,15 @@ +import { FC } from 'react'; + +import PasswordInput from './PasswordInput'; + +interface Props { + value: string; + onChange: (value: string) => void; + placeholder?: string; +} + +const ConfirmPasswordField: FC = ({ value, onChange, placeholder }) => ( + +); + +export default ConfirmPasswordField; diff --git a/src/components/Login/SignUpForm/PasswordField.tsx b/src/components/Login/SignUpForm/PasswordField.tsx new file mode 100644 index 0000000000..8dd69c0226 --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordField.tsx @@ -0,0 +1,19 @@ +import { FC } from 'react'; + +import PasswordInput from './PasswordInput'; +import PasswordValidation from './PasswordValidation'; + +interface Props { + value: string; + onChange: (value: string) => void; + placeholder?: string; +} + +const PasswordField: FC = ({ value = '', onChange, placeholder }) => ( + <> + + + +); + +export default PasswordField; diff --git a/src/components/Login/SignUpForm/PasswordFields.tsx b/src/components/Login/SignUpForm/PasswordFields.tsx new file mode 100644 index 0000000000..0521d0f46f --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordFields.tsx @@ -0,0 +1,71 @@ +import { FC } from 'react'; + +import { PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH } from '../SignUpFormFields/consts'; + +import ConfirmPasswordField from './ConfirmPasswordField'; +import PasswordField from './PasswordField'; + +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import { RuleType } from '@/types/FieldRule'; +import { FormFieldType } from '@/types/FormField'; + +const getPasswordFields = ( + t: any, + passwordPlaceholderKey = 'password-placeholder', + confirmPasswordPlaceholderKey = 'confirm-password-placeholder', +): FormBuilderFormField[] => { + const PasswordInput: FC<{ + value: string; + onChange: (value: string) => void; + placeholder?: string; + }> = ({ value, onChange, placeholder }) => ( + + ); + + return [ + { + field: 'password', + type: FormFieldType.Password, + placeholder: t(passwordPlaceholderKey), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.password') }), + }, + { + type: RuleType.MinimumLength, + value: PASSWORD_MIN_LENGTH, + errorMessage: t('errors.min', { + fieldName: t('common:form.password'), + min: PASSWORD_MIN_LENGTH, + }), + }, + { + type: RuleType.MaximumLength, + value: PASSWORD_MAX_LENGTH, + errorMessage: t('errors.max', { + fieldName: t('common:form.password'), + max: PASSWORD_MAX_LENGTH, + }), + }, + ], + customRender: PasswordInput, + }, + { + field: 'confirmPassword', + type: FormFieldType.Password, + placeholder: t(confirmPasswordPlaceholderKey), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.confirm-password') }), + }, + ], + customRender: ConfirmPasswordField, + }, + ]; +}; + +export default getPasswordFields; diff --git a/src/components/Login/SignUpForm/PasswordInput.module.scss b/src/components/Login/SignUpForm/PasswordInput.module.scss new file mode 100644 index 0000000000..941e5aa862 --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordInput.module.scss @@ -0,0 +1,38 @@ +.passwordInputContainer { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + border: 1px solid var(--color-borders-hairline); + border-radius: var(--border-radius-rounded); + padding-inline: var(--spacing-small); + height: calc(2 * var(--spacing-large)); +} + +.toggleButton { + position: relative; + background: none; + border: none; + padding: 4px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-text-faded); + padding-inline: var(--spacing-xxsmall); + + &:hover { + color: var(--color-text-default); + } + + &:focus { + outline: none; + color: var(--color-text-default); + } +} + +.icon { + width: var(--spacing-large); + height: var(--spacing-large); +} diff --git a/src/components/Login/SignUpForm/PasswordInput.tsx b/src/components/Login/SignUpForm/PasswordInput.tsx new file mode 100644 index 0000000000..969b4e10de --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordInput.tsx @@ -0,0 +1,37 @@ +import { FC, useState } from 'react'; + +import styles from './PasswordInput.module.scss'; + +import HideIcon from '@/icons/hide.svg'; +import ShowIcon from '@/icons/show.svg'; + +interface Props { + value: string; + onChange: (value: string) => void; + placeholder?: string; +} + +const PasswordInput: FC = ({ value = '', onChange, placeholder }) => { + const [showPassword, setShowPassword] = useState(false); + + return ( +
    + onChange(e.target.value)} + placeholder={placeholder} + /> + +
    + ); +}; + +export default PasswordInput; diff --git a/src/components/Login/SignUpForm/PasswordValidation.module.scss b/src/components/Login/SignUpForm/PasswordValidation.module.scss new file mode 100644 index 0000000000..26f3e60036 --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordValidation.module.scss @@ -0,0 +1,16 @@ +.passwordValidation { + margin-top: var(--spacing-medium2-px); +} + +.validationRule { + display: flex; + align-items: center; + margin-block: var(--spacing-xxsmall); + color: var(--color-text-gray); + font-size: var(--font-size-medium-px); +} + +.ruleIcon { + margin-inline-end: var(--spacing-xxsmall); + font-weight: bold; +} diff --git a/src/components/Login/SignUpForm/PasswordValidation.tsx b/src/components/Login/SignUpForm/PasswordValidation.tsx new file mode 100644 index 0000000000..328621e3af --- /dev/null +++ b/src/components/Login/SignUpForm/PasswordValidation.tsx @@ -0,0 +1,84 @@ +import { FC } from 'react'; + +import classNames from 'classnames'; +import useTranslation from 'next-translate/useTranslation'; + +import { PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH } from '../SignUpFormFields/consts'; + +import styles from './PasswordValidation.module.scss'; + +interface PasswordRule { + test: (value: string) => boolean; + messageKey: string; +} + +interface Props { + value: string; +} + +const PasswordValidation: FC = ({ value = '' }) => { + const { t } = useTranslation('login'); + + const rules: PasswordRule[] = [ + { + test: (password) => password.length >= PASSWORD_MIN_LENGTH, + messageKey: 'password-rules.min-length', + }, + { + test: (password) => password.length <= PASSWORD_MAX_LENGTH, + messageKey: 'password-rules.max-length', + }, + { + test: (password) => /[A-Z]/.test(password), + messageKey: 'password-rules.uppercase', + }, + { + test: (password) => /[a-z]/.test(password), + messageKey: 'password-rules.lowercase', + }, + { + test: (password) => /\d/.test(password), + messageKey: 'password-rules.number', + }, + { + test: (password) => { + // Check if at least one allowed special character exists + const hasAllowedSpecial = /[!@#$%^&*_-]/.test(password); + + // Check if there are any characters that aren't letters, numbers, or allowed special chars + const hasDisallowedChars = /[^a-zA-Z0-9!@#$%^&*_-]/.test(password); + + // Return true only if there's at least one allowed special char AND no disallowed chars + return hasAllowedSpecial && !hasDisallowedChars; + }, + messageKey: 'password-rules.special', + }, + ]; + + // Only show validation rules when there's a value + if (!value) { + return null; + } + + return ( +
    + {rules.map((rule) => { + const isValid = rule.test(value); + return ( +
    + {isValid ? '✓' : '×'} + {t(rule.messageKey)} +
    + ); + })} +
    + ); +}; + +export default PasswordValidation; diff --git a/src/components/Login/SignUpForm/errors.ts b/src/components/Login/SignUpForm/errors.ts new file mode 100644 index 0000000000..58a101aa3c --- /dev/null +++ b/src/components/Login/SignUpForm/errors.ts @@ -0,0 +1,117 @@ +/* eslint-disable react-func/max-lines-per-function */ +import { + NAME_MAX_LENGTH, + NAME_MIN_LENGTH, + PASSWORD_MAX_LENGTH, + PASSWORD_MIN_LENGTH, + USERNAME_MAX_LENGTH, + USERNAME_MIN_LENGTH, +} from '../SignUpFormFields/consts'; + +import SignUpRequest from '@/types/auth/SignUpRequest'; + +type AuthErrors = Record; + +export enum ErrorType { + MISMATCH = 'mismatch', + SIGNUP = 'signup', + API = 'api', + FORGOT_PASSWORD = 'forgot-password', + SIGN_IN = 'sign-in', + RESET_PASSWORD = 'reset-password', +} + +const getFormErrors = (t: any, type: ErrorType, apiErrors?: any): { errors: AuthErrors } => { + const baseErrors = {}; + + switch (type) { + case ErrorType.MISMATCH: + return { + errors: { + ...baseErrors, + confirmPassword: t('errors.confirm'), + } as AuthErrors, + }; + case ErrorType.API: { + const errors: Partial = { ...baseErrors }; + + if (apiErrors?.email) { + errors.email = t(apiErrors.email, { + fieldName: t('common:form.email'), + }); + } + + if (apiErrors?.username) { + errors.username = t(apiErrors.username, { + fieldName: t('common:form.username'), + min: USERNAME_MIN_LENGTH, + max: USERNAME_MAX_LENGTH, + }); + } + + if (apiErrors?.password) { + errors.password = t(apiErrors.password, { + fieldName: t('common:form.password'), + min: PASSWORD_MIN_LENGTH, + max: PASSWORD_MAX_LENGTH, + }); + } + + if (apiErrors?.confirmPassword) { + errors.confirmPassword = t(apiErrors.confirmPassword, { + fieldName: t('common:form.confirm-password'), + }); + } + + if (apiErrors?.firstName) { + errors.firstName = t(apiErrors.firstName, { + fieldName: t('common:form.firstName'), + min: NAME_MIN_LENGTH, + max: NAME_MAX_LENGTH, + }); + } + + if (apiErrors?.lastName) { + errors.lastName = t(apiErrors.lastName, { + fieldName: t('common:form.lastName'), + min: NAME_MIN_LENGTH, + max: NAME_MAX_LENGTH, + }); + } + + return { errors: errors as AuthErrors }; + } + case ErrorType.SIGNUP: + return { + errors: { + ...baseErrors, + password: t('errors.signup-failed'), + } as AuthErrors, + }; + case ErrorType.FORGOT_PASSWORD: + return { + errors: { + ...baseErrors, + email: t('errors.forgot-password-failed'), + } as AuthErrors, + }; + case ErrorType.SIGN_IN: + return { + errors: { + ...baseErrors, + password: t('errors.signin-failed'), + } as AuthErrors, + }; + case ErrorType.RESET_PASSWORD: + return { + errors: { + ...baseErrors, + password: t('errors.reset-password-failed'), + } as AuthErrors, + }; + default: + return { errors: baseErrors as AuthErrors }; + } +}; + +export default getFormErrors; diff --git a/src/components/Login/SignUpFormFields/consts.ts b/src/components/Login/SignUpFormFields/consts.ts new file mode 100644 index 0000000000..51cf08c56f --- /dev/null +++ b/src/components/Login/SignUpFormFields/consts.ts @@ -0,0 +1,10 @@ +export const PASSWORD_MIN_LENGTH = 8; +export const PASSWORD_MAX_LENGTH = 20; +export const USERNAME_MIN_LENGTH = 3; +export const USERNAME_MAX_LENGTH = 25; +export const NAME_MIN_LENGTH = 3; +export const NAME_MAX_LENGTH = 25; + +export const VERIFICATION_CODE_LENGTH = 6; +export const RESEND_COOLDOWN_SECONDS = 60; +export const CODE_EXPIRY_MINUTES = 5; diff --git a/src/components/Login/SignUpFormFields/credentialFields.ts b/src/components/Login/SignUpFormFields/credentialFields.ts new file mode 100644 index 0000000000..d5f6a31048 --- /dev/null +++ b/src/components/Login/SignUpFormFields/credentialFields.ts @@ -0,0 +1,63 @@ +/* eslint-disable react-func/max-lines-per-function */ +import { USERNAME_MAX_LENGTH, USERNAME_MIN_LENGTH } from './consts'; + +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import { RuleType } from '@/types/FieldRule'; +import { FormFieldType } from '@/types/FormField'; + +const EMAIL_REGEX = + '^(([^<>()[\\]\\\\.,;:\\s@"]+(\\.[^<>()[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+[a-zA-Z]{2,}))$'; + +export const REGEX_USERNAME = '^[a-zA-Z0-9_]+$'; + +export const getEmailField = (t: any): FormBuilderFormField => ({ + field: 'email', + type: FormFieldType.Text, + placeholder: t('email-placeholder'), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.email') }), + }, + { + type: RuleType.Regex, + value: EMAIL_REGEX, + errorMessage: t('errors.email'), + }, + ], +}); + +export const getUsernameField = (t: any): FormBuilderFormField => ({ + field: 'username', + type: FormFieldType.Text, + placeholder: t('username-placeholder'), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.username') }), + }, + { + type: RuleType.MinimumLength, + value: USERNAME_MIN_LENGTH, + errorMessage: t('errors.min', { + fieldName: t('common:form.username'), + min: USERNAME_MIN_LENGTH, + }), + }, + { + type: RuleType.MaximumLength, + value: USERNAME_MAX_LENGTH, + errorMessage: t('errors.max', { + fieldName: t('common:form.username'), + max: USERNAME_MAX_LENGTH, + }), + }, + { + type: RuleType.Regex, + value: REGEX_USERNAME, + errorMessage: t('errors.username', { fieldName: t('common:form.username') }), + }, + ], +}); diff --git a/src/components/Login/SignUpFormFields/index.ts b/src/components/Login/SignUpFormFields/index.ts new file mode 100644 index 0000000000..ea72024ead --- /dev/null +++ b/src/components/Login/SignUpFormFields/index.ts @@ -0,0 +1,14 @@ +import { getEmailField, getUsernameField } from './credentialFields'; +import { getNameFields } from './nameFields'; + +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import getPasswordFields from '@/components/Login/SignUpForm/PasswordFields'; + +const getSignUpFormFields = (t: any): FormBuilderFormField[] => [ + ...getNameFields(t), + getEmailField(t), + getUsernameField(t), + ...getPasswordFields(t), +]; + +export default getSignUpFormFields; diff --git a/src/components/Login/SignUpFormFields/nameFields.ts b/src/components/Login/SignUpFormFields/nameFields.ts new file mode 100644 index 0000000000..cab473d46a --- /dev/null +++ b/src/components/Login/SignUpFormFields/nameFields.ts @@ -0,0 +1,78 @@ +/* eslint-disable import/prefer-default-export */ +/* eslint-disable react-func/max-lines-per-function */ +import { NAME_MAX_LENGTH, NAME_MIN_LENGTH } from './consts'; + +import { FormBuilderFormField } from '@/components/FormBuilder/FormBuilderTypes'; +import { RuleType } from '@/types/FieldRule'; +import { FormFieldType } from '@/types/FormField'; + +export const REGEX_NAME = '^[^!"#$%&\'\\*\\+,\\-\\./:;<=>?@\\[\\\\\\]\\^_`{|}~§±×÷]+$'; + +export const getNameFields = (t: any): FormBuilderFormField[] => [ + { + field: 'firstName', + type: FormFieldType.Text, + placeholder: t('first-name-placeholder'), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.firstName') }), + }, + { + type: RuleType.MinimumLength, + value: NAME_MIN_LENGTH, + errorMessage: t('errors.min', { + fieldName: t('common:form.firstName'), + min: NAME_MIN_LENGTH, + }), + }, + { + type: RuleType.MaximumLength, + value: NAME_MAX_LENGTH, + errorMessage: t('errors.max', { + fieldName: t('common:form.firstName'), + max: NAME_MAX_LENGTH, + }), + }, + { + type: RuleType.Regex, + value: REGEX_NAME, + errorMessage: t('errors.name', { fieldName: t('common:form.firstName') }), + }, + ], + }, + { + field: 'lastName', + type: FormFieldType.Text, + placeholder: t('last-name-placeholder'), + rules: [ + { + type: RuleType.Required, + value: true, + errorMessage: t('errors.required', { fieldName: t('common:form.lastName') }), + }, + { + type: RuleType.MinimumLength, + value: NAME_MIN_LENGTH, + errorMessage: t('errors.min', { + fieldName: t('common:form.lastName'), + min: NAME_MIN_LENGTH, + }), + }, + { + type: RuleType.MaximumLength, + value: NAME_MAX_LENGTH, + errorMessage: t('errors.max', { + fieldName: t('common:form.lastName'), + max: NAME_MAX_LENGTH, + }), + }, + { + type: RuleType.Regex, + value: REGEX_NAME, + errorMessage: t('errors.name', { fieldName: t('common:form.lastName') }), + }, + ], + }, +]; diff --git a/src/components/Login/SocialButtons.tsx b/src/components/Login/SocialButtons.tsx new file mode 100644 index 0000000000..6259ae8197 --- /dev/null +++ b/src/components/Login/SocialButtons.tsx @@ -0,0 +1,72 @@ +import { FC } from 'react'; + +import classNames from 'classnames'; +import useTranslation from 'next-translate/useTranslation'; + +import styles from './login.module.scss'; + +import Button, { ButtonShape, ButtonVariant } from '@/dls/Button/Button'; +import AppleIcon from '@/icons/apple.svg'; +import FacebookIcon from '@/icons/facebook.svg'; +import GoogleIcon from '@/icons/google.svg'; +import { makeAppleLoginUrl, makeFacebookLoginUrl, makeGoogleLoginUrl } from '@/utils/auth/apiPaths'; +import { logButtonClick } from '@/utils/eventLogger'; +import AuthType from 'types/auth/AuthType'; + +interface Props { + redirect?: string; + onEmailLoginClick: () => void; +} + +const SocialButtons: FC = ({ redirect, onEmailLoginClick }) => { + const { t } = useTranslation('login'); + + const onSocialButtonClick = (type: AuthType) => { + logButtonClick(type); + }; + + return ( +
    + + + + +
    + ); +}; + +export default SocialButtons; diff --git a/src/components/Login/VerificationCode/VerificationCode.module.scss b/src/components/Login/VerificationCode/VerificationCode.module.scss new file mode 100644 index 0000000000..1eb1416dd2 --- /dev/null +++ b/src/components/Login/VerificationCode/VerificationCode.module.scss @@ -0,0 +1,119 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + max-width: 400px; + margin: 0 auto; + padding: var(--spacing-medium); +} + +.title { + font-size: var(--font-size-xlarge); + font-weight: var(--font-weight-bold); + margin-bottom: var(--spacing-mega); + text-align: center; +} + +.emailContainer { + text-align: center; + margin-bottom: var(--spacing-large); +} + +.description { + font-size: var(--font-size-large); + color: var(--color-text-default); + margin-bottom: var(--spacing-xsmall); +} + +.email { + font-size: var(--font-size-large); + font-weight: var(--font-weight-bold); + color: var(--color-text-default); +} + +.instruction { + font-size: var(--font-size-large); + color: var(--color-text-default); + text-align: center; + margin-bottom: var(--spacing-large); +} + +.inputContainer { + margin-bottom: var(--spacing-medium); +} + +.verificationContainer { + display: flex; + justify-content: space-between; + gap: var(--spacing-xsmall); + margin-bottom: var(--spacing-medium); +} + +.character { + width: 48px; + height: 48px; + border: 1px solid var(--color-borders-hairline); + border-radius: var(--border-radius-default); + font-size: var(--font-size-jumbo); + font-weight: var(--font-weight-bold); + color: var(--color-text-default); + background-color: var(--color-background-default); + display: flex; + align-items: center; + justify-content: center; + cursor: text; + + &:focus { + outline: none; + border-color: var(--color-primary-medium); + box-shadow: 0 0 0 1px var(--color-primary-medium); + } +} + +.characterInactive { + background-color: var(--color-background-elevated); +} + +.characterSelected { + border-color: var(--color-primary-medium); + box-shadow: 0 0 0 1px var(--color-primary-medium); +} + +.error { + color: var(--color-error-medium); + font-size: var(--font-size-small); + margin-top: var(--spacing-xxsmall); + text-align: center; +} + +.spamNote { + font-size: var(--font-size-medium); + color: var(--color-text-default); + text-align: center; + margin-bottom: var(--spacing-large); +} + +.actions { + display: flex; + flex-direction: column; + gap: var(--spacing-small); + width: 100%; +} + +.resendButton { + color: var(--color-text-faded); + font-size: var(--font-size-medium); + + &:disabled { + opacity: 1; + cursor: not-allowed; + } +} + +.backButton { + margin-top: var(--spacing-xsmall); +} + +.confirmationText { + font-weight: var(--font-weight-bold); +} diff --git a/src/components/Login/VerificationCode/VerificationCodeBase.tsx b/src/components/Login/VerificationCode/VerificationCodeBase.tsx new file mode 100644 index 0000000000..ecba18c6d1 --- /dev/null +++ b/src/components/Login/VerificationCode/VerificationCodeBase.tsx @@ -0,0 +1,149 @@ +import { FC, useEffect, useState } from 'react'; + +import Trans from 'next-translate/Trans'; +import useTranslation from 'next-translate/useTranslation'; +import VerificationInput from 'react-verification-input'; + +import styles from './VerificationCode.module.scss'; + +import { + VERIFICATION_CODE_LENGTH, + RESEND_COOLDOWN_SECONDS, +} from '@/components/Login/SignUpFormFields/consts'; +import Button, { ButtonType, ButtonVariant } from '@/dls/Button/Button'; +import { useToast } from '@/dls/Toast/Toast'; +import ArrowLeft from '@/icons/west.svg'; +import { logButtonClick, logFormSubmission } from '@/utils/eventLogger'; + +interface Props { + email: string; + onBack: () => void; + onResendCode: () => Promise; + onSubmitCode: (code: string) => Promise; + titleTranslationKey?: string; + descriptionTranslationKey?: string; + errorTranslationKey?: string; + formSubmissionKey?: string; + resendClickKey?: string; + shouldShowEmail?: boolean; +} + +const VerificationCodeBase: FC = ({ + email, + onBack, + onResendCode, + onSubmitCode, + titleTranslationKey = 'check-email-title', + descriptionTranslationKey = 'login:verification-code-sent-to', + errorTranslationKey = 'errors.verification-code-invalid', + formSubmissionKey = 'verification_code_submit', + resendClickKey = 'verification_code_resend', + shouldShowEmail = true, +}) => { + const { t } = useTranslation('login'); + const showToast = useToast(); + const [resendTimer, setResendTimer] = useState(0); + const [verificationCode, setVerificationCode] = useState(''); + const [error, setError] = useState(''); + + useEffect(() => { + let interval; + if (resendTimer > 0) { + interval = setInterval(() => { + setResendTimer((prev) => prev - 1); + }, 1000); + } + return () => clearInterval(interval); + }, [resendTimer]); + + const handleSubmit = async (code: string) => { + logFormSubmission(formSubmissionKey); + setError(''); + + try { + await onSubmitCode(code); + } catch (err) { + setError(t(errorTranslationKey)); + } + }; + + const handleChange = (code: string) => { + setVerificationCode(code); + if (code.length === VERIFICATION_CODE_LENGTH) { + handleSubmit(code); + } + }; + + const handleResendCode = async () => { + logButtonClick(resendClickKey); + if (resendTimer > 0) return; + + try { + await onResendCode(); + setResendTimer(RESEND_COOLDOWN_SECONDS); + setVerificationCode(''); // Clear the input on resend + showToast(t('verification-code-sent')); + } catch (err) { + showToast(t('errors.verification-resend-failed')); + } + }; + + return ( +
    +

    {t(titleTranslationKey)}

    +
    +

    + , + }} + /> +

    + {shouldShowEmail &&

    {email}

    } +
    +

    {t('verification-code-instruction')}

    + +
    + + {error &&
    {error}
    } +
    + +
    {t('verification-code-spam-note')}
    + +
    + + + +
    +
    + ); +}; + +export default VerificationCodeBase; diff --git a/src/components/Login/VerificationCode/VerificationCodeForm.tsx b/src/components/Login/VerificationCode/VerificationCodeForm.tsx new file mode 100644 index 0000000000..8726c3e043 --- /dev/null +++ b/src/components/Login/VerificationCode/VerificationCodeForm.tsx @@ -0,0 +1,53 @@ +/* eslint-disable react-func/max-lines-per-function */ +import { FC } from 'react'; + +import { useRouter } from 'next/router'; + +import VerificationCodeBase from './VerificationCodeBase'; + +import AuthHeader from '@/components/Login/AuthHeader'; +import styles from '@/components/Login/login.module.scss'; +import SignUpRequest from '@/types/auth/SignUpRequest'; +import { signUp } from '@/utils/auth/authRequests'; +import { logFormSubmission } from '@/utils/eventLogger'; + +interface Props { + email: string; + onBack: () => void; + onResendCode: () => Promise; + signUpData: SignUpRequest; +} + +const VerificationCodeForm: FC = ({ email, onBack, onResendCode, signUpData }) => { + const router = useRouter(); + + const handleSubmitCode = async (code: string) => { + logFormSubmission('verification_code_submit'); + const { data: response } = await signUp({ + ...signUpData, + verificationCode: code, + }); + + if (!response.success) { + throw new Error('Invalid verification code'); + } + + // If successful, redirect back or to home + const redirectPath = (router.query.redirect as string) || '/'; + router.push(redirectPath); + }; + + return ( +
    + + +
    + ); +}; + +export default VerificationCodeForm; diff --git a/src/components/Login/login.module.scss b/src/components/Login/login.module.scss index 6588ed5bad..b441795117 100644 --- a/src/components/Login/login.module.scss +++ b/src/components/Login/login.module.scss @@ -1,43 +1,154 @@ @use "src/styles/theme"; @use "src/styles/breakpoints"; +$container-width: 370px; + .outerContainer { min-height: 80vh; display: flex; justify-content: center; align-items: center; - padding-block-end: calc(5 * var(--spacing-mega)); - padding-block-start: var(--spacing-mega); - padding-inline: var(--spacing-large); + padding: var(--spacing-mega); flex-direction: column; + background-color: var(--color-background-default); + max-width: 400px; + margin-inline: auto; } .innerContainer { + width: 100%; display: flex; flex-direction: column; + align-items: center; + padding: var(--spacing-large); + background-color: var(--color-background-elevated); + border-radius: var(--border-radius-large); + box-shadow: var(--shadow-small); +} + +.title { + font-size: var(--font-size-normal-px); + color: var(--color-text-default); + text-align: center; + margin-bottom: var(--spacing-xsmall-px); @include breakpoints.desktop { - width: calc(10 * var(--spacing-mega)); + font-size: var(--font-size-xlarge-px); + margin-bottom: var(--spacing-large); } } -.cta { - font-weight: var(--font-weight-bold); - font-size: var(--font-size-large); - padding-block: var(--spacing-large); +.subtitle { text-align: center; + margin-block-end: var(--spacing-xlarge); + color: var(--color-text-default); + max-width: 400px; + font-size: var(--font-size-xsmall-px); } -.title { - font-size: var(--font-size-jumbo); +.inlineText { + display: inline; +} + +.boldText { font-weight: var(--font-weight-bold); - margin-block-end: var(--spacing-large); +} + +.serviceCard { + display: flex; + flex-direction: column; + align-items: center; + inline-size: 100%; + padding-inline: var(--spacing-large); + background: var(--color-background-default); + @include breakpoints.desktop { + padding-block: var(--spacing-large); + } +} + +.serviceLogo { text-align: center; + + svg { + height: 20px; + width: auto; + @include breakpoints.desktop { + height: 30px; + } + } } -.loginButton { - margin-block-start: var(--spacing-small); - font-weight: var(--font-weight-semibold); +.reflectLogo { + height: 40px; + width: auto; +} + +.reflectLogos { display: flex; + align-items: center; + gap: var(--spacing-medium); +} + +.benefits { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--spacing-xxsmall-px); + inline-size: 100%; + margin-block-start: var(--spacing-xsmall-px); + @include breakpoints.desktop { + margin-block-start: var(--spacing-large-px); + } +} + +.quranBenefits { + display: flex; + flex-direction: column; + align-items: center; +} + +.benefit { + display: flex; + justify-content: center; +} + +.benefitContent { + display: flex; + align-items: center; +} + +.benefitText { + margin-left: var(--spacing-micro-px); + margin-right: var(--spacing-micro-px); + text-align: center; + font-size: var(--font-size-xsmall-px); +} + +.authButtons { + display: flex; + flex-direction: column; + gap: var(--spacing-medium); + width: 100%; +} + +.loginButton { + width: 100%; + justify-content: center; + padding: var(--spacing-medium); + font-size: var(--font-size-normal); + font-weight: var(--font-weight-bold); + border-radius: var(--border-radius-rounded); + border: 1px solid var(--color-text-default); + background-color: var(--color-background-default); + color: var(--color-text-default); + transition: all 0.2s ease-in-out; + + &:hover { + background-color: var(--color-background-elevated); + } + + svg { + width: 20px; + height: 20px; + } } .googleButton { @@ -72,9 +183,11 @@ .emailSentContainer { text-align: center; } + .paragraphContainer { margin-block-end: var(--spacing-medium); } + .emailContainer { font-weight: var(--font-weight-bold); } @@ -100,11 +213,263 @@ } .privacyText { - margin-block-start: var(--spacing-medium); - font-size: var(--font-size-xsmall); + text-align: center; + font-size: var(--font-size-small); color: var(--color-text-faded); + margin-block-start: var(--spacing-medium-px); } .bold { font-weight: var(--font-weight-bold); } + +.authContainer { + width: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + max-width: 400px; + margin: 0 auto; +} + +.authLogos { + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-large); + padding: var(--spacing-large); + + svg { + height: 32px; + width: auto; + @include breakpoints.smallerThanTablet { + height: 20px; + } + } +} + +.qrLogos { + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-small-px); + svg { + height: 29px; + width: auto; + @include breakpoints.smallerThanTablet { + height: 20px; + } + } +} + +.authTabs { + width: 100%; + margin-top: var(--spacing-large); + display: flex; + flex-direction: column; + gap: var(--spacing-large); +} + +.authSwitchContainer { + width: 95%; + margin-inline: auto; +} + +.authTitle { + font-size: var(--font-size-xlarge); + font-weight: var(--font-weight-bold); + margin: 0; + text-align: center; + color: var(--color-text-default); + margin-block: var(--spacing-large); +} + +.description { + text-align: center; + color: var(--color-text-default); + margin-block: var(--spacing-large); + font-size: var(--font-size-large); +} + +.formContainer { + width: 100%; + margin-inline: auto; + display: flex; + align-items: center; + flex-direction: column; + gap: var(--spacing-large); + margin-top: var(--spacing-large); + + form { + width: 95%; + } + + input { + border: none; + width: 100%; + background: transparent; + color: var(--color-text-default); + + &::placeholder { + color: var(--color-text-faded); + } + + &:focus { + outline: none; + } + } +} + +.submitButton { + width: 100%; + padding: var(--spacing-medium); + font-size: var(--font-size-normal); + font-weight: var(--font-weight-bold); + border-radius: var(--border-radius-pill); + background-color: var(--color-success-medium); + color: var(--color-text-inverse); + border: none; + cursor: pointer; + transition: all 0.2s ease-in-out; + margin-top: var(--spacing-medium); + + &:hover { + background-color: var(--color-success-dark); + } +} + +.formActions { + width: 95%; +} + +.forgotPassword { + color: var(--color-success-medium); + text-decoration: none; + font-size: var(--font-size-medium); + text-align: start; + + &:hover { + text-decoration: underline; + } +} + +.backButton { + align-self: flex-start; + margin-bottom: var(--spacing-medium); + color: var(--color-text-default); + cursor: pointer; + display: flex; + align-items: center; + gap: var(--spacing-xsmall); + font-size: var(--font-size-normal); + background: none; + border: none; + padding: 0; + + svg { + width: 20px; + height: 20px; + } +} + +.logos { + display: flex; + align-items: center; + gap: var(--spacing-large); + margin-block-end: var(--spacing-xlarge); + border-block-end: 1px solid var(--color-borders-hairline); + padding-block-end: var(--spacing-large); + width: 100%; + justify-content: center; + + svg { + height: 32px; + width: auto; + } +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--spacing-mega); + gap: var(--spacing-medium); + width: 400px; + margin: 0 auto; +} + +.form { + display: flex; + flex-direction: column; + gap: var(--spacing-medium); + width: 100%; +} + +.formField { + width: 100%; + padding: var(--spacing-medium); + font-size: var(--font-size-normal); + border: 1px solid var(--color-borders-hairline); + border-radius: var(--border-radius-default); + background-color: var(--color-background-elevated); + color: var(--color-text-default); + + &::placeholder { + color: var(--color-text-faded); + } + + &:focus { + outline: none; + border-color: var(--color-primary-medium); + } +} + +.comingSoon { + text-align: center; + color: var(--color-text-default); + font-size: var(--font-size-medium); + margin-top: var(--spacing-large); +} + +.servicesContainer { + display: flex; + flex-direction: column; + width: 100%; + margin-block-start: var(--spacing-small-px); + border: 1px solid var(--color-text-default); + border-radius: var(--border-radius-rounded); + padding: 0; +} + +.serviceSection { + padding: var(--spacing-xsmall-px); + @include breakpoints.desktop { + padding: var(--spacing-small-px); + } + display: flex; + flex-direction: column; + align-items: center; +} + +.serviceDivider { + width: 95%; + border: none; + border-top: 1px solid var(--color-borders-hairline); + margin: auto; +} + +.loginCta { + font-size: var(--font-size-xsmall-px); + padding-block: var(--spacing-xsmall-px); + @include breakpoints.desktop { + padding-block: var(--spacing-small-px); + } +} + +.emailButton { + color: var(--color-qdc-blue); + &:hover { + color: var(--color-qdc-deep-blue); + } +} diff --git a/src/components/MediaMaker/Content/MediaMakerContent.module.scss b/src/components/MediaMaker/Content/MediaMakerContent.module.scss index 0e33376b9d..2892975fdf 100644 --- a/src/components/MediaMaker/Content/MediaMakerContent.module.scss +++ b/src/components/MediaMaker/Content/MediaMakerContent.module.scss @@ -58,31 +58,31 @@ $white: #ffffff; .watermark { text-align: center; color: $white; - font-size: 19px; + font-size: 28px; font-family: "Figtree" !important; font-weight: var(--font-weight-bold); } .watermarkPortrait { - font-size: 19px; + font-size: 28px; } .watermarkLandscape { - font-size: 17px; + font-size: 25px; } .logo { font-weight: 700; - font-size: 29px; + font-size: 42px; font-family: "PlayfairDisplay" !important; } .logoPortrait { - font-size: 29px; + font-size: 42px; } .logoLandscape { - font-size: 25px; + font-size: 36px; } .space { diff --git a/src/components/MediaMaker/Content/index.tsx b/src/components/MediaMaker/Content/index.tsx index ff697c9c71..dc4dfc4e62 100644 --- a/src/components/MediaMaker/Content/index.tsx +++ b/src/components/MediaMaker/Content/index.tsx @@ -121,7 +121,7 @@ const MediaMakerContent: React.FC = ({ diff --git a/src/components/MediaMaker/RenderControls/index.tsx b/src/components/MediaMaker/RenderControls/index.tsx index 0011ee0d35..bc251e7ff2 100644 --- a/src/components/MediaMaker/RenderControls/index.tsx +++ b/src/components/MediaMaker/RenderControls/index.tsx @@ -12,8 +12,11 @@ import RenderVideoButton from './RenderVideoButton'; import Button, { ButtonType } from '@/dls/Button/Button'; import CopyIcon from '@/icons/copy.svg'; import layoutStyle from '@/pages/index.module.scss'; +import PreviewMode from '@/types/Media/PreviewMode'; +import { shortenUrl } from '@/utils/auth/api'; import { logButtonClick } from '@/utils/eventLogger'; -import { getCurrentPath } from '@/utils/url'; +import { getQuranMediaMakerNavigationUrl } from '@/utils/navigation'; +import { getBasePath, getCurrentPath } from '@/utils/url'; type Props = { inputProps: MediaFileCompositionProps; @@ -49,11 +52,16 @@ const RenderControls: React.FC = ({ inputProps, isFetching, playerRef }) }; }, [isCopied]); - const onCopyLinkClicked = () => { + const onCopyLinkClicked = async () => { logButtonClick('video_generation_copy_link'); const path = getCurrentPath(); - if (origin) { - clipboardCopy(path).then(() => { + const response = await shortenUrl(`${path}&previewMode=${PreviewMode.ENABLED}`); + + const url = response?.id + ? `${getBasePath()}${getQuranMediaMakerNavigationUrl()}/${response.id}` + : path; + if (url) { + clipboardCopy(url).then(() => { setIsCopied(true); }); } diff --git a/src/components/MediaMaker/Settings/AudioTab.tsx b/src/components/MediaMaker/Settings/AudioTab.tsx index d964a2692f..fcfd7269a5 100644 --- a/src/components/MediaMaker/Settings/AudioTab.tsx +++ b/src/components/MediaMaker/Settings/AudioTab.tsx @@ -71,15 +71,7 @@ const AudioTab: FC = ({ ) => { setRangesError(null); const isVerseKeyStartOfRange = verseSelectorId === RangeSelectorType.START; - const startVerseNumber = isVerseKeyStartOfRange ? newSelectedVerseNumber : verseFrom; - const endVerseNumber = !isVerseKeyStartOfRange ? newSelectedVerseNumber : verseTo; - const startVerseKey = `${surah}:${startVerseNumber}`; - const endVerseKey = `${surah}:${endVerseNumber}`; - const validationError = validateRangeSelection(startVerseKey, endVerseKey, t); - if (validationError) { - setRangesError(validationError); - return false; - } + if (isVerseKeyStartOfRange) { const isMaxAyahs = Number(verseTo) - Number(newSelectedVerseNumber) >= MAX_AYAHS_LIMIT; @@ -95,6 +87,17 @@ const AudioTab: FC = ({ } else { const isMaxAyahs = Number(newSelectedVerseNumber) - Number(verseFrom) >= MAX_AYAHS_LIMIT; + const startVerseNumber = isVerseKeyStartOfRange ? newSelectedVerseNumber : verseFrom; + const endVerseNumber = !isVerseKeyStartOfRange ? newSelectedVerseNumber : verseTo; + const startVerseKey = `${surah}:${startVerseNumber}`; + const endVerseKey = `${surah}:${endVerseNumber}`; + const validationError = validateRangeSelection(startVerseKey, endVerseKey, t); + + if (validationError) { + setRangesError(validationError); + return false; + } + onSettingsUpdate( { verseFrom: isMaxAyahs ? newSelectedVerseNumber : verseFrom, diff --git a/src/components/MediaMaker/Settings/VideoSettings.tsx b/src/components/MediaMaker/Settings/VideoSettings.tsx index ee9bff22f5..5ef9c7751a 100644 --- a/src/components/MediaMaker/Settings/VideoSettings.tsx +++ b/src/components/MediaMaker/Settings/VideoSettings.tsx @@ -64,6 +64,7 @@ const MEDIA_SETTINGS_TO_QUERY_PARAM = { orientation: QueryParam.ORIENTATION, videoId: QueryParam.VIDEO_ID, surah: QueryParam.SURAH, + previewMode: QueryParam.PREVIEW_MODE, } as Record; const VideoSettings: React.FC = ({ diff --git a/src/components/Navbar/Drawer/Drawer.module.scss b/src/components/Navbar/Drawer/Drawer.module.scss index dd172033b4..37784d8081 100644 --- a/src/components/Navbar/Drawer/Drawer.module.scss +++ b/src/components/Navbar/Drawer/Drawer.module.scss @@ -30,6 +30,9 @@ inset-inline-end: calc(-1 * constants.$side-menu-desktop-width); } } + &.noTransition { + transition: none; + } } .containerOpen { diff --git a/src/components/Navbar/Drawer/index.tsx b/src/components/Navbar/Drawer/index.tsx index cb388392c4..865db07137 100644 --- a/src/components/Navbar/Drawer/index.tsx +++ b/src/components/Navbar/Drawer/index.tsx @@ -21,7 +21,6 @@ import { setIsSettingsDrawerOpen, setIsVisible, } from '@/redux/slices/navbar'; -import { stopSearchDrawerVoiceFlow } from '@/redux/slices/voiceSearch'; import { logEvent } from '@/utils/eventLogger'; export enum DrawerType { @@ -112,9 +111,6 @@ const Drawer: React.FC = ({ } dispatch({ type: getActionCreator(type), payload: false }); - if (type === DrawerType.Search) { - dispatch({ type: stopSearchDrawerVoiceFlow.type }); - } logDrawerCloseEvent(type, actionSource); }, [dispatch, type, canCloseDrawer], @@ -149,6 +145,7 @@ const Drawer: React.FC = ({ }, isOpen, ); + const isSearchDrawer = type === DrawerType.Search; return (
    = ({ [styles.containerOpen]: isOpen, [styles.left]: side === DrawerSide.Left, [styles.right]: side === DrawerSide.Right, + [styles.noTransition]: type === DrawerType.Search && navbar.disableSearchDrawerTransition, })} ref={drawerRef} id={type === DrawerType.Settings ? 'settings-drawer-container' : undefined} diff --git a/src/components/Navbar/Navbar.module.scss b/src/components/Navbar/Navbar.module.scss index 119b359a5c..6cff48c4cb 100644 --- a/src/components/Navbar/Navbar.module.scss +++ b/src/components/Navbar/Navbar.module.scss @@ -23,3 +23,22 @@ transform: translate3d(0, calc(-1 * (var(--navbar-container-height) + var(--banner-height))), 0); } } + +.donateButton { + color: var(--color-text-link-new); + --themed-bg: var(--color-success-faded); + --themed-border: var(--color-success-faded); + font-weight: var(--font-weight-semibold); + + &:hover { + --themed-bg: var(--color-success-faded); + --themed-border: var(--color-success-faded); + color: var(--color-text-link-new); + } + + svg { + path { + fill: var(--color-blue-buttons-and-icons); + } + } +} diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index 70ae314fd4..03e8ed5b7c 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -9,9 +9,10 @@ import NavbarBody from './NavbarBody'; import Banner from '@/components/Banner/Banner'; import { useOnboarding } from '@/components/Onboarding/OnboardingProvider'; -import Button, { ButtonSize, ButtonType } from '@/dls/Button/Button'; +import Button, { ButtonSize, ButtonType, ButtonShape } from '@/dls/Button/Button'; +import DiamondIcon from '@/icons/diamond.svg'; import { selectNavbar } from '@/redux/slices/navbar'; -import { getRamadanNavigationUrl } from '@/utils/navigation'; +import { makeDonatePageUrl } from '@/utils/apiPaths'; const Navbar = () => { const { isActive } = useOnboarding(); @@ -25,14 +26,18 @@ const Navbar = () => {
    diff --git a/src/components/Navbar/NavigationDrawer/MobileApps.module.scss b/src/components/Navbar/NavigationDrawer/MobileApps.module.scss deleted file mode 100644 index 2ea430cc25..0000000000 --- a/src/components/Navbar/NavigationDrawer/MobileApps.module.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use "src/styles/utility"; - -$images-container-width: 17.5rem; - -.container { - background: var(--color-background-alternative-medium); -} - -.centerHorizontally { - @include utility.center-horizontally; - width: 100%; -} - -.imagesContainer { - display: flex; - max-width: $images-container-width; - justify-content: space-between; - margin-block-start: auto; - margin-inline-end: auto; - margin-block-end: auto; - margin-inline-start: auto; - padding-block: var(--spacing-xxsmall) var(--spacing-mega); -} diff --git a/src/components/Navbar/NavigationDrawer/MobileApps.tsx b/src/components/Navbar/NavigationDrawer/MobileApps.tsx deleted file mode 100644 index 8c26be2642..0000000000 --- a/src/components/Navbar/NavigationDrawer/MobileApps.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; - -import Image from 'next/image'; -import useTranslation from 'next-translate/useTranslation'; - -import styles from './MobileApps.module.scss'; -import NavigationDrawerItem from './NavigationDrawerItem'; - -import IconMobile from '@/icons/mobile.svg'; - -const MobileApps = () => { - const { t } = useTranslation('common'); - return ( -
    - } isStale /> -
    - -
    -
    - ); -}; - -export default MobileApps; diff --git a/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/NavigationDrawerBody.module.scss b/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/NavigationDrawerBody.module.scss index ebd7957c0b..4f9822fb2e 100644 --- a/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/NavigationDrawerBody.module.scss +++ b/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/NavigationDrawerBody.module.scss @@ -14,3 +14,8 @@ border-block-end: 1px var(--color-borders-hairline) solid; min-height: calc(var(--spacing-mega) + var(--spacing-small)); } + +.projectsDesc { + font-size: var(--font-size-small); + margin-block-start: var(--spacing-small); +} diff --git a/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/index.tsx b/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/index.tsx index d3fe49ff8a..49bd560055 100644 --- a/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/index.tsx +++ b/src/components/Navbar/NavigationDrawer/NavigationDrawerBody/index.tsx @@ -11,21 +11,12 @@ import IconDevelopers from '@/icons/developers.svg'; import IconFeedback from '@/icons/feedback.svg'; import IconHome from '@/icons/home.svg'; import IconInfo from '@/icons/info.svg'; -import IconLock from '@/icons/lock.svg'; -import MobileIcon from '@/icons/mobile.svg'; import IconProductUpdates from '@/icons/product-updates.svg'; import IconQ from '@/icons/Q_simple.svg'; import QuranReflect from '@/icons/QR.svg'; import IconQuestionMark from '@/icons/question-mark.svg'; import IconRadio2 from '@/icons/radio-2.svg'; import IconRadio from '@/icons/radio.svg'; -import Tarteel from '@/icons/tarteel.svg'; -// import MobileApps from '../MobileApps'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; - -// import IconDonate from '@/icons/donate.svg'; -// import IconUpdates from '@/icons/updates.svg'; -// import IconCollection from '@/icons/collection.svg'; const NavigationDrawerBody = () => { const { t } = useTranslation('common'); @@ -37,16 +28,7 @@ const NavigationDrawerBody = () => { } /> } /> } href="/about-us" /> - } href="/apps" /> - {/* } href="/updates" /> */} } href="/developers" /> - {/* } href="/contribute" /> */} - } href="/privacy" /> - } - href="/terms-and-conditions" - /> } @@ -59,62 +41,55 @@ const NavigationDrawerBody = () => { isExternalLink /> } href="/support" /> - {/*

    Selected Collections

    */} - {/* } /> */} - {/* } /> */} - {/* } /> */} - {/* } /> */} -

    {t('network')}

    +

    {t('our-projects')}

    +

    {t('projects-desc')}

    } - href="https://quranicaudio.com" + href="https://quran.com" isExternalLink /> } - href="https://salah.com" + href="https://play.google.com/store/apps/details?id=com.quran.labs.androidquran&hl=en&pli=1 " isExternalLink /> } - href="https://sunnah.com" + href="https://apps.apple.com/us/app/quran-by-quran-com-%D9%82%D8%B1%D8%A2%D9%86/id1118663303 " isExternalLink /> } - href="https://legacy.quran.com" + title="QuranReflect.com" + icon={} + href="https://quranreflect.com/" isExternalLink /> } - href="https://previous.quran.com" + href="https://sunnah.com/" isExternalLink /> } - href="https://corpus.quran.com" + href="https://nuqayah.com/" isExternalLink /> } - href="https://quranreflect.com/" + title="Legacy.quran.com" + icon={} + href="https://legacy.quran.com" isExternalLink /> { - logTarteelLinkClick('navigation_menu_network'); - }} + title="Corpus.quran.com" + icon={} + href="https://corpus.quran.com" isExternalLink - title={t('tarteel.name')} - icon={} - href="https://download.tarteel.ai/" />
    ); diff --git a/src/components/Navbar/SearchDrawer/Footer/Footer.module.scss b/src/components/Navbar/SearchDrawer/Footer/Footer.module.scss index 4f815dc18b..8b51a5926b 100644 --- a/src/components/Navbar/SearchDrawer/Footer/Footer.module.scss +++ b/src/components/Navbar/SearchDrawer/Footer/Footer.module.scss @@ -1,8 +1,10 @@ +@use "src/styles/breakpoints"; + .container { - display: flex; - align-items: center; - justify-content: flex-end; - font-size: var(--font-size-xsmall-dangerous); + @include breakpoints.tablet { + padding-block-end: var(--spacing-mega); + } + padding-block-end: calc(4 * var(--spacing-mega)); } .betaContainer { diff --git a/src/components/Navbar/SearchDrawer/Footer/index.tsx b/src/components/Navbar/SearchDrawer/Footer/index.tsx index 0d8750b181..4d4964b0ca 100644 --- a/src/components/Navbar/SearchDrawer/Footer/index.tsx +++ b/src/components/Navbar/SearchDrawer/Footer/index.tsx @@ -2,18 +2,8 @@ import React from 'react'; import styles from './Footer.module.scss'; -import TarteelAttribution from '@/components/TarteelAttribution/TarteelAttribution'; -import Separator from '@/dls/Separator/Separator'; - const Footer: React.FC = () => { - return ( -
    - -
    - -
    -
    - ); + return
    ; }; export default Footer; diff --git a/src/components/Navbar/SearchDrawer/Header/Header.module.scss b/src/components/Navbar/SearchDrawer/Header/Header.module.scss index 57605d3a6a..99e5ca4d6d 100644 --- a/src/components/Navbar/SearchDrawer/Header/Header.module.scss +++ b/src/components/Navbar/SearchDrawer/Header/Header.module.scss @@ -34,3 +34,7 @@ max-height: var(--spacing-mega); margin-inline: calc(0.5 * var(--spacing-xxsmall)); } + +.form { + display: contents; +} diff --git a/src/components/Navbar/SearchDrawer/Header/index.tsx b/src/components/Navbar/SearchDrawer/Header/index.tsx index 5d5262827c..db3280538b 100644 --- a/src/components/Navbar/SearchDrawer/Header/index.tsx +++ b/src/components/Navbar/SearchDrawer/Header/index.tsx @@ -1,18 +1,17 @@ import React, { RefObject } from 'react'; import classNames from 'classnames'; +import { useRouter } from 'next/router'; import useTranslation from 'next-translate/useTranslation'; import DrawerSearchIcon from '../Buttons/DrawerSearchIcon'; import styles from './Header.module.scss'; -import TarteelVoiceSearchTrigger from '@/components/TarteelVoiceSearch/Trigger'; import Separator from '@/dls/Separator/Separator'; -import { logButtonClick } from '@/utils/eventLogger'; +import { getSearchQueryNavigationUrl } from '@/utils/navigation'; interface Props { - isVoiceFlowStarted: boolean; isSearching: boolean; searchQuery: string; onSearchQueryChange: (event: React.FormEvent) => void; @@ -21,7 +20,6 @@ interface Props { } const Header: React.FC = ({ - isVoiceFlowStarted, onSearchQueryChange, resetQueryAndResults, inputRef, @@ -29,52 +27,42 @@ const Header: React.FC = ({ searchQuery, }) => { const { t } = useTranslation('common'); + const router = useRouter(); - const onKeyboardReturnPressed = (e) => { + const onSubmit = (e: React.FormEvent) => { e.preventDefault(); - inputRef.current.blur(); + inputRef.current?.blur(); + if (searchQuery) { + router.push(getSearchQueryNavigationUrl(searchQuery)); + } }; return ( <> - {isVoiceFlowStarted ? ( - { - logButtonClick('search_drawer_voice_search_stop_flow'); - }} - /> - ) : ( - <> - -
    -
    - -
    - {searchQuery && ( - <> - - - - )} - { - logButtonClick('search_drawer_voice_search_start_flow'); - }} - /> -
    - - )} + +
    +
    + +
    + {searchQuery && ( + <> + + + + )} +
    ); }; diff --git a/src/components/Navbar/SearchDrawer/SearchDrawer.tsx b/src/components/Navbar/SearchDrawer/SearchDrawer.tsx index 196f628d08..53a5366b68 100644 --- a/src/components/Navbar/SearchDrawer/SearchDrawer.tsx +++ b/src/components/Navbar/SearchDrawer/SearchDrawer.tsx @@ -8,37 +8,29 @@ import { shallowEqual, useDispatch, useSelector } from 'react-redux'; import SearchDrawerHeader from './Header'; +import { getNewSearchResults } from '@/api'; import Drawer, { DrawerType } from '@/components/Navbar/Drawer'; import Spinner from '@/dls/Spinner/Spinner'; import useDebounce from '@/hooks/useDebounce'; import useFocus from '@/hooks/useFocusElement'; import { selectNavbar } from '@/redux/slices/navbar'; import { selectSelectedTranslations } from '@/redux/slices/QuranReader/translations'; -import { selectIsSearchDrawerVoiceFlowStarted } from '@/redux/slices/voiceSearch'; +import SearchService from '@/types/Search/SearchService'; import SearchQuerySource from '@/types/SearchQuerySource'; import { areArraysEqual } from '@/utils/array'; -import { logButtonClick } from '@/utils/eventLogger'; -import { addToSearchHistory, searchGetResults } from '@/utils/search'; +import { logButtonClick, logTextSearchQuery } from '@/utils/eventLogger'; +import { addToSearchHistory, getQuickSearchQuery } from '@/utils/search'; import { SearchResponse } from 'types/ApiResponses'; const SearchBodyContainer = dynamic(() => import('@/components/Search/SearchBodyContainer'), { ssr: false, loading: () => , }); -const VoiceSearchBodyContainer = dynamic( - () => import('@/components/TarteelVoiceSearch/BodyContainer'), - { - ssr: false, - loading: () => , - }, -); -const FIRST_PAGE_NUMBER = 1; -const PAGE_SIZE = 10; const DEBOUNCING_PERIOD_MS = 1000; const SearchDrawer: React.FC = () => { - const selectedTranslations = useSelector(selectSelectedTranslations, areArraysEqual); + const selectedTranslations = useSelector(selectSelectedTranslations, areArraysEqual) as string[]; const [focusInput, searchInputRef]: [() => void, RefObject] = useFocus(); const [searchQuery, setSearchQuery] = useState(''); const isOpen = useSelector(selectNavbar, shallowEqual).isSearchDrawerOpen; @@ -46,7 +38,6 @@ const SearchDrawer: React.FC = () => { const [isSearching, setIsSearching] = useState(false); const [hasError, setHasError] = useState(false); const [searchResult, setSearchResult] = useState(null); - const isVoiceSearchFlowStarted = useSelector(selectIsSearchDrawerVoiceFlowStarted, shallowEqual); // Debounce search query to avoid having to call the API on every type. The API will be called once the user stops typing. const debouncedSearchQuery = useDebounce(searchQuery, DEBOUNCING_PERIOD_MS); // once the drawer is open, focus the input field @@ -60,17 +51,21 @@ const SearchDrawer: React.FC = () => { // only when the search query has a value we call the API. if (debouncedSearchQuery) { addToSearchHistory(dispatch, debouncedSearchQuery, SearchQuerySource.SearchDrawer); - searchGetResults( - SearchQuerySource.SearchDrawer, - debouncedSearchQuery, - FIRST_PAGE_NUMBER, - PAGE_SIZE, - setIsSearching, - setHasError, - setSearchResult, - null, - selectedTranslations?.length && selectedTranslations.join(','), - ); + setIsSearching(true); + logTextSearchQuery(debouncedSearchQuery, SearchQuerySource.SearchDrawer); + getNewSearchResults(getQuickSearchQuery(debouncedSearchQuery, 10, selectedTranslations)) + .then((response) => { + setSearchResult({ + ...response, + service: SearchService.KALIMAT, + }); + }) + .catch(() => { + setHasError(true); + }) + .finally(() => { + setIsSearching(false); + }); } }, [debouncedSearchQuery, selectedTranslations, dispatch]); @@ -114,11 +109,9 @@ const SearchDrawer: React.FC = () => { return ( { >
    {isOpen && ( - <> - {isVoiceSearchFlowStarted ? ( - - ) : ( - searchInputRef?.current?.blur()} - onSearchKeywordClicked={onSearchKeywordClicked} - searchQuery={searchQuery} - searchResult={searchResult} - isSearching={isSearching} - hasError={hasError} - /> - )} - + )}
    diff --git a/src/components/QuestionAndAnswer/Answer/AnswerBody/AnswerBody.module.scss b/src/components/QuestionAndAnswer/Answer/AnswerBody/AnswerBody.module.scss index 390aec75cd..d94d83633e 100644 --- a/src/components/QuestionAndAnswer/Answer/AnswerBody/AnswerBody.module.scss +++ b/src/components/QuestionAndAnswer/Answer/AnswerBody/AnswerBody.module.scss @@ -29,3 +29,51 @@ align-items: center; gap: var(--spacing-xxsmall); } + +.shareOptions { + display: flex; + flex-direction: column; + align-items: center; + padding: var(--spacing-medium); + width: 100%; +} + +.shareOptionsButtons { + display: flex; + align-items: center; + gap: var(--spacing-medium); + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.shareOptionButton { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-xsmall); + cursor: pointer; + background: none; + border: none; + padding: 0; + + span { + font-size: var(--font-size-small); + color: var(--color-text-default); + } +} + +.socialIcon { + width: var(--spacing-xlarge-px); + height: var(--spacing-xlarge-px); +} + +.utilityIconWrapper { + width: var(--spacing-xlarge-px); + height: var(--spacing-xlarge-px); + background-color: var(--color-background-alternative); + border-radius: var(--border-radius-circle); + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/components/QuestionAndAnswer/Answer/AnswerBody/index.tsx b/src/components/QuestionAndAnswer/Answer/AnswerBody/index.tsx index b75439b3ed..6f71cfa5af 100644 --- a/src/components/QuestionAndAnswer/Answer/AnswerBody/index.tsx +++ b/src/components/QuestionAndAnswer/Answer/AnswerBody/index.tsx @@ -1,28 +1,49 @@ -import React from 'react'; +/* eslint-disable i18next/no-literal-string */ +import React, { useState } from 'react'; +import { MilkdownProvider } from '@milkdown/react'; import useTranslation from 'next-translate/useTranslation'; import styles from './AnswerBody.module.scss'; +import MarkdownEditor from '@/components/MarkdownEditor'; import Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button'; +import ShareButtons from '@/dls/ShareButtons'; import ShareIcon from '@/icons/share.svg'; import { Question } from '@/types/QuestionsAndAnswers/Question'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getQuestionNavigationUrl } from '@/utils/navigation'; +import { getBasePath } from '@/utils/url'; type Props = { question: Question; }; const AnswerBody: React.FC = ({ question }) => { + const [shouldShowShareOptions, setShouldShowShareOptions] = useState(false); const { t } = useTranslation('quran-reader'); + + const onShareButtonClick = () => { + logButtonClick('q_and_a_answer_share_button'); + setShouldShowShareOptions(true); + }; + + const shareURL = `${getBasePath()}${getQuestionNavigationUrl(question.id)}`; + const title = t('q-and-a.explore_answers'); + return ( <>

    {t('q-and-a.answer')}

    -
    {question?.answers[0]?.body}
    + + + {question?.summary && ( <>

    {t('q-and-a.summary')}

    -
    {question?.summary}
    + + + )} {question?.references && ( @@ -35,12 +56,19 @@ const AnswerBody: React.FC = ({ question }) => { )}
    -
    + {shouldShowShareOptions && ( + + )} ); }; diff --git a/src/components/QuestionAndAnswer/Pill/shared.module.scss b/src/components/QuestionAndAnswer/Pill/shared.module.scss index d119131b33..afc0b9e844 100644 --- a/src/components/QuestionAndAnswer/Pill/shared.module.scss +++ b/src/components/QuestionAndAnswer/Pill/shared.module.scss @@ -2,18 +2,8 @@ %clarification { font-weight: var(--font-weight-semibold) !important; - @include theme.light { - --background-color: #fff8e4; - --text-color: #7c6e21; - } - @include theme.dark { - --background-color: #fff8e4; - --text-color: #7c6e21; - } - @include theme.sepia { - --background-color: #f1d5b7; - --text-color: #7c6e21; - } + --background-color: var(--color-scholars-say-background); + --text-color: var(--color-scholars-say-text); } %explore_answers { diff --git a/src/components/QuranReader/ContextMenu.tsx b/src/components/QuranReader/ContextMenu.tsx index 052804439e..bfb23f795a 100644 --- a/src/components/QuranReader/ContextMenu.tsx +++ b/src/components/QuranReader/ContextMenu.tsx @@ -22,7 +22,7 @@ import { selectNotes } from '@/redux/slices/QuranReader/notes'; import { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker'; import { selectIsSidebarNavigationVisible, - setIsVisible, + setIsSidebarNavigationVisible, } from '@/redux/slices/QuranReader/sidebarNavigation'; import { Mushaf } from '@/types/QuranReader'; import { getChapterData, getChapterReadingProgress } from '@/utils/chapter'; @@ -97,9 +97,9 @@ const ContextMenu = () => { if (isSidebarNavigationVisible === 'auto') { // eslint-disable-next-line no-unneeded-ternary const shouldBeVisible = isMobile() ? true : false; - dispatch(setIsVisible(shouldBeVisible)); + dispatch(setIsSidebarNavigationVisible(shouldBeVisible)); } else { - dispatch(setIsVisible(!isSidebarNavigationVisible)); + dispatch(setIsSidebarNavigationVisible(!isSidebarNavigationVisible)); } }} > diff --git a/src/components/QuranReader/EndOfScrollingControls/index.tsx b/src/components/QuranReader/EndOfScrollingControls/index.tsx index eb7c709783..ca072107b6 100644 --- a/src/components/QuranReader/EndOfScrollingControls/index.tsx +++ b/src/components/QuranReader/EndOfScrollingControls/index.tsx @@ -15,6 +15,7 @@ import QuranReaderReadingStreak from './QuranReaderReadingStreak'; import RubControls from './RubControls'; import VerseControls from './VerseControls'; +import HomepageFundraisingBanner from '@/components/Fundraising/HomepageFundraisingBanner'; import { selectIsReadingByRevelationOrder } from '@/redux/slices/revelationOrder'; import { QuranReaderDataType } from '@/types/QuranReader'; import { VersesResponse } from 'types/ApiResponses'; @@ -38,6 +39,9 @@ const EndOfScrollingControls: React.FC = ({
    +
    + +
    {isReadingByRevelationOrder && quranReaderDataType === QuranReaderDataType.Chapter && ( void; setSelectedVerseNumber: (verseNumber: string) => void; + selectedContentType: ContentType; } const ReflectionBody: React.FC = ({ @@ -33,6 +39,7 @@ const ReflectionBody: React.FC = ({ data, scrollToTop, setSelectedVerseNumber, + selectedContentType, }) => { const { t, lang } = useTranslation('quran-reader'); const chaptersData = useContext(DataContext); @@ -47,27 +54,42 @@ const ReflectionBody: React.FC = ({ logButtonClick('reflection_next_verse'); scrollToTop(); const newVerseNumber = String(Number(selectedVerseNumber) + 1); - fakeNavigate( - getVerseReflectionNavigationUrl( - makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)), - ), - lang, - ); + const verseKey = makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)); + const navigationUrl = + selectedContentType === ContentType.REFLECTIONS + ? getVerseReflectionNavigationUrl(verseKey) + : getVerseLessonNavigationUrl(verseKey); + fakeNavigate(navigationUrl, lang); setSelectedVerseNumber(newVerseNumber); - }, [lang, scrollToTop, selectedChapterId, selectedVerseNumber, setSelectedVerseNumber]); + }, [ + lang, + scrollToTop, + selectedChapterId, + selectedVerseNumber, + setSelectedVerseNumber, + selectedContentType, + ]); const loadPrevVerse = useCallback(() => { const newVerseNumber = String(Number(selectedVerseNumber) - 1); logButtonClick('reflection_prev_verse'); scrollToTop(); setSelectedVerseNumber(newVerseNumber); - fakeNavigate( - getVerseReflectionNavigationUrl( - makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)), - ), - lang, - ); - }, [lang, scrollToTop, selectedChapterId, selectedVerseNumber, setSelectedVerseNumber]); + const verseKey = makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)); + const navigationUrl = + selectedContentType === ContentType.REFLECTIONS + ? getVerseReflectionNavigationUrl(verseKey) + : getVerseLessonNavigationUrl(verseKey); + fakeNavigate(navigationUrl, lang); + }, [ + lang, + scrollToTop, + selectedChapterId, + selectedVerseNumber, + setSelectedVerseNumber, + selectedContentType, + ]); + const filteredPosts = useMemo(() => { return data?.posts?.filter((reflection) => localeToReflectionLanguages(lang).includes(reflection.language), @@ -89,9 +111,9 @@ const ReflectionBody: React.FC = ({
    {filteredPosts?.length === 0 ? ( - + ) : ( - + )} {filteredPosts?.map((reflection) => ( void; setSelectedVerseNumber: (verseNumber: string) => void; + selectedContentType: ContentType; } const ReflectionSurahAndAyahSelection: React.FC = ({ @@ -21,28 +27,30 @@ const ReflectionSurahAndAyahSelection: React.FC = ({ selectedVerseNumber, setSelectedVerseNumber, setSelectedChapterId, + selectedContentType, }) => { const { lang } = useTranslation(); + + const getNavigationUrl = (verseKey: string) => { + return selectedContentType === ContentType.REFLECTIONS + ? getVerseReflectionNavigationUrl(verseKey) + : getVerseLessonNavigationUrl(verseKey); + }; + const onChapterIdChange = (newChapterId) => { logItemSelectionChange('reflection_chapter_id', newChapterId); setSelectedChapterId(newChapterId.toString()); const newVerseNumber = '1'; setSelectedVerseNumber(newVerseNumber); // reset verse number to 1 every time chapter changes - fakeNavigate( - getVerseReflectionNavigationUrl(makeVerseKey(newChapterId, Number(newVerseNumber))), - lang, - ); + const verseKey = makeVerseKey(newChapterId, Number(newVerseNumber)); + fakeNavigate(getNavigationUrl(verseKey), lang); }; const onVerseNumberChange = (newVerseNumber) => { logItemSelectionChange('reflection_verse_number', newVerseNumber); setSelectedVerseNumber(newVerseNumber.toString()); - fakeNavigate( - getVerseReflectionNavigationUrl( - makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)), - ), - lang, - ); + const verseKey = makeVerseKey(Number(selectedChapterId), Number(newVerseNumber)); + fakeNavigate(getNavigationUrl(verseKey), lang); }; return ( diff --git a/src/components/QuranReader/ReflectionView/ReflectionBodyContainer/index.tsx b/src/components/QuranReader/ReflectionView/ReflectionBodyContainer/index.tsx index d9456562f3..15516f340c 100644 --- a/src/components/QuranReader/ReflectionView/ReflectionBodyContainer/index.tsx +++ b/src/components/QuranReader/ReflectionView/ReflectionBodyContainer/index.tsx @@ -3,17 +3,30 @@ import { useCallback, useState } from 'react'; import dynamic from 'next/dynamic'; import useTranslation from 'next-translate/useTranslation'; +import styles from './ReflectionBodyContainer.module.scss'; + import DataFetcher from '@/components/DataFetcher'; import { REFLECTIONS_OBSERVER_ID } from '@/components/QuranReader/observer'; import TafsirSkeleton from '@/components/QuranReader/TafsirView/TafsirSkeleton'; +import NewLabel from '@/dls/Badge/NewLabel'; +import Tabs from '@/dls/Tabs/Tabs'; import useGlobalIntersectionObserverWithDelay from '@/hooks/useGlobalIntersectionObserverWithDelay'; import { isLoggedIn } from '@/utils/auth/login'; import { postReflectionViews } from '@/utils/auth/qf/api'; +import { logEvent } from '@/utils/eventLogger'; +import { + fakeNavigate, + getVerseLessonNavigationUrl, + getVerseReflectionNavigationUrl, +} from '@/utils/navigation'; import { makeAyahReflectionsUrl, postReflectionViews as postReflectionViewsToQuranReflect, + REFLECTION_POST_TYPE_ID, + LESSON_POST_TYPE_ID, } from '@/utils/quranReflect/apiPaths'; import AyahReflectionsResponse from 'types/QuranReflect/AyahReflectionsResponse'; +import ContentType from 'types/QuranReflect/ContentType'; const ReflectionSurahAndAyahSelection = dynamic(() => import('./ReflectionSurahAndAyahSelection'), { ssr: false, @@ -28,6 +41,7 @@ type ReflectionBodyProps = { initialVerseNumber: string; scrollToTop: () => void; render: (renderProps: { surahAndAyahSelection: JSX.Element; body: JSX.Element }) => JSX.Element; + initialContentType?: ContentType; }; const ReflectionBodyContainer = ({ @@ -35,10 +49,36 @@ const ReflectionBodyContainer = ({ initialChapterId, initialVerseNumber, scrollToTop, + initialContentType = ContentType.REFLECTIONS, }: ReflectionBodyProps) => { const [selectedChapterId, setSelectedChapterId] = useState(initialChapterId); const [selectedVerseNumber, setSelectedVerseNumber] = useState(initialVerseNumber); - const { lang } = useTranslation(); + const [selectedContentType, setSelectedContentType] = useState(initialContentType); + const { lang, t } = useTranslation(); + + const tabs = [ + { title: t('common:reflections'), value: ContentType.REFLECTIONS }, + { + title: ( +
    + {t('common:lessons')} + +
    + ), + value: ContentType.LESSONS, + }, + ]; + + const handleTabChange = (value: ContentType) => { + logEvent('reflection_view_tab_change', { tab: value }); + setSelectedContentType(value); + const verseKey = `${selectedChapterId}:${selectedVerseNumber}`; + const newUrl = + value === ContentType.REFLECTIONS + ? getVerseReflectionNavigationUrl(verseKey) + : getVerseLessonNavigationUrl(verseKey); + fakeNavigate(newUrl, lang); + }; /** * Handle when the reflection is viewed: @@ -72,21 +112,32 @@ const ReflectionBodyContainer = ({ selectedVerseNumber={selectedVerseNumber} setSelectedVerseNumber={setSelectedVerseNumber} scrollToTop={scrollToTop} + selectedContentType={selectedContentType} /> ), - [scrollToTop, selectedChapterId, selectedVerseNumber], + [scrollToTop, selectedChapterId, selectedVerseNumber, selectedContentType], ); const body = ( - + <> + {/* @ts-ignore */} + + + ); return render({ @@ -96,6 +147,7 @@ const ReflectionBodyContainer = ({ selectedVerseNumber={selectedVerseNumber} setSelectedChapterId={setSelectedChapterId} setSelectedVerseNumber={setSelectedVerseNumber} + selectedContentType={selectedContentType} /> ), body, diff --git a/src/components/QuranReader/ReflectionView/ReflectionDisclaimerMessage.tsx b/src/components/QuranReader/ReflectionView/ReflectionDisclaimerMessage.tsx index be7db18da6..db61d42dd6 100644 --- a/src/components/QuranReader/ReflectionView/ReflectionDisclaimerMessage.tsx +++ b/src/components/QuranReader/ReflectionView/ReflectionDisclaimerMessage.tsx @@ -2,11 +2,19 @@ import useTranslation from 'next-translate/useTranslation'; import styles from './ReflectionDisclaimerMessage.module.scss'; -const ReflectionDisclaimerMessage = () => { +import ContentType from 'types/QuranReflect/ContentType'; + +interface Props { + contentType?: ContentType; +} + +const ReflectionDisclaimerMessage = ({ contentType }: Props) => { const { t } = useTranslation(); return (
    - {t('quran-reader:reflection-disclaimer')} + {contentType === ContentType.REFLECTIONS + ? t('quran-reader:reflection-disclaimer') + : t('quran-reader:lessons-disclaimer')}
    ); }; diff --git a/src/components/QuranReader/ReflectionView/ReflectionNotAvailableMessage.tsx b/src/components/QuranReader/ReflectionView/ReflectionNotAvailableMessage.tsx index b9170d68af..e43e53815b 100644 --- a/src/components/QuranReader/ReflectionView/ReflectionNotAvailableMessage.tsx +++ b/src/components/QuranReader/ReflectionView/ReflectionNotAvailableMessage.tsx @@ -2,13 +2,21 @@ import useTranslation from 'next-translate/useTranslation'; import styles from './ReflectionDisclaimerMessage.module.scss'; -const ReflectionNotAvailableMessage = () => { +import ContentType from 'types/QuranReflect/ContentType'; + +interface Props { + contentType?: ContentType; +} + +const ReflectionNotAvailableMessage = ({ contentType = ContentType.REFLECTIONS }: Props) => { const { t } = useTranslation(); - return ( -
    - {t('quran-reader:reflection-not-available')} -
    - ); + + const message = + contentType === ContentType.REFLECTIONS + ? t('quran-reader:reflection-not-available') + : t('quran-reader:lessons-not-available'); + + return
    {message}
    ; }; export default ReflectionNotAvailableMessage; diff --git a/src/components/QuranReader/SidebarNavigation/HizbSelection.tsx b/src/components/QuranReader/SidebarNavigation/HizbSelection.tsx deleted file mode 100644 index ad67d357bc..0000000000 --- a/src/components/QuranReader/SidebarNavigation/HizbSelection.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import useTranslation from 'next-translate/useTranslation'; -import { useSelector } from 'react-redux'; - -import ScrollableSelection from './ScrollableSelection'; - -import { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker'; -import { getHizbIds } from '@/utils/hizb'; -import { getHizbNavigationUrl } from '@/utils/navigation'; - -const HizbSelection = () => { - const { t, lang } = useTranslation('common'); - const hizbIds = getHizbIds(lang); - const lastReadVerseKey = useSelector(selectLastReadVerseKey); - - return ( - `${t('hizb')} ${hizb.label}`} - selectedItem={Number(lastReadVerseKey.hizb)} - /> - ); -}; -export default HizbSelection; diff --git a/src/components/QuranReader/SidebarNavigation/JuzSelection.tsx b/src/components/QuranReader/SidebarNavigation/JuzSelection.tsx index 21c83b03ea..583abd6ae1 100644 --- a/src/components/QuranReader/SidebarNavigation/JuzSelection.tsx +++ b/src/components/QuranReader/SidebarNavigation/JuzSelection.tsx @@ -9,7 +9,11 @@ import { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracke import { getJuzIds, getJuzNumberByHizb } from '@/utils/juz'; import { getJuzNavigationUrl } from '@/utils/navigation'; -const JuzSelection = () => { +type Props = { + onAfterNavigationItemRouted?: () => void; +}; + +const JuzSelection: React.FC = ({ onAfterNavigationItemRouted }) => { const { t, lang } = useTranslation('common'); const juzIds = getJuzIds(lang); const lastReadVerseKey = useSelector(selectLastReadVerseKey); @@ -25,6 +29,7 @@ const JuzSelection = () => { searchPlaceholder={t('sidebar.search-juz')} renderItem={(juz) => `${t('juz')} ${juz.label}`} selectedItem={selectedJuz} + onAfterNavigationItemRouted={onAfterNavigationItemRouted} /> ); }; diff --git a/src/components/QuranReader/SidebarNavigation/PageSelection.tsx b/src/components/QuranReader/SidebarNavigation/PageSelection.tsx index 2ece7faaa4..f1c605ed89 100644 --- a/src/components/QuranReader/SidebarNavigation/PageSelection.tsx +++ b/src/components/QuranReader/SidebarNavigation/PageSelection.tsx @@ -8,7 +8,11 @@ import { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles'; import { getPageNavigationUrl } from '@/utils/navigation'; import { getPageIdsByMushaf } from '@/utils/page'; -const PageSelection = () => { +type Props = { + onAfterNavigationItemRouted?: () => void; +}; + +const PageSelection: React.FC = ({ onAfterNavigationItemRouted }) => { const { t, lang } = useTranslation('common'); const { quranFont, mushafLines } = useSelector(selectQuranReaderStyles); const pageIds = getPageIdsByMushaf(lang, quranFont, mushafLines); @@ -22,6 +26,7 @@ const PageSelection = () => { renderItem={(page) => `${t('page')} ${page.label}`} isJuz={false} selectedItem={Number(lastReadPage)} + onAfterNavigationItemRouted={onAfterNavigationItemRouted} /> ); }; diff --git a/src/components/QuranReader/SidebarNavigation/ScrollableSelection.tsx b/src/components/QuranReader/SidebarNavigation/ScrollableSelection.tsx index 0ff82bb868..49f3153171 100644 --- a/src/components/QuranReader/SidebarNavigation/ScrollableSelection.tsx +++ b/src/components/QuranReader/SidebarNavigation/ScrollableSelection.tsx @@ -17,6 +17,7 @@ const ScrollableSelection = ({ getHref, isJuz = true, selectedItem, + onAfterNavigationItemRouted, }) => { const [searchQuery, setSearchQuery] = useState(''); const router = useRouter(); @@ -50,16 +51,29 @@ const ScrollableSelection = ({ scroll(); }, [selectedItem, scroll]); + const navigateAndHandleAfterNavigation = (href: string) => { + router.push(href).then(() => { + if (onAfterNavigationItemRouted) { + onAfterNavigationItemRouted(); + } + }); + }; + // handle when user press `Enter` in input box const handleInputSubmit = (e) => { e.preventDefault(); const firstFilteredItem = filteredItems[0]; if (filteredItems) { const href = getHref(firstFilteredItem.value); - router.push(href); + navigateAndHandleAfterNavigation(href); } }; + const handleItemClick = (e: React.MouseEvent, href: string) => { + e.preventDefault(); + navigateAndHandleAfterNavigation(href); + }; + return (
    @@ -72,19 +86,27 @@ const ScrollableSelection = ({
    - {filteredItems.map((item) => ( - -
    { + const href = getHref(item.value); + return ( + handleItemClick(e, href)} > - {renderItem(item)} -
    - - ))} +
    + {renderItem(item)} +
    + + ); + })}
    diff --git a/src/components/QuranReader/SidebarNavigation/SidebarNavigation.module.scss b/src/components/QuranReader/SidebarNavigation/SidebarNavigation.module.scss index f0bb2eb874..25b38507a4 100644 --- a/src/components/QuranReader/SidebarNavigation/SidebarNavigation.module.scss +++ b/src/components/QuranReader/SidebarNavigation/SidebarNavigation.module.scss @@ -5,9 +5,17 @@ $sections-menu-height: 2.25rem; $progress-bar-height: var(--spacing-micro); -$top-menu-height: calc($sections-menu-height + var(--navbar-container-height) + $progress-bar-height); +$navbar-height: var(--navbar-container-height); + +// Homepage heights (without sections menu and without progress bar) +$top-menu-height-home: $navbar-height; +$context-menu-height-home: 0; + +// Non-homepage heights (with sections menu and progress bar) +$top-menu-height: calc($sections-menu-height + $navbar-height + $progress-bar-height); $context-menu-height: calc($sections-menu-height + $progress-bar-height); -$isNavbarVisible : var(--isNavbarVisible); + +$isNavbarVisible: var(--isNavbarVisible); @mixin sidebarVisible { z-index: var(--z-index-sticky); @@ -15,21 +23,39 @@ $isNavbarVisible : var(--isNavbarVisible); } @mixin sidebarInvisibleExpanded { - transform: translateX(-100%) translateY(calc($top-menu-height)); - [dir="rtl"] & { - transform: translateX(100%) translateY(calc($top-menu-height)); + &[data-is-homepage="true"] { + transform: translateX(-100%) translateY($top-menu-height-home); + [dir="rtl"] & { + transform: translateX(100%) translateY($top-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateX(-100%) translateY($top-menu-height); + [dir="rtl"] & { + transform: translateX(100%) translateY($top-menu-height); + } } } @mixin sidebarInvisibleCollapsed { - transform: translateX(-100%) translateY(calc($context-menu-height)); - [dir="rtl"] & { - transform: translateX(100%) translateY(calc($context-menu-height)); + &[data-is-homepage="true"] { + transform: translateX(-100%) translateY($context-menu-height-home); + [dir="rtl"] & { + transform: translateX(100%) translateY($context-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateX(-100%) translateY($context-menu-height); + [dir="rtl"] & { + transform: translateX(100%) translateY($context-menu-height); + } } } .container { - --sidebar-size: calc(100% - (2 * var(--spacing-mega))); + --sidebar-size: calc(100% - calc(1.5 * var(--spacing-mega))); @include breakpoints.tablet { --sidebar-size: calc(10 * var(--spacing-mega)); } @@ -46,7 +72,9 @@ $isNavbarVisible : var(--isNavbarVisible); border-inline-end: 1px solid var(--color-borders-hairline); width: var(--sidebar-size); padding-inline: var(--spacing-large); - transition: transform var(--transition-regular), height var(--transition-regular); + transition: + transform var(--transition-regular), + height var(--transition-regular); display: flex; flex-direction: column; overflow-y: hidden; @@ -62,23 +90,56 @@ $isNavbarVisible : var(--isNavbarVisible); .visibleContainer { @include sidebarVisible(); - [dir="rtl"] & { - transform: translateX(0%) translateY(calc($top-menu-height)); + + &[data-is-homepage="true"] { + transform: translateY($top-menu-height-home); + [dir="rtl"] & { + transform: translateY($top-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateY($top-menu-height); + [dir="rtl"] & { + transform: translateY($top-menu-height); + } } } .visibleContainerCollapsed { @include sidebarVisible(); - [dir="rtl"] & { - transform: translateX(0%) translateY(calc($context-menu-height)); + + &[data-is-homepage="true"] { + transform: translateY($context-menu-height-home); + [dir="rtl"] & { + transform: translateY($context-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateY($context-menu-height); + [dir="rtl"] & { + transform: translateY($context-menu-height); + } } } .containerAuto { @include breakpoints.tablet { @include sidebarVisible(); - [dir="rtl"] & { - transform: translateX(0%) translateY(calc($top-menu-height)); + + &[data-is-homepage="true"] { + transform: translateY($top-menu-height-home); + [dir="rtl"] & { + transform: translateY($top-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateY($top-menu-height); + [dir="rtl"] & { + transform: translateY($top-menu-height); + } } } } @@ -86,8 +147,19 @@ $isNavbarVisible : var(--isNavbarVisible); .containerAutoCollapsed { @include breakpoints.tablet { @include sidebarVisible(); - [dir="rtl"] & { - transform: translateX(0%) translateY(calc($context-menu-height)); + + &[data-is-homepage="true"] { + transform: translateY($context-menu-height-home); + [dir="rtl"] & { + transform: translateY($context-menu-height-home); + } + } + + &[data-is-homepage="false"] { + transform: translateY($context-menu-height); + [dir="rtl"] & { + transform: translateY($context-menu-height); + } } } } @@ -111,9 +183,6 @@ $isNavbarVisible : var(--isNavbarVisible); .surahBodyContainer { display: flex; flex: 1; - & > .verseListContainer { - margin-inline-start: var(--spacing-xsmall); - } } .scrollableSectionContainer { @@ -157,8 +226,6 @@ $isNavbarVisible : var(--isNavbarVisible); flex-direction: column; } .verseListContainer { - padding-inline-start: var(--spacing-xsmall); - border-inline-start: 1px solid var(--color-borders-hairline); flex: 1; display: flex; flex-direction: column; @@ -180,15 +247,27 @@ $isNavbarVisible : var(--isNavbarVisible); } .spaceOnTop { - transform: translateY($top-menu-height); - height: calc(100vh - $top-menu-height); + &[data-is-homepage="true"] { + transform: translateY($top-menu-height-home); + height: calc(100vh - $top-menu-height-home); + } + &[data-is-homepage="false"] { + transform: translateY($top-menu-height); + height: calc(100vh - $top-menu-height); + } } .spaceOnTopCollapsed { - transform: translateY($context-menu-height); - height: calc(100vh - $context-menu-height); + &[data-is-homepage="true"] { + transform: translateY($top-menu-height-home); + height: 100vh; + } + &[data-is-homepage="false"] { + transform: translateY($context-menu-height); + height: calc(100vh - $context-menu-height); + } } .chapterNumber { diff --git a/src/components/QuranReader/SidebarNavigation/SidebarNavigation.tsx b/src/components/QuranReader/SidebarNavigation/SidebarNavigation.tsx index 6b24384c43..f94e8ae402 100644 --- a/src/components/QuranReader/SidebarNavigation/SidebarNavigation.tsx +++ b/src/components/QuranReader/SidebarNavigation/SidebarNavigation.tsx @@ -2,6 +2,7 @@ import { useRef } from 'react'; import classNames from 'classnames'; +import { useRouter } from 'next/router'; import useTranslation from 'next-translate/useTranslation'; import { shallowEqual, useDispatch, useSelector } from 'react-redux'; @@ -22,13 +23,15 @@ import { selectIsSidebarNavigationVisible, selectNavigationItem, selectSelectedNavigationItem, - setIsVisible, + setIsSidebarNavigationVisible, } from '@/redux/slices/QuranReader/sidebarNavigation'; import { selectIsReadingByRevelationOrder } from '@/redux/slices/revelationOrder'; import { logButtonClick, logEvent, logValueChange } from '@/utils/eventLogger'; import { isMobile } from '@/utils/responsive'; const SidebarNavigation = () => { + const router = useRouter(); + const isHomePage = router.pathname === '/'; const isSidebarVisible = useSelector(selectIsSidebarNavigationVisible); const { isVisible: isNavbarVisible } = useSelector(selectNavbar, shallowEqual); const selectedNavigationItem = useSelector(selectSelectedNavigationItem); @@ -42,7 +45,7 @@ const SidebarNavigation = () => { sidebarRef, () => { logEvent('sidebar_navigation_close_outside_click'); - dispatch(setIsVisible(false)); + dispatch(setIsSidebarNavigationVisible(false)); }, isSidebarVisible && isMobile(), ); @@ -52,14 +55,14 @@ const SidebarNavigation = () => { name: t('surah'), value: NavigationItem.Surah, }, + { + name: t('verse'), + value: NavigationItem.Verse, + }, { name: t('juz'), value: NavigationItem.Juz, }, - // { - // name: t('hizb'), - // value: NavigationItem.Hizb, - // }, { name: t('page'), value: NavigationItem.Page, @@ -72,6 +75,7 @@ const SidebarNavigation = () => { return (
    { variant={ButtonVariant.Ghost} onClick={() => { logButtonClick('sidebar_navigation_close'); - dispatch(setIsVisible(false)); + dispatch(setIsSidebarNavigationVisible(false)); }} ariaLabel={t('aria.sidebar-nav-close')} > @@ -134,7 +138,7 @@ const SidebarNavigation = () => { variant={ButtonVariant.Ghost} onClick={() => { logButtonClick('sidebar_navigation_close'); - dispatch(setIsVisible(false)); + dispatch(setIsSidebarNavigationVisible(false)); }} ariaLabel={t('aria.sidebar-nav-close')} > diff --git a/src/components/QuranReader/SidebarNavigation/SidebarNavigationSelections.tsx b/src/components/QuranReader/SidebarNavigation/SidebarNavigationSelections.tsx index 2efeecb70f..69363aa9ec 100644 --- a/src/components/QuranReader/SidebarNavigation/SidebarNavigationSelections.tsx +++ b/src/components/QuranReader/SidebarNavigation/SidebarNavigationSelections.tsx @@ -1,13 +1,16 @@ import React from 'react'; import dynamic from 'next/dynamic'; +import { useDispatch } from 'react-redux'; import SidebarSelectionSkeleton from './SidebarSelectionSkeleton'; import { IsSidebarNavigationVisible, NavigationItem, + setIsSidebarNavigationVisible, } from '@/redux/slices/QuranReader/sidebarNavigation'; +import { isMobile } from '@/utils/responsive'; const PageSelection = dynamic(() => import('./PageSelection'), { loading: SidebarSelectionSkeleton, @@ -18,9 +21,9 @@ const SurahSelection = dynamic(() => import('./SurahSelection'), { const JuzSelection = dynamic(() => import('./JuzSelection'), { loading: SidebarSelectionSkeleton, }); -// const HizbSelection = dynamic(() => import('./HizbSelection'), { -// loading: SidebarSelectionSkeleton, -// }); +const VerseSelection = dynamic(() => import('./VerseSelection'), { + loading: SidebarSelectionSkeleton, +}); type Props = { isVisible: IsSidebarNavigationVisible; @@ -28,14 +31,29 @@ type Props = { }; const SidebarNavigationSelections: React.FC = ({ isVisible, selectedNavigationItem }) => { + const dispatch = useDispatch(); // we skip requesting any selection list if the drawer is not open. if (!isVisible) return <>; - if (selectedNavigationItem === NavigationItem.Surah) return ; - if (selectedNavigationItem === NavigationItem.Juz) return ; - // if (selectedNavigationItem === NavigationItem.Hizb) return ; - - return ; + const onAfterNavigationItemRouted = () => { + const isDeviceMobile = isMobile(); + // close the sidebar if the device is mobile after navigation + if (isDeviceMobile) { + dispatch({ type: setIsSidebarNavigationVisible.type, payload: false }); + } + }; + + if (selectedNavigationItem === NavigationItem.Surah) { + return ; + } + if (selectedNavigationItem === NavigationItem.Juz) { + return ; + } + if (selectedNavigationItem === NavigationItem.Verse) { + return ; + } + + return ; }; export default SidebarNavigationSelections; diff --git a/src/components/QuranReader/SidebarNavigation/SurahList.tsx b/src/components/QuranReader/SidebarNavigation/SurahList.tsx index 71dbd29f40..5c92ab2e67 100644 --- a/src/components/QuranReader/SidebarNavigation/SurahList.tsx +++ b/src/components/QuranReader/SidebarNavigation/SurahList.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { useContext, useEffect, useMemo, useState } from 'react'; import classNames from 'classnames'; @@ -40,7 +41,19 @@ const filterSurah = (surahs: Chapter[], searchQuery: string) => { return filteredSurah as Chapter[]; }; -const SurahList = () => { +type Props = { + onAfterNavigationItemRouted?: () => void; + customChapterSelectHandler?: (chapterId: string) => void; + shouldDisableNavigation?: boolean; + selectedChapterId?: string; +}; + +const SurahList: React.FC = ({ + onAfterNavigationItemRouted, + customChapterSelectHandler, + shouldDisableNavigation = false, + selectedChapterId: externalSelectedChapterId, +}) => { const { t, lang } = useTranslation('common'); const lastReadVerseKey = useSelector(selectLastReadVerseKey); const isReadingByRevelationOrder = useSelector(selectIsReadingByRevelationOrder); @@ -50,16 +63,22 @@ const SurahList = () => { const chapterIds = useChapterIdsByUrlPath(lang); const urlChapterId = chapterIds && chapterIds.length > 0 ? chapterIds[0] : null; - const [currentChapterId, setCurrentChapterId] = useState(urlChapterId); + // Use external selectedChapterId if provided, otherwise use internal state + const [internalCurrentChapterId, setInternalCurrentChapterId] = useState(urlChapterId); + const currentChapterId = externalSelectedChapterId || internalCurrentChapterId; useEffect(() => { - setCurrentChapterId(lastReadVerseKey.chapterId); - }, [lastReadVerseKey]); + if (!externalSelectedChapterId) { + setInternalCurrentChapterId(lastReadVerseKey.chapterId); + } + }, [lastReadVerseKey, externalSelectedChapterId]); useEffect(() => { - // when the user navigates to a new chapter, the current chapter id - setCurrentChapterId(urlChapterId); - }, [urlChapterId]); + // when the user navigates to a new chapter, update the current chapter id + if (!externalSelectedChapterId) { + setInternalCurrentChapterId(urlChapterId); + } + }, [urlChapterId, externalSelectedChapterId]); const [searchQuery, setSearchQuery] = useState(''); @@ -99,15 +118,37 @@ const SurahList = () => { scrollTo(); }, [currentChapterId, scrollTo]); + const navigateAndHandleAfterNavigation = (href: string) => { + router.push(href).then(() => { + if (onAfterNavigationItemRouted) { + onAfterNavigationItemRouted(); + } + }); + }; + // Handle when user press `Enter` in input box const handleSurahInputSubmit = (e) => { e.preventDefault(); const firstFilteredChapter = filteredChapters[0]; if (firstFilteredChapter) { - router.push(getSurahNavigationUrl(firstFilteredChapter.id)); + const href = getSurahNavigationUrl(firstFilteredChapter.id); + navigateAndHandleAfterNavigation(href); } }; + const handleChapterClick = (e: React.MouseEvent, href: string, chapterId: string) => { + e.preventDefault(); + + // If we have a custom handler and navigation is disabled, use the custom handler + if (customChapterSelectHandler && shouldDisableNavigation) { + customChapterSelectHandler(chapterId); + return; + } + + // Otherwise use the default navigation behavior + navigateAndHandleAfterNavigation(href); + }; + return (
    @@ -120,19 +161,27 @@ const SurahList = () => {
    - {filteredChapters.map((chapter) => ( - -
    { + const href = getSurahNavigationUrl(chapter.id); + return ( + handleChapterClick(e, href, chapter.id.toString())} > - {chapter.localizedId} - {chapter.transliteratedName} -
    - - ))} +
    + {chapter.localizedId} + {chapter.transliteratedName} +
    + + ); + })}
    diff --git a/src/components/QuranReader/SidebarNavigation/SurahSelection.tsx b/src/components/QuranReader/SidebarNavigation/SurahSelection.tsx index be19040b8f..6a6f49d2f9 100644 --- a/src/components/QuranReader/SidebarNavigation/SurahSelection.tsx +++ b/src/components/QuranReader/SidebarNavigation/SurahSelection.tsx @@ -1,12 +1,14 @@ import styles from './SidebarNavigation.module.scss'; import SurahList from './SurahList'; -import VerseList from './VerseList'; -const SurahSelection: React.FC = () => { +type Props = { + onAfterNavigationItemRouted?: () => void; +}; + +const SurahSelection: React.FC = ({ onAfterNavigationItemRouted }) => { return (
    - - +
    ); }; diff --git a/src/components/QuranReader/SidebarNavigation/VerseList.tsx b/src/components/QuranReader/SidebarNavigation/VerseList.tsx index a3598bebb0..a530652f4e 100644 --- a/src/components/QuranReader/SidebarNavigation/VerseList.tsx +++ b/src/components/QuranReader/SidebarNavigation/VerseList.tsx @@ -10,13 +10,18 @@ import VerseListItem from './VerseListItem'; import useChapterIdsByUrlPath from '@/hooks/useChapterId'; import { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker'; import SearchQuerySource from '@/types/SearchQuerySource'; -import { logEmptySearchResults, logTextSearchQuery } from '@/utils/eventLogger'; +import { logButtonClick, logEmptySearchResults, logTextSearchQuery } from '@/utils/eventLogger'; import { toLocalizedNumber } from '@/utils/locale'; import { getChapterWithStartingVerseUrl } from '@/utils/navigation'; import { generateChapterVersesKeys, getVerseNumberFromKey } from '@/utils/verse'; import DataContext from 'src/contexts/DataContext'; -const VerseList = () => { +type Props = { + onAfterNavigationItemRouted?: () => void; + selectedChapterId?: string; +}; + +const VerseList: React.FC = ({ onAfterNavigationItemRouted, selectedChapterId }) => { const [searchQuery, setSearchQuery] = useState(''); const { t, lang } = useTranslation('common'); const lastReadVerseKey = useSelector(selectLastReadVerseKey); @@ -26,17 +31,30 @@ const VerseList = () => { const chapterIds = useChapterIdsByUrlPath(lang); const urlChapterId = chapterIds && chapterIds.length > 0 ? chapterIds[0] : null; - const [currentChapterId, setCurrentChapterId] = useState(urlChapterId); + // Use the provided selectedChapterId if available, otherwise use URL or fallback logic + const [currentChapterId, setCurrentChapterId] = useState( + selectedChapterId || urlChapterId || '1', + ); useEffect(() => { - setCurrentChapterId(lastReadVerseKey.chapterId); - }, [lastReadVerseKey]); + // If selectedChapterId is provided externally, use it + if (selectedChapterId) { + setCurrentChapterId(selectedChapterId); + } else if (lastReadVerseKey.chapterId) { + setCurrentChapterId(lastReadVerseKey.chapterId); + } else if (!currentChapterId) { + // If no chapter is selected, default to chapter 1 + setCurrentChapterId('1'); + } + }, [lastReadVerseKey, currentChapterId, selectedChapterId]); useEffect(() => { // when the user navigates to a new chapter, reset the search query, and update the current chapter id setSearchQuery(''); - setCurrentChapterId(urlChapterId); - }, [urlChapterId]); + if (!selectedChapterId) { + setCurrentChapterId(urlChapterId || currentChapterId || '1'); + } + }, [urlChapterId, currentChapterId, selectedChapterId]); const verseKeys = useMemo( () => (currentChapterId ? generateChapterVersesKeys(chaptersData, currentChapterId) : []), @@ -63,32 +81,64 @@ const VerseList = () => { } }, [searchQuery, filteredVerseKeys]); + const navigateAndHandleAfterNavigation = (href: string) => { + router + .push(href, undefined, { + shallow: false, // Change to false to force a full page reload + }) + .then(() => { + if (onAfterNavigationItemRouted) { + onAfterNavigationItemRouted(); + } + }) + .catch(() => { + // As a fallback, we can use window.location + window.location.href = href; + }); + }; + // Handle when user press `Enter` in input box const handleVerseInputSubmit = (e) => { e.preventDefault(); const firstFilteredVerseKey = filteredVerseKeys[0]; if (firstFilteredVerseKey) { - router.push(getChapterWithStartingVerseUrl(firstFilteredVerseKey), undefined, { - shallow: true, // https://nextjs.org/docs/routing/shallow-routing - }); + const href = getChapterWithStartingVerseUrl(firstFilteredVerseKey); + navigateAndHandleAfterNavigation(href); } }; + const handleVerseClick = (e: React.MouseEvent, verseKey: string) => { + e.preventDefault(); + const href = getChapterWithStartingVerseUrl(verseKey); + navigateAndHandleAfterNavigation(href); + logButtonClick(`navigation_list_verse`, { + verseKey, + }); + }; + + const onSearchQueryChange = (e) => { + setSearchQuery(e.target.value); + }; + return (
    setSearchQuery(e.target.value)} + onChange={onSearchQueryChange} className={styles.searchInput} placeholder={t('verse')} />
    - {filteredVerseKeys.map((verseKey) => { - return ; - })} + {filteredVerseKeys.map((verseKey) => ( + handleVerseClick(e, verseKey)} + /> + ))}
    diff --git a/src/components/QuranReader/SidebarNavigation/VerseListItem.tsx b/src/components/QuranReader/SidebarNavigation/VerseListItem.tsx index f5e1c53197..629a2d1b78 100644 --- a/src/components/QuranReader/SidebarNavigation/VerseListItem.tsx +++ b/src/components/QuranReader/SidebarNavigation/VerseListItem.tsx @@ -13,10 +13,12 @@ import { toLocalizedNumber } from '@/utils/locale'; import { getChapterWithStartingVerseUrl } from '@/utils/navigation'; import { getVerseNumberFromKey } from '@/utils/verse'; -type VerseListItemProps = { +interface VerseListItemProps { verseKey: string; -}; -const VerseListItem = React.memo(({ verseKey }: VerseListItemProps) => { + onVerseClick?: (e: React.MouseEvent) => void; +} + +const VerseListItem: React.FC = ({ verseKey, onVerseClick }) => { const { lang } = useTranslation(); const isVerseKeySelected = useSelector(selectIsVerseKeySelected(verseKey)); @@ -35,6 +37,7 @@ const VerseListItem = React.memo(({ verseKey }: VerseListItemProps) => { key={verseKey} isShallow shouldPrefetch={false} + onClick={onVerseClick} >
    {
    ); -}); +}; export default VerseListItem; diff --git a/src/components/QuranReader/SidebarNavigation/VerseSelection.tsx b/src/components/QuranReader/SidebarNavigation/VerseSelection.tsx new file mode 100644 index 0000000000..7fd0d2e343 --- /dev/null +++ b/src/components/QuranReader/SidebarNavigation/VerseSelection.tsx @@ -0,0 +1,56 @@ +import { useState, useEffect } from 'react'; + +import useTranslation from 'next-translate/useTranslation'; +import { useSelector } from 'react-redux'; + +import styles from './SidebarNavigation.module.scss'; +import SurahList from './SurahList'; +import VerseList from './VerseList'; + +import useChapterIdsByUrlPath from '@/hooks/useChapterId'; +import { selectLastReadVerseKey } from '@/redux/slices/QuranReader/readingTracker'; + +type Props = { + onAfterNavigationItemRouted?: () => void; +}; + +const VerseSelection: React.FC = ({ onAfterNavigationItemRouted }) => { + const { lang } = useTranslation('common'); + const chapterIds = useChapterIdsByUrlPath(lang); + const urlChapterId = chapterIds && chapterIds.length > 0 ? chapterIds[0] : null; + const lastReadVerseKey = useSelector(selectLastReadVerseKey); + + // Default to the chapter from URL or last read chapter or chapter 1 + const [selectedChapterId, setSelectedChapterId] = useState( + urlChapterId || lastReadVerseKey.chapterId || '1', + ); + + useEffect(() => { + // Update selected chapter when URL changes + if (urlChapterId) { + setSelectedChapterId(urlChapterId); + } + }, [urlChapterId]); + + // Custom handler for chapter selection that doesn't navigate immediately + const handleChapterSelect = (chapterId: string) => { + setSelectedChapterId(chapterId); + }; + + return ( +
    + + +
    + ); +}; + +export default VerseSelection; diff --git a/src/components/QuranReader/TajweedBar/TajweedBar.tsx b/src/components/QuranReader/TajweedBar/TajweedBar.tsx index 46a4005028..666637e7a6 100644 --- a/src/components/QuranReader/TajweedBar/TajweedBar.tsx +++ b/src/components/QuranReader/TajweedBar/TajweedBar.tsx @@ -6,7 +6,6 @@ import { shallowEqual, useSelector } from 'react-redux'; import styles from './TajweedBar.module.scss'; -import NewLabel from '@/dls/Badge/NewLabel'; import useThemeDetector from '@/hooks/useThemeDetector'; import ChevronDownIcon from '@/icons/chevron-down.svg'; import { selectContextMenu } from '@/redux/slices/QuranReader/contextMenu'; @@ -81,7 +80,6 @@ const TajweedColors = () => { tabIndex={0} >

    {t('tajweed-colors')}

    -
    - ); diff --git a/src/components/Reciter/QuranReciterListHero.module.scss b/src/components/Reciter/QuranReciterListHero.module.scss index 992bf39770..c710512ba1 100644 --- a/src/components/Reciter/QuranReciterListHero.module.scss +++ b/src/components/Reciter/QuranReciterListHero.module.scss @@ -24,7 +24,7 @@ $fallbackColor: #22a5ad; z-index: -1; inset: 0; background-color: $fallbackColor; - background-image: url("/images/background.jpg"); + background-image: url("/images/background.png"); background-size: cover; @include theme.dark { filter: saturate(0.1) brightness(0.3) contrast(1.1); diff --git a/src/components/CommandBar/CommandsList/CommandControl.tsx b/src/components/Search/CommandBar/CommandsList/CommandControl.tsx similarity index 88% rename from src/components/CommandBar/CommandsList/CommandControl.tsx rename to src/components/Search/CommandBar/CommandsList/CommandControl.tsx index a429726a0c..7d70e6bd39 100644 --- a/src/components/CommandBar/CommandsList/CommandControl.tsx +++ b/src/components/Search/CommandBar/CommandsList/CommandControl.tsx @@ -2,7 +2,6 @@ import React, { MouseEvent } from 'react'; import Button, { ButtonSize, ButtonVariant } from '@/dls/Button/Button'; import CloseIcon from '@/icons/close.svg'; -// import KeyboardInput from '@/dls/KeyboardInput'; interface Props { isClearable: boolean; @@ -29,7 +28,6 @@ const CommandControl: React.FC = ({ ); } if (isSelected) { - // return ; return null; } return null; diff --git a/src/components/CommandBar/CommandsList/CommandList.module.scss b/src/components/Search/CommandBar/CommandsList/CommandList.module.scss similarity index 81% rename from src/components/CommandBar/CommandsList/CommandList.module.scss rename to src/components/Search/CommandBar/CommandsList/CommandList.module.scss index 80a2a81327..9f7197020c 100644 --- a/src/components/CommandBar/CommandsList/CommandList.module.scss +++ b/src/components/Search/CommandBar/CommandsList/CommandList.module.scss @@ -1,6 +1,6 @@ @use "src/styles/breakpoints"; -$itemHeight: calc(1.5 * var(--spacing-mega)); +$itemHeight: calc(1.2 * var(--spacing-mega)); .noResult { text-align: center; font-size: var(--font-size-large); @@ -24,25 +24,23 @@ $itemHeight: calc(1.5 * var(--spacing-mega)); display: flex; align-items: center; justify-content: space-between; - height: $itemHeight; font-size: var(--font-size-normal); - padding-block-start: 0; - padding-block-end: 0; + padding-block-start: var(--spacing-xxsmall); + padding-block-end: var(--spacing-xxsmall); padding-inline-start: var(--spacing-xsmall); padding-inline-end: var(--spacing-xsmall); cursor: pointer; - color: var(--color-text-faded); - white-space: nowrap; position: relative; z-index: var(--z-index-default); &.selected { - color: var(--color-text-default); + background: var(--color-background-alternative-medium); + border-radius: var(--border-radius-rounded); } } .highlight { transition: transform var(--transition-fast); - height: $itemHeight; + // min-height: $itemHeight; width: 100%; position: absolute; border-radius: var(--border-radius-rounded); diff --git a/src/components/Search/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss b/src/components/Search/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss new file mode 100644 index 0000000000..89584dca90 --- /dev/null +++ b/src/components/Search/CommandBar/CommandsList/CommandPrefix/CommandPrefix.module.scss @@ -0,0 +1,25 @@ +.commandPrefix { + margin-inline-end: var(--spacing-small); + margin-block-start: var(--spacing-micro); + display: flex; + align-items: center; + > svg { + width: var(--spacing-medium); + height: var(--spacing-medium); + } +} + +.container { + display: flex; + align-items: flex-start; +} + +.name { + em { + font-weight: var(--font-weight-bold); + color: var(--color-highlight-dark); + } + sup { + display: none; + } +} diff --git a/src/components/Search/CommandBar/CommandsList/CommandPrefix/index.tsx b/src/components/Search/CommandBar/CommandsList/CommandPrefix/index.tsx new file mode 100644 index 0000000000..736bb535e4 --- /dev/null +++ b/src/components/Search/CommandBar/CommandsList/CommandPrefix/index.tsx @@ -0,0 +1,43 @@ +/* eslint-disable react/no-danger */ +import React from 'react'; + +import useTranslation from 'next-translate/useTranslation'; + +import styles from './CommandPrefix.module.scss'; + +import SearchResultItemIcon from '@/components/Search/SearchResults/SearchResultItemIcon'; +import { SearchNavigationType } from 'types/Search/SearchNavigationResult'; + +interface Props { + name: string; + type: SearchNavigationType; +} + +const CommandPrefix: React.FC = ({ name, type }) => { + const { t } = useTranslation('common'); + const getContent = () => { + if (type === SearchNavigationType.SEARCH_PAGE) { + return t('search-for', { + searchQuery: name, + }); + } + + return name; + }; + + return ( +
    + + + +

    +

    + ); +}; + +export default CommandPrefix; diff --git a/src/components/CommandBar/CommandsList/index.tsx b/src/components/Search/CommandBar/CommandsList/index.tsx similarity index 79% rename from src/components/CommandBar/CommandsList/index.tsx rename to src/components/Search/CommandBar/CommandsList/index.tsx index 503cb2cc25..35719f17c5 100644 --- a/src/components/CommandBar/CommandsList/index.tsx +++ b/src/components/Search/CommandBar/CommandsList/index.tsx @@ -18,23 +18,31 @@ import useScroll, { SMOOTH_SCROLL_TO_CENTER } from '@/hooks/useScrollToElement'; import { addRecentNavigation, removeRecentNavigation, - setIsOpen, + setIsExpanded, } from '@/redux/slices/CommandBar/state'; import { logButtonClick } from '@/utils/eventLogger'; -import { resolveUrlBySearchNavigationType } from '@/utils/navigation'; -import { SearchNavigationResult } from 'types/SearchNavigationResult'; +import { getSearchQueryNavigationUrl, resolveUrlBySearchNavigationType } from '@/utils/navigation'; +import { getResultType } from '@/utils/search'; +import { SearchNavigationResult, SearchNavigationType } from 'types/Search/SearchNavigationResult'; export interface Command extends SearchNavigationResult { group: string; + name: string; index?: number; isClearable?: boolean; } interface Props { commandGroups: { groups: Record; numberOfCommands: number }; + searchQuery?: string; } -const CommandsList: React.FC = ({ commandGroups: { groups, numberOfCommands } }) => { +export const RESULTS_GROUP = 'results'; + +const CommandsList: React.FC = ({ + commandGroups: { groups, numberOfCommands }, + searchQuery, +}) => { const { t } = useTranslation('common'); const [scrollToSelectedCommand, selectedItemRef]: [() => void, RefObject] = useScroll(SMOOTH_SCROLL_TO_CENTER); @@ -77,7 +85,7 @@ const CommandsList: React.FC = ({ commandGroups: { groups, numberOfComman const { name, resultType, key } = command; router.push(resolveUrlBySearchNavigationType(resultType, key)).then(() => { dispatch({ type: addRecentNavigation.type, payload: { name, resultType, key } }); - dispatch({ type: setIsOpen.type, payload: false }); + dispatch({ type: setIsExpanded.type, payload: false }); }); }, [dispatch, router], @@ -103,19 +111,17 @@ const CommandsList: React.FC = ({ commandGroups: { groups, numberOfComman useHotkeys( 'enter', () => { - let navigateTo = null; - Object.keys(groups).forEach((commandGroup) => { - const selectedCommand = groups[commandGroup].find( - (command) => command.index === selectedCommandIndex, - ); - if (selectedCommand) { - navigateTo = selectedCommand; - } + router.push(getSearchQueryNavigationUrl(searchQuery)).then(() => { + navigateToLink({ + name: searchQuery, + resultType: SearchNavigationType.SEARCH_PAGE, + key: searchQuery, + group: RESULTS_GROUP, + }); }); - navigateToLink(navigateTo); }, - { enabled: selectedCommandIndex !== null, enableOnFormTags: ['INPUT'] }, - [selectedCommandIndex, groups, navigateToLink], + { enabled: !!searchQuery, enableOnFormTags: ['INPUT'] }, + [searchQuery, navigateToLink, router], ); const onRemoveCommandClicked = ( event: MouseEvent, @@ -133,7 +139,6 @@ const CommandsList: React.FC = ({ commandGroups: { groups, numberOfComman return (
      = ({ commandGroups: { groups, numberOfComman {Object.keys(groups).map((commandGroup) => { return (
      -
      - {commandGroup} -
      + {commandGroup !== RESULTS_GROUP && ( +
      + {commandGroup} +
      + )}
        {groups[commandGroup].map((command) => { - const { name, resultType } = command; - const isSelected = selectedCommandIndex === command.index; + const { name, key, index } = command; + const isSelected = selectedCommandIndex === index; return (
      • navigateToLink(command)} - onMouseOver={() => setSelectedCommandIndex(command.index)} + onMouseOver={() => setSelectedCommandIndex(index)} > - +
        diff --git a/src/components/CommandBar/CommandBarBody/CommandBarBody.module.scss b/src/components/Search/CommandBar/ExpandedSearchInputSection/ExpandedSearchInputSection.module.scss similarity index 75% rename from src/components/CommandBar/CommandBarBody/CommandBarBody.module.scss rename to src/components/Search/CommandBar/ExpandedSearchInputSection/ExpandedSearchInputSection.module.scss index e2e9fafeac..84554671c1 100644 --- a/src/components/CommandBar/CommandBarBody/CommandBarBody.module.scss +++ b/src/components/Search/CommandBar/ExpandedSearchInputSection/ExpandedSearchInputSection.module.scss @@ -1,9 +1,14 @@ @use "src/styles/breakpoints"; -$height: calc(9 * var(--spacing-mega)); +$height: calc(16 * var(--spacing-mega)); .container { padding: 0 var(--spacing-large); + @include breakpoints.smallerThanTablet { + padding: 0 var(--spacing-xxsmall); + } + background: var(--color-background-elevated); box-sizing: border-box; + border-radius: 0 0 var(--border-radius-circle-small) var(--border-radius-circle-small); } .textInputContainer { @@ -23,7 +28,6 @@ $height: calc(9 * var(--spacing-mega)); .inputContainer { border-block-end: 1px solid var(--color-borders-hairline); - padding-block: var(--spacing-small); display: flex; align-items: center; justify-content: space-between; @@ -46,7 +50,7 @@ $height: calc(9 * var(--spacing-mega)); font-size: var(--font-size-xlarge); } padding: var(--spacing-small) 0; - color: var(--color-text-faded); + color: var(--color-text-default); &::placeholder { color: var(--color-text-faded); opacity: var(--opacity-50); @@ -55,18 +59,16 @@ $height: calc(9 * var(--spacing-mega)); .bodyContainer { @include breakpoints.tablet { - padding-block-start: var(--spacing-xsmall); padding-block-end: var(--spacing-xsmall); } padding-inline-start: 0; - padding-inline-end: 0; + padding-inline-end: var(--spacing-xxsmall); overflow-y: auto; position: relative; - height: $height; box-sizing: border-box; + max-height: $height; } -.attribution { - display: flex; - justify-content: flex-end; +.height { + height: $height; } diff --git a/src/components/CommandBar/CommandBarBody/index.tsx b/src/components/Search/CommandBar/ExpandedSearchInputSection/index.tsx similarity index 50% rename from src/components/CommandBar/CommandBarBody/index.tsx rename to src/components/Search/CommandBar/ExpandedSearchInputSection/index.tsx index 8b6eb35075..6fe21fb0a8 100644 --- a/src/components/CommandBar/CommandBarBody/index.tsx +++ b/src/components/Search/CommandBar/ExpandedSearchInputSection/index.tsx @@ -1,54 +1,43 @@ /* eslint-disable max-lines */ -import React, { useState, useCallback, useEffect } from 'react'; +import React, { useCallback, useContext } from 'react'; import classNames from 'classnames'; import groupBy from 'lodash/groupBy'; import useTranslation from 'next-translate/useTranslation'; -import { shallowEqual, useSelector } from 'react-redux'; +import { useSelector } from 'react-redux'; -import CommandsList, { Command } from '../CommandsList'; +import CommandsList, { Command, RESULTS_GROUP } from '../CommandsList'; -import styles from './CommandBarBody.module.scss'; +import styles from './ExpandedSearchInputSection.module.scss'; +import { getNewSearchResults } from '@/api'; import DataFetcher from '@/components/DataFetcher'; -import TarteelAttribution from '@/components/TarteelAttribution/TarteelAttribution'; -import VoiceSearchBodyContainer from '@/components/TarteelVoiceSearch/BodyContainer'; -import TarteelVoiceSearchTrigger from '@/components/TarteelVoiceSearch/Trigger'; -import useDebounce from '@/hooks/useDebounce'; -import IconSearch from '@/icons/search.svg'; +import DataContext from '@/contexts/DataContext'; import { selectRecentNavigations } from '@/redux/slices/CommandBar/state'; -import { selectIsCommandBarVoiceFlowStarted } from '@/redux/slices/voiceSearch'; -import { SearchNavigationResult, SearchNavigationType } from '@/types/SearchNavigationResult'; -import SearchQuerySource from '@/types/SearchQuerySource'; -import { makeSearchResultsUrl } from '@/utils/apiPaths'; +import { selectSelectedTranslations } from '@/redux/slices/QuranReader/translations'; +import { + SearchNavigationResult, + SearchNavigationType, +} from '@/types/Search/SearchNavigationResult'; +import { makeNewSearchResultsUrl } from '@/utils/apiPaths'; import { areArraysEqual } from '@/utils/array'; -import { logButtonClick, logTextSearchQuery } from '@/utils/eventLogger'; +import { getQuickSearchQuery, getSearchNavigationResult } from '@/utils/search'; import { SearchResponse } from 'types/ApiResponses'; const NAVIGATE_TO = [ { name: 'Juz 1', - key: 1, + key: '1', resultType: SearchNavigationType.JUZ, }, - { - name: 'Hizb 1', - key: 1, - resultType: SearchNavigationType.HIZB, - }, - { - name: 'Rub el Hizb 1', - key: 1, - resultType: SearchNavigationType.RUB_EL_HIZB, - }, { name: 'Page 1', - key: 1, + key: '1', resultType: SearchNavigationType.PAGE, }, { name: 'Surah Yasin', - key: 36, + key: '36', resultType: SearchNavigationType.SURAH, }, { @@ -58,35 +47,18 @@ const NAVIGATE_TO = [ }, ]; -const DEBOUNCING_PERIOD_MS = 1500; +interface Props { + searchQuery: string; +} -const CommandBarBody: React.FC = () => { - const { t } = useTranslation('common'); +const ExpandedSearchInputSection: React.FC = ({ searchQuery }) => { + const selectedTranslations = useSelector(selectSelectedTranslations, areArraysEqual) as string[]; + const { t, lang } = useTranslation('common'); const recentNavigations = useSelector( selectRecentNavigations, areArraysEqual, ) as SearchNavigationResult[]; - const isVoiceSearchFlowStarted = useSelector(selectIsCommandBarVoiceFlowStarted, shallowEqual); - const [searchQuery, setSearchQuery] = useState(null); - // Debounce search query to avoid having to call the API on every type. The API will be called once the user stops typing. - const debouncedSearchQuery = useDebounce(searchQuery, DEBOUNCING_PERIOD_MS); - - useEffect(() => { - // only when the search query has a value we call the API. - if (debouncedSearchQuery) { - logTextSearchQuery(debouncedSearchQuery, SearchQuerySource.CommandBar); - } - }, [debouncedSearchQuery]); - - /** - * Handle when the search query is changed. - * - * @param {React.FormEvent} event - * @returns {void} - */ - const onSearchQueryChange = useCallback((event: React.FormEvent): void => { - setSearchQuery(event.currentTarget.value || null); - }, []); + const chaptersData = useContext(DataContext); /** * Generate an array of commands that will show in the pre-input view. @@ -115,6 +87,10 @@ const CommandBarBody: React.FC = () => { [recentNavigations, t], ); + const quickSearchFetcher = useCallback(() => { + return getNewSearchResults(getQuickSearchQuery(searchQuery, 10, selectedTranslations)); + }, [searchQuery, selectedTranslations]); + /** * This function will be used by DataFetcher and will run only when there is no API error * or the connections is offline. When we receive the response from DataFetcher, @@ -135,12 +111,17 @@ const CommandBarBody: React.FC = () => { if (!data) { toBeGroupedCommands = getPreInputCommands(); numberOfCommands = recentNavigations.length + NAVIGATE_TO.length; - } else { + } else if (data.result.navigation.length) { toBeGroupedCommands = [ ...data.result.navigation.map((navigationItem) => ({ - ...navigationItem, - group: t('command-bar.navigations'), + ...getSearchNavigationResult(chaptersData, navigationItem, t, lang), + group: RESULTS_GROUP, })), + ]; + numberOfCommands = data.result.navigation.length; + } else { + // if there are no results, we will show the search page suggestion as an item + toBeGroupedCommands = [ { key: searchQuery, resultType: SearchNavigationType.SEARCH_PAGE, @@ -148,10 +129,11 @@ const CommandBarBody: React.FC = () => { group: t('search.title'), }, ]; - numberOfCommands = data.result.navigation.length + 1; + numberOfCommands = 1; } return ( ({ ...item, index })), // append the index so that it can be used for keyboard navigation. @@ -162,55 +144,22 @@ const CommandBarBody: React.FC = () => { /> ); }, - [getPreInputCommands, recentNavigations.length, searchQuery, t], + [chaptersData, getPreInputCommands, lang, recentNavigations.length, searchQuery, t], ); return (
        -
        - {!isVoiceSearchFlowStarted && ( -
        - - -
        - )} - { - logButtonClick( - // eslint-disable-next-line i18next/no-literal-string - `command_bar_voice_search_${startFlow ? 'start' : 'stop'}_flow`, - ); - }} +
        +
        -
        - {isVoiceSearchFlowStarted ? ( - - ) : ( - - )} -
        -
        - -
        ); }; -export default CommandBarBody; +export default ExpandedSearchInputSection; diff --git a/src/components/Search/NavigationItem/index.tsx b/src/components/Search/NavigationItem/index.tsx deleted file mode 100644 index d8a320dd71..0000000000 --- a/src/components/Search/NavigationItem/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React, { useContext } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import DataContext from '@/contexts/DataContext'; -import Button from '@/dls/Button/Button'; -import SearchService from '@/types/Search/SearchService'; -import SearchQuerySource from '@/types/SearchQuerySource'; -import { logButtonClick } from '@/utils/eventLogger'; -import { toLocalizedNumber, toLocalizedVerseKey } from '@/utils/locale'; -import { resolveUrlBySearchNavigationType } from '@/utils/navigation'; -import { getSearchNavigationResult } from '@/utils/search'; -import { SearchNavigationResult, SearchNavigationType } from 'types/SearchNavigationResult'; - -interface Props { - navigation: SearchNavigationResult; - isSearchDrawer: boolean; - service?: SearchService; -} - -const NavigationItem: React.FC = ({ - navigation, - isSearchDrawer, - service = SearchService.QDC, -}) => { - const { t, lang } = useTranslation('common'); - const chaptersData = useContext(DataContext); - const isKalimatService = service === SearchService.KALIMAT; - const url = resolveUrlBySearchNavigationType( - navigation.resultType, - navigation.key, - isKalimatService, - ); - - const result = isKalimatService - ? getSearchNavigationResult(chaptersData, navigation, t, lang) - : navigation; - const getKalimatResultSuffix = () => { - if (navigation.resultType === SearchNavigationType.SURAH) { - return `(${toLocalizedNumber(Number(result.key), lang)})`; - } - - if (navigation.resultType === SearchNavigationType.AYAH) { - return `(${toLocalizedVerseKey(result.key as string, lang)})`; - } - - return undefined; - }; - - const suffix = isKalimatService ? getKalimatResultSuffix() : `(${navigation.key})`; - - const onNavigationItemClicked = () => { - logButtonClick('search_navigation_result', { - type: navigation.resultType, - service, - source: isSearchDrawer ? SearchQuerySource.SearchDrawer : SearchQuerySource.SearchPage, - }); - }; - - return ( - - ); -}; - -export default NavigationItem; diff --git a/src/components/Search/NoResults/index.tsx b/src/components/Search/NoResults/index.tsx index 418fdbcf70..e160fe9631 100644 --- a/src/components/Search/NoResults/index.tsx +++ b/src/components/Search/NoResults/index.tsx @@ -4,14 +4,37 @@ import useTranslation from 'next-translate/useTranslation'; import styles from './NoResults.module.scss'; +import Link, { LinkVariant } from '@/dls/Link/Link'; import IconSearch from '@/icons/search.svg'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getSearchQueryNavigationUrl } from '@/utils/navigation'; interface Props { searchQuery: string; + shouldSuggestFullSearchWhenNoResults?: boolean; } -const NoResults: React.FC = ({ searchQuery }) => { +const NoResults: React.FC = ({ + searchQuery, + shouldSuggestFullSearchWhenNoResults = false, +}) => { const { t } = useTranslation('common'); + if (shouldSuggestFullSearchWhenNoResults) { + return ( + { + logButtonClick('no_results_advanced_search_link'); + }} + variant={LinkVariant.Blend} + > + {t('search-for', { + searchQuery, + })} + + ); + } return ( <>
        diff --git a/src/components/Search/PreInput/SearchQuerySuggestion/index.tsx b/src/components/Search/PreInput/SearchQuerySuggestion/index.tsx index 181f6c6486..52ac5c5bc1 100644 --- a/src/components/Search/PreInput/SearchQuerySuggestion/index.tsx +++ b/src/components/Search/PreInput/SearchQuerySuggestion/index.tsx @@ -1,23 +1,26 @@ import React, { MouseEvent, KeyboardEvent } from 'react'; +import SearchResultItemIcon from '../../SearchResults/SearchResultItemIcon'; import SearchItem from '../SearchItem'; import styles from './SearchQuerySuggestion.module.scss'; import Button, { ButtonShape, ButtonSize, ButtonVariant } from '@/dls/Button/Button'; import CloseIcon from '@/icons/close.svg'; -import SearchIcon from '@/icons/search.svg'; +import { SearchNavigationType } from '@/types/Search/SearchNavigationResult'; interface Props { searchQuery: string; onSearchKeywordClicked: (searchQuery: string) => void; onRemoveSearchQueryClicked?: (searchQuery: string) => void; + type: SearchNavigationType; } const SearchQuerySuggestion: React.FC = ({ searchQuery, onSearchKeywordClicked, onRemoveSearchQueryClicked, + type, }) => { const onRemoveClicked = ( event: MouseEvent | KeyboardEvent, @@ -31,7 +34,7 @@ const SearchQuerySuggestion: React.FC = ({
        } + prefix={} onClick={() => onSearchKeywordClicked(searchQuery)} suffix={ onRemoveSearchQueryClicked && ( diff --git a/src/components/Search/PreInput/index.tsx b/src/components/Search/PreInput/index.tsx index 6cf57d01a5..2b457ea2b4 100644 --- a/src/components/Search/PreInput/index.tsx +++ b/src/components/Search/PreInput/index.tsx @@ -11,6 +11,8 @@ import SearchHistory from '@/components/Search/SearchHistory'; import Link from '@/dls/Link/Link'; import useGetChaptersData from '@/hooks/useGetChaptersData'; import TrendUpIcon from '@/icons/trend-up.svg'; +import { SearchNavigationType } from '@/types/Search/SearchNavigationResult'; +import SearchQuerySource from '@/types/SearchQuerySource'; import { getChapterData } from '@/utils/chapter'; import { logButtonClick } from '@/utils/eventLogger'; import { toLocalizedNumber, toLocalizedVerseKey } from '@/utils/locale'; @@ -18,23 +20,39 @@ import { getSurahNavigationUrl } from '@/utils/navigation'; interface Props { onSearchKeywordClicked: (searchQuery: string) => void; - isSearchDrawer: boolean; + source: SearchQuerySource; } const POPULAR_SEARCH_QUERIES = { Mulk: 67, Noah: 71, Kahf: 18, Yaseen: 36 }; -const PreInput: React.FC = ({ onSearchKeywordClicked, isSearchDrawer }) => { +const PreInput: React.FC = ({ onSearchKeywordClicked, source }) => { const { t, lang } = useTranslation('common'); const chaptersData = useGetChaptersData(lang); if (!chaptersData) { return <>; } - const SEARCH_FOR_KEYWORDS = [ - `${t('juz')} ${toLocalizedNumber(1, lang)}`, - `${t('page')} ${toLocalizedNumber(1, lang)}`, - getChapterData(chaptersData, '36').transliteratedName, - toLocalizedNumber(36, lang), - toLocalizedVerseKey('2:255', lang), + + const SEARCH_FOR_KEYWORD = [ + { + type: SearchNavigationType.JUZ, + value: `${t('juz')} ${toLocalizedNumber(1, lang)}`, + }, + { + type: SearchNavigationType.PAGE, + value: `${t('page')} ${toLocalizedNumber(1, lang)}`, + }, + { + type: SearchNavigationType.SURAH, + value: getChapterData(chaptersData, '36').transliteratedName, + }, + { + type: SearchNavigationType.SURAH, + value: toLocalizedNumber(36, lang), + }, + { + type: SearchNavigationType.AYAH, + value: toLocalizedVerseKey('2:255', lang), + }, ]; return (
        @@ -52,29 +70,23 @@ const PreInput: React.FC = ({ onSearchKeywordClicked, isSearchDrawer }) = title={chapterData.transliteratedName} key={url} onClick={() => { - logButtonClick( - `search_${ - isSearchDrawer ? 'drawer' : 'page' - }_popular_search_${popularSearchQuery}`, - ); + logButtonClick(`${source}_popular_search_${popularSearchQuery}`); }} /> ); })}
        - +
        - {SEARCH_FOR_KEYWORDS.map((keyword, index) => { + {SEARCH_FOR_KEYWORD.map((keyword, index) => { return ( { - logButtonClick(`search_${isSearchDrawer ? 'drawer' : 'page'}_search_hint_${index}`); + logButtonClick(`${source}_search_hint_${index}`); onSearchKeywordClicked(searchQuery); }} /> diff --git a/src/components/Search/SearchBodyContainer.tsx b/src/components/Search/SearchBodyContainer.tsx index de71b89026..f02902a1c3 100644 --- a/src/components/Search/SearchBodyContainer.tsx +++ b/src/components/Search/SearchBodyContainer.tsx @@ -9,19 +9,20 @@ import styles from './SearchBodyContainer.module.scss'; import SearchResults from '@/components/Search/SearchResults'; import Spinner, { SpinnerSize } from '@/dls/Spinner/Spinner'; +import SearchQuerySource from '@/types/SearchQuerySource'; import { SearchResponse } from 'types/ApiResponses'; interface Props { searchQuery: string; isSearching: boolean; - isSearchDrawer?: boolean; hasError: boolean; searchResult: SearchResponse; onSearchKeywordClicked: (keyword: string) => void; - onSearchResultClicked?: () => void; currentPage?: number; pageSize?: number; onPageChange?: (page: number) => void; + shouldSuggestFullSearchWhenNoResults?: boolean; + source: SearchQuerySource; } const SearchBodyContainer: React.FC = ({ @@ -30,11 +31,11 @@ const SearchBodyContainer: React.FC = ({ hasError, searchResult, onSearchKeywordClicked, - onSearchResultClicked, - isSearchDrawer = true, currentPage, pageSize, onPageChange, + shouldSuggestFullSearchWhenNoResults = false, + source, }) => { const { t } = useTranslation('common'); const isEmptyResponse = @@ -50,7 +51,7 @@ const SearchBodyContainer: React.FC = ({ })} > {!searchQuery ? ( - + ) : ( <> {isSearching ? ( @@ -61,13 +62,15 @@ const SearchBodyContainer: React.FC = ({ {!hasError && searchResult && ( <> {isEmptyResponse ? ( - + ) : ( void; - isSearchDrawer: boolean; + source: SearchQuerySource; } -const SearchHistory: React.FC = ({ onSearchKeywordClicked, isSearchDrawer }) => { +const SearchHistory: React.FC = ({ onSearchKeywordClicked, source }) => { const { t } = useTranslation('common'); const searchHistory = useSelector(selectSearchHistory, areArraysEqual) as string[]; const dispatch = useDispatch(); @@ -24,10 +26,10 @@ const SearchHistory: React.FC = ({ onSearchKeywordClicked, isSearchDrawer const onRemoveSearchQueryClicked = useCallback( (searchQuery: string) => { // eslint-disable-next-line i18next/no-literal-string - logButtonClick(`search_${isSearchDrawer ? 'drawer' : 'page'}_remove_query`); + logButtonClick(`${source}_remove_query`); dispatch({ type: removeSearchHistoryRecord.type, payload: searchQuery }); }, - [dispatch, isSearchDrawer], + [dispatch, source], ); // if there are no recent search queries. @@ -39,10 +41,11 @@ const SearchHistory: React.FC = ({ onSearchKeywordClicked, isSearchDrawer
        {searchHistory.map((recentSearchQuery) => ( { - logButtonClick(`search_${isSearchDrawer ? 'drawer' : 'page'}_history_item`); + logButtonClick(`${source}_history_item`); onSearchKeywordClicked(searchQuery); }} onRemoveSearchQueryClicked={onRemoveSearchQueryClicked} diff --git a/src/components/Search/SearchInput/SearchInput.module.scss b/src/components/Search/SearchInput/SearchInput.module.scss new file mode 100644 index 0000000000..a39d358017 --- /dev/null +++ b/src/components/Search/SearchInput/SearchInput.module.scss @@ -0,0 +1,83 @@ +@use "src/styles/breakpoints"; + +.headerOuterContainer { + background: var(--color-background-elevated); + position: relative; + border-radius: var(--border-radius-pill); + box-shadow: var(--shadow-small); + width: 100%; + margin: 0 auto; + z-index: 1; + @include breakpoints.tablet { + width: 750px; + height: 49px; + } +} + +.prefixSuffixContainer { + svg { + fill: var(--color-grey-icons) !important; + } +} + +.expanded { + z-index: 100; + border-radius: var(--border-radius-circle-small); + border-radius: var(--border-radius-circle-small) var(--border-radius-circle-small) 0 0; +} + +.inputContainer { + display: flex; + align-items: center; + justify-content: center; + height: 100%; +} + +.form { + display: contents; +} + +.input { + border: none !important; + width: 100%; + height: 100%; + @include breakpoints.smallerThanTablet { + height: 44px !important; + } + + input::placeholder { + color: var(--color-text-faded-new); + opacity: 1; + font-size: var(--font-size-small-px); + @include breakpoints.tablet { + font-size: var(--font-size-normal-px); + } + } + + input { + &:-webkit-autofill, + &:-webkit-autofill:hover, + &:-webkit-autofill:focus, + &:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px transparent inset !important; + -webkit-text-fill-color: var(--color-text-default) !important; + transition: background-color 5000s ease-in-out 0s; + background-color: transparent !important; + } + } +} + +.dropdownContainer { + position: absolute; + top: 100%; + left: 0; + right: 0; + width: 100%; + z-index: 100; + border-radius: 0 0 var(--border-radius-circle-small) var(--border-radius-circle-small); + box-shadow: var(--shadow-small); + ::-webkit-scrollbar { + width: 7px; + height: 7px; + } +} diff --git a/src/components/Search/SearchInput/index.tsx b/src/components/Search/SearchInput/index.tsx new file mode 100644 index 0000000000..9d668ddeeb --- /dev/null +++ b/src/components/Search/SearchInput/index.tsx @@ -0,0 +1,119 @@ +import React, { useCallback, useEffect, useRef, useState } from 'react'; + +import classNames from 'classnames'; +import { useRouter } from 'next/router'; +import { useHotkeys } from 'react-hotkeys-hook'; +import { useDispatch, useSelector } from 'react-redux'; + +import styles from './SearchInput.module.scss'; + +import ExpandedSearchInputSection from '@/components/Search/CommandBar/ExpandedSearchInputSection'; +import Input, { InputSize } from '@/dls/Forms/Input'; +import useOutsideClickDetector from '@/hooks/useOutsideClickDetector'; +import SearchIcon from '@/icons/search.svg'; +import { selectIsExpanded, setIsExpanded } from '@/redux/slices/CommandBar/state'; +import { setIsSearchDrawerOpen, setDisableSearchDrawerTransition } from '@/redux/slices/navbar'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getSearchQueryNavigationUrl } from '@/utils/navigation'; +import { isMobile } from '@/utils/responsive'; + +type Props = { + placeholder?: string; + initialSearchQuery?: string; + shouldExpandOnClick?: boolean; + shouldOpenDrawerOnMobile?: boolean; +}; + +const SearchInput: React.FC = ({ + placeholder, + initialSearchQuery, + shouldExpandOnClick = false, + shouldOpenDrawerOnMobile = false, +}) => { + const router = useRouter(); + const [searchQuery, setSearchQuery] = useState(initialSearchQuery || ''); + const isExpanded = useSelector(selectIsExpanded); + const dispatch = useDispatch(); + const containerRef = useRef(null); + const collapseContainer = useCallback(() => { + dispatch({ type: setIsExpanded.type, payload: false }); + }, [dispatch]); + useOutsideClickDetector(containerRef, collapseContainer, isExpanded); + useHotkeys('Escape', collapseContainer, { enabled: isExpanded, enableOnFormTags: ['INPUT'] }); + + useEffect(() => { + if (initialSearchQuery) { + setSearchQuery(initialSearchQuery); + } + }, [initialSearchQuery]); + + /** + * Handle when the search query is changed. + * + * @param {string} newSearchQuery + * @returns {void} + */ + const onSearchQueryChange = (newSearchQuery: string): void => { + setSearchQuery(newSearchQuery); + dispatch({ type: setIsExpanded.type, payload: !!newSearchQuery }); + }; + + const onClearClicked = () => { + logButtonClick('search_input_clear_query'); + setSearchQuery(''); + }; + + const shouldSearchBeInSearchDrawer = shouldOpenDrawerOnMobile && isMobile(); + + const onInputClick = () => { + if (shouldSearchBeInSearchDrawer) { + dispatch({ type: setDisableSearchDrawerTransition.type, payload: true }); + dispatch({ type: setIsSearchDrawerOpen.type, payload: true }); + } else if (shouldExpandOnClick) { + dispatch({ type: setIsExpanded.type, payload: true }); + } + }; + + const onSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (searchQuery) { + router.push(getSearchQueryNavigationUrl(searchQuery)); + } + }; + + return ( +
        +
        +
        + } + prefixSuffixContainerClassName={styles.prefixSuffixContainer} + containerClassName={styles.input} + htmlType="search" + enterKeyHint="search" + shouldUseDefaultStyles={false} + fixedWidth={false} + size={InputSize.Large} + /> +
        +
        + {isExpanded && ( +
        + +
        + )} +
        + ); +}; + +export default SearchInput; diff --git a/src/components/Search/SearchResults/SearchResultItem.module.scss b/src/components/Search/SearchResults/SearchResultItem.module.scss deleted file mode 100644 index 6df1512eae..0000000000 --- a/src/components/Search/SearchResults/SearchResultItem.module.scss +++ /dev/null @@ -1,50 +0,0 @@ -.translationName { - font-size: var(--font-size-xsmall); - opacity: var(--opacity-75); -} - -.translationContainer { - margin-block-start: var(--spacing-small); - margin-block-end: var(--spacing-small); - margin-inline-start: 0; - margin-inline-end: 0; - em { - font-weight: var(--font-weight-semibold); - } -} - -.container { - text-decoration: none; - border-block-end: 1px solid var(--color-borders-hairline); - padding-block: var(--spacing-medium); - margin-block-end: var(--spacing-xsmall); -} - -.itemContainer { - border-radius: var(--border-radius-default); - margin-inline-start: auto; - margin-inline-end: auto; -} - -.quranTextContainer { -} - -.verseLink { -} - -.quranTextResult { - font-size: var(--font-size-xlarge); - line-height: var(--line-height-large); - direction: rtl; - padding-block-start: var(--spacing-micro); - padding-block-end: var(--spacing-micro); - padding-inline-start: var(--spacing-micro); - padding-inline-end: var(--spacing-micro); -} - -.verseKey { - color: var(--color-success-medium); - display: block; - margin-block-end: var(--spacing-medium); - font-weight: var(--font-weight-bold); -} diff --git a/src/components/Search/SearchResults/SearchResultItem.tsx b/src/components/Search/SearchResults/SearchResultItem.tsx deleted file mode 100644 index 50360d057e..0000000000 --- a/src/components/Search/SearchResults/SearchResultItem.tsx +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-disable react/no-danger */ - -import React, { useMemo } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './SearchResultItem.module.scss'; - -import Link from '@/dls/Link/Link'; -import QuranWord from '@/dls/QuranWord/QuranWord'; -import useGetChaptersData from '@/hooks/useGetChaptersData'; -import SearchService from '@/types/Search/SearchService'; -import SearchQuerySource from '@/types/SearchQuerySource'; -import { getChapterData } from '@/utils/chapter'; -import { logButtonClick } from '@/utils/eventLogger'; -import { toLocalizedVerseKey } from '@/utils/locale'; -import { getChapterWithStartingVerseUrl } from '@/utils/navigation'; -import { getChapterNumberFromKey } from '@/utils/verse'; -import Verse from 'types/Verse'; - -interface Props { - result: Verse; - source: SearchQuerySource; - service?: SearchService; -} - -const SearchResultItem: React.FC = ({ result, source, service = SearchService.QDC }) => { - const { lang } = useTranslation('quran-reader'); - const localizedVerseKey = useMemo( - () => toLocalizedVerseKey(result.verseKey, lang), - [lang, result.verseKey], - ); - - const chaptersData = useGetChaptersData(lang); - - if (!chaptersData) return null; - - const chapterNumber = getChapterNumberFromKey(result.verseKey); - const chapterData = getChapterData(chaptersData, chapterNumber.toString()); - - const onResultItemClicked = () => { - logButtonClick(`search_result_item`, { - service, - source, - }); - }; - - return ( -
        -
        - - {chapterData.transliteratedName} {localizedVerseKey} - -
        -
        - {result.words.map((word, index) => { - return ( - - ); - })} -
        -
        - {result.translations?.map((translation) => ( -
        -
        - {/* eslint-disable-next-line i18next/no-literal-string */} -

        - {translation.resourceName}

        -
        - ))} -
        -
        - ); -}; -export default SearchResultItem; diff --git a/src/components/Search/SearchResults/SearchResultItem/SearchResultItem.module.scss b/src/components/Search/SearchResults/SearchResultItem/SearchResultItem.module.scss new file mode 100644 index 0000000000..556877bb02 --- /dev/null +++ b/src/components/Search/SearchResults/SearchResultItem/SearchResultItem.module.scss @@ -0,0 +1,32 @@ +.iconContainer { + padding-block-start: var(--spacing-micro); + padding-inline-end: var(--spacing-small); +} + +.container { + padding-block: var(--spacing-xsmall); + padding-inline: var(--spacing-xsmall); + &:hover { + background-color: var(--color-background-alternative-faded); + border-radius: var(--border-radius-default); + } +} + +.linkContainer { + display: flex; + flex-direction: row; +} + +.arabic { + direction: rtl; +} + +.resultText { + em { + font-weight: var(--font-weight-bold); + color: var(--color-highlight-dark); + } + sup { + display: none; + } +} diff --git a/src/components/Search/SearchResults/SearchResultItem/index.tsx b/src/components/Search/SearchResults/SearchResultItem/index.tsx new file mode 100644 index 0000000000..5938994ad0 --- /dev/null +++ b/src/components/Search/SearchResults/SearchResultItem/index.tsx @@ -0,0 +1,62 @@ +/* eslint-disable react/no-danger */ +import React, { useContext } from 'react'; + +import classNames from 'classnames'; +import useTranslation from 'next-translate/useTranslation'; + +import SearchResultItemIcon from '../SearchResultItemIcon'; + +import styles from './SearchResultItem.module.scss'; + +import DataContext from '@/contexts/DataContext'; +import Link from '@/dls/Link/Link'; +import { SearchNavigationResult } from '@/types/Search/SearchNavigationResult'; +import SearchService from '@/types/Search/SearchService'; +import SearchQuerySource from '@/types/SearchQuerySource'; +import { logButtonClick } from '@/utils/eventLogger'; +import { resolveUrlBySearchNavigationType } from '@/utils/navigation'; +import { getResultType, getSearchNavigationResult } from '@/utils/search'; + +interface Props { + source: SearchQuerySource; + service: SearchService; + result: SearchNavigationResult; +} + +const SearchResultItem: React.FC = ({ source, service, result }) => { + const { t, lang } = useTranslation(); + const chaptersData = useContext(DataContext); + const type = getResultType(result); + const onResultItemClicked = () => { + logButtonClick(`search_result_item`, { + service, + source, + }); + }; + + const { + name, + key: resultKey, + isArabic, + } = getSearchNavigationResult(chaptersData, result, t, lang); + + const url = resolveUrlBySearchNavigationType(type, resultKey, true); + return ( +
        + +
        + +
        +
        + +
        + ); +}; +export default SearchResultItem; diff --git a/src/components/Search/SearchResults/SearchResultItemIcon/index.tsx b/src/components/Search/SearchResults/SearchResultItemIcon/index.tsx new file mode 100644 index 0000000000..47fe482ce0 --- /dev/null +++ b/src/components/Search/SearchResults/SearchResultItemIcon/index.tsx @@ -0,0 +1,40 @@ +import NavigateToIcon from '@/icons/east.svg'; +import ArabicIcon from '@/icons/search/arabic.svg'; +import AyahRangeIcon from '@/icons/search/ayah-range.svg'; +import JuzIcon from '@/icons/search/juz.svg'; +import PageIcon from '@/icons/search/page.svg'; +import SurahIcon from '@/icons/search/surah.svg'; +import TranslationIcon from '@/icons/search/translation.svg'; +import TransliterationIcon from '@/icons/search/transliteration.svg'; +import SearchIcon from '@/icons/search.svg'; +import { SearchNavigationType } from '@/types/Search/SearchNavigationResult'; + +const TYPE_ICON_MAP = { + [SearchNavigationType.AYAH]: ArabicIcon, + [SearchNavigationType.SURAH]: SurahIcon, + [SearchNavigationType.JUZ]: JuzIcon, + [SearchNavigationType.PAGE]: PageIcon, + [SearchNavigationType.RANGE]: AyahRangeIcon, + // TODO: change this after it's ready + [SearchNavigationType.RUB_EL_HIZB]: ArabicIcon, + // TODO: change this after it's ready + [SearchNavigationType.HIZB]: ArabicIcon, + [SearchNavigationType.SEARCH_PAGE]: SearchIcon, + [SearchNavigationType.TRANSLITERATION]: TransliterationIcon, + [SearchNavigationType.TRANSLATION]: TranslationIcon, +}; + +interface Props { + type: SearchNavigationType; +} + +const SearchResultItemIcon = ({ type }: Props) => { + const Icon = TYPE_ICON_MAP[type]; + if (!type) { + return <>; + } + + return Icon ? : ; +}; + +export default SearchResultItemIcon; diff --git a/src/components/Search/SearchResults/SearchResults.module.scss b/src/components/Search/SearchResults/SearchResults.module.scss deleted file mode 100644 index 7075c92f5a..0000000000 --- a/src/components/Search/SearchResults/SearchResults.module.scss +++ /dev/null @@ -1,24 +0,0 @@ -.resultsSummaryContainer { - margin-block-start: var(--spacing-medium); - display: flex; - align-items: center; - justify-content: space-between; - padding-block-end: var(--spacing-medium); -} - -.header { - margin-block-start: var(--spacing-large); - text-transform: capitalize; - color: var(--color-text-faded); -} - -.showAll { - text-decoration: underline; -} - -.navigationItemsListContainer { - margin-block-start: var(--spacing-large); -} -.navigationItemContainer { - margin-inline-end: var(--spacing-small); -} diff --git a/src/components/Search/SearchResults/SearchResultsHeader/SearchResultsHeader.module.scss b/src/components/Search/SearchResults/SearchResultsHeader/SearchResultsHeader.module.scss new file mode 100644 index 0000000000..9b9311db94 --- /dev/null +++ b/src/components/Search/SearchResults/SearchResultsHeader/SearchResultsHeader.module.scss @@ -0,0 +1,38 @@ +.showAll { + font-weight: var(--font-weight-bold); +} + +.commandPrefix { + margin-inline-start: var(--spacing-xxsmall); + display: flex; + align-items: center; + > svg { + width: var(--spacing-large); + height: var(--spacing-large); + } +} + +.moreResultsContainer { + display: flex; + cursor: pointer; + align-items: center; + font-size: var(--font-size-small); + svg { + width: var(--spacing-medium) !important; + height: var(--spacing-medium) !important; + path { + fill: var(--color-text-faded) !important; + } + } +} + +.resultsSummaryContainer { + display: flex; + align-items: center; + justify-content: space-between; + padding-block-end: var(--spacing-small); +} + +.resultsSummary { + font-size: var(--font-size-small); +} diff --git a/src/components/Search/SearchResults/SearchResultsHeader/index.tsx b/src/components/Search/SearchResults/SearchResultsHeader/index.tsx new file mode 100644 index 0000000000..f13e8dd3dc --- /dev/null +++ b/src/components/Search/SearchResults/SearchResultsHeader/index.tsx @@ -0,0 +1,56 @@ +import React from 'react'; + +import { useRouter } from 'next/router'; +import useTranslation from 'next-translate/useTranslation'; +import { useDispatch } from 'react-redux'; + +import styles from './SearchResultsHeader.module.scss'; + +import IconContainer from '@/dls/IconContainer/IconContainer'; +import NavigateIcon from '@/icons/east.svg'; +import { setIsExpanded } from '@/redux/slices/CommandBar/state'; +import SearchQuerySource from '@/types/SearchQuerySource'; +import { logButtonClick } from '@/utils/eventLogger'; +import { getSearchQueryNavigationUrl } from '@/utils/navigation'; + +type Props = { + searchQuery: string; + onSearchResultClicked?: () => void; + source: SearchQuerySource; +}; + +const SearchResultsHeader: React.FC = ({ searchQuery, onSearchResultClicked, source }) => { + const { t } = useTranslation(); + const router = useRouter(); + const dispatch = useDispatch(); + + const onNavigationLinkClicked = () => { + router.push(getSearchQueryNavigationUrl(searchQuery)).then(() => { + dispatch({ type: setIsExpanded.type, payload: false }); + if (onSearchResultClicked) { + onSearchResultClicked(); + } + logButtonClick(`${source}_show_all`); + }); + }; + return ( +
        +

        {t('common:search-results-no-count')}

        +
        +
        +

        {t('common:search.more-results')}

        + + } /> + +
        +
        +
        + ); +}; + +export default SearchResultsHeader; diff --git a/src/components/Search/SearchResults/index.tsx b/src/components/Search/SearchResults/index.tsx index 88650d699d..6ebc98fcc7 100644 --- a/src/components/Search/SearchResults/index.tsx +++ b/src/components/Search/SearchResults/index.tsx @@ -3,104 +3,68 @@ import React from 'react'; import useTranslation from 'next-translate/useTranslation'; import SearchResultItem from './SearchResultItem'; -import styles from './SearchResults.module.scss'; -import NavigationItem from '@/components/Search/NavigationItem'; -import Link from '@/dls/Link/Link'; import Pagination from '@/dls/Pagination/Pagination'; +import useScrollToTop from '@/hooks/useScrollToTop'; import SearchQuerySource from '@/types/SearchQuerySource'; -import { logButtonClick } from '@/utils/eventLogger'; import { toLocalizedNumber } from '@/utils/locale'; import { SearchResponse } from 'types/ApiResponses'; interface Props { searchResult: SearchResponse; searchQuery: string; - isSearchDrawer?: boolean; currentPage?: number; pageSize?: number; onPageChange?: (page: number) => void; - onSearchResultClicked?: () => void; + source: SearchQuerySource; } const SearchResults: React.FC = ({ searchResult, searchQuery, - isSearchDrawer = true, + source, currentPage, onPageChange, pageSize, - onSearchResultClicked, }) => { - const { t, lang } = useTranslation(); + const results = searchResult.result.navigation.concat(searchResult.result.verses); + const isSearchDrawer = source === SearchQuerySource.SearchDrawer; + const { t, lang } = useTranslation('common'); + const scrollToTop = useScrollToTop(); + + const handlePageChange = (page: number) => { + scrollToTop(); + onPageChange?.(page); + }; + return ( - <> -
        - {!!searchResult.result.navigation?.length && ( -
        - {searchResult.result.navigation.map((navigationResult) => ( - - - - ))} -
        - )} -

        - {t('common:search-results', { +

        + {!isSearchDrawer && searchQuery && ( + <> + {t('search-results', { count: toLocalizedNumber(searchResult.pagination.totalRecords, lang), })} -

        - <> - {searchResult.result.verses.map((result) => ( - - ))} - {isSearchDrawer ? ( -
        -

        - {toLocalizedNumber(searchResult.pagination.totalRecords, lang)}{' '} - {t('common:search.results')} -

        - {searchResult.pagination.totalRecords > 0 && ( - { - if (onSearchResultClicked) onSearchResultClicked(); - logButtonClick('search_drawer_show_all'); - }} - > - -

        {t('common:search.show-all')}

        -
        - - )} -
        - ) : ( - <> - {searchQuery && ( - - )} - - )} -
        - + )} + <> + {results.map((result) => ( + + ))} + + {!isSearchDrawer && !!searchQuery && ( + + )} +
        ); }; diff --git a/src/components/TarteelAttribution/TarteelAttribution.module.scss b/src/components/TarteelAttribution/TarteelAttribution.module.scss deleted file mode 100644 index be6f63411b..0000000000 --- a/src/components/TarteelAttribution/TarteelAttribution.module.scss +++ /dev/null @@ -1,21 +0,0 @@ -.container { - display: flex; - align-items: center; - padding-block: var(--spacing-small); - text-decoration: none; -} -.poweredBy { - font-size: var(--font-size-xsmall); - line-height: normal; - color: var(--color-text-faded); - display: flex; - margin-inline-end: var(--spacing-xxsmall); -} - -.tarteelTextWrapper { - display: flex; - align-items: center; - & > svg > path { - fill: var(--color-text-default); - } -} diff --git a/src/components/TarteelAttribution/TarteelAttribution.tsx b/src/components/TarteelAttribution/TarteelAttribution.tsx deleted file mode 100644 index c10b86ecc3..0000000000 --- a/src/components/TarteelAttribution/TarteelAttribution.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import useTranslation from 'next-translate/useTranslation'; - -import styles from './TarteelAttribution.module.scss'; - -import Link from '@/dls/Link/Link'; -import TarteelLogo from '@/icons/tarteel-logo.svg'; -import TarteelText from '@/icons/tarteel-text.svg'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; - -interface Props { - isCommandBar?: boolean; -} - -const TarteelAttribution: React.FC = ({ isCommandBar = false }) => { - const { t } = useTranslation('common'); - const onLinkClicked = () => { - logTarteelLinkClick(isCommandBar ? 'command_bar' : 'search_drawer'); - }; - return ( - -
        - {t('voice.voice-search-powered-by')} - - - - -
        - - ); -}; - -export default TarteelAttribution; diff --git a/src/components/TarteelVoiceSearch/BodyContainer/Error/Error.module.scss b/src/components/TarteelVoiceSearch/BodyContainer/Error/Error.module.scss deleted file mode 100644 index c40483f91e..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/Error/Error.module.scss +++ /dev/null @@ -1,15 +0,0 @@ -.container { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - & > svg { - margin-block-end: var(--spacing-mega); - width: calc(2 * var(--spacing-mega)); - height: calc(2 * var(--spacing-mega)); - & > path { - fill: var(--color-background-inverse); - } - } -} diff --git a/src/components/TarteelVoiceSearch/BodyContainer/Error/index.tsx b/src/components/TarteelVoiceSearch/BodyContainer/Error/index.tsx deleted file mode 100644 index faf991c5ee..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/Error/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; - -import useTranslation from 'next-translate/useTranslation'; - -import styles from './Error.module.scss'; - -import Link, { LinkVariant } from '@/dls/Link/Link'; -import ErrorIcon from '@/icons/info.svg'; -import MicrophoneIcon from '@/icons/microphone.svg'; -import NoMicrophoneIcon from '@/icons/no-mic.svg'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; -import VoiceError from 'types/Tarteel/VoiceError'; - -interface Props { - error: VoiceError; - isWaitingForPermission: boolean; - isCommandBar: boolean; -} - -const Error: React.FC = ({ error, isWaitingForPermission, isCommandBar }) => { - const { t } = useTranslation('common'); - - const onTarteelLinkClicked = () => { - // eslint-disable-next-line i18next/no-literal-string - logTarteelLinkClick(`${isCommandBar ? 'command_bar' : 'search_drawer'}_error`); - }; - let icon = null; - let errorBody = null; - if (isWaitingForPermission) { - errorBody =

        {t('voice.ask-permission')}

        ; - icon = ; - } else { - let errorText = ''; - switch (error) { - case VoiceError.NO_PERMISSION: - errorText = t('voice.no-permission'); - icon = ; - break; - case VoiceError.NOT_SUPPORTED: - errorText = t('voice.not-supported'); - icon = ; - break; - default: - errorText = t('voice.error'); - icon = ; - break; - } - errorBody = ( -
        - {errorText} - - {t('tarteel.app')} - -
        - ); - } - - return ( -
        - {icon} - {errorBody} -
        - ); -}; - -export default Error; diff --git a/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/PartialResult.module.scss b/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/PartialResult.module.scss deleted file mode 100644 index 0c52bd06a9..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/PartialResult.module.scss +++ /dev/null @@ -1,93 +0,0 @@ -@use "src/styles/breakpoints"; - -.outerContainer { - width: 100%; - box-sizing: border-box; - padding-inline: var(--spacing-medium); -} - -.innerContainer { - width: 100%; - display: flex; - justify-content: space-between; - margin-block-end: calc(2 * var(--spacing-mega)); - margin-block-start: calc(1.5 * var(--spacing-mega)); -} - -.transcript { - text-align: end; - min-height: var(--spacing-large); -} - -.suggestTitle { - font-size: var(--font-size-xlarge); - font-weight: var(--font-weight-semibold); - margin-block-end: var(--spacing-xxsmall); -} -.suggestSubtitle { - opacity: var(--opacity-75); - max-width: 80%; - font-size: var(--font-size-large); -} - -.micCircle { - background-color: var(--color-success-medium); - border-radius: var(--border-radius-circle); - width: calc(4 * var(--spacing-large)); - height: calc(4 * var(--spacing-large)); - display: flex; - flex-direction: row; - align-items: center; - > svg { - width: 100%; - & > path { - fill: var(--color-background-default); - } - } -} - -.circlesContainer { - width: 20%; - position: relative; - display: flex; - justify-content: center; - align-items: center; - > div { - position: absolute; - } -} - -.volumeCircle { - background-color: var(--color-secondary-faint); - border-radius: var(--border-radius-circle); - width: calc(var(--volume) * 4 * var(--spacing-large)); - height: calc(var(--volume) * 4 * var(--spacing-large)); - transition: width var(--transition-fast) ease, - height var(--transition-fast) ease; -} - -@mixin verticalLayout { - .innerContainer { - flex-direction: column; - margin: 0; - } - .circlesContainer { - width: 100%; - height: calc(10 * var(--spacing-medium)); - } - .suggestTitle { - text-align: center; - } - .suggestSubtitle { - max-width: 100%; - text-align: center; - } -} - -.verticalLyaout { - @include verticalLayout; -} - -@include breakpoints.smallerThanTablet { - @include verticalLayout(); -} diff --git a/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/index.tsx b/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/index.tsx deleted file mode 100644 index 864038c5d5..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/PartialResult/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import classNames from 'classnames'; -import useTranslation from 'next-translate/useTranslation'; - -import styles from './PartialResult.module.scss'; - -import MicrophoneIcon from '@/icons/microphone.svg'; -import { getVolumeLevelMultiplier } from 'src/audioInput/voice'; - -interface Props { - partialTranscript: string; - volume: number; - stopRecording: () => void; - verticalLayout?: boolean; -} - -const PartialResult: React.FC = ({ - partialTranscript, - volume, - verticalLayout, - stopRecording, -}) => { - const { t } = useTranslation('common'); - - return ( -
        -
        -
        -

        {t('voice.suggest-title')}

        -

        {t('voice.suggest-subtitle')}

        -
        - {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */} -
        -
        -
        - -
        -
        -
        -

        {partialTranscript}

        -
        - ); -}; - -export default PartialResult; diff --git a/src/components/TarteelVoiceSearch/BodyContainer/SearchResults.tsx b/src/components/TarteelVoiceSearch/BodyContainer/SearchResults.tsx deleted file mode 100644 index 060d438106..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/SearchResults.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import React, { useCallback } from 'react'; - -import groupBy from 'lodash/groupBy'; -import useTranslation from 'next-translate/useTranslation'; -import { useSelector } from 'react-redux'; - -import CommandsList from '@/components/CommandBar/CommandsList'; -import DataFetcher from '@/components/DataFetcher'; -import SearchResultItem from '@/components/Search/SearchResults/SearchResultItem'; -import { selectSelectedTranslations } from '@/redux/slices/QuranReader/translations'; -import SearchService from '@/types/Search/SearchService'; -import SearchQuerySource from '@/types/SearchQuerySource'; -import { makeVersesFilterUrl } from '@/utils/apiPaths'; -import { areArraysEqual } from '@/utils/array'; -import { toLocalizedVerseKey } from '@/utils/locale'; -import { truncateString } from '@/utils/string'; -import { VersesResponse } from 'types/ApiResponses'; -import { SearchNavigationType } from 'types/SearchNavigationResult'; -import SearchResult from 'types/Tarteel/SearchResult'; - -interface Props { - searchResult: SearchResult; - isCommandBar: boolean; -} - -const SearchResults: React.FC = ({ searchResult, isCommandBar }) => { - const selectedTranslations = useSelector(selectSelectedTranslations, areArraysEqual); - const { t, lang } = useTranslation('common'); - - const params = { - // only get the first 10 results - filters: searchResult.matches - .slice(0, 10) - .map((match) => `${match.surahNum}:${match.ayahNum}`) - .join(','), - fields: 'text_uthmani', - // when it's the search drawer - ...(!isCommandBar && { - words: true, - // when there is a translation in Redux - ...(!!selectedTranslations.length && { - translations: selectedTranslations.join(','), - translationFields: 'text,resource_id,resource_name', - }), - }), - }; - - const responseRender = useCallback( - (data: VersesResponse) => { - if (isCommandBar) { - const toBeGroupedCommands = data.verses.map((verse) => { - return { - key: verse.verseKey, - resultType: SearchNavigationType.AYAH, - name: `[${toLocalizedVerseKey(verse.verseKey, lang)}] ${truncateString( - verse.textUthmani, - 80, - )}`, - group: t('command-bar.navigations'), - }; - }); - - return ( - ({ ...item, index })), // append the index so that it can be used for keyboard navigation. - (item) => item.group, // we group by the group name that has been attached to each command. - ), - numberOfCommands: data.verses.length, // this is needed so that we can know when we have reached the last command when using keyboard navigation across multiple groups - }} - /> - ); - } - return ( - <> - {data.verses.map((verse) => ( - - ))} - - ); - }, - [isCommandBar, lang, t], - ); - - return ; -}; - -export default SearchResults; diff --git a/src/components/TarteelVoiceSearch/BodyContainer/VoiceSearchBodyContainer.module.scss b/src/components/TarteelVoiceSearch/BodyContainer/VoiceSearchBodyContainer.module.scss deleted file mode 100644 index d02afbf9d8..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/VoiceSearchBodyContainer.module.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use "src/styles/breakpoints"; - -$body-min-height: 80vh; -$body-min-height-mobile: 65vh; - -.container { - display: flex; - flex-direction: row; - align-items: center; - text-align: center; - min-height: $body-min-height-mobile; - @include breakpoints.tablet { - min-height: $body-min-height; - } -} - -.noResultContainer { - text-align: center; -} - -.commandBarContainer { - @include breakpoints.tablet { - margin-block-start: calc(2 * var(--spacing-mega)); - } -} diff --git a/src/components/TarteelVoiceSearch/BodyContainer/index.tsx b/src/components/TarteelVoiceSearch/BodyContainer/index.tsx deleted file mode 100644 index f39360cd99..0000000000 --- a/src/components/TarteelVoiceSearch/BodyContainer/index.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { useEffect } from 'react'; - -import classNames from 'classnames'; - -import Error from './Error'; -import PartialResult from './PartialResult'; -import SearchResults from './SearchResults'; -import styles from './VoiceSearchBodyContainer.module.scss'; - -import NoResults from '@/components/Search/NoResults'; -import Spinner, { SpinnerSize } from '@/dls/Spinner/Spinner'; -import useTarteelVoiceSearch from '@/hooks/useTarteelVoiceSearch'; - -interface Props { - isCommandBar?: boolean; -} - -const VoiceSearchBodyContainer: React.FC = ({ isCommandBar = false }) => { - const { - isLoading, - partialTranscript, - searchResult, - error, - volume, - isWaitingForPermission, - startRecording, - stopRecording, - } = useTarteelVoiceSearch(); - - useEffect(() => { - startRecording(); - - return () => { - stopRecording(); - }; - - // we only want to start the recording once when the component mounts - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const stopVoiceSearch = () => { - // pass `false` so that we don't stop the recording and get the search results - stopRecording(false); - }; - - if (isLoading) { - return ; - } - // if there is an error or we are waiting for the permission from the user - if (error || isWaitingForPermission) { - return ( -
        - -
        - ); - } - - // if we received the result but no matches - if (searchResult && !searchResult.matches?.length) { - return ( -
        - -
        - ); - } - - return ( - <> - {searchResult ? ( - - ) : ( -
        - -
        - )} - - ); -}; - -export default VoiceSearchBodyContainer; diff --git a/src/components/TarteelVoiceSearch/Trigger.module.scss b/src/components/TarteelVoiceSearch/Trigger.module.scss deleted file mode 100644 index 3c3dfe74d9..0000000000 --- a/src/components/TarteelVoiceSearch/Trigger.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -.button { - & > span > svg { - & > path { - fill: var(--color-success-medium) !important; - } - } -} diff --git a/src/components/TarteelVoiceSearch/Trigger.tsx b/src/components/TarteelVoiceSearch/Trigger.tsx deleted file mode 100644 index f77b3e124b..0000000000 --- a/src/components/TarteelVoiceSearch/Trigger.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React, { useRef } from 'react'; - -import useTranslation from 'next-translate/useTranslation'; -import { shallowEqual, useDispatch, useSelector } from 'react-redux'; - -import styles from './Trigger.module.scss'; - -import Button, { ButtonShape, ButtonVariant } from '@/dls/Button/Button'; -import useBrowserLayoutEffect from '@/hooks/useBrowserLayoutEffect'; -import CloseIcon from '@/icons/close.svg'; -import MicrophoneIcon from '@/icons/microphone.svg'; -import { - toggleIsSearchDrawerVoiceFlowStarted, - toggleIsCommandBarVoiceFlowStarted, - selectIsCommandBarVoiceFlowStarted, - selectIsSearchDrawerVoiceFlowStarted, -} from '@/redux/slices/voiceSearch'; - -interface Props { - isCommandBar?: boolean; - onClick: (startFlow: boolean) => void; -} - -const TarteelVoiceSearchTrigger: React.FC = ({ isCommandBar = false, onClick }) => { - const { t } = useTranslation('common'); - const isSupported = useRef(true); - const dispatch = useDispatch(); - const isCommandBarVoiceFlowStarted = useSelector( - selectIsCommandBarVoiceFlowStarted, - shallowEqual, - ); - const isSearchDrawerVoiceFlowStarted = useSelector( - selectIsSearchDrawerVoiceFlowStarted, - shallowEqual, - ); - - const showCloseIcon = - (isCommandBar && isCommandBarVoiceFlowStarted) || - (!isCommandBar && isSearchDrawerVoiceFlowStarted); - - const onMicClicked = () => { - onClick(!showCloseIcon); - dispatch({ - type: isCommandBar - ? toggleIsCommandBarVoiceFlowStarted.type - : toggleIsSearchDrawerVoiceFlowStarted.type, - }); - }; - - // check whether the microphone is supported first. - useBrowserLayoutEffect(() => { - isSupported.current = - navigator.mediaDevices?.getUserMedia || - // @ts-ignore - navigator.getUserMedia || - // @ts-ignore - navigator.webkitGetUserMedia || - // @ts-ignore - navigator.mozGetUserMedia; - }, []); - - // if the mic is not supported. - if (!isSupported.current) { - return <>; - } - - return ( - - ); -}; - -export default TarteelVoiceSearchTrigger; diff --git a/src/components/Verse/OverflowVerseActionsMenuBody/ShareVerseActionsMenu/index.tsx b/src/components/Verse/OverflowVerseActionsMenuBody/ShareVerseActionsMenu/index.tsx index 008174a43c..f850776c6c 100644 --- a/src/components/Verse/OverflowVerseActionsMenuBody/ShareVerseActionsMenu/index.tsx +++ b/src/components/Verse/OverflowVerseActionsMenuBody/ShareVerseActionsMenu/index.tsx @@ -13,6 +13,7 @@ import CopyLinkIcon from '@/icons/copy-link.svg'; import CopyIcon from '@/icons/copy.svg'; import VideoIcon from '@/icons/video.svg'; import { selectQuranReaderStyles } from '@/redux/slices/QuranReader/styles'; +import PreviewMode from '@/types/Media/PreviewMode'; import QueryParam from '@/types/QueryParam'; import Verse from '@/types/Verse'; import { logButtonClick } from '@/utils/eventLogger'; @@ -117,6 +118,7 @@ const ShareVerseActionsMenu: React.FC = ({ [QueryParam.SURAH]: verse.chapterId as string, [QueryParam.VERSE_FROM]: String(verse.verseNumber), [QueryParam.VERSE_TO]: String(verse.verseNumber), + [QueryParam.PREVIEW_MODE]: PreviewMode.DISABLED, }), ); }; diff --git a/src/components/chapters/ChapterAndJuzList.module.scss b/src/components/chapters/ChapterAndJuzList.module.scss index 67f2243154..70ca10d38a 100644 --- a/src/components/chapters/ChapterAndJuzList.module.scss +++ b/src/components/chapters/ChapterAndJuzList.module.scss @@ -46,6 +46,10 @@ padding-block-end: var(--spacing-medium); } +.tabItem { + background-color: unset; +} + // sorter .sorter { display: flex; diff --git a/src/components/chapters/ChapterAndJuzList.tsx b/src/components/chapters/ChapterAndJuzList.tsx index 7bd32063c0..8e3f9e8055 100644 --- a/src/components/chapters/ChapterAndJuzList.tsx +++ b/src/components/chapters/ChapterAndJuzList.tsx @@ -103,7 +103,7 @@ const ChapterAndJuzList: React.FC = ({ return ( <>
        - +
        {t('common:sort.by')}:
        { const { t } = useTranslation('common'); - return

        {t('new')}

        ; + return {t('new')}; }; export default NewLabel; diff --git a/src/components/dls/Button/Button.module.scss b/src/components/dls/Button/Button.module.scss index f34b7b894b..51b0f89d25 100644 --- a/src/components/dls/Button/Button.module.scss +++ b/src/components/dls/Button/Button.module.scss @@ -1,4 +1,11 @@ -@use "src/styles/utility"; +// we are using this mixin ase using the one from utility.scss will break the remotion build +@mixin lighten-background-color { + background-image: linear-gradient( + to right, + var(--color-background-lighten), + var(--color-background-lighten) + ); +} .base { border: none; @@ -130,7 +137,7 @@ color: var(--themed-bg); &:hover { background-color: var(--themed-bg); - @include utility.lighten-background-color; + @include lighten-background-color; } } // corner case for secondary ghost button @@ -212,3 +219,14 @@ padding-inline-start: 0; padding-inline-end: 0; } + +.simplified { + --themed-bg: #22a5ad; + background-color: transparent; + color: var(--themed-bg); + font-weight: var(--font-weight-bold); + border-radius: var(--border-radius-rounded); + border: 1px solid var(--themed-bg); + font-size: var(--font-size-small); + padding: var(--spacing-xxsmall); +} diff --git a/src/components/dls/Button/Button.stories.tsx b/src/components/dls/Button/Button.stories.tsx index b158643daa..f308d04c7f 100644 --- a/src/components/dls/Button/Button.stories.tsx +++ b/src/components/dls/Button/Button.stories.tsx @@ -107,3 +107,8 @@ export const IconCircle = TemplateIcon.bind({}); IconCircle.args = { shape: ButtonShape.Circle, }; + +export const Simplified = Template.bind({}); +Simplified.args = { + variant: ButtonVariant.Simplified, +}; diff --git a/src/components/dls/Button/Button.tsx b/src/components/dls/Button/Button.tsx index 51d045415c..2ddc7c1d91 100644 --- a/src/components/dls/Button/Button.tsx +++ b/src/components/dls/Button/Button.tsx @@ -37,6 +37,7 @@ export enum ButtonVariant { Ghost = 'ghost', Compact = 'compact', Outlined = 'outlined', + Simplified = 'simplified', } export type ButtonProps = { @@ -115,7 +116,7 @@ const Button: React.FC = ({ [styles.ghost]: variant === ButtonVariant.Ghost, [styles.compact]: variant === ButtonVariant.Compact, [styles.outlined]: variant === ButtonVariant.Outlined, - + [styles.simplified]: variant === ButtonVariant.Simplified, [styles.disabled]: disabled || isLoading, [styles.noSidePadding]: !hasSidePadding, }); diff --git a/src/components/dls/CircularProgress/index.tsx b/src/components/dls/CircularProgress/index.tsx index 0d3fbe450f..4982e98105 100644 --- a/src/components/dls/CircularProgress/index.tsx +++ b/src/components/dls/CircularProgress/index.tsx @@ -26,11 +26,11 @@ export type CircularProgressbarDefaultProps = { backgroundPadding: number; circleRatio: number; classes: { - root: string; + root?: string; trail: string; path: string; text: string; - background: string; + background?: string; }; className: string; counterClockwise: boolean; diff --git a/src/components/dls/Footer/Footer.module.scss b/src/components/dls/Footer/Footer.module.scss index 5afdcd5e35..38870a3d2b 100644 --- a/src/components/dls/Footer/Footer.module.scss +++ b/src/components/dls/Footer/Footer.module.scss @@ -86,7 +86,7 @@ margin-block-end: var(--spacing-medium); width: 50%; @include breakpoints.tablet { - width: auto; + width: 26%; } } @@ -178,3 +178,10 @@ margin-block: var(--spacing-small); border-radius: var(--border-radius-default); } + +.groupDescription { + opacity: var(--opacity-75); + color: var(--color-text-secondary); + font-size: var(--font-size-small); + margin-top: var(--spacing-xsmall); +} diff --git a/src/components/dls/Footer/Footer.tsx b/src/components/dls/Footer/Footer.tsx index 60e1a4f3da..3b938bf793 100644 --- a/src/components/dls/Footer/Footer.tsx +++ b/src/components/dls/Footer/Footer.tsx @@ -1,9 +1,18 @@ +import { useRouter } from 'next/router'; + import BottomSection from './BottomSection'; import styles from './Footer.module.scss'; import Links from './Links'; import TitleAndDescription from './TitleAndDescription'; const Footer = () => { + const router = useRouter(); + + // Don't render the footer on login pages + if (router.pathname.includes('/login')) { + return null; + } + return (
        diff --git a/src/components/dls/Footer/Links.tsx b/src/components/dls/Footer/Links.tsx index 9655814ec9..92d7f6872d 100644 --- a/src/components/dls/Footer/Links.tsx +++ b/src/components/dls/Footer/Links.tsx @@ -5,8 +5,6 @@ import styles from './Footer.module.scss'; import Link, { LinkVariant } from '@/dls/Link/Link'; import useGetChaptersData from '@/hooks/useGetChaptersData'; -import { makeDonateUrl } from '@/utils/apiPaths'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; const Links = () => { const { t, lang } = useTranslation('common'); @@ -23,8 +21,6 @@ const Links = () => { { text: t('quran-radio'), url: '/radio' }, { text: t('reciters'), url: '/reciters' }, { text: t('about'), url: '/about-us' }, - { text: t('donate'), isExternal: true, url: makeDonateUrl() }, - { text: t('mobile-apps'), url: '/apps' }, { text: t('developers'), url: '/developers' }, { text: t('product-updates'), url: '/product-updates' }, { text: t('feedback'), url: 'https://feedback.quran.com/', isExternal: true }, @@ -32,24 +28,26 @@ const Links = () => { ], }, { - title: t('network'), + title: t('our-projects'), links: [ - { text: 'QuranicAudio.com', url: 'https://quranicaudio.com', isExternal: true }, - { text: 'Salah.com', url: 'https://salah.com', isExternal: true }, - { text: 'Sunnah.com', url: 'https://sunnah.com', isExternal: true }, - { text: 'Legacy.Quran.com', url: 'https://legacy.quran.com', isExternal: true }, - { text: 'Previous.Quran.com', url: 'https://previous.quran.com', isExternal: true }, - { text: 'Corpus.Quran.com', url: 'https://corpus.quran.com', isExternal: true }, - { text: 'QuranReflect.com', url: 'https://quranreflect.com', isExternal: true }, + { text: 'Quran.com', url: 'https://quran.com', isExternal: true }, { - text: 'Tarteel.ai', - url: 'https://www.tarteel.ai/', + text: 'Quran For Android', + url: 'https://play.google.com/store/apps/details?id=com.quran.labs.androidquran&hl=en&pli=1', isExternal: true, - onClick: () => { - logTarteelLinkClick('footer_network_attribution'); - }, }, + { + text: 'Quran iOS', + url: 'https://apps.apple.com/us/app/quran-by-quran-com-%D9%82%D8%B1%D8%A2%D9%86/id1118663303', + isExternal: true, + }, + { text: 'QuranReflect.com', url: 'https://quranreflect.com', isExternal: true }, + { text: 'Sunnah.com', url: 'https://sunnah.com', isExternal: true }, + { text: 'Nuqayah.com', url: 'https://nuqayah.com', isExternal: true }, + { text: 'Legacy.Quran.com', url: 'https://legacy.quran.com', isExternal: true }, + { text: 'Corpus.Quran.com', url: 'https://corpus.quran.com', isExternal: true }, ], + description: t('projects-desc'), }, { title: t('popular-links'), @@ -95,6 +93,7 @@ const Links = () => { )}
        ))} + {group.description &&
        {group.description}
        }
        ))}
        diff --git a/src/components/dls/Footer/TitleAndDescription.tsx b/src/components/dls/Footer/TitleAndDescription.tsx index 072f347396..85f6ef9cfb 100644 --- a/src/components/dls/Footer/TitleAndDescription.tsx +++ b/src/components/dls/Footer/TitleAndDescription.tsx @@ -1,3 +1,4 @@ +import Trans from 'next-translate/Trans'; import useTranslation from 'next-translate/useTranslation'; import styles from './Footer.module.scss'; @@ -15,7 +16,14 @@ const TitleAndDescription = () => {
        {t('footer.title')}
        -

        {t('footer.description')}

        +

        + , + }} + /> +

        ); }; diff --git a/src/components/dls/Forms/Input/Input.module.scss b/src/components/dls/Forms/Input/Input.module.scss index cd5d82a4ab..9d78d8528e 100644 --- a/src/components/dls/Forms/Input/Input.module.scss +++ b/src/components/dls/Forms/Input/Input.module.scss @@ -89,6 +89,16 @@ &.warning { color: var(--color-warning-medium); } + + &:-webkit-autofill, + &:-webkit-autofill:hover, + &:-webkit-autofill:focus, + &:-webkit-autofill:active { + -webkit-box-shadow: 0 0 0 30px transparent inset !important; + -webkit-text-fill-color: var(--color-text-default) !important; + transition: background-color 5000s ease-in-out 0s; + background-color: transparent !important; + } } @mixin prefixSuffixContainer { @@ -126,13 +136,3 @@ padding-inline-start: var(--spacing-xsmall); padding-inline-end: var(--spacing-xxsmall); } - -.suffix { - border-inline-start: 1px solid var(--color-background-alternative-deep); - border-start-end-radius: var(--border-radius-default); - border-end-end-radius: var(--border-radius-default); - background: var(--color-background-alternative-medium); - - padding-inline-start: var(--spacing-xxsmall); - padding-inline-end: var(--spacing-xsmall); -} diff --git a/src/components/dls/Forms/Input/Suffix/Suffix.module.scss b/src/components/dls/Forms/Input/Suffix/Suffix.module.scss new file mode 100644 index 0000000000..523e8d6712 --- /dev/null +++ b/src/components/dls/Forms/Input/Suffix/Suffix.module.scss @@ -0,0 +1,9 @@ +.suffix { + border-inline-start: 1px solid var(--color-background-alternative-deep); + border-start-end-radius: var(--border-radius-default); + border-end-end-radius: var(--border-radius-default); + background: var(--color-background-alternative-medium); + + padding-inline-start: var(--spacing-xxsmall); + padding-inline-end: var(--spacing-xsmall); +} diff --git a/src/components/dls/Forms/Input/Suffix/index.tsx b/src/components/dls/Forms/Input/Suffix/index.tsx new file mode 100644 index 0000000000..321f42a12e --- /dev/null +++ b/src/components/dls/Forms/Input/Suffix/index.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import classNames from 'classnames'; + +import styles from './Suffix.module.scss'; + +type Props = { + suffix: React.ReactNode; + suffixContainerClassName?: string; + shouldUseDefaultStyles?: boolean; +}; + +const InputSuffix: React.FC = ({ + suffix, + suffixContainerClassName, + shouldUseDefaultStyles = true, +}) => { + return ( + <> + {suffix && ( +
        + {suffix} +
        + )} + + ); +}; + +export default InputSuffix; diff --git a/src/components/dls/Forms/Input/index.tsx b/src/components/dls/Forms/Input/index.tsx index e6be0b4e3c..0ddc6f2d36 100644 --- a/src/components/dls/Forms/Input/index.tsx +++ b/src/components/dls/Forms/Input/index.tsx @@ -7,6 +7,7 @@ import React, { RefObject, KeyboardEvent, HTMLAttributes, + InputHTMLAttributes, } from 'react'; import classNames from 'classnames'; @@ -14,6 +15,7 @@ import classNames from 'classnames'; import Button, { ButtonShape, ButtonSize, ButtonVariant } from '../../Button/Button'; import styles from './Input.module.scss'; +import InputSuffix from './Suffix'; import ClearIcon from '@/icons/close.svg'; @@ -45,8 +47,10 @@ interface Props { suffix?: ReactNode; onClearClicked?: () => void; onChange?: (value: string) => void; + onClick?: () => void; onKeyDown?: (event: KeyboardEvent) => void; inputMode?: HTMLAttributes['inputMode']; + enterKeyHint?: InputHTMLAttributes['enterKeyHint']; value?: string; label?: string | JSX.Element; type?: InputType; @@ -56,6 +60,8 @@ interface Props { htmlType?: React.HTMLInputTypeAttribute; isRequired?: boolean; inputRef?: RefObject; + prefixSuffixContainerClassName?: string; + shouldUseDefaultStyles?: boolean; } const Input: React.FC = ({ @@ -74,13 +80,17 @@ const Input: React.FC = ({ onClearClicked, onChange, onKeyDown, + onClick, inputMode, + enterKeyHint, value = '', shouldFlipOnRTL = true, containerClassName, + prefixSuffixContainerClassName, htmlType, isRequired, inputRef, + shouldUseDefaultStyles = true, }) => { const [inputValue, setInputValue] = useState(value); // listen to any change in value in-case the value gets populated after and API call. @@ -96,6 +106,25 @@ const Input: React.FC = ({ } }; + const handleClick = () => { + if (onClick) { + onClick(); + } + }; + + // eslint-disable-next-line react/no-multi-comp + const Suffix = () => ( + <> + {suffix && ( + + )} + + ); + return ( <> {label &&

        {label}

        } @@ -105,7 +134,6 @@ const Input: React.FC = ({ [styles.mediumContainer]: size === InputSize.Medium, [styles.largeContainer]: size === InputSize.Large, [styles.fixedWidth]: fixedWidth, - [styles.disabled]: disabled, [styles.error]: type === InputType.Error, [styles.success]: type === InputType.Success, [styles.warning]: type === InputType.Warning, @@ -113,14 +141,24 @@ const Input: React.FC = ({ })} > {prefix && ( -
        {prefix}
        +
        + {prefix} +
        )} = ({ value={inputValue} onKeyDown={onKeyDown} inputMode={inputMode} + enterKeyHint={enterKeyHint} {...(placeholder && { placeholder })} {...(name && { name })} /> {clearable ? ( <> - {inputValue && ( + {inputValue ? (
        + ) : ( + )} ) : ( - <> - {suffix && ( -
        - {suffix} -
        - )} - + )}
        diff --git a/src/components/dls/ShareButtons/ShareButtons.module.scss b/src/components/dls/ShareButtons/ShareButtons.module.scss new file mode 100644 index 0000000000..13cbc501d0 --- /dev/null +++ b/src/components/dls/ShareButtons/ShareButtons.module.scss @@ -0,0 +1,39 @@ +.shareOptionsButtons { + display: flex; + align-items: center; + gap: var(--spacing-medium); + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.shareOptionButton { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-xsmall); + cursor: pointer; + background: none; + border: none; + padding: 0; + + span { + font-size: var(--font-size-small); + color: var(--color-text-default); + } +} + +.socialIcon { + width: var(--spacing-xlarge-px); + height: var(--spacing-xlarge-px); +} + +.utilityIconWrapper { + width: var(--spacing-xlarge-px); + height: var(--spacing-xlarge-px); + background-color: var(--color-background-alternative); + border-radius: var(--border-radius-circle); + display: flex; + align-items: center; + justify-content: center; +} diff --git a/src/components/dls/ShareButtons/index.tsx b/src/components/dls/ShareButtons/index.tsx new file mode 100644 index 0000000000..4da8a15e38 --- /dev/null +++ b/src/components/dls/ShareButtons/index.tsx @@ -0,0 +1,98 @@ +/* eslint-disable i18next/no-literal-string */ +import React, { useEffect, useState } from 'react'; + +import clipboardCopy from 'clipboard-copy'; +import useTranslation from 'next-translate/useTranslation'; +import { + FacebookShareButton, + TwitterShareButton, + XIcon, + WhatsappShareButton, + WhatsappIcon, +} from 'react-share'; + +import styles from './ShareButtons.module.scss'; + +import CopyLinkIcon from '@/icons/copy-link-new.svg'; +import FacebookIcon from '@/icons/fb.svg'; +import { logButtonClick } from '@/utils/eventLogger'; + +interface Props { + url: string; + title: string; + analyticsContext: string; +} + +const COPY_TIMEOUT_MS = 5000; +const BG_STYLE = { fill: 'black' }; + +const ShareButtons: React.FC = ({ url, title, analyticsContext }) => { + const { t } = useTranslation('common'); + const [isCopied, setIsCopied] = useState(false); + + useEffect(() => { + let timeoutId: ReturnType; + if (isCopied === true) { + timeoutId = setTimeout(() => setIsCopied(false), COPY_TIMEOUT_MS); + } + return () => { + clearTimeout(timeoutId); + }; + }, [isCopied]); + + const onCopyLinkClicked = () => { + logButtonClick(`${analyticsContext}_copy_link`); + clipboardCopy(url).then(() => { + setIsCopied(true); + }); + }; + + const onTwitterShareButtonClicked = () => { + logButtonClick(`${analyticsContext}_twitter_share`); + }; + + const onFacebookShareButtonClicked = () => { + logButtonClick(`${analyticsContext}_facebook_share`); + }; + + const onWhatsappShareButtonClicked = () => { + logButtonClick(`${analyticsContext}_whatsapp_share`); + }; + + return ( +
        +
        + +
        + +
        +
        + X +
        +
        + +
        + +
        +
        + Facebook +
        +
        + +
        + +
        +
        + Whatsapp +
        + +
        + ); +}; + +export default ShareButtons; diff --git a/src/components/dls/Tabs/Tabs.tsx b/src/components/dls/Tabs/Tabs.tsx index 526a9aa3cd..8312bf77e0 100644 --- a/src/components/dls/Tabs/Tabs.tsx +++ b/src/components/dls/Tabs/Tabs.tsx @@ -2,7 +2,7 @@ import classNames from 'classnames'; import styles from './Tabs.module.scss'; -type Tab = { +export type Tab = { title: string; value: string; id?: string; @@ -12,15 +12,20 @@ type TabsProps = { tabs: Tab[]; selected: string; onSelect?: (value: string) => void; + className?: string; }; // TODO: move this to Radix UI Tabs component -const Tabs = ({ tabs, onSelect, selected }: TabsProps) => { +const Tabs = ({ tabs, onSelect, selected, className }: TabsProps) => { return (
        {tabs.map((tab) => (
        { return { @@ -86,6 +90,7 @@ const useGetMediaSettings = ( orientation, videoId, surah, + previewMode, }; }, [ backgroundColor, @@ -105,6 +110,7 @@ const useGetMediaSettings = ( verseFrom, verseTo, videoId, + previewMode, ]); }; diff --git a/src/hooks/auth/useCurrentUser.ts b/src/hooks/auth/useCurrentUser.ts index 62625f53b9..442eacb91b 100644 --- a/src/hooks/auth/useCurrentUser.ts +++ b/src/hooks/auth/useCurrentUser.ts @@ -5,16 +5,18 @@ import { makeUserProfileUrl } from '@/utils/auth/apiPaths'; import { isLoggedIn } from '@/utils/auth/login'; const useCurrentUser = () => { + const isUserLoggedIn = isLoggedIn(); const { data: userData, isValidating, error, - } = useSWR(isLoggedIn() ? makeUserProfileUrl() : null, getUserProfile); + } = useSWR(isUserLoggedIn ? makeUserProfileUrl() : null, getUserProfile); return { user: userData || ({} as typeof userData), isLoading: isValidating && !userData, error, + isUserLoggedIn, }; }; diff --git a/src/hooks/useGetQueryParamOrReduxValue.ts b/src/hooks/useGetQueryParamOrReduxValue.ts index 52f25e63ad..8d13e5fb55 100644 --- a/src/hooks/useGetQueryParamOrReduxValue.ts +++ b/src/hooks/useGetQueryParamOrReduxValue.ts @@ -11,6 +11,7 @@ import { selectFontColor, selectOpacity, selectOrientation, + selectPreviewMode, selectQuranTextFontScale, selectQuranTextFontStyle, selectReciter, @@ -30,6 +31,7 @@ import { DEFAULT_BACKGROUND_COLOR, DEFAULT_BORDER_COLOR, DEFAULT_FONT_COLOR, + DEFAULT_PREVIEW_MODE, DEFAULT_RECITER_ID, DEFAULT_SURAH, DEFAULT_TRANSLATION, @@ -48,6 +50,7 @@ import { isValidFontStyleQueryParamValue, isValidOpacityQueryParamValue, isValidOrientationQueryParamValue, + isValidPreviewModeQueryParamValue, isValidReciterId, isValidTranslationsQueryParamValue, isValidTranslationsQueryParamValueWithExistingKey, @@ -186,6 +189,13 @@ export const QUERY_PARAMS_DATA = { queryParamValueType: QueryParamValueType.Number, isValidQueryParam: (val) => isValidVideoIdQueryParamValue(val), }, + [QueryParam.PREVIEW_MODE]: { + reduxValueSelector: selectPreviewMode, + reduxValueEqualityFunction: shallowEqual, + queryParamValueType: QueryParamValueType.String, + isValidQueryParam: (val) => isValidPreviewModeQueryParamValue(val), + customValueGetterWhenParamIsInvalid: () => DEFAULT_PREVIEW_MODE, + }, } as QueryParamsData; export const getQueryParamsData = () => { diff --git a/src/hooks/useTarteelVoiceSearch.ts b/src/hooks/useTarteelVoiceSearch.ts deleted file mode 100644 index 48bba735d1..0000000000 --- a/src/hooks/useTarteelVoiceSearch.ts +++ /dev/null @@ -1,276 +0,0 @@ -/* eslint-disable max-lines */ -/* eslint-disable import/no-unresolved */ -/* eslint-disable react-func/max-lines-per-function */ -import { useState, useCallback, useRef } from 'react'; - -import useBrowserLayoutEffect from '@/hooks/useBrowserLayoutEffect'; -import SearchService from '@/types/Search/SearchService'; -import SearchQuerySource from '@/types/SearchQuerySource'; -import SearchType from '@/types/SearchType'; -import { logEmptySearchResults, logEvent } from '@/utils/eventLogger'; -import { getAverageVolume } from 'src/audioInput/voice'; -import Event from 'types/Tarteel/Event'; -import Result from 'types/Tarteel/Result'; -import SearchResult from 'types/Tarteel/SearchResult'; -import VoiceError from 'types/Tarteel/VoiceError'; - -const AUDIO_CONFIG = { - sampleRate: 16000, - fileFormat: 'WAV', - channels: 1, -}; - -const END_STREAM_DATA = { - event: Event.END_STREAM, -}; -const START_STREAM_DATA = { - event: Event.START_STREAM, - data: { - audioConfig: AUDIO_CONFIG, - }, -}; - -const AUDIO_CONSTRAINTS = { - sampleRate: AUDIO_CONFIG.sampleRate, - channelCount: AUDIO_CONFIG.channels, - sampleSize: 4096, -} as MediaTrackConstraints; - -const USER_MEDIA_NOT_SUPPORTED_ERROR = 'USER_MEDIA_NOT_SUPPORTED'; -const ANALYSER_SMOOTHING_CONSTANT = 0.8; -const FAST_FOURIER_TRANSFORM_SIZE = 1024; - -const isWebSocketOpen = (webSocket: WebSocket) => { - return webSocket && webSocket.readyState === webSocket.OPEN; -}; - -const useTarteelVoiceSearch = () => { - const [volume, setVolume] = useState(0); - const mediaStream = useRef(null); - const [isLoading, setIsLoading] = useState(false); - const [error, setError] = useState(null); - const [partialTranscript, setPartialTranscript] = useState(null); - const [searchResult, setSearchResult] = useState(null); - const [isWaitingForPermission, setIsWaitingForPermission] = useState(false); - - const websocket = useRef(null); - const analyser = useRef(null); - const micWorkletNode = useRef(null); - const audioContext = useRef(null); - const micSourceNode = useRef(null); - - useBrowserLayoutEffect(() => { - window.AudioContext = window.AudioContext || window.webkitAudioContext; - // Older browsers might not implement mediaDevices at all, so we set an empty object first - if (navigator.mediaDevices === undefined) { - // @ts-ignore - navigator.mediaDevices = {}; - } - // Some browsers partially implement mediaDevices. We can't just assign an object - // with getUserMedia as it would overwrite existing properties. - // Here, we will just add the getUserMedia property if it's missing. - if (navigator.mediaDevices.getUserMedia === undefined) { - navigator.mediaDevices.getUserMedia = (constraints: MediaStreamConstraints) => { - // First get ahold of the legacy getUserMedia, if present - const getUserMedia = - // @ts-ignore - navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia; - - // Some browsers just don't implement it - return a rejected promise with an error - // to keep a consistent interface - if (!getUserMedia) { - return Promise.reject(new Error(USER_MEDIA_NOT_SUPPORTED_ERROR)); - } - - // Otherwise, wrap the call to the old navigator.getUserMedia with a Promise - return new Promise((resolve, reject) => { - getUserMedia.call(navigator, constraints, resolve, reject); - }); - }; - } - }, []); - - const releaseMicrophone = useCallback(() => { - if (mediaStream.current) { - mediaStream.current.getAudioTracks().forEach((track) => { - track.stop(); - }); - } - setVolume(0); - }, []); - - // the `closeWebsocket` param is used to close the websocket when the user clicks exits the flow. - // otherwise, the user just clicked on the mic button to stop the recording - // and the websocket should remain open to receive the final results. - const stopRecording = useCallback( - async (closeWebsocket = true) => { - if (!closeWebsocket && !partialTranscript) { - // if the user didn't say anything and clicked on the mic button, don't stop the flow - return; - } - - // if the websocket is still open, close it - if (isWebSocketOpen(websocket.current)) { - websocket.current.send(JSON.stringify(END_STREAM_DATA)); - if (closeWebsocket) { - websocket.current.close(); - } - } - - releaseMicrophone(); - if (analyser.current) { - analyser?.current?.disconnect(); - } - if (micWorkletNode.current) { - micWorkletNode.current.disconnect(); - } - if (micSourceNode.current) { - micSourceNode.current.disconnect(); - } - if (audioContext.current.state === 'running') { - await audioContext.current.close(); - } - }, - [releaseMicrophone, partialTranscript], - ); - - const onWebsocketMessage = useCallback( - (message: MessageEvent) => { - const result = JSON.parse(message.data) as Result; - const { event, data } = result; - switch (event) { - case Event.SEARCH_LOADING: - setIsLoading(true); - break; - case Event.SEARCH_RESULT: - setIsLoading(false); - setSearchResult(data as SearchResult); - if (!(data as SearchResult).matches?.length) { - logEmptySearchResults({ - query: data.queryText, - source: SearchQuerySource.Tarteel, - type: SearchType.Voice, - service: SearchService.Tarteel, - }); - } - stopRecording(); - break; - case Event.PARTIAL_TRANSCRIPT: - setIsLoading(false); - setPartialTranscript(data.queryText); - break; - case Event.ERROR: - setIsLoading(false); - logEvent('tarteel_error', { error: event }); - setError(VoiceError.RESPONSE_ERROR); - break; - default: - break; - } - }, - [stopRecording], - ); - - const addMicInputProcessorToAudioContext = useCallback(async () => { - try { - await audioContext.current.audioWorklet.addModule('/worklets/MicInputProcessor.js'); - logEvent('tarteel_websocket_initialize'); - setIsLoading(true); - - // 3. Start a new websocket - websocket.current = new WebSocket( - `wss://voice-v2.tarteel.io/search/?Authorization=${process.env.NEXT_PUBLIC_TARTEEL_VS_API_KEY}`, - ); - - websocket.current.onopen = () => { - logEvent('tarteel_websocket_open'); - setIsLoading(false); - analyser.current = audioContext.current.createAnalyser(); - analyser.current.smoothingTimeConstant = ANALYSER_SMOOTHING_CONSTANT; - analyser.current.fftSize = FAST_FOURIER_TRANSFORM_SIZE; - const volumes = new Uint8Array(analyser.current.frequencyBinCount); - micWorkletNode.current = new AudioWorkletNode(audioContext.current, 'MicInputProcessor'); - websocket.current.send(JSON.stringify(START_STREAM_DATA)); - micSourceNode.current.connect(analyser.current); - analyser.current.connect(micWorkletNode.current); - micWorkletNode.current.connect(audioContext.current.destination); - // Handling the data being posted from the MicInputProcessor. - micWorkletNode.current.port.onmessage = (event) => { - setVolume(getAverageVolume(analyser.current, volumes)); - // sometimes the processor hasn't sent the last bit of data yet but the websocket had already been closed. - if (isWebSocketOpen(websocket.current)) { - websocket.current.send(event.data); - } - }; - }; - - websocket.current.onmessage = (message: MessageEvent) => { - onWebsocketMessage(message); - }; - - websocket.current.onerror = () => { - logEvent('tarteel_websocket_error'); - setIsLoading(false); - setError(VoiceError.SOCKET_ERROR); - releaseMicrophone(); - }; - } catch (err) { - logEvent('voice_search_worklet_error'); - setError(VoiceError.WORKLET_ERROR); - } - }, [onWebsocketMessage, releaseMicrophone]); - - const startRecording = useCallback(async () => { - // re-set fields in-case this is not the first time we are running the voice search - setError(null); - setPartialTranscript(null); - setSearchResult(null); - setIsWaitingForPermission(true); - - audioContext.current = new window.AudioContext({ sampleRate: AUDIO_CONFIG.sampleRate }); - - try { - // 1. Ask for the user permission to access the mic - const stream = await navigator.mediaDevices.getUserMedia({ audio: AUDIO_CONSTRAINTS }); - mediaStream.current = stream; - try { - micSourceNode.current = audioContext.current.createMediaStreamSource(stream); - } catch (err) { - logEvent('voice_search_create_media_stream_error'); - // this will happen for Firefox users due to FF not accepting to change the sampleRate {@see https://bugzilla.mozilla.org/show_bug.cgi?id=1607781} - stopRecording(); - throw new Error(USER_MEDIA_NOT_SUPPORTED_ERROR); - } - - // 2. Add the MicInputProcessor to the audioContext - await addMicInputProcessorToAudioContext(); - } catch (getUserMedia) { - // if it's a custom thrown error when getUserMedia is not implemented in the browser - if (getUserMedia.message === USER_MEDIA_NOT_SUPPORTED_ERROR) { - logEvent('voice_search_not_supported'); - setError(VoiceError.NOT_SUPPORTED); - } else { - const isPermissionDenied = getUserMedia.name === 'NotAllowedError'; - if (isPermissionDenied) { - logEvent('voice_search_permission_denied'); - } - setError(isPermissionDenied ? VoiceError.NO_PERMISSION : VoiceError.GENERAL_ERROR); - } - } finally { - setIsWaitingForPermission(false); - } - }, [stopRecording, addMicInputProcessorToAudioContext]); - - return { - isLoading, - error, - partialTranscript, - searchResult, - volume, - isWaitingForPermission, - startRecording, - stopRecording, - }; -}; - -export default useTarteelVoiceSearch; diff --git a/src/lib/og.ts b/src/lib/og.ts index 92361389b4..42cb0fd960 100644 --- a/src/lib/og.ts +++ b/src/lib/og.ts @@ -35,3 +35,6 @@ export const getChapterOgImageUrl = ({ export const getWhatIsRamadanOgImageUrl = ({ locale }: BaseOgOptions) => `${BASE_OG_URL}/api/og/what-is-ramadan?lang=${locale}`; + +export const getExploreAnswersOgImageUrl = ({ locale }: BaseOgOptions) => + `${BASE_OG_URL}/api/og/explore-answers?lang=${locale}`; diff --git a/src/pages/[chapterId]/lessons.tsx b/src/pages/[chapterId]/lessons.tsx new file mode 100644 index 0000000000..792542f178 --- /dev/null +++ b/src/pages/[chapterId]/lessons.tsx @@ -0,0 +1,177 @@ +/* eslint-disable max-lines */ +/* eslint-disable react-func/max-lines-per-function */ +import React from 'react'; + +import { NextPage, GetStaticProps, GetStaticPaths } from 'next'; +import useTranslation from 'next-translate/useTranslation'; +import { SWRConfig } from 'swr'; + +import { fetcher } from '@/api'; +import NextSeoWrapper from '@/components/NextSeoWrapper'; +import ReflectionBodyContainer from '@/components/QuranReader/ReflectionView/ReflectionBodyContainer'; +import { getChapterOgImageUrl } from '@/lib/og'; +import Error from '@/pages/_error'; +import layoutStyle from '@/pages/index.module.scss'; +import { + getQuranReaderStylesInitialState, + getTranslationsInitialState, +} from '@/redux/defaultSettings/util'; +import { getDefaultWordFields, getMushafId } from '@/utils/api'; +import { makeVersesUrl } from '@/utils/apiPaths'; +import { getChapterData, getAllChaptersData } from '@/utils/chapter'; +import { getLanguageAlternates, toLocalizedNumber } from '@/utils/locale'; +import { + getCanonicalUrl, + getVerseLessonNavigationUrl, + scrollWindowToTop, +} from '@/utils/navigation'; +import { + getAyahReflections, + makeAyahReflectionsUrl, + LESSON_POST_TYPE_ID, +} from '@/utils/quranReflect/apiPaths'; +import { + REVALIDATION_PERIOD_ON_ERROR_SECONDS, + ONE_WEEK_REVALIDATION_PERIOD_SECONDS, +} from '@/utils/staticPageGeneration'; +import { isValidVerseKey } from '@/utils/validator'; +import { getVerseAndChapterNumbersFromKey } from '@/utils/verse'; +import { ChapterResponse } from 'types/ApiResponses'; +import ChaptersData from 'types/ChaptersData'; +import ContentType from 'types/QuranReflect/ContentType'; + +type AyahLessonProp = { + chapter?: ChapterResponse; + hasError?: boolean; + verseNumber?: string; + chapterId?: string; + chaptersData: ChaptersData; + fallback?: any; +}; + +const SelectedAyahLesson: NextPage = ({ + hasError, + chapter, + verseNumber, + chapterId, + fallback, +}) => { + const { t, lang } = useTranslation('quran-reader'); + if (hasError) { + return ; + } + + const navigationUrl = getVerseLessonNavigationUrl(`${chapterId}:${verseNumber}`); + return ( + <> + + {/* @ts-ignore */} + +
        +
        +
        + { + return ( +
        + {surahAndAyahSelection} + {body} +
        + ); + }} + /> +
        +
        +
        +
        + + ); +}; + +export const getStaticProps: GetStaticProps = async ({ params, locale }) => { + const { chapterId } = params; + const verseKey = String(chapterId); + const chaptersData = await getAllChaptersData(locale); + if (!isValidVerseKey(chaptersData, verseKey)) { + return { notFound: true }; + } + const [chapterNumber, verseNumber] = getVerseAndChapterNumbersFromKey(verseKey); + const { quranFont, mushafLines } = getQuranReaderStylesInitialState(locale); + const translations = getTranslationsInitialState(locale).selectedTranslations; + try { + const verseLessonsUrl = makeAyahReflectionsUrl({ + surahId: chapterNumber, + ayahNumber: verseNumber, + locale, + reviewed: true, + postTypeIds: [LESSON_POST_TYPE_ID], + }); + + const mushafId = getMushafId(quranFont, mushafLines).mushaf; + const apiParams = { + ...getDefaultWordFields(quranFont), + translationFields: 'resource_name,language_id', + translations: translations.join(','), + mushaf: mushafId, + from: `${chapterNumber}:${verseNumber}`, + to: `${chapterNumber}:${verseNumber}`, + }; + + const versesUrl = makeVersesUrl(chapterNumber, locale, apiParams); + + const [verseLessonsData, versesData] = await Promise.all([ + getAyahReflections(verseLessonsUrl), + fetcher(versesUrl), + ]); + + const fallback = { + [verseLessonsUrl]: verseLessonsData, + [versesUrl]: versesData, + }; + + return { + props: { + chaptersData, + chapterId: chapterNumber, + chapter: { chapter: getChapterData(chaptersData, chapterNumber) }, + verseNumber, + fallback, + }, + revalidate: ONE_WEEK_REVALIDATION_PERIOD_SECONDS, + }; + } catch (error) { + return { + props: { hasError: true }, + revalidate: REVALIDATION_PERIOD_ON_ERROR_SECONDS, + }; + } +}; + +export const getStaticPaths: GetStaticPaths = async () => ({ + paths: [], + fallback: 'blocking', +}); + +export default SelectedAyahLesson; diff --git a/src/pages/[chapterId]/reflections.tsx b/src/pages/[chapterId]/reflections.tsx index 0b4194c9e4..ccdce79a02 100644 --- a/src/pages/[chapterId]/reflections.tsx +++ b/src/pages/[chapterId]/reflections.tsx @@ -25,7 +25,11 @@ import { getVerseReflectionNavigationUrl, scrollWindowToTop, } from '@/utils/navigation'; -import { getAyahReflections, makeAyahReflectionsUrl } from '@/utils/quranReflect/apiPaths'; +import { + getAyahReflections, + makeAyahReflectionsUrl, + REFLECTION_POST_TYPE_ID, +} from '@/utils/quranReflect/apiPaths'; import { REVALIDATION_PERIOD_ON_ERROR_SECONDS, ONE_WEEK_REVALIDATION_PERIOD_SECONDS, @@ -119,6 +123,8 @@ export const getStaticProps: GetStaticProps = async ({ params, locale }) => { surahId: chapterNumber, ayahNumber: verseNumber, locale, + reviewed: true, + postTypeIds: [REFLECTION_POST_TYPE_ID], }); const mushafId = getMushafId(quranFont, mushafLines).mushaf; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index d56e2a684d..a5f0b9f74a 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -14,7 +14,6 @@ import DeveloperUtility from '@/components/DeveloperUtility/DeveloperUtility'; import FontPreLoader from '@/components/Fonts/FontPreLoader'; import GlobalListeners from '@/components/GlobalListeners'; import Navbar from '@/components/Navbar/Navbar'; -import OnboardingChecklist from '@/components/Onboarding/OnboardingChecklist'; import { OnboardingProvider } from '@/components/Onboarding/OnboardingProvider'; import SessionIncrementor from '@/components/SessionIncrementor'; import ThirdPartyScripts from '@/components/ThirdPartyScripts/ThirdPartyScripts'; @@ -97,7 +96,6 @@ function MyApp({ Component, pageProps }): JSX.Element {
        - diff --git a/src/pages/about-the-quran/about-the-quran.module.scss b/src/pages/about-the-quran/about-the-quran.module.scss new file mode 100644 index 0000000000..51af6ee914 --- /dev/null +++ b/src/pages/about-the-quran/about-the-quran.module.scss @@ -0,0 +1,27 @@ +.verseContainer { + margin-block: var(--spacing-large-px); + color: var(--color-text-black); + + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: var(--spacing-medium2-px); + gap: var(--spacing-small-px); + + background: var(--shade-0); + border-inline-start: 3px solid var(--color-qdc-blue); + border-radius: 0px var(--spacing-small-px) var(--spacing-small-px) 0px; +} + +.verseTranslation { + font-size: calc(2 * var(--spacing-xsmall-px)); + text-align: center; + line-height: normal !important; +} + +.translationName { + color: var(--color-text-faded); + font-size: var(--spacing-medium-px); + font-weight: var(--font-weight-semibold); +} diff --git a/src/pages/about-the-quran/index.tsx b/src/pages/about-the-quran/index.tsx index 2fd8ced2b0..6be1e911f6 100644 --- a/src/pages/about-the-quran/index.tsx +++ b/src/pages/about-the-quran/index.tsx @@ -8,14 +8,18 @@ import useTranslation from 'next-translate/useTranslation'; import styles from '../contentPage.module.scss'; +import pageStyles from './about-the-quran.module.scss'; + import NextSeoWrapper from '@/components/NextSeoWrapper'; import PageContainer from '@/components/PageContainer'; +import PlainVerseText from '@/components/Verse/PlainVerseText'; import Button, { ButtonVariant } from '@/dls/Button/Button'; -import Link from '@/dls/Link/Link'; +import Link, { LinkVariant } from '@/dls/Link/Link'; import { getAboutTheQuranImageUrl } from '@/lib/og'; import { logButtonClick } from '@/utils/eventLogger'; import { getLanguageAlternates } from '@/utils/locale'; import { getCanonicalUrl } from '@/utils/navigation'; +import verse3829 from 'src/data/verses/verse3829'; const PATH = '/about-quran'; const AboutQuranPage: NextPage = (): JSX.Element => { @@ -80,18 +84,22 @@ const AboutQuranPage: NextPage = (): JSX.Element => { until the Day of Judgment, and it will remain preserved from loss and distortion which affected previous scriptures in various ways.
        -
        - "˹This is˺ a blessed Book which We have revealed to you ˹O Prophet˺ so that they may - contemplate its verses, and people of reason may be mindful."{' '} - - 38:29 - +
        + +
        + "˹This is˺ a blessed Book which We have revealed to you ˹O Prophet˺ so that they may + contemplate its verses, and people of reason may be mindful."{' '} + + Sad 38:29 + +
        +

        - Dr. Mustafa Khattab, The Clear Quran

        We welcome you to Quran.com and invite you to read and listen to the Quran with an open heart, to deeply contemplate its verses, sincerely seek the knowledge contained within it, and to learn more using the resources on our site. We hope you will find - Quran.com beneficial and pray that the message of the Quran will enrich your life’s + Quran.com beneficial and pray that the message of the Quran will enrich your life's journey.
        @@ -129,7 +137,7 @@ const AboutQuranPage: NextPage = (): JSX.Element => { transmitted both orally and in writing from the time of the Prophet Muhammad ﷺ, who announced at the age of forty (around 610 CE) that he was receiving revelation of these words from an angel sent by the One God. The content of this message together - with the Prophet’s impeccable character, integrity and credibility created a + with the Prophet's impeccable character, integrity and credibility created a believing community, at first in Arabia, which carried the Quran to all parts of the world.
      • @@ -202,7 +210,7 @@ const AboutQuranPage: NextPage = (): JSX.Element => { The Surah consists of seven verses, and it is recited several times a day during the formal five daily prayers. The Surah begins with the phrase "Bismillahir-Rahmanir-Rahim," which means "In the name of God, the Most Merciful, the - Most Compassionate." This phrase is used to seek God’s blessings before beginning any + Most Compassionate." This phrase is used to seek God's blessings before beginning any task.
      diff --git a/src/pages/about-us.tsx b/src/pages/about-us.tsx index 8d329876d4..9bcba4f243 100644 --- a/src/pages/about-us.tsx +++ b/src/pages/about-us.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ /* eslint-disable jsx-a11y/anchor-has-content */ /* eslint-disable jsx-a11y/control-has-associated-label */ import Image from 'next/image'; @@ -9,7 +10,6 @@ import styles from './contentPage.module.scss'; import NextSeoWrapper from '@/components/NextSeoWrapper'; import PageContainer from '@/components/PageContainer'; import Link from '@/dls/Link/Link'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; import { getBlurDataUrl } from '@/utils/image'; import { getLanguageAlternates } from '@/utils/locale'; import { getCanonicalUrl } from '@/utils/navigation'; @@ -18,10 +18,6 @@ const path = '/about-us'; const AboutUsPage = () => { const { t, lang } = useTranslation('about'); - const onTarteelLinkClicked = () => { - logTarteelLinkClick('about_us_page'); - }; - return ( <> {

      {t('common:about')}

      - , - ]} - /> +

      -

      {t('credits.title')}

      + +

      {t('our-mission.title')}

      +

      {t('our-mission.desc')}

      + +

      {t('key-features.title')}

      +

      {t('key-features.desc')}

      +
        + {Array.isArray(t('key-features.features', {}, { returnObjects: true })) + ? (t('key-features.features', {}, { returnObjects: true }) as string[]).map( + (feature, index) => ( + // eslint-disable-next-line react/no-array-index-key +
      • {feature}
      • + ), + ) + : null} +
      + +

      {t('who-we-are.title')}

      +

      {t('who-we-are.desc')}

      + +

      {t('global-effort.title')}

      +

      {t('global-effort.desc')}

      + +

      {t('credits.title')}

      {t('credits.desc')}

      • @@ -98,6 +112,14 @@ const AboutUsPage = () => { ]} />
      • +
      • + , + ]} + /> +
      • .texts { - margin-inline-end: calc(1.2 * var(--spacing-mega)); - margin-inline-start: 0; - } -} -.layoutFlipped { - flex-direction: row-reverse; - - & > .texts { - margin-inline-start: calc(1.2 * var(--spacing-mega)); - margin-inline-end: 0; - } -} - -@include breakpoints.smallerThanMobileL { - .sideBySideLayout { - flex-direction: column; - } - - .layoutFlipped { - & > .texts { - margin-inline: 0; - } - } -} - -.appImage { - max-height: calc(13 * var(--spacing-mega)); -} - -.downloadButtonsContainer { - display: flex; - margin-block-start: var(--spacing-medium); - & > a:first-child { - margin-inline-end: var(--spacing-xsmall); - } -} diff --git a/src/pages/apps.tsx b/src/pages/apps.tsx deleted file mode 100644 index 8ac64f6fbf..0000000000 --- a/src/pages/apps.tsx +++ /dev/null @@ -1,121 +0,0 @@ -/* eslint-disable react/no-multi-comp */ -import classNames from 'classnames'; -import Image from 'next/image'; -import Trans from 'next-translate/Trans'; -import useTranslation from 'next-translate/useTranslation'; - -import styles from './apps.module.scss'; - -import NextSeoWrapper from '@/components/NextSeoWrapper'; -import PageContainer from '@/components/PageContainer'; -import Link from '@/dls/Link/Link'; -import QuranAppLogo from '@/public/images/quran-app-logo.png'; -import QuranAppImage from '@/public/images/quran-app.png'; -import TarteelAppImage from '@/public/images/tarteel-app.png'; -import { logTarteelLinkClick } from '@/utils/eventLogger'; -import { getLanguageAlternates } from '@/utils/locale'; -import { getCanonicalUrl } from '@/utils/navigation'; - -type AppProps = { - app: any; - isFlipped?: boolean; - isMain?: boolean; -}; -const App = ({ app, isFlipped, isMain }: AppProps) => { - const onTarteelAppClicked = (isIOS: boolean) => { - // eslint-disable-next-line i18next/no-literal-string - logTarteelLinkClick(`apps_page_${isIOS ? 'iOS' : 'android'}`); - }; - - return ( -
        -
        - {app.title} - {isMain ? ( -

        {app.title}

        - ) : ( -

        {app.title}

        - )} -

        {app.description}

        -
        - { - onTarteelAppClicked(true); - }, - })} - > - App Store - - { - onTarteelAppClicked(false); - }, - })} - > - Play Store - -
        -
        -
        - {app.title} -
        -
        - ); -}; - -const path = '/apps'; -const AppsPage = () => { - const { t, lang } = useTranslation(); - - const apps = { - quran: { - title: 'Quran.com', - description: t('apps:quran-desc'), - ios: 'https://itunes.apple.com/us/app/quran-by-quran.com-qran/id1118663303', - android: - 'https://play.google.com/store/apps/details?id=com.quran.labs.androidquran&utm_source=quran-com&utm_campaign=download', - preview: QuranAppImage, - logo: QuranAppLogo, - }, - tarteel: { - title: 'Tarteel.ai', - description: ]} />, - ios: 'https://apps.apple.com/app/tarteel/id1391009396', - android: 'https://play.google.com/store/apps/details?id=com.mmmoussa.iqra', - preview: TarteelAppImage, - logo: '/icons/tarteel-logo.svg', - isTarteel: true, - }, - }; - - return ( - <> - - - - - - - ); -}; - -export default AppsPage; diff --git a/src/pages/developers.tsx b/src/pages/developers.tsx index 894e19cb08..362451aad1 100644 --- a/src/pages/developers.tsx +++ b/src/pages/developers.tsx @@ -27,14 +27,6 @@ const DevelopersPage = () => {

        {t('header')}

        {t('main-desc')}

        -

        - , - ]} - /> -

        { + const { t } = useTranslation('login'); + const router = useRouter(); + const lang = router.locale; + return ( + <> + + + + + + ); +}; + +export const getStaticProps: GetStaticProps = async ({ locale }) => { + const allChaptersData = await getAllChaptersData(locale); + + return { + props: { + chaptersData: allChaptersData, + }, + }; +}; + +export default ForgotPasswordPage; diff --git a/src/pages/index.module.scss b/src/pages/index.module.scss index 95d6cf7453..ee222e3be6 100644 --- a/src/pages/index.module.scss +++ b/src/pages/index.module.scss @@ -10,9 +10,6 @@ $list-max-width: 80rem; @include breakpoints.smallerThanTablet { padding-block-start: var(--banner-height); } - @include breakpoints.tablet { - padding-block-start: var(--spacing-small); - } } .loadingContainer { @@ -63,3 +60,34 @@ $list-max-width: 80rem; } } } + +.homepageCard:not(:first-child) { + padding-block-start: var(--spacing-medium2-px); + @include breakpoints.tablet { + padding-block-start: var(--spacing-large-px); + } +} + +.homepageCard { + @include breakpoints.smallerThanTablet { + padding-inline: var(--spacing-small-px); + margin-inline: var(--spacing-medium2-px); + } + padding-block-end: var(--spacing-medium2-px); + @include breakpoints.tablet { + padding-block-end: var(--spacing-large-px); + } + border-bottom: 1px solid var(--color-separators); +} + +.mobileOnly { + @include utility.mobileOnly; +} + +.bodyContainer { + background: var(--color-background-elevated); + @include breakpoints.smallerThanTablet { + border-start-start-radius: var(--border-radius-rounded); + border-start-end-radius: var(--border-radius-rounded); + } +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 67c01af50a..0f0fb41c5c 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -5,18 +5,26 @@ import classNames from 'classnames'; import { NextPage, GetStaticProps } from 'next'; import Head from 'next/head'; import useTranslation from 'next-translate/useTranslation'; +import { useSelector } from 'react-redux'; import styles from './index.module.scss'; import ChapterAndJuzListWrapper from '@/components/chapters/ChapterAndJuzList'; +import HomepageFundraisingBanner from '@/components/Fundraising/HomepageFundraisingBanner'; +import CommunitySection from '@/components/HomePage/CommunitySection'; +import ExploreTopicsSection from '@/components/HomePage/ExploreTopicsSection'; import HomePageHero from '@/components/HomePage/HomePageHero'; +import LearningPlansSection from '@/components/HomePage/LearningPlansSection'; +import MobileHomepageSections from '@/components/HomePage/MobileHomepageSections'; import QuranGrowthJourneySection from '@/components/HomePage/QuranGrowthJourneySection'; -import RamadanActivitiesSection from '@/components/HomePage/RamadanActivitiesSection'; +import ReadingSection from '@/components/HomePage/ReadingSection'; import NextSeoWrapper from '@/components/NextSeoWrapper'; -import BookmarksAndCollectionsSection from '@/components/Verses/BookmarksAndCollectionsSection'; +import { selectIsHomepageBannerVisible } from '@/redux/slices/fundraisingBanner'; +import { isLoggedIn } from '@/utils/auth/login'; import { getAllChaptersData } from '@/utils/chapter'; import { getLanguageAlternates } from '@/utils/locale'; import { getCanonicalUrl } from '@/utils/navigation'; +import { isMobile } from '@/utils/responsive'; import { ChaptersResponse } from 'types/ApiResponses'; import ChaptersData from 'types/ChaptersData'; @@ -27,10 +35,13 @@ type IndexProps = { const Index: NextPage = ({ chaptersResponse: { chapters } }): JSX.Element => { const { t, lang } = useTranslation('home'); + const isUserLoggedIn = isLoggedIn(); + const isFundraisingBannerVisible = useSelector(selectIsHomepageBannerVisible); + return ( <> - + = ({ chaptersResponse: { chapters } }): JSX.El

        -
        - -
        -
        - -
        -
        - -
        -
        - +
        +
        + +
        + {isFundraisingBannerVisible && ( +
        + +
        + )} + {isMobile() ? ( + + ) : ( + <> + {isUserLoggedIn ? ( + <> +
        + +
        +
        + +
        +
        + +
        + + ) : ( + <> +
        + +
        +
        + +
        +
        + +
        + + )} + + )} + +
        + +
        +
        + +
        diff --git a/src/pages/login.tsx b/src/pages/login.tsx index 5f08034850..bafdf81ccc 100644 --- a/src/pages/login.tsx +++ b/src/pages/login.tsx @@ -8,6 +8,7 @@ import LoginContainer from '@/components/Login/LoginContainer'; import PageContainer from '@/components/PageContainer'; import { ToastStatus, useToast } from '@/dls/Toast/Toast'; import ChaptersData from '@/types/ChaptersData'; +import { BANNED_USER_ERROR_ID } from '@/utils/auth/constants'; import { getAllChaptersData } from '@/utils/chapter'; import { getLoginNavigationUrl } from '@/utils/navigation'; import AuthError from 'types/AuthError'; @@ -26,6 +27,9 @@ const LoginPage: NextPage = () => { if (errorId in AuthError) { return t(`login-error.${errorId}`); } + if (errorId === BANNED_USER_ERROR_ID) { + return t(`login-error.${AuthError.BannedUserError}`); + } return t(`login-error.${AuthError.AuthenticationError}`); }, [t], @@ -34,10 +38,11 @@ const LoginPage: NextPage = () => { useEffect(() => { if (query.error) { const errorMessage = getErrorMessage(query.error); - toast(errorMessage, { - status: ToastStatus.Error, + replace(getLoginNavigationUrl(), null, { shallow: true }).then(() => { + toast(errorMessage, { + status: ToastStatus.Error, + }); }); - replace(getLoginNavigationUrl(), null, { shallow: true }); } }, [query.error, toast, replace, t, getErrorMessage]); diff --git a/src/pages/media/[shortenURL]/index.tsx b/src/pages/media/[shortenURL]/index.tsx new file mode 100644 index 0000000000..9f8f0582a8 --- /dev/null +++ b/src/pages/media/[shortenURL]/index.tsx @@ -0,0 +1,30 @@ +import { GetServerSideProps } from 'next'; + +import { getFullUrlById } from '@/utils/auth/api'; + +const ShortenURL = () => {}; + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { shortenURL } = context.query; + + if (shortenURL) { + const response = await getFullUrlById(shortenURL as string); + if (response.url) { + return { + redirect: { + destination: response.url, + permanent: false, + }, + }; + } + } + + return { + redirect: { + destination: '/media', + permanent: false, + }, + }; +}; + +export default ShortenURL; diff --git a/src/pages/media/index.tsx b/src/pages/media/index.tsx index e2d8c45f26..6d1053c3eb 100644 --- a/src/pages/media/index.tsx +++ b/src/pages/media/index.tsx @@ -27,6 +27,7 @@ import { getMediaGeneratorOgImageUrl } from '@/lib/og'; import Error from '@/pages/_error'; import layoutStyles from '@/pages/index.module.scss'; import AudioData from '@/types/AudioData'; +import PreviewMode from '@/types/Media/PreviewMode'; import QueryParam from '@/types/QueryParam'; import { MushafLines, QuranFont } from '@/types/QuranReader'; import Reciter from '@/types/Reciter'; @@ -114,6 +115,7 @@ const MediaMaker: NextPage = ({ quranTextFontStyle, translationFontScale, orientation, + previewMode, } = mediaSettings; const queryParams = { @@ -132,6 +134,7 @@ const MediaMaker: NextPage = ({ [QueryParam.QURAN_TEXT_FONT_STYLE]: String(quranTextFontStyle), [QueryParam.TRANSLATION_FONT_SCALE]: String(translationFontScale), [QueryParam.ORIENTATION]: orientation, + [QueryParam.PREVIEW_MODE]: previewMode, }; useAddQueryParamsToUrl(getQuranMediaMakerNavigationUrl(queryParams), {}); @@ -430,16 +433,19 @@ const MediaMaker: NextPage = ({ />
        -
        - -
        + + {previewMode === PreviewMode.DISABLED && ( +
        + +
        + )}
      ); diff --git a/src/pages/profile.tsx b/src/pages/profile.tsx index a68f982cd1..cce1d75e9c 100644 --- a/src/pages/profile.tsx +++ b/src/pages/profile.tsx @@ -7,7 +7,6 @@ import useTranslation from 'next-translate/useTranslation'; import layoutStyle from './index.module.scss'; import styles from './profile.module.scss'; -import withAuth from '@/components/Auth/withAuth'; import NextSeoWrapper from '@/components/NextSeoWrapper'; import DeleteAccountButton from '@/components/Profile/DeleteAccountButton'; import BookmarksAndCollectionsSection from '@/components/Verses/BookmarksAndCollectionsSection'; @@ -39,7 +38,7 @@ const emailSample = 'mohammadali@quran.com'; const ProfilePage: NextPage = () => { const { t, lang } = useTranslation(); const router = useRouter(); - const { user, isLoading, error } = useCurrentUser(); + const { user, isLoading, error, isUserLoggedIn } = useCurrentUser(); const onLogoutClicked = async () => { if (!isLoggedIn()) { @@ -70,10 +69,37 @@ const ProfilePage: NextPage = () => {
      ); + const accountActions = ( +
      +
      + +
      +
      + +
      +
      + ); + const profileInfo = ( -
      -

      {`${firstName} ${lastName}`}

      -
      {email}
      +
      +
      +
      + {/* eslint-disable-next-line @next/next/no-img-element */} + avatar +
      + {isLoading ? ( + profileSkeletonInfoSkeleton + ) : ( +
      +

      {`${firstName} ${lastName}`}

      +
      {email}
      +
      + )} +
      ); @@ -89,19 +115,7 @@ const ProfilePage: NextPage = () => {
      -
      -
      -
      - {/* eslint-disable-next-line @next/next/no-img-element */} - avatar -
      - {isLoading ? profileSkeletonInfoSkeleton : profileInfo} -
      -
      + {isUserLoggedIn && profileInfo}
      = () => { >
      - -
      -
      - -
      -
      - -
      -
      + {isUserLoggedIn && accountActions}
      @@ -154,4 +152,4 @@ export const getStaticProps: GetStaticProps = async ({ locale }) => { }; }; -export default withAuth(ProfilePage); +export default ProfilePage; diff --git a/src/pages/questions/[questionId].tsx b/src/pages/questions/[questionId].tsx index c5fde50e24..5f82263560 100644 --- a/src/pages/questions/[questionId].tsx +++ b/src/pages/questions/[questionId].tsx @@ -8,6 +8,7 @@ import NextSeoWrapper from '@/components/NextSeoWrapper'; import PageContainer from '@/components/PageContainer'; import Answer from '@/components/QuestionAndAnswer/Answer'; import QuestionHeader from '@/components/QuestionAndAnswer/QuestionHeader'; +import { getExploreAnswersOgImageUrl } from '@/lib/og'; import Error from '@/pages/_error'; import contentPageStyles from '@/pages/contentPage.module.scss'; import styles from '@/pages/questions/questions.module.scss'; @@ -42,19 +43,15 @@ const QuestionPage: NextPage = ({ hasError, questionId, quest return ( <>
      diff --git a/src/pages/ramadan/index.tsx b/src/pages/ramadan/index.tsx index 685a170ddb..234d8aa0f7 100644 --- a/src/pages/ramadan/index.tsx +++ b/src/pages/ramadan/index.tsx @@ -21,12 +21,13 @@ import styles from '@/pages/contentPage.module.scss'; import pageStyles from '@/pages/ramadan/RamadanActivities.module.scss'; import AyahLevelSettings from '@/public/images/ayah-level-settings.jpeg'; import { makeDonatePageUrl } from '@/utils/apiPaths'; +import { isLoggedIn } from '@/utils/auth/login'; import { logButtonClick } from '@/utils/eventLogger'; import { getLanguageAlternates } from '@/utils/locale'; import { getCanonicalUrl, getCourseNavigationUrl, - getCoursesNavigationUrl, + getLoginNavigationUrl, getRamadanNavigationUrl, getReadingGoalNavigationUrl, } from '@/utils/navigation'; @@ -53,7 +54,7 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => {
      -

      Preparing for Ramadan: Deepen Your Connection with the Quran

      +

      Deepen Your Connection with the Quran this Ramadan

      Ramadan is a time of immense blessings and reflection, a month where hearts are softened and connections with the Quran are deepened. It’s the perfect opportunity to @@ -71,15 +72,22 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => {
    • +
    • +
    • +
    • @@ -113,7 +121,11 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => { onButtonClicked('goal_setting'); }} variant={ButtonVariant.Shadow} - href={getReadingGoalNavigationUrl()} + href={ + isLoggedIn() + ? getReadingGoalNavigationUrl() + : getLoginNavigationUrl(getReadingGoalNavigationUrl()) + } isNewTab className={styles.button} > @@ -122,12 +134,84 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => {

      -
      +

      Our Featured Ramadan Programs

      -

      Preparing Our Hearts for Ramadan

      +
      +
      +
      +

      Mindful Fasting: A Ramadan Learning Plan

      - Embark on a journey to mentally and spiritually prepare for Ramadan with our enhanced - Learning Plan, Preparing Our Hearts for Ramadan. This revised program is based on last + Discover the beauty of fasting beyond abstention with Mindful Fasting, a unique + Learning Plan designed to help you: +
      +
        +
      • Reflect on the deeper purpose of fasting.
      • +
      • Gain Quranic insights into patience, gratitude, and self-control.
      • +
      • Deepen your connection with Allah through intentional practices.
      • +
      +
      Start this learning plan now:
      +
      + +
      +
      +
      +
      +

      Quranic Duas: Reflect and Connect

      +
      + This Ramadan, join Shaykh Hammad Fahim and the QuranReflect community in a + transformative journey through the Duas in the Quran. Each session invites you to: +
      +
        +
      • Reflect deeply on selected Quranic supplications.
      • +
      • Understand the meaning and context of these powerful prayers.
      • +
      • Share and engage with reflections from a global community.
      • +
      +
      To participate, sign into QuranRelect:
      +
      + +
      +
      + Sign up on QuranReflect.com to automatically follow Shaykh Fahim and receive updates. + Explore{' '} + {' '} + throughout the month to read community reflections. +
      +
      +
      + (Already have a Quran.com account? Sign in with the same email to link your accounts.) +
      +
      +
      +
      +

      Preparing Our Hearts for Ramadan

      +
      + It's never too late to prepare for the days of Ramadan! Enhance your spiritual and + mental readiness with our Learning Plan, Preparing Our Hearts for Ramadan. Start today + and make the most of the blessed days ahead. This revised program is based on last year’s highly-rated course, enriched with additional insights and reflections to help you approach Ramadan with a rejuvenated focus.
      @@ -214,28 +298,6 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => {

      -
      -

      Mindful Fasting: A Ramadan Learning Plan

      -
      - Discover the beauty of fasting beyond abstention with Mindful Fasting, a unique - Learning Plan designed to help you: -
      -
        -
      • Reflect on the deeper purpose of fasting.
      • -
      • Gain Quranic insights into patience, gratitude, and self-control.
      • -
      • Deepen your connection with Allah through intentional practices.
      • -
      -
      - Launching: 1st day of Ramadan on{' '} - - , insha’Allah. -
      -
      -

      Share the Month of the Quran! Visit 'What Is Ramadan?'

      @@ -291,7 +353,13 @@ const PreparingForRamadanPage: NextPage = (): JSX.Element => { We remain committed to our mission to empower every human being to benefit from the Quran. The modern technology and human talent needed to accomplish our mission requires resources. Monthly donations help us retain top talent and sustain operations - so we focus less on fundraising and more on creating impact. + so we focus less on fundraising and more on creating impact. To learn more and donate, + visit: +
      -
      - } - isOpen={isContentModalOpen} - onClose={() => setIsContentModalOpen(false)} - > - - -
      - -
      - {/* eslint-disable-next-line i18next/no-literal-string */} - {t('search:searching-translations')}: - {formattedSelectedTranslations} -
      -
      -
      +
      +
      - { + return ( + + ); + }} + fetcher={fetcher} />
      @@ -385,32 +174,22 @@ const Search: NextPage = ({ translations }): JSX.Element => { export const getStaticProps: GetStaticProps = async ({ locale }) => { try { - const [availableLanguagesResponse, availableTranslationsResponse] = await Promise.all([ - getAvailableLanguages(locale), - getAvailableTranslations(locale), - ]); + const availableLanguagesResponse = await getAvailableLanguages(locale); - let translations = []; let languages = []; if (availableLanguagesResponse.status !== 500) { const { languages: responseLanguages } = availableLanguagesResponse; languages = responseLanguages; } - if (availableTranslationsResponse.status !== 500) { - const { translations: responseTranslations } = availableTranslationsResponse; - translations = responseTranslations; - } const chaptersData = await getAllChaptersData(locale); return { props: { chaptersData, languages, - translations, }, }; } catch (e) { - console.log(e); return { props: { hasError: true, @@ -419,4 +198,4 @@ export const getStaticProps: GetStaticProps = async ({ locale }) => { } }; -export default Search; +export default SearchPage; diff --git a/src/pages/support.tsx b/src/pages/support.tsx index b0ec614af3..5a1c1f1f9f 100644 --- a/src/pages/support.tsx +++ b/src/pages/support.tsx @@ -69,8 +69,6 @@ const SupportPage: NextPage = (): JSX.Element => { ]} />

      -

      {t('fiqh-q')}

      -

      {t('fiqh-a')}

      {t('tafsir-q')}

      {t('tafsir-a')}

      {t('translations-q')}

      @@ -95,7 +93,20 @@ const SupportPage: NextPage = (): JSX.Element => {

      ]} + components={[ + , + , + ]} />

      {/*

      diff --git a/src/redux/defaultSettings/locales/es.ts b/src/redux/defaultSettings/locales/es.ts new file mode 100644 index 0000000000..153db29985 --- /dev/null +++ b/src/redux/defaultSettings/locales/es.ts @@ -0,0 +1,8 @@ +import DEFAULT_SETTINGS, { DefaultSettings } from '../defaultSettings'; + +const DEFAULT_TRANSLATION = 83; // Sheikh Isa Garcia + +export default { + ...DEFAULT_SETTINGS, + translations: { ...DEFAULT_SETTINGS.translations, selectedTranslations: [DEFAULT_TRANSLATION] }, +} as DefaultSettings; diff --git a/src/redux/defaultSettings/locales/sw.ts b/src/redux/defaultSettings/locales/sw.ts new file mode 100644 index 0000000000..8a492d3ac3 --- /dev/null +++ b/src/redux/defaultSettings/locales/sw.ts @@ -0,0 +1,8 @@ +import DEFAULT_SETTINGS, { DefaultSettings } from '../defaultSettings'; + +const DEFAULT_TRANSLATION = 49; // Ali Muhsin Al-Barwani + +export default { + ...DEFAULT_SETTINGS, + translations: { ...DEFAULT_SETTINGS.translations, selectedTranslations: [DEFAULT_TRANSLATION] }, +} as DefaultSettings; diff --git a/src/redux/slices/CommandBar/persistConfig.ts b/src/redux/slices/CommandBar/persistConfig.ts index d9b070ed23..f6fc7a4c05 100644 --- a/src/redux/slices/CommandBar/persistConfig.ts +++ b/src/redux/slices/CommandBar/persistConfig.ts @@ -6,7 +6,7 @@ const commandBarPersistConfig = { key: SliceName.COMMAND_BAR, storage, version: 1, - blacklist: ['isOpen'], + blacklist: ['isExpanded'], }; export default commandBarPersistConfig; diff --git a/src/redux/slices/CommandBar/state.ts b/src/redux/slices/CommandBar/state.ts index 659967cd5c..596109ac7e 100644 --- a/src/redux/slices/CommandBar/state.ts +++ b/src/redux/slices/CommandBar/state.ts @@ -2,29 +2,21 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '@/redux/RootState'; import SliceName from '@/redux/types/SliceName'; -import { SearchNavigationResult } from 'types/SearchNavigationResult'; +import { SearchNavigationResult } from 'types/Search/SearchNavigationResult'; export type CommandBar = { - isOpen: boolean; recentNavigations: SearchNavigationResult[]; + isExpanded: boolean; }; const MAXIMUM_RECENT_NAVIGATIONS = 5; -const initialState: CommandBar = { isOpen: false, recentNavigations: [] }; +const initialState: CommandBar = { recentNavigations: [], isExpanded: false }; export const commandBarSlice = createSlice({ name: SliceName.COMMAND_BAR, initialState, reducers: { - setIsOpen: (state: CommandBar, action: PayloadAction) => ({ - ...state, - isOpen: action.payload, - }), - toggleIsOpen: (state: CommandBar) => ({ - ...state, - isOpen: !state.isOpen, - }), addRecentNavigation: (state: CommandBar, action: PayloadAction) => { let newRecentNavigations = [...state.recentNavigations]; const newRecentNavigation = action.payload; @@ -53,13 +45,24 @@ export const commandBarSlice = createSlice({ recentNavigations: newRecentNavigations, }; }, + toggleIsExpanded: (state: CommandBar) => { + return { + ...state, + isExpanded: !state.isExpanded, + }; + }, + setIsExpanded: (state: CommandBar, action: PayloadAction) => { + return { + ...state, + isExpanded: action.payload, + }; + }, }, }); -export const { setIsOpen, toggleIsOpen, addRecentNavigation, removeRecentNavigation } = +export const { addRecentNavigation, removeRecentNavigation, toggleIsExpanded, setIsExpanded } = commandBarSlice.actions; -export const selectCommandBarIsOpen = (state: RootState) => state.commandBar.isOpen; export const selectRecentNavigations = (state: RootState) => state.commandBar.recentNavigations; - +export const selectIsExpanded = (state: RootState) => state.commandBar.isExpanded; export default commandBarSlice.reducer; diff --git a/src/redux/slices/QuranReader/sidebarNavigation.ts b/src/redux/slices/QuranReader/sidebarNavigation.ts index ff24de5453..3d6ad4fad8 100644 --- a/src/redux/slices/QuranReader/sidebarNavigation.ts +++ b/src/redux/slices/QuranReader/sidebarNavigation.ts @@ -15,9 +15,10 @@ export enum NavigationItem { Page = 'page', RubElHizb = 'rub_el_hizb', Hizb = 'hizb', + Verse = 'verse', } -export const initialSidebarIsVisible = 'auto'; // sidebar will be open on desktop and closed on mobile +export const initialSidebarIsVisible = false; // sidebar will be closed by default const initialState: SidebarNavigation = { isVisible: initialSidebarIsVisible, selectedNavigationItem: NavigationItem.Surah, @@ -27,10 +28,14 @@ export const sidebarNavigationSlice = createSlice({ name: SliceName.SIDEBAR_NAVIGATION, initialState, reducers: { - setIsVisible: (state: SidebarNavigation, action: PayloadAction) => ({ + setIsSidebarNavigationVisible: (state: SidebarNavigation, action: PayloadAction) => ({ ...state, isVisible: action.payload, }), + toggleIsVisible: (state: SidebarNavigation) => ({ + ...state, + isVisible: !state.isVisible, + }), selectNavigationItem: (state: SidebarNavigation, action: PayloadAction) => ({ ...state, selectedNavigationItem: action.payload, @@ -38,7 +43,8 @@ export const sidebarNavigationSlice = createSlice({ }, }); -export const { setIsVisible, selectNavigationItem } = sidebarNavigationSlice.actions; +export const { setIsSidebarNavigationVisible, toggleIsVisible, selectNavigationItem } = + sidebarNavigationSlice.actions; export const selectIsSidebarNavigationVisible = (state: RootState) => state.sidebarNavigation.isVisible; diff --git a/src/redux/slices/fundraisingBanner.ts b/src/redux/slices/fundraisingBanner.ts new file mode 100644 index 0000000000..7fa2ca07c9 --- /dev/null +++ b/src/redux/slices/fundraisingBanner.ts @@ -0,0 +1,34 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; + +import { RootState } from '../RootState'; + +import SliceName from '@/redux/types/SliceName'; + +export type FundraisingBannerState = { + isHomepageBannerVisible: boolean; +}; + +const initialState: FundraisingBannerState = { + isHomepageBannerVisible: true, +}; + +export const fundraisingBannerSlice = createSlice({ + name: SliceName.FUNDRAISING_BANNER, + initialState, + reducers: { + setIsHomepageBannerVisible: ( + state: FundraisingBannerState, + action: PayloadAction, + ) => ({ + ...state, + isHomepageBannerVisible: action.payload, + }), + }, +}); + +export const { setIsHomepageBannerVisible } = fundraisingBannerSlice.actions; + +export const selectIsHomepageBannerVisible = (state: RootState) => + state.fundraisingBanner.isHomepageBannerVisible; + +export default fundraisingBannerSlice.reducer; diff --git a/src/redux/slices/mediaMaker.ts b/src/redux/slices/mediaMaker.ts index 75fa33c70e..8f7477c48c 100644 --- a/src/redux/slices/mediaMaker.ts +++ b/src/redux/slices/mediaMaker.ts @@ -11,6 +11,7 @@ import { DEFAULT_BORDER_SIZE, DEFAULT_FONT_COLOR, DEFAULT_OPACITY, + DEFAULT_PREVIEW_MODE, DEFAULT_QURAN_FONT_SCALE, DEFAULT_QURAN_FONT_STYLE, DEFAULT_RECITER_ID, @@ -38,6 +39,7 @@ const initialState: MediaSettings = { surah: DEFAULT_SURAH, verseFrom: '1', verseTo: '1', + previewMode: DEFAULT_PREVIEW_MODE, }; export const mediaGeneratorSlice = createSlice({ @@ -84,5 +86,6 @@ export const selectSurahAndVersesFromAndTo = (state: RootState) => ({ export const selectBorderColor = (state: RootState) => state.mediaMaker.borderColor; export const selectBorderSize = (state: RootState) => state.mediaMaker.borderSize; export const selectBackgroundColor = (state: RootState) => state.mediaMaker.backgroundColor; +export const selectPreviewMode = (state: RootState) => state.mediaMaker.previewMode; export default mediaGeneratorSlice.reducer; diff --git a/src/redux/slices/navbar.ts b/src/redux/slices/navbar.ts index 21544ba6f9..caf8c752dd 100644 --- a/src/redux/slices/navbar.ts +++ b/src/redux/slices/navbar.ts @@ -17,6 +17,7 @@ export type Navbar = { isSearchDrawerOpen: boolean; isSettingsDrawerOpen: boolean; settingsView: SettingsView; + disableSearchDrawerTransition: boolean; }; const initialState: Navbar = { @@ -25,6 +26,7 @@ const initialState: Navbar = { isSearchDrawerOpen: false, isSettingsDrawerOpen: false, settingsView: SettingsView.Body, + disableSearchDrawerTransition: false, }; export const navbarSlice = createSlice({ @@ -43,6 +45,10 @@ export const navbarSlice = createSlice({ ...state, isSearchDrawerOpen: action.payload, }), + toggleSearchDrawerIsOpen: (state: Navbar) => ({ + ...state, + isSearchDrawerOpen: !state.isSearchDrawerOpen, + }), setIsSettingsDrawerOpen: (state: Navbar, action: PayloadAction) => ({ ...state, isSettingsDrawerOpen: action.payload, @@ -51,6 +57,10 @@ export const navbarSlice = createSlice({ ...state, settingsView: action.payload, }), + setDisableSearchDrawerTransition: (state: Navbar, action: PayloadAction) => ({ + ...state, + disableSearchDrawerTransition: action.payload, + }), }, }); @@ -60,8 +70,11 @@ export const { setIsSearchDrawerOpen, setIsSettingsDrawerOpen, setSettingsView, + toggleSearchDrawerIsOpen, + setDisableSearchDrawerTransition, } = navbarSlice.actions; export const selectNavbar = (state: RootState) => state.navbar; +export const selectIsSearchDrawerOpen = (state: RootState) => state.navbar.isSearchDrawerOpen; export default navbarSlice.reducer; diff --git a/src/redux/slices/session.ts b/src/redux/slices/session.ts index 48fd655952..83a0dd43de 100644 --- a/src/redux/slices/session.ts +++ b/src/redux/slices/session.ts @@ -3,6 +3,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../RootState'; import SliceName from '@/redux/types/SliceName'; +import { isLoggedIn } from '@/utils/auth/login'; export type SessionState = { count: number; @@ -32,6 +33,15 @@ export const sessionSlice = createSlice({ export const { incrementSessionCount, setIsDonationPopupVisible } = sessionSlice.actions; export const selectSessionCount = (state: RootState) => state.session.count; +export const selectUserState = (state: RootState) => { + const isGuest = !isLoggedIn(); + return { + isGuest, + isFirstTimeGuest: isGuest && state.session.count === 2, + hasReadingSessions: !!state.readingTracker.lastReadVerse.chapterId, + lastReadVerse: state?.readingTracker?.lastReadVerse, + }; +}; export const selectIsDonationPopupVisible = (state: RootState) => state.session.isDonationPopupVisible; diff --git a/src/redux/slices/voiceSearch.ts b/src/redux/slices/voiceSearch.ts deleted file mode 100644 index fc33a69ad0..0000000000 --- a/src/redux/slices/voiceSearch.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createSlice } from '@reduxjs/toolkit'; - -import { RootState } from '../RootState'; - -import SliceName from '@/redux/types/SliceName'; - -export type InitialState = { - isSearchDrawerVoiceFlowStarted: boolean; - isCommandBardVoiceFlowStarted: boolean; -}; - -export const initialState: InitialState = { - isSearchDrawerVoiceFlowStarted: false, - isCommandBardVoiceFlowStarted: false, -}; - -export const voiceSearchSlice = createSlice({ - name: SliceName.VOICE_SEARCH, - initialState, - reducers: { - toggleIsSearchDrawerVoiceFlowStarted: (state) => ({ - ...state, - isSearchDrawerVoiceFlowStarted: !state.isSearchDrawerVoiceFlowStarted, - }), - stopSearchDrawerVoiceFlow: (state) => ({ - ...state, - isSearchDrawerVoiceFlowStarted: false, - }), - stopCommandBarVoiceFlow: (state) => ({ - ...state, - isCommandBardVoiceFlowStarted: false, - }), - toggleIsCommandBarVoiceFlowStarted: (state) => ({ - ...state, - isCommandBardVoiceFlowStarted: !state.isCommandBardVoiceFlowStarted, - }), - }, -}); - -export const selectIsSearchDrawerVoiceFlowStarted = (state: RootState) => - state.voiceSearch.isSearchDrawerVoiceFlowStarted; -export const selectIsCommandBarVoiceFlowStarted = (state: RootState) => - state.voiceSearch.isCommandBardVoiceFlowStarted; -export const { - toggleIsSearchDrawerVoiceFlowStarted, - toggleIsCommandBarVoiceFlowStarted, - stopSearchDrawerVoiceFlow, - stopCommandBarVoiceFlow, -} = voiceSearchSlice.actions; -export default voiceSearchSlice.reducer; diff --git a/src/redux/store.ts b/src/redux/store.ts index a9bebc44ba..8426de9f61 100644 --- a/src/redux/store.ts +++ b/src/redux/store.ts @@ -20,6 +20,7 @@ import banner from './slices/banner'; import commandBarPersistConfig from './slices/CommandBar/persistConfig'; import commandBar from './slices/CommandBar/state'; import defaultSettings from './slices/defaultSettings'; +import fundraisingBanner from './slices/fundraisingBanner'; import mediaMaker from './slices/mediaMaker'; import navbar from './slices/navbar'; import notifications from './slices/notifications'; @@ -40,7 +41,6 @@ import revelationOrder from './slices/revelationOrder'; import search from './slices/Search/search'; import session from './slices/session'; import theme from './slices/theme'; -import voiceSearch from './slices/voiceSearch'; import welcomeMessage from './slices/welcomeMessage'; import SliceName from './types/SliceName'; @@ -63,6 +63,7 @@ const persistConfig = { SliceName.DEFAULT_SETTINGS, SliceName.SIDEBAR_NAVIGATION, SliceName.BANNER, + SliceName.FUNDRAISING_BANNER, SliceName.SESSION, SliceName.BOOKMARKS, SliceName.USER_DATA_SYNC, @@ -87,12 +88,12 @@ export const rootReducer = combineReducers({ readingTracker, commandBar: persistReducer(commandBarPersistConfig, commandBar), welcomeMessage, - voiceSearch, defaultSettings, fontFaces, sidebarNavigation, readingViewVerse, banner, + fundraisingBanner, session, persistGateHydration, revelationOrder, diff --git a/src/redux/types/SliceName.ts b/src/redux/types/SliceName.ts index cbf708e67e..4b7bd3695f 100644 --- a/src/redux/types/SliceName.ts +++ b/src/redux/types/SliceName.ts @@ -7,10 +7,10 @@ enum SliceName { AUDIO_PLAYER_STATE = 'audioPlayerState', DEFAULT_SETTINGS = 'defaultSettings', BANNER = 'banner', + FUNDRAISING_BANNER = 'fundraisingBanner', NAVBAR = 'navbar', SESSION = 'session', BOOKMARKS = 'bookmarks', - VOICE_SEARCH = 'voiceSearch', WELCOME_MESSAGE = 'welcomeMessage', COMMAND_BAR = 'commandBar', CONTEXT_MENU = 'contextMenu', diff --git a/src/styles/_utility.scss b/src/styles/_utility.scss index 1dc336b498..db15e43daf 100644 --- a/src/styles/_utility.scss +++ b/src/styles/_utility.scss @@ -17,11 +17,7 @@ } @mixin lighten-background-color { - background-image: linear-gradient( - to right, - var(--color-background-lighten), - var(--color-background-lighten) - ); + background-image: linear-gradient(to right, var(--color-background-lighten), var(--color-background-lighten)); } // On mobile, font size 1-3 will try to preserve the line, using flex @@ -32,7 +28,7 @@ $line-heights-map: ( tajweed: ( - tablet: (), + tablet: () ), fallback_qpc_uthmani_hafs: ( tablet: ( @@ -45,8 +41,8 @@ $line-heights-map: ( 7: 10.61vh, 8: 13.07vh, 9: 15.54vh, - 10: 18vh, - ), + 10: 18vh + ) ), qpc_uthmani_hafs: ( tablet: ( @@ -59,8 +55,8 @@ $line-heights-map: ( 7: 10.61vh, 8: 13.07vh, 9: 15.54vh, - 10: 18vh, - ), + 10: 18vh + ) ), text_indopak_15_lines: ( tablet: ( @@ -73,8 +69,8 @@ $line-heights-map: ( 7: 11.01vh, 8: 13.67vh, 9: 16.34vh, - 10: 19vh, - ), + 10: 19vh + ) ), text_indopak_16_lines: ( tablet: ( @@ -87,8 +83,8 @@ $line-heights-map: ( 7: 9.12vh, 8: 10.88vh, 9: 12.64vh, - 10: 14.4vh, - ), + 10: 14.4vh + ) ), code_v2: ( tablet: ( @@ -101,8 +97,8 @@ $line-heights-map: ( 7: 12.46vh, 8: 15.64vh, 9: 18.82vh, - 10: 22vh, - ), + 10: 22vh + ) ), tajweed_v4: ( tablet: ( @@ -115,8 +111,8 @@ $line-heights-map: ( 7: 12.46vh, 8: 15.64vh, 9: 18.82vh, - 10: 22vh, - ), + 10: 22vh + ) ), code_v1: ( tablet: ( @@ -129,8 +125,8 @@ $line-heights-map: ( 7: 11vh, 8: 14vh, 9: 17vh, - 10: 20vh, - ), + 10: 20vh + ) ), translation: ( tablet: ( @@ -138,8 +134,8 @@ $line-heights-map: ( 2: 3.5vh, 3: 4vh, 4: 4.2vh, - 5: 4.3vh, - ), + 5: 4.3vh + ) ), tafsir: ( tablet: ( @@ -147,9 +143,9 @@ $line-heights-map: ( 2: 3.5vh, 3: 4vh, 4: 4.2vh, - 5: 4.3vh, - ), - ), + 5: 4.3vh + ) + ) ); // TODO: rename to $font-size-scales-map @@ -165,7 +161,7 @@ $scales-map: ( 7: 6.7vh, 8: 7.85vh, 9: 9vh, - 10: 10.15vh, + 10: 10.15vh ), mobile: ( 1: 4vw, @@ -177,8 +173,8 @@ $scales-map: ( 7: 13vw, 8: 14vw, 9: 15vw, - 10: 16vw, - ), + 10: 16vw + ) ), //TODO: rename qpc_uthmani_hafs to text_qpc_hafs qpc_uthmani_hafs: @@ -193,7 +189,7 @@ $scales-map: ( 7: 6.72vh, 8: 7.88vh, 9: 9.04vh, - 10: 10.27vh, + 10: 10.27vh ), mobile: ( 1: 4vw, @@ -205,8 +201,8 @@ $scales-map: ( 7: 13vw, 8: 14vw, 9: 15vw, - 10: 16vw, - ), + 10: 16vw + ) ), text_indopak_15_lines: ( tablet: ( @@ -219,7 +215,7 @@ $scales-map: ( 7: 6.98vh, 8: 8.32vh, 9: 9.66vh, - 10: 11vh, + 10: 11vh ), mobile: ( 1: 4.4vw, @@ -231,8 +227,8 @@ $scales-map: ( 7: 10.2vw, 8: 11vw, 9: 12vw, - 10: 13vw, - ), + 10: 13vw + ) ), text_indopak_16_lines: ( tablet: ( @@ -245,7 +241,7 @@ $scales-map: ( 7: 6.21vh, 8: 7.34vh, 9: 8.47vh, - 10: 9.6vh, + 10: 9.6vh ), mobile: ( 1: 4.4vw, @@ -257,8 +253,8 @@ $scales-map: ( 7: 10.2vw, 8: 11vw, 9: 12vw, - 10: 13vw, - ), + 10: 13vw + ) ), code_v2: ( tablet: ( @@ -271,7 +267,7 @@ $scales-map: ( 7: 6.62vh, 8: 8.08vh, 9: 9.54vh, - 10: 11vh, + 10: 11vh ), mobile: ( 1: 4vw, @@ -283,8 +279,8 @@ $scales-map: ( 7: 12vw, 8: 13vw, 9: 14vw, - 10: 15vw, - ), + 10: 15vw + ) ), tajweed_v4: ( tablet: ( @@ -297,7 +293,7 @@ $scales-map: ( 7: 6.62vh, 8: 8.08vh, 9: 9.54vh, - 10: 11vh, + 10: 11vh ), mobile: ( 1: 4vw, @@ -309,8 +305,8 @@ $scales-map: ( 7: 12vw, 8: 13vw, 9: 14vw, - 10: 15vw, - ), + 10: 15vw + ) ), code_v1: ( tablet: ( @@ -323,7 +319,7 @@ $scales-map: ( 7: 7.77vh, 8: 9.42vh, 9: 11.05vh, - 10: 12.7vh, + 10: 12.7vh ), mobile: ( 1: 4vw, @@ -335,8 +331,8 @@ $scales-map: ( 7: 14vw, 8: 15vw, 9: 16vw, - 10: 17vw, - ), + 10: 17vw + ) ), translation: ( tablet: ( @@ -349,7 +345,7 @@ $scales-map: ( 7: 2.7rem, 8: 3rem, 9: 3.5rem, - 10: 4rem, + 10: 4rem ), mobile: ( 1: 0.85rem, @@ -361,8 +357,8 @@ $scales-map: ( 7: 2.1rem, 8: 2.4rem, 9: 2.75rem, - 10: 3rem, - ), + 10: 3rem + ) ), tafsir: ( tablet: ( @@ -375,7 +371,7 @@ $scales-map: ( 7: 2.7rem, 8: 3rem, 9: 3.5rem, - 10: 4rem, + 10: 4rem ), mobile: ( 1: 0.85rem, @@ -387,13 +383,13 @@ $scales-map: ( 7: 2.1rem, 8: 2.4rem, 9: 2.75rem, - 10: 3rem, - ), + 10: 3rem + ) ), tajweed: ( tablet: (), - mobile: (), - ), + mobile: () + ) ); $skeleton-height-map: ( @@ -408,7 +404,7 @@ $skeleton-height-map: ( 7: 5.8rem, 8: 5.9rem, 9: 6.05rem, - 10: 6.15rem, + 10: 6.15rem ), mobile: ( 1: 1.9rem, @@ -420,8 +416,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), qpc_uthmani_hafs: ( desktop: ( @@ -434,7 +430,7 @@ $skeleton-height-map: ( 7: 9.2vh, 8: 11.72vh, 9: 14.21vh, - 10: 16.6vh, + 10: 16.6vh ), mobile: ( 1: 4.55vw, @@ -446,8 +442,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), text_indopak_15_lines: ( desktop: ( @@ -460,7 +456,7 @@ $skeleton-height-map: ( 7: 9.66vh, 8: 12.38vh, 9: 15.03vh, - 10: 17.65vh, + 10: 17.65vh ), mobile: ( 1: 6.8vw, @@ -472,8 +468,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), text_indopak_16_lines: ( desktop: ( @@ -486,7 +482,7 @@ $skeleton-height-map: ( 7: 7.64vh, 8: 9.44vh, 9: 11.15vh, - 10: 12.86vh, + 10: 12.86vh ), mobile: ( 1: 6.8vw, @@ -498,8 +494,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), code_v2: ( desktop: ( @@ -512,7 +508,7 @@ $skeleton-height-map: ( 7: 11.03vh, 8: 14.22vh, 9: 17.41vh, - 10: 20.6vh, + 10: 20.6vh ), mobile: ( 1: 4.17vw, @@ -524,8 +520,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), tajweed_v4: ( desktop: ( @@ -538,7 +534,7 @@ $skeleton-height-map: ( 7: 11.03vh, 8: 14.22vh, 9: 17.41vh, - 10: 20.6vh, + 10: 20.6vh ), mobile: ( 1: 4.17vw, @@ -550,8 +546,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), code_v1: ( desktop: ( @@ -564,7 +560,7 @@ $skeleton-height-map: ( 7: 9.94vh, 8: 12.63vh, 9: 15.55vh, - 10: 18.6vh, + 10: 18.6vh ), mobile: ( 1: 5.08vw, @@ -576,8 +572,8 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), + 10: 1rem + ) ), default: ( desktop: ( @@ -590,7 +586,7 @@ $skeleton-height-map: ( 7: 9.2vh, 8: 11.72vh, 9: 14.21vh, - 10: 16.6vh, + 10: 16.6vh ), mobile: ( 1: 4vw, @@ -602,9 +598,9 @@ $skeleton-height-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, - ), - ), + 10: 1rem + ) + ) ); // for now, we're only doing fixed witdth for tablet & desktop. @@ -622,8 +618,8 @@ $line-width-map: ( 7: calc(25.6 * var(--spacing-mega)), 8: calc(26.2 * var(--spacing-mega)), 9: calc(27 * var(--spacing-mega)), - 10: calc(27.3 * var(--spacing-mega)), - ), + 10: calc(27.3 * var(--spacing-mega)) + ) ), fallback_qpc_uthmani_hafs: ( tablet: ( @@ -636,7 +632,7 @@ $line-width-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, + 10: 1rem ), desktop: ( 1: 56vh, @@ -648,8 +644,8 @@ $line-width-map: ( 7: 124.3vh, 8: 146.2vh, 9: 168vh, - 10: 190vh, - ), + 10: 190vh + ) ), qpc_uthmani_hafs: ( tablet: ( @@ -662,7 +658,7 @@ $line-width-map: ( 7: 1rem, 8: 1rem, 9: 1rem, - 10: 1rem, + 10: 1rem ), desktop: ( 1: 60vh, @@ -674,8 +670,8 @@ $line-width-map: ( 7: 124.6vh, 8: 146.4vh, 9: 168.2vh, - 10: 190vh, - ), + 10: 190vh + ) ), text_indopak_15_lines: ( tablet: ( @@ -688,8 +684,8 @@ $line-width-map: ( 7: 121.2vh, 8: 143.8vh, 9: 166.4vh, - 10: 189vh, - ), + 10: 189vh + ) ), text_indopak_16_lines: ( tablet: ( @@ -702,8 +698,8 @@ $line-width-map: ( 7: 117.4vh, 8: 141.6vh, 9: 165.8vh, - 10: 190vh, - ), + 10: 190vh + ) ), code_v2: ( tablet: ( @@ -716,8 +712,8 @@ $line-width-map: ( 7: 116.3vh, 8: 142.2vh, 9: 168.1vh, - 10: 194vh, - ), + 10: 194vh + ) ), tajweed_v4: ( tablet: ( @@ -730,8 +726,8 @@ $line-width-map: ( 7: 116.3vh, 8: 142.2vh, 9: 168.1vh, - 10: 194vh, - ), + 10: 194vh + ) ), code_v1: ( tablet: ( @@ -744,9 +740,9 @@ $line-width-map: ( 7: 116.2vh, 8: 140.8vh, 9: 165.4vh, - 10: 190vh, - ), - ), + 10: 190vh + ) + ) ); @function map-deep-get($map, $keys...) { @@ -796,38 +792,18 @@ $line-width-map: ( // reading view skeletons mapping @if map.has-key($skeleton-height-map, $name) { - $desktop-skeleton-height-scales: get-scales( - $name, - "desktop", - $skeleton-height-map - ); - $mobile-skeleton-height-scales: get-scales( - $name, - "mobile", - $skeleton-height-map - ); + $desktop-skeleton-height-scales: get-scales($name, "desktop", $skeleton-height-map); + $mobile-skeleton-height-scales: get-scales($name, "mobile", $skeleton-height-map); } @else { - $desktop-skeleton-height-scales: get-scales( - "default", - "desktop", - $skeleton-height-map - ); - $mobile-skeleton-height-scales: get-scales( - "default", - "mobile", - $skeleton-height-map - ); + $desktop-skeleton-height-scales: get-scales("default", "desktop", $skeleton-height-map); + $mobile-skeleton-height-scales: get-scales("default", "mobile", $skeleton-height-map); } // line heights mapping @if map.has-key($line-heights-map, $name) { $tablet-line-height-scales: get-scales($name, "tablet", $line-heights-map); } @else { - $tablet-line-height-scales: get-scales( - "default", - "tablet", - $line-heights-map - ); + $tablet-line-height-scales: get-scales("default", "tablet", $line-heights-map); } // font scales mapping @@ -870,6 +846,12 @@ $page-container-max-width: 80rem; @mixin pageContainer { max-width: $page-container-max-width; @include breakpoints.tablet { - width: 80%; + width: 1230px; + } +} + +@mixin mobileOnly { + @include breakpoints.tablet { + display: none; } } diff --git a/src/styles/auth/auth.module.scss b/src/styles/auth/auth.module.scss new file mode 100644 index 0000000000..82727344e2 --- /dev/null +++ b/src/styles/auth/auth.module.scss @@ -0,0 +1,86 @@ +@use "src/styles/theme"; +@use "src/styles/breakpoints"; + +.outerContainer { + min-height: 80vh; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin-inline: auto; + + @include breakpoints.desktop { + max-width: 480px; + } +} + +.innerContainer { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + font-size: var(--font-size-xlarge); + font-weight: var(--font-weight-bold); + color: var(--color-text-default); + margin-bottom: var(--spacing-large); + text-align: center; +} + +.description { + font-size: var(--font-size-large); + color: var(--color-text-default); + text-align: center; + margin: 0; + margin-bottom: var(--spacing-xlarge); + line-height: 1.5; +} + +.formContainer { + width: 90%; + display: flex; + flex-direction: column; + gap: var(--spacing-large); + margin-top: var(--spacing-large); + + input { + border: none; + width: 90%; + background: transparent; + color: var(--color-text-default); + + &::placeholder { + color: var(--color-text-faded); + } + + &:focus { + outline: none; + } + } +} + +.submitButton { + width: 90%; + padding: var(--spacing-medium); + font-size: var(--font-size-normal); + font-weight: var(--font-weight-bold); + border-radius: var(--border-radius-pill); + background-color: var(--color-success-medium); + color: var(--color-text-inverse); + border: none; + cursor: pointer; + transition: all 0.2s ease-in-out; + margin-top: var(--spacing-medium); + + &:hover { + background-color: var(--color-success-dark); + } +} + +.backButton { + width: 50%; + margin-block: var(--spacing-medium); + border-radius: var(--border-radius-pill); +} diff --git a/src/styles/theme.scss b/src/styles/theme.scss index 05688330e3..668efe06a3 100644 --- a/src/styles/theme.scss +++ b/src/styles/theme.scss @@ -32,6 +32,16 @@ --font-size-xlarge: 1.5rem; --font-size-jumbo: 2rem; + --font-size-xsmall-px: 14px; + --font-size-small-px: 16px; + --font-size-medium-px: 18px; + --font-size-normal-px: 20px; + --font-size-large-px: 24px; + --font-size-xlarge-px: 26px; + --font-size-xxlarge-px: 32px; + --font-size-jumbo-px: 40px; + --font-size-xjumbo-px: 64px; + --line-height-small: 0.8125rem; --line-height-normal: 1rem; --line-height-large: 1.1875rem; @@ -47,8 +57,9 @@ --border-radius-sharp: 0; --border-radius-pill: 20rem; --border-radius-default: 0.25rem; - --border-radius-rounded: 0.5rem; + --border-radius-rounded: 15px; --border-radius-circle: 50%; + --border-radius-circle-small: 30px; --opacity-10: 10%; --opacity-30: 30%; diff --git a/src/styles/themes/_dark.scss b/src/styles/themes/_dark.scss index e723347e08..6c0992ddca 100644 --- a/src/styles/themes/_dark.scss +++ b/src/styles/themes/_dark.scss @@ -26,15 +26,21 @@ --color-warning-medium: #ffb300; --color-warning-deep: #ab570a; + --color-text-default-new: #ffffff; --color-text-default: #e7e9ea; --color-text-faded: #777; + --color-text-faded-new: #dee2e6; --color-text-inverse: #000; --color-text-link: #2ca4ab; + --color-text-link-new: #2ca4ab; --color-text-warning: #f7b955; --color-text-error: #f33; + --color-text-black: #000000; + --color-text-white: #ffffff; + --color-text-gray: #495057; --color-background-default: #1f2125; - --color-background-elevated: var(--shade-8); + --color-background-elevated: #1f2125; --color-background-alternative-faded: var(--shade-9); --color-background-alternative-faint: var(--shade-8); @@ -52,11 +58,13 @@ --shadow-small: 0px 2px 4px var(--shade-9); --shadow-normal: 0px 4px 8px var(--shade-9); + --shadow-medium: 0px 4px 10px 0px rgba(0, 0, 0, 0.1); --shadow-large: 0 5px 10px var(--shade-9); --shadow-xlarge: 0 8px 30px var(--shade-9); --shadow-jumbo: 0 30px 60px var(--shade-9); --shadow-hover: 0 30px 60px var(--shade-9); --shadow-sticky: 0 12px 10px -10px var(--shade-9); + --shadow-strong: 0px 4px 4px 0px rgba(0, 0, 0, 0.5); font-palette: --Dark; // scrollbar styles @@ -64,4 +72,24 @@ --scrollbar-thumb: var(--shade-7); --scrollbar-thumb-hover: var(--shade-6); --scrollbar-thumb-active: var(--shade-5); + + --color-grey-icons: #868e96; + --color-daily-progress: #adb5bd; + --color-separators: #1e2225; + --color-blue-buttons-and-icons: #2ca4ab; + --color-faint-blue-icons: #c2edef; + --color-black-buttons: #ffffff; + --color-topics-grey: #161616; + --color-topics-gold: #56354c; + --color-gqc: #cb955b; + --color-qdc-blue: #22a5ad; + --color-qdc-faded-blue: #ebf9fa; + --color-qdc-faint-blue: #c2edef; + --color-qdc-deep-blue: #258c91; + --color-streaks-dark: #1c4428; + --color-streaks-light: #93b69d; + --color-calligraphy: #060606; + --color-scholars-say-background: #fff8e4; + --color-scholars-say-text: #7c6e21; + --color-search-background: #000000; } diff --git a/src/styles/themes/_light.scss b/src/styles/themes/_light.scss index 15d4000dea..6d741f277c 100644 --- a/src/styles/themes/_light.scss +++ b/src/styles/themes/_light.scss @@ -26,12 +26,18 @@ --color-warning-medium: #ffb300; --color-warning-deep: #ab570a; + --color-text-default-new: #272727; --color-text-default: #272727; --color-text-faded: #666; + --color-text-faded-new: #666666; --color-text-inverse: #fff; --color-text-link: #2ca4ab; + --color-text-link-new: #2ca4ab; --color-text-warning: #ab570a; --color-text-error: #c50000; + --color-text-black: #000000; + --color-text-white: #ffffff; + --color-text-gray: #495057; --color-background-default: #fff; --color-background-elevated: #fff; @@ -49,14 +55,17 @@ --color-borders-hairline: rgb(235, 238, 240); --color-highlight: #79ffe1; + --color-highlight-dark: #22a5ad; --shadow-small: 0px 2px 4px rgba(0, 0, 0, 0.1); --shadow-normal: 0px 4px 8px rgba(0, 0, 0, 0.12); + --shadow-medium: 0px 4px 10px 0px rgba(0, 0, 0, 0.1); --shadow-large: 0 5px 10px rgba(0, 0, 0, 0.12); --shadow-xlarge: 0 8px 30px rgba(0, 0, 0, 0.12); --shadow-jumbo: 0 30px 60px rgba(0, 0, 0, 0.12); --shadow-hover: 0 30px 60px rgba(0, 0, 0, 0.12); --shadow-sticky: 0 12px 10px -10px rgba(0, 0, 0, 0.12); + --shadow-strong: 0px 4px 4px 0px rgba(0, 0, 0, 0.5); font-palette: --Light; // scrollbar styles @@ -64,4 +73,24 @@ --scrollbar-thumb: var(--shade-4); --scrollbar-thumb-hover: var(--shade-6); --scrollbar-thumb-active: var(--shade-7); -} \ No newline at end of file + + --color-grey-icons: #868e96; + --color-daily-progress: #ced4da; + --color-separators: #f8f9fa; + --color-blue-buttons-and-icons: #2ca4ab; + --color-faint-blue-icons: #c2edef; + --color-black-buttons: #000000; + --color-topics-grey: #f4f5f6; + --color-topics-gold: #fff7de; + --color-gqc: #cb955b; + --color-qdc-blue: #22a5ad; + --color-qdc-faded-blue: #ebf9fa; + --color-qdc-faint-blue: #c2edef; + --color-qdc-deep-blue: #258c91; + --color-streaks-dark: #38794b; + --color-streaks-light: #e4f4e9; + --color-calligraphy: #e2e7eb; + --color-scholars-say-background: #fff8e4; + --color-scholars-say-text: #7c6e21; + --color-search-background: #e9ecef; +} diff --git a/src/styles/themes/_sepia.scss b/src/styles/themes/_sepia.scss index 222864d62a..47cbada1dc 100644 --- a/src/styles/themes/_sepia.scss +++ b/src/styles/themes/_sepia.scss @@ -26,12 +26,18 @@ --color-warning-medium: #9d5c01; --color-warning-deep: #ab570a; + --color-text-default-new: #272727; --color-text-default: #010101; --color-text-faded: #666; + --color-text-faded-new: #666666; --color-text-inverse: #fff; --color-text-link: #2ca4ab; + --color-text-link-new: #72603f; --color-text-warning: #ab570a; --color-text-error: #c50000; + --color-text-black: #000000; + --color-text-white: #ffffff; + --color-text-gray: #495057; --color-background-default: #f8ebd5; --color-background-elevated: #fff7ea; @@ -52,11 +58,13 @@ --shadow-small: 0px 2px 4px rgba(0, 0, 0, 0.1); --shadow-normal: 0px 4px 8px rgba(0, 0, 0, 0.12); + --shadow-medium: 0px 4px 10px 0px rgba(0, 0, 0, 0.1); --shadow-large: 0 5px 10px rgba(0, 0, 0, 0.12); --shadow-xlarge: 0 8px 30px rgba(0, 0, 0, 0.12); --shadow-jumbo: 0 30px 60px rgba(0, 0, 0, 0.12); --shadow-hover: 0 30px 60px rgba(0, 0, 0, 0.12); --shadow-sticky: 0 12px 10px -10px rgba(0, 0, 0, 0.12); + --shadow-strong: 0px 4px 4px 0px rgba(0, 0, 0, 0.5); font-palette: --Sepia; // scrollbar styles @@ -64,4 +72,24 @@ --scrollbar-thumb: #f0cd8c; --scrollbar-thumb-hover: #d4b478; --scrollbar-thumb-active: #8d774e; -} \ No newline at end of file + + --color-grey-icons: #d8c6a5; + --color-daily-progress: #ced4da; + --color-separators: #f8ebd5; + --color-blue-buttons-and-icons: #72603f; + --color-faint-blue-icons: #f2e0bf; + --color-black-buttons: #000000; + --color-topics-grey: #efe2cd; + --color-topics-gold: #fae7a9; + --color-gqc: #cb955b; + --color-qdc-blue: #22a5ad; + --color-qdc-faded-blue: #ebf9fa; + --color-qdc-faint-blue: #c2edef; + --color-qdc-deep-blue: #258c91; + --color-streaks-dark: #415d49; + --color-streaks-light: #efe2cd; + --color-calligraphy: #ccb996; + --color-scholars-say-background: #f1d5b7; + --color-scholars-say-text: #7c4221; + --color-search-background: #d8c6a5; +} diff --git a/src/types/QuranReflect/ContentType.ts b/src/types/QuranReflect/ContentType.ts new file mode 100644 index 0000000000..35cfc431d0 --- /dev/null +++ b/src/types/QuranReflect/ContentType.ts @@ -0,0 +1,6 @@ +enum ContentType { + REFLECTIONS = 'reflections', + LESSONS = 'lessons', +} + +export default ContentType; diff --git a/src/types/auth/SignUpRequest.ts b/src/types/auth/SignUpRequest.ts new file mode 100644 index 0000000000..33b890adb2 --- /dev/null +++ b/src/types/auth/SignUpRequest.ts @@ -0,0 +1,11 @@ +interface SignUpRequest { + firstName: string; + lastName: string; + username: string; + password: string; + confirmPassword: string; + email: string; + verificationCode?: string; +} + +export default SignUpRequest; diff --git a/src/utils/apiPaths.ts b/src/utils/apiPaths.ts index 5e971c1468..da9912a004 100644 --- a/src/utils/apiPaths.ts +++ b/src/utils/apiPaths.ts @@ -3,6 +3,7 @@ import { decamelizeKeys } from 'humps'; // eslint-disable-next-line import/no-cycle import { getDefaultWordFields, getMushafId, ITEMS_PER_PAGE, makeUrl } from './api'; import stringify from './qs-stringify'; +import { getProxiedServiceUrl } from './url'; import { DEFAULT_RECITER } from '@/redux/defaultSettings/defaultSettings'; import { @@ -11,7 +12,7 @@ import { } from '@/redux/defaultSettings/util'; import { MushafLines, QuranFont } from '@/types/QuranReader'; import { SearchRequestParams, SearchMode } from '@/types/Search/SearchRequestParams'; -import { AdvancedCopyRequest, PagesLookUpRequest, SearchRequest } from 'types/ApiRequests'; +import { AdvancedCopyRequest, PagesLookUpRequest } from 'types/ApiRequests'; export const DEFAULT_VERSES_PARAMS = { words: true, @@ -146,23 +147,10 @@ export const makeTranslationsInfoUrl = (locale: string, translations: number[]): export const makeAdvancedCopyUrl = (params: AdvancedCopyRequest): string => makeUrl('/verses/advanced_copy', params as Record); -/** - * Compose the url for search API. - * - * @param {SearchRequest} params the request params. - * @returns {string} - */ -export const makeSearchResultsUrl = (params: SearchRequest): string => makeUrl('/search', params); - -export const makeNewSearchApiUrl = (params: Record) => { - const baseUrl = process.env.NEXT_PUBLIC_SEARCH_BASE_URL; - - return `${baseUrl}/v1/search?${stringify(decamelizeKeys(params))}`; +export const makeNewSearchResultsUrl = (params: SearchRequestParams) => { + return getProxiedServiceUrl('search/v1/search', `?${stringify(decamelizeKeys(params))}`); }; -export const makeNewSearchResultsUrl = (params: SearchRequestParams) => - makeNewSearchApiUrl(params); - /** * Compose the url for the navigation search API that is used to show results inside the command bar. * diff --git a/src/utils/auth/api.ts b/src/utils/auth/api.ts index ba816baf44..c0e342a7af 100644 --- a/src/utils/auth/api.ts +++ b/src/utils/auth/api.ts @@ -1,24 +1,28 @@ /* eslint-disable max-lines */ import { NextApiRequest } from 'next'; +import Router from 'next/router'; import { configureRefreshFetch } from 'refresh-fetch'; import { getTimezone } from '../datetime'; import { prepareGenerateMediaFileRequestData } from '../media/utils'; +import { BANNED_USER_ERROR_ID } from './constants'; +import { AuthErrorCodes } from './errors'; import generateSignature from './signature'; import BookmarkByCollectionIdQueryParams from './types/BookmarkByCollectionIdQueryParams'; import GetAllNotesQueryParams from './types/Note/GetAllNotesQueryParams'; +import { ShortenUrlResponse } from './types/ShortenUrl'; import { fetcher, X_AUTH_SIGNATURE, X_INTERNAL_CLIENT, X_TIMESTAMP } from '@/api'; import { + ActivityDay, + ActivityDayType, FilterActivityDaysParams, QuranActivityDay, - UpdateQuranActivityDayBody, - ActivityDayType, UpdateActivityDayBody, - ActivityDay, - UpdateLessonActivityDayBody, UpdateActivityDayParams, + UpdateLessonActivityDayBody, + UpdateQuranActivityDayBody, } from '@/types/auth/ActivityDay'; import ConsentType from '@/types/auth/ConsentType'; import { Course } from '@/types/auth/Course'; @@ -32,53 +36,55 @@ import MediaRenderError from '@/types/Media/MediaRenderError'; import QuestionResponse from '@/types/QuestionsAndAnswers/QuestionResponse'; import { Mushaf } from '@/types/QuranReader'; import { - makeBookmarksUrl, - makeCompleteSignupUrl, - makeUserProfileUrl, - makeDeleteAccountUrl, + CollectionsQueryParams, + makeActivityDaysUrl, + makeAddCollectionBookmarkUrl, + makeAddCollectionUrl, + makeBookmarkCollectionsUrl, makeBookmarksRangeUrl, + makeBookmarksUrl, makeBookmarkUrl, - makeReadingSessionsUrl, - makeUserPreferencesUrl, - makeVerificationCodeUrl, - makeUserBulkPreferencesUrl, - makeLogoutUrl, - makeCompleteAnnouncementUrl, - makeSyncLocalDataUrl, - makeRefreshTokenUrl, makeCollectionsUrl, - makeGetBookmarkByCollectionId, - makeAddCollectionUrl, - makeBookmarkCollectionsUrl, - CollectionsQueryParams, - makeUpdateCollectionUrl, - makeDeleteCollectionUrl, - makeAddCollectionBookmarkUrl, + makeCompleteAnnouncementUrl, + makeCompleteSignupUrl, + makeCountNotesWithinRangeUrl, + makeCountQuestionsWithinRangeUrl, + makeCourseFeedbackUrl, + makeDeleteAccountUrl, + makeDeleteBookmarkUrl, makeDeleteCollectionBookmarkByIdUrl, makeDeleteCollectionBookmarkByKeyUrl, - makeDeleteBookmarkUrl, - makeActivityDaysUrl, - makeGoalUrl, - makeFilterActivityDaysUrl, - makeStreakUrl, - makeEstimateRangesReadingTimeUrl, - makeUserFeatureFlagsUrl, - makeUserConsentsUrl, - makeNotesUrl, + makeDeleteCollectionUrl, makeDeleteOrUpdateNoteUrl, - makeCountNotesWithinRangeUrl, makeEnrollUserUrl, + makeEstimateRangesReadingTimeUrl, + makeFilterActivityDaysUrl, + makeFullUrlById, + makeGenerateMediaFileUrl, + makeGetBookmarkByCollectionId, makeGetCoursesUrl, makeGetCourseUrl, - makePublishNoteUrl, - makeCourseFeedbackUrl, - makeGetUserCoursesCountUrl, - makeGenerateMediaFileUrl, makeGetMediaFileProgressUrl, makeGetMonthlyMediaFilesCountUrl, - makeCountQuestionsWithinRangeUrl, - makeGetQuestionsByVerseKeyUrl, makeGetQuestionByIdUrl, + makeGetQuestionsByVerseKeyUrl, + makeGetUserCoursesCountUrl, + makeGoalUrl, + makeLogoutUrl, + makeNotesUrl, + makePublishNoteUrl, + makeReadingSessionsUrl, + makeRefreshTokenUrl, + makeShortenUrlUrl, + makeStreakUrl, + makeSyncLocalDataUrl, + makeUpdateCollectionUrl, + makeUserBulkPreferencesUrl, + makeUserConsentsUrl, + makeUserFeatureFlagsUrl, + makeUserPreferencesUrl, + makeUserProfileUrl, + makeVerificationCodeUrl, } from '@/utils/auth/apiPaths'; import { isStaticBuild } from '@/utils/build'; import CompleteAnnouncementRequest from 'types/auth/CompleteAnnouncementRequest'; @@ -99,15 +105,37 @@ type RequestData = Record; const IGNORE_ERRORS = [ MediaRenderError.MediaVersesRangeLimitExceeded, MediaRenderError.MediaFilesPerUserLimitExceeded, + AuthErrorCodes.InvalidCredentials, + AuthErrorCodes.NotFound, + AuthErrorCodes.BadRequest, + AuthErrorCodes.Invalid, + AuthErrorCodes.Mismatch, + AuthErrorCodes.Missing, + AuthErrorCodes.Duplicate, + AuthErrorCodes.Banned, + AuthErrorCodes.Expired, + AuthErrorCodes.Used, + AuthErrorCodes.Immutable, + AuthErrorCodes.ValidationError, ]; const handleErrors = async (res) => { const body = await res.json(); + const error = body?.error || body?.details?.error; + const errorName = body?.name || body?.details?.name; + // sometimes FE needs to handle the error from the API instead of showing a general something went wrong message - const shouldIgnoreError = IGNORE_ERRORS.includes(body?.error?.code); + const shouldIgnoreError = IGNORE_ERRORS.includes(error?.code); if (shouldIgnoreError) { return body; } + // const toast = useToast(); + + if (errorName === BANNED_USER_ERROR_ID) { + await logoutUser(); + return Router.push(`/login?error=${errorName}`); + } + throw new Error(body?.message); }; @@ -460,6 +488,26 @@ export const addOrUpdateBulkUserPreferences = async ( mushafId: Mushaf, ) => postRequest(makeUserBulkPreferencesUrl(mushafId), preferences); +/** + * Shorten a URL. + * + * @param {string} url + * @returns {Promise} + */ +export const shortenUrl = async (url: string): Promise => { + return postRequest(makeShortenUrlUrl(), { url }); +}; + +/** + * Get full URL by id. + * + * @param {string} id + * @returns {Promise} + */ +export const getFullUrlById = async (id: string): Promise => { + return privateFetcher(makeFullUrlById(id)); +}; + export const logoutUser = async () => { return postRequest(makeLogoutUrl(), {}); }; diff --git a/src/utils/auth/apiPaths.ts b/src/utils/auth/apiPaths.ts index 6106eb20d3..4ff0ec8e10 100644 --- a/src/utils/auth/apiPaths.ts +++ b/src/utils/auth/apiPaths.ts @@ -11,14 +11,14 @@ import { StreakWithMetadataParams } from '@/types/auth/Streak'; import Language from '@/types/Language'; import { MediaType } from '@/types/Media/GenerateMediaFileRequest'; import { Mushaf } from '@/types/QuranReader'; -import { getAuthApiPath } from '@/utils/url'; +import { getProxiedServiceUrl } from '@/utils/url'; import BookmarkType from 'types/BookmarkType'; export const makeUrl = (url: string, parameters?: Record): string => { if (!parameters) { - return getAuthApiPath(url); + return getProxiedServiceUrl('auth/', url); } - return getAuthApiPath(`${url}${`?${stringify(parameters)}`}`); + return getProxiedServiceUrl('auth/', `${url}${`?${stringify(parameters)}`}`); }; export const makeUserProfileUrl = (): string => makeUrl('users/profile'); @@ -37,6 +37,10 @@ export const makeSyncLocalDataUrl = (): string => makeUrl('users/syncLocalData') export const makeVerificationCodeUrl = (): string => makeUrl('users/verificationCode'); +export const makeForgotPasswordUrl = (): string => makeUrl('users/forgetPassword'); + +export const makeResetPasswordUrl = (): string => makeUrl('users/resetPassword'); + export const makeSendMagicLinkUrl = (redirect?: string): string => makeUrl('auth/magiclogin', redirect ? { redirect } : undefined); @@ -49,6 +53,10 @@ export const makeFacebookLoginUrl = (redirect?: string): string => export const makeAppleLoginUrl = (redirect?: string): string => makeUrl('auth/apple', redirect ? { redirect } : undefined); +export const makeSignInUrl = (): string => makeUrl('users/login'); + +export const makeSignUpUrl = (): string => makeUrl('users/signup'); + export const makeBookmarksUrl = (mushafId: number, limit?: number): string => makeUrl('bookmarks', { mushafId, limit }); @@ -244,3 +252,18 @@ export const makeGetMediaFileProgressUrl = (renderId: string) => export const makeGetMonthlyMediaFilesCountUrl = (type: MediaType) => makeUrl(`media/monthly-count`, { type }); + +/** + * Compose the url for shorten-url API. + * + * @returns {string} + */ +export const makeShortenUrlUrl = (): string => makeUrl('/shorten-url'); + +/** + * Compose the url for get full URL by id. + * + * @param {string} id + * @returns {string} + */ +export const makeFullUrlById = (id: string): string => makeUrl(`/shorten-url/${id}`); diff --git a/src/utils/auth/authRequests.ts b/src/utils/auth/authRequests.ts new file mode 100644 index 0000000000..af3f288adb --- /dev/null +++ b/src/utils/auth/authRequests.ts @@ -0,0 +1,114 @@ +import { privateFetcher } from './api'; +import { + makeCompleteSignupUrl, + makeForgotPasswordUrl, + makeResetPasswordUrl, + makeSignInUrl, + makeSignUpUrl, +} from './apiPaths'; +import mapAPIErrorToFormFields, { AuthEndpoint } from './errors'; + +import SignUpRequest from '@/types/auth/SignUpRequest'; +import BaseAuthResponse from '@/types/BaseAuthResponse'; +import CompleteSignupRequest from '@/types/CompleteSignupRequest'; + +const CONTENT_TYPE = 'Content-Type'; + +interface APIResponse { + data: T; + errors: Record; +} + +interface AuthFieldMap { + [key: string]: string; +} + +/** + * Generic function to handle auth requests + * @returns {Promise>} Promise containing the API response and mapped error fields + */ +const handleAuthRequest = async ( + url: string, + data: T, + endpoint: AuthEndpoint, + fieldMap: AuthFieldMap, +): Promise> => { + const response = await privateFetcher(url, { + method: 'POST', + headers: { + [CONTENT_TYPE]: 'application/json', + }, + body: JSON.stringify(data), + }); + + return { + data: response, + errors: await mapAPIErrorToFormFields(response, { + endpoint, + fieldMap, + }), + }; +}; + +/** + * Sign in request handler + * @returns {Promise>} Promise containing the authentication response and any validation errors + */ +export const signIn = async ( + email: string, + password: string, +): Promise> => { + return handleAuthRequest(makeSignInUrl(), { email, password }, AuthEndpoint.SignIn, { + credentials: 'password', + email: 'email', + }); +}; + +/** + * Sign up request handler + * @returns {Promise>} Promise containing the authentication response and any validation errors + */ +export const signUp = async (data: SignUpRequest): Promise> => { + return handleAuthRequest(makeSignUpUrl(), data, AuthEndpoint.SignUp, { + email: 'email', + password: 'password', + confirmPassword: 'confirmPassword', + username: 'username', + firstName: 'firstName', + lastName: 'lastName', + }); +}; + +export const requestPasswordReset = async ( + email: string, +): Promise> => { + return handleAuthRequest(makeForgotPasswordUrl(), { email }, AuthEndpoint.ForgotPassword, { + email: 'email', + }); +}; + +export const completeSignup = async ( + data: CompleteSignupRequest, +): Promise> => { + return handleAuthRequest(makeCompleteSignupUrl(), data, AuthEndpoint.CompleteSignup, { + email: 'email', + firstName: 'firstName', + lastName: 'lastName', + username: 'username', + }); +}; + +export const resetPassword = async ( + password: string, + token: string, +): Promise> => { + return handleAuthRequest( + makeResetPasswordUrl(), + { password, token }, + AuthEndpoint.ResetPassword, + { + password: 'password', + token: 'token', + }, + ); +}; diff --git a/src/utils/auth/constants.ts b/src/utils/auth/constants.ts index cded35eef6..44e3bd68be 100644 --- a/src/utils/auth/constants.ts +++ b/src/utils/auth/constants.ts @@ -28,3 +28,5 @@ export const NOTIFICATION_SUBSCRIBER_COOKIE_NAME = addEnvSuffixToAuthCookie('not export const DEFAULT_PHOTO_URL = `https://www.gravatar.com/avatar/00000000000000000000000000000000?d=mp&f=y`; export const AUTH_ONBOARDING_ANNOUNCEMENT_TYPE = 'auth-onboarding'; + +export const BANNED_USER_ERROR_ID = 'external.banned'; diff --git a/src/utils/auth/errors.ts b/src/utils/auth/errors.ts new file mode 100644 index 0000000000..5b5bd2550e --- /dev/null +++ b/src/utils/auth/errors.ts @@ -0,0 +1,189 @@ +/* eslint-disable max-lines */ +import { ServerErrorCodes, BASE_SERVER_ERRORS_MAP } from '@/types/auth/error'; + +export enum AuthErrorCodes { + Invalid = 'INVALID', + InvalidCredentials = 'INVALID_CREDENTIALS', + MinLength = 'MIN_LENGTH', + MaxLength = 'MAX_LENGTH', + ExactLength = 'EXACT_LENGTH', + Mismatch = 'MISMATCH', + Missing = 'MISSING', + Duplicate = 'DUPLICATE', + Banned = 'BANNED', + Expired = 'EXPIRED', + Used = 'USED', + Immutable = 'IMMUTABLE', + BadRequest = 'BAD_REQUEST', + NotFound = 'NOT_FOUND', + ValidationError = 'ValidationError', +} + +interface APIErrorResponse { + details?: { + success: boolean; + error?: { + code: string; + message: string; + details: Record; + }; + }; + message?: string; + type?: string; + success: boolean; + error?: { + code: string; + message: string; + details: Record; + }; + status?: number; +} + +type ErrorFieldMap = Record; + +export enum AuthEndpoint { + SignIn = 'signIn', + SignUp = 'signUp', + ForgotPassword = 'forgotPassword', + ResetPassword = 'resetPassword', + CompleteSignup = 'completeSignup', +} + +// Map of API endpoint to their error field keys +const API_ERROR_FIELD_MAP: Record = { + [AuthEndpoint.SignIn]: { + credentials: 'password', + email: 'email', + }, + [AuthEndpoint.SignUp]: { + email: 'email', + password: 'password', + confirmPassword: 'confirmPassword', + firstName: 'firstName', + lastName: 'lastName', + }, + [AuthEndpoint.ForgotPassword]: { + email: 'email', + }, + [AuthEndpoint.ResetPassword]: { + password: 'password', + token: 'token', + }, + [AuthEndpoint.CompleteSignup]: { + email: 'email', + firstName: 'firstName', + lastName: 'lastName', + username: 'username', + }, +}; + +interface ErrorMappingConfig { + endpoint: keyof typeof API_ERROR_FIELD_MAP; + fieldMap?: ErrorFieldMap; + defaultErrorKey?: string; + errorMessageMap?: Record; // Map HTTP status codes to error messages +} + +const handleResponseError = async (response: Response): Promise => { + const errorData = await response.json(); + errorData.status = response.status; + return errorData; +}; + +const handleStatusBasedError = ( + errorData: APIErrorResponse, + config: ErrorMappingConfig, +): { [key: string]: string } | null => { + if (errorData.status && config.errorMessageMap?.[errorData.status]) { + return { + form: config.errorMessageMap[errorData.status], + }; + } + return null; +}; + +const mapErrorDetailsToFields = ( + error: APIErrorResponse['error'], + endpointErrorMap: ErrorFieldMap, + config: ErrorMappingConfig, +): { [key: string]: string } => { + const result: Record = {}; + + Object.entries(error.details || {}).forEach(([errorField, errorCode]) => { + const field = config.fieldMap?.[errorField] || endpointErrorMap[errorField]; + if (field) { + result[field] = + BASE_SERVER_ERRORS_MAP[errorCode as ServerErrorCodes] || + BASE_SERVER_ERRORS_MAP[error.code as ServerErrorCodes] || + config.defaultErrorKey || + 'errors.badRequest'; + } + }); + + return result; +}; + +const handleErrorResponse = ( + errorData: APIErrorResponse, + error: APIErrorResponse['error'], + config: ErrorMappingConfig, +): { [key: string]: string } => { + const endpointErrorMap = API_ERROR_FIELD_MAP[config.endpoint]; + if (!endpointErrorMap) { + return { + form: + config.defaultErrorKey || + BASE_SERVER_ERRORS_MAP[error.code as ServerErrorCodes] || + 'errors.badRequest', + }; + } + + const result = mapErrorDetailsToFields(error, endpointErrorMap, config); + return Object.keys(result).length === 0 + ? { + form: + config.defaultErrorKey || + BASE_SERVER_ERRORS_MAP[error.code as ServerErrorCodes] || + 'errors.badRequest', + } + : result; +}; + +/** + * Maps API error responses to form field errors + * @param {APIErrorResponse | Response} response - The API error response or fetch Response + * @param {ErrorMappingConfig} config - Configuration for error mapping + * @returns {{ [key: string]: string }} An object with field keys and their corresponding error translation keys + */ +const mapAPIErrorToFormFields = async ( + response: APIErrorResponse | Response, + config: ErrorMappingConfig, +): Promise<{ [key: string]: string }> => { + let errorData: APIErrorResponse; + + if (response instanceof Response) { + try { + errorData = await handleResponseError(response); + } catch (e) { + return { + form: config.errorMessageMap?.[response.status] || 'errors.badRequest', + }; + } + } else { + errorData = response; + } + + const statusError = handleStatusBasedError(errorData, config); + if (statusError) return statusError; + + const error = errorData.details?.error || errorData.error; + if (!error) { + return { + form: config.defaultErrorKey || 'errors.badRequest', + }; + } + + return handleErrorResponse(errorData, error, config); +}; + +export default mapAPIErrorToFormFields; diff --git a/src/utils/auth/types/ShortenUrl.ts b/src/utils/auth/types/ShortenUrl.ts new file mode 100644 index 0000000000..22ae4bcbe7 --- /dev/null +++ b/src/utils/auth/types/ShortenUrl.ts @@ -0,0 +1,8 @@ +import { BaseResponse } from '@/types/ApiResponses'; + +export interface ShortenUrlResponse extends BaseResponse { + id: string; + url: string; + createdAt: Date; + updatedAt: Date; +} diff --git a/src/utils/chapter.ts b/src/utils/chapter.ts index 4048243743..ad7f37885d 100644 --- a/src/utils/chapter.ts +++ b/src/utils/chapter.ts @@ -22,6 +22,8 @@ const SUPPORTED_CHAPTER_LOCALES = [ 'tr', 'ur', 'zh', + 'es', + 'sw', ]; /** diff --git a/src/utils/datetime.ts b/src/utils/datetime.ts index 2822044260..074ecaf104 100644 --- a/src/utils/datetime.ts +++ b/src/utils/datetime.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-lines */ import { Translate } from 'next-translate'; import { getLangFullLocale, LANG_LOCALE_MAP, toLocalizedNumber } from './locale'; @@ -68,6 +69,52 @@ export const secondsToReadableFormat = (s: number, t: Translate, locale: string) return results.join(', '); }; +/** + * Convert seconds to the format of `x hours, y minutes, z seconds` without any additional text. + * Or any combination of the three. + * + * @param {number} s seconds + * @param {string} locale locale + * @returns {string} + */ +export const secondsToShortReadableFormat = (s: number, locale: string): string => { + const results: string[] = []; + + let seconds = s; + let minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + if (hours > 0) { + results.push( + `${toLocalizedNumber(convertNumberToDecimal(hours), locale)} ${ + hours === 1 ? 'hour' : 'hours' + }`, + ); + minutes %= 60; + seconds %= 60; + } + + if (minutes > 0) { + results.push( + `${toLocalizedNumber(convertNumberToDecimal(minutes), locale)} ${ + minutes === 1 ? 'minute' : 'minutes' + }`, + ); + seconds %= 60; + } + + // if there are seconds left, or if the duration is 0 (in this case, `results.length` = 0), add seconds + if (seconds > 0 || results.length === 0) { + results.push( + `${toLocalizedNumber(convertNumberToDecimal(seconds), locale)} ${ + seconds === 1 ? 'second' : 'seconds' + }`, + ); + } + + return results.join(', '); +}; + /** * Convert milliseconds to seconds. * diff --git a/src/utils/eventLogger.ts b/src/utils/eventLogger.ts index 1073d802f7..c6631a2431 100644 --- a/src/utils/eventLogger.ts +++ b/src/utils/eventLogger.ts @@ -146,12 +146,6 @@ export const logTextSearchQuery = (searchQuery: string, source: SearchQuerySourc } }; -export const logTarteelLinkClick = (type: string) => { - logEvent('tarteel_link_click', { - type: `${type}_attribution`, - }); -}; - /** * Log when an item selection status change. * diff --git a/src/utils/locale.ts b/src/utils/locale.ts index 94662e580d..5849eb4aaf 100644 --- a/src/utils/locale.ts +++ b/src/utils/locale.ts @@ -34,6 +34,7 @@ const LOCALE_NAME = { [Language.KU]: 'Kurdî', [Language.UZ]: "o'zbek", [Language.ES]: 'Español', + [Language.SW]: 'Kiswahili', }; const LOCALE_NAME_TO_CODE = { @@ -43,6 +44,7 @@ const LOCALE_NAME_TO_CODE = { russian: Language.RU, urdu: Language.UR, Kurdish: Language.KU, + swahili: Language.SW, }; export const LANG_LOCALE_MAP = { @@ -63,6 +65,7 @@ export const LANG_LOCALE_MAP = { [Language.ZH]: 'zh-CN', [Language.MS]: 'ms-MY', [Language.ES]: 'es-ES', + [Language.SW]: 'sw-TZ', }; export enum Direction { @@ -150,6 +153,14 @@ export const Languages = { // Chinese locale: Language.ZH, }, + 40: { + // Spanish + locale: Language.ES, + }, + 157: { + // Swahili + locale: Language.SW, + }, }; interface LinkLanguageAlternate { diff --git a/src/utils/media/constants.ts b/src/utils/media/constants.ts index 3fe946e285..af02e69c30 100644 --- a/src/utils/media/constants.ts +++ b/src/utils/media/constants.ts @@ -7,6 +7,7 @@ import defaultVerses from './defaultVerses.json'; import Alignment from '@/types/Media/Alignment'; import Orientation from '@/types/Media/Orientation'; +import PreviewMode from '@/types/Media/PreviewMode'; import WatermarkColor from '@/types/Media/WatermarkColor'; import { QuranFont } from '@/types/QuranReader'; import Verse from '@/types/Verse'; @@ -35,6 +36,7 @@ export const MAXIMUM_OPACITY = 1; export const OPACITY_VALUES = [0, 0.2, 0.4, 0.6, 0.8, 1]; export const MINIMUM_BORDER = 0; export const MAXIMUM_BORDER = 10; +export const DEFAULT_PREVIEW_MODE = PreviewMode.DISABLED; export function getDefaultVerseKeys(lang = 'en') { const keys = defaultVerses.map((verse) => `${verse.chapterId}:${verse.verseNumber}`); @@ -115,4 +117,5 @@ export const DEFAULT_PROPS = { borderColor: DEFAULT_BORDER_COLOR, borderSize: DEFAULT_BORDER_SIZE, backgroundColor: DEFAULT_BACKGROUND_COLOR, + previewMode: DEFAULT_PREVIEW_MODE, }; diff --git a/src/utils/navigation.ts b/src/utils/navigation.ts index ff7187d0ac..588e6513ee 100644 --- a/src/utils/navigation.ts +++ b/src/utils/navigation.ts @@ -8,7 +8,7 @@ import { getVerseAndChapterNumbersFromKey, getVerseNumberRangeFromKey } from './ import QueryParam from '@/types/QueryParam'; import { QuranReaderFlow } from '@/types/QuranReader'; -import { SearchNavigationType } from 'types/SearchNavigationResult'; +import { SearchNavigationType } from 'types/Search/SearchNavigationResult'; /** * Get the href link to a verse. @@ -132,6 +132,14 @@ export const getVerseSelectedTafsirNavigationUrl = ( export const getVerseReflectionNavigationUrl = (verseKey: string): string => `/${verseKey}/reflections`; +/** + * Get the href link to lessons of Ayah. + * + * @param {string} verseKey + * @returns {string} + */ +export const getVerseLessonNavigationUrl = (verseKey: string): string => `/${verseKey}/lessons`; + /** * Get the href link to questions of Ayah. * @@ -237,7 +245,11 @@ export const resolveUrlBySearchNavigationType = ( isKalimatSearch = false, ): string => { const stringKey = isKalimatSearch ? searchIdToNavigationKey(type, String(key)) : String(key); - if (type === SearchNavigationType.AYAH) { + if ( + type === SearchNavigationType.AYAH || + type === SearchNavigationType.TRANSLITERATION || + type === SearchNavigationType.TRANSLATION + ) { return getChapterWithStartingVerseUrl(stringKey); } if (type === SearchNavigationType.JUZ) { @@ -269,7 +281,7 @@ export const resolveUrlBySearchNavigationType = ( * @returns {string} */ export const getSearchQueryNavigationUrl = (query?: string): string => - `/search${query ? `?${QueryParam.QUERY}=${query}` : ''}`; + `/search${query ? `?${QueryParam.QUERY}=${encodeURIComponent(query)}` : ''}`; /** * Get the href link to the info page of a Surah. @@ -353,8 +365,17 @@ export const getLoginNavigationUrl = (redirectTo?: string) => export const getReadingGoalProgressNavigationUrl = () => '/reading-goal/progress'; +export const getFirstTimeReadingGuideNavigationUrl = () => '/first-time-reading-guide'; + export const getNotesNavigationUrl = () => '/notes-and-reflections'; +export const getForgotPasswordNavigationUrl = () => `/forgot-password`; + +export const getResetPasswordNavigationUrl = () => `/reset-password`; + +export const getVerifyEmailNavigationUrl = (email?: string) => + `/verify-email${email ? `?${QueryParam.EMAIL}=${email}` : ''}`; + export const getNotificationSettingsNavigationUrl = () => '/notification-settings'; export const getQuranicCalendarNavigationUrl = () => '/calendar'; export const getQuranMediaMakerNavigationUrl = (params?: ParsedUrlQuery) => { diff --git a/src/utils/queryParamValidator.ts b/src/utils/queryParamValidator.ts index 1c4da218c3..8f37de2d78 100644 --- a/src/utils/queryParamValidator.ts +++ b/src/utils/queryParamValidator.ts @@ -3,6 +3,7 @@ import Orientation from '../../types/Media/Orientation'; import QuranFont from '../../types/Media/QuranFont'; import AvailableTranslation from '@/types/AvailableTranslation'; +import PreviewMode from '@/types/Media/PreviewMode'; import Reciter from '@/types/Reciter'; export const isValidTranslationsQueryParamValue = (value: string): boolean => { @@ -118,3 +119,7 @@ export const isValidBorderSizeQueryParamValue = (value: string): boolean => { // 1 and 5 are the ranges of all the valid scales return isValidNumber && Number(value) >= 1 && Number(value) <= 5; }; + +export const isValidPreviewModeQueryParamValue = (value: string): boolean => { + return Object.values(PreviewMode).includes(value as PreviewMode); +}; diff --git a/src/utils/quranReflect/apiPaths.ts b/src/utils/quranReflect/apiPaths.ts index da08e27807..985ae3b177 100644 --- a/src/utils/quranReflect/apiPaths.ts +++ b/src/utils/quranReflect/apiPaths.ts @@ -10,6 +10,9 @@ const STAGING_API_HOST = 'https://quranreflect.org'; const PRODUCTION_API_HOST = 'https://quranreflect.com'; const isProd = process.env.NEXT_PUBLIC_VERCEL_ENV === 'production'; +export const REFLECTION_POST_TYPE_ID = '1'; +export const LESSON_POST_TYPE_ID = '2'; + // env variables in Vercel can't be dynamic, we have to hardcode the urls here. https://stackoverflow.com/questions/44342226/next-js-error-only-absolute-urls-are-supported export const API_HOST = isProd ? PRODUCTION_API_HOST : STAGING_API_HOST; @@ -28,6 +31,8 @@ export const makeAyahReflectionsUrl = ({ locale, page = 1, tab = Tab.MostPopular, + reviewed = false, + postTypeIds = [], }: AyahReflectionsRequestParams) => { const surahNumber = Number(surahId) + 1; return makeQuranReflectApiUrl('posts.json', { @@ -35,10 +40,12 @@ export const makeAyahReflectionsUrl = ({ 'q[filters_attributes][0][from]': ayahNumber, 'q[filters_attributes][0][to]': ayahNumber, 'q[filters_operation]': 'OR', + ...(postTypeIds.length > 0 && { 'q[post_type_ids]': postTypeIds.join(',') }), page, tab, lang: locale, feed: true, + reviewed, }); }; diff --git a/src/utils/quranReflect/navigation.ts b/src/utils/quranReflect/navigation.ts index 1aea1e7d46..588e675d70 100644 --- a/src/utils/quranReflect/navigation.ts +++ b/src/utils/quranReflect/navigation.ts @@ -28,3 +28,5 @@ export const getQuranReflectPostUrl = (postId: number | string, viewComments = f export const getQuranReflectTagUrl = (tag: string) => `${API_HOST}/?tags=${encodeURIComponent(tag)}`; + +export const getQRNavigationUrl = () => `${API_HOST}`; diff --git a/src/utils/search.ts b/src/utils/search.ts index 205651a662..a982bfd79c 100644 --- a/src/utils/search.ts +++ b/src/utils/search.ts @@ -6,20 +6,17 @@ import groupBy from 'lodash/groupBy'; import { Translate } from 'next-translate'; import { AnyAction } from 'redux'; -import { logEmptySearchResults, logSearchResults, logTextSearchQuery } from './eventLogger'; +import { logTextSearchQuery } from './eventLogger'; -import { getNewSearchResults, getSearchResults } from '@/api'; import { addSearchHistoryRecord } from '@/redux/slices/Search/search'; -import { SearchResponse } from '@/types/ApiResponses'; import AvailableTranslation from '@/types/AvailableTranslation'; import ChaptersData from '@/types/ChaptersData'; -import { SearchMode } from '@/types/Search/SearchRequestParams'; -import SearchService from '@/types/Search/SearchService'; +import { SearchMode, SearchRequestParams } from '@/types/Search/SearchRequestParams'; import SearchQuerySource from '@/types/SearchQuerySource'; import { getChapterData } from '@/utils/chapter'; -import { toLocalizedNumber } from '@/utils/locale'; +import { toLocalizedNumber, toLocalizedVerseKey } from '@/utils/locale'; import { getVerseAndChapterNumbersFromKey, getVerseNumberRangeFromKey } from '@/utils/verse'; -import { SearchNavigationResult, SearchNavigationType } from 'types/SearchNavigationResult'; +import { SearchNavigationResult, SearchNavigationType } from 'types/Search/SearchNavigationResult'; export const LOCALE_TO_TRANSLATION_LANGUAGE = { en: 'english', @@ -115,163 +112,184 @@ export const getSearchNavigationResult = ( result: SearchNavigationResult, t: Translate, locale: string, -): SearchNavigationResult & { name: string } => { - const { key, resultType } = result; +): SearchNavigationResult => { + const { key, isArabic, isTransliteration } = result; + const resultType = getResultType(result); + const resultSuffix = getResultSuffix(resultType, key as string, locale, chaptersData); + let returnedResult = { + isTransliteration, + isArabic, + resultType, + key, + } as SearchNavigationResult; if (resultType === SearchNavigationType.JUZ) { const juzNumber = idToJuzNumber(key as string); - return { + returnedResult = { + ...returnedResult, name: `${t('common:juz')} ${toLocalizedNumber(Number(juzNumber), locale)}`, key: juzNumber, - resultType: SearchNavigationType.JUZ, }; } if (resultType === SearchNavigationType.PAGE) { const pageNumber = idToPageNumber(key as string); - return { + returnedResult = { + ...returnedResult, name: `${t('common:page')} ${toLocalizedNumber(Number(pageNumber), locale)}`, key: pageNumber, - resultType: SearchNavigationType.PAGE, + }; + } + + if (resultType === SearchNavigationType.RUB_EL_HIZB) { + returnedResult = { + ...returnedResult, + name: `${t('common:rub')} ${toLocalizedNumber(Number(key), locale)}`, + }; + } + + if (resultType === SearchNavigationType.HIZB) { + returnedResult = { + ...returnedResult, + name: `${t('common:hizb')} ${toLocalizedNumber(Number(key), locale)}`, }; } if (resultType === SearchNavigationType.RANGE) { const { surah, from, to } = getVerseNumberRangeFromKey(key as string); - return { + returnedResult = { + ...returnedResult, name: `${t('common:surah')} ${ getChapterData(chaptersData, `${surah}`).transliteratedName } ${t('common:ayah')} ${toLocalizedNumber(from, locale)} - ${toLocalizedNumber(to, locale)}`, - key, - resultType: SearchNavigationType.RANGE, }; } - if (resultType === SearchNavigationType.AYAH) { - const [surahNumber, ayahNumber] = getVerseAndChapterNumbersFromKey(key as string); - return { + if ( + resultType === SearchNavigationType.AYAH || + resultType === SearchNavigationType.TRANSLITERATION || + resultType === SearchNavigationType.TRANSLATION + ) { + returnedResult = { + ...returnedResult, + name: result.name, + }; + } + + if (resultType === SearchNavigationType.SURAH) { + returnedResult = { + ...returnedResult, name: `${t('common:surah')} ${ - getChapterData(chaptersData, `${surahNumber}`).transliteratedName - }, ${t('common:ayah')} ${toLocalizedNumber(Number(ayahNumber), locale)}`, - key, - resultType: SearchNavigationType.AYAH, + getChapterData(chaptersData, key as string).transliteratedName + }`, }; } - // when it's a chapter + return { ...returnedResult, name: `${returnedResult.name} ${resultSuffix}` }; +}; + +/** + * Adds the searched text to the recent history. + * + * @param {Dispatch} dispatch + * @param {string} debouncedSearchQuery + * @param {SearchQuerySource} source + */ +export const addToSearchHistory = ( + dispatch: Dispatch, + debouncedSearchQuery: string, + source: SearchQuerySource, +) => { + dispatch({ type: addSearchHistoryRecord.type, payload: debouncedSearchQuery }); + logTextSearchQuery(debouncedSearchQuery, source); +}; + +/** + * Get the quick search query. + * + * @param {string} query + * @param {number} perPage + * @param {string[]} selectedTranslationIds + * @returns {SearchRequestParams} + */ +export const getQuickSearchQuery = ( + query: string, + perPage = 10, + selectedTranslationIds: string[] = [], +): SearchRequestParams => { return { - name: `${t('common:surah')} ${getChapterData(chaptersData, key as string).transliteratedName}`, - key, - resultType: SearchNavigationType.SURAH, + mode: SearchMode.Quick, + query, + getText: 1, + highlight: 1, + perPage, + translationIds: selectedTranslationIds.join(','), }; }; /** - * Call BE to fetch the search results using the passed filters - * and if there are no results call Kalimat API. + * Get the advanced search query. * - * @param {SearchQuerySource} source * @param {string} query * @param {number} page * @param {number} pageSize - * @param {(arg: boolean) => void} setIsSearching - * @param {(arg: boolean) => void} setHasError - * @param {(data: SearchResponse) => void} setSearchResult - * @param {string} languages - * @param {string} translations + * @param {string[]} selectedTranslationIds + * @returns {SearchRequestParams} */ -export const searchGetResults = ( - source: SearchQuerySource, +export const getAdvancedSearchQuery = ( query: string, page: number, pageSize: number, - setIsSearching: (arg: boolean) => void, - setHasError: (arg: boolean) => void, - setSearchResult: (data: SearchResponse) => void, - languages?: string, - translations?: string, -) => { - setIsSearching(true); - logTextSearchQuery(query, source); - getSearchResults({ + selectedTranslationIds: string[] = [], +): SearchRequestParams => { + return { + mode: SearchMode.Advanced, query, - ...(languages && { filterLanguages: languages }), // languages will be included only when there is a selected language size: pageSize, page, - ...(translations && { filterTranslations: translations }), // translations will be included only when there is a selected translation - }) - .then(async (response) => { - if (response.status === 500) { - setHasError(true); - } else { - setSearchResult({ ...response, service: SearchService.QDC }); - const noQdcResults = - response.pagination.totalRecords === 0 && !response.result.navigation.length; - // if there is no navigations nor verses in the response - if (noQdcResults) { - logEmptySearchResults({ - query, - source, - service: SearchService.QDC, - }); - - const kalimatResponse = await getNewSearchResults({ - mode: SearchMode.Advanced, - query, - size: pageSize, - filterLanguages: languages, - page, - exactMatchesOnly: 0, - // translations will be included only when there is a selected translation - ...(translations && { - filterTranslations: translations, - translationFields: 'resource_name', - }), - }); - - setSearchResult({ - ...kalimatResponse, - service: SearchService.KALIMAT, - }); + exactMatchesOnly: 0, + getText: 1, + highlight: 1, + translationIds: selectedTranslationIds.join(','), + }; +}; - if (kalimatResponse.pagination.totalRecords === 0) { - logEmptySearchResults({ - query, - source, - service: SearchService.KALIMAT, - }); - } else { - logSearchResults({ - query, - source, - service: SearchService.KALIMAT, - }); - } - } - } - }) - .catch(() => { - setHasError(true); - }) - .finally(() => { - setIsSearching(false); - }); +export const getResultType = (result: SearchNavigationResult) => { + const { resultType, isArabic, isTransliteration } = result; + if (resultType === SearchNavigationType.AYAH) { + if (isArabic) { + return SearchNavigationType.AYAH; + } + if (isTransliteration) { + return SearchNavigationType.TRANSLITERATION; + } + return SearchNavigationType.TRANSLATION; + } + return resultType; }; -/** - * Adds the searched text to the recent history. - * - * @param {Dispatch} dispatch - * @param {string} debouncedSearchQuery - * @param {SearchQuerySource} source - */ -export const addToSearchHistory = ( - dispatch: Dispatch, - debouncedSearchQuery: string, - source: SearchQuerySource, +export const getResultSuffix = ( + type: SearchNavigationType, + resultKey: string, + lang: string, + chaptersData: ChaptersData, ) => { - dispatch({ type: addSearchHistoryRecord.type, payload: debouncedSearchQuery }); - logTextSearchQuery(debouncedSearchQuery, source); + const [surahNumber] = getVerseAndChapterNumbersFromKey(resultKey as string); + if (type === SearchNavigationType.SURAH) { + return `- ${toLocalizedNumber(Number(surahNumber), lang)}`; + } + + if ( + type === SearchNavigationType.AYAH || + type === SearchNavigationType.TRANSLITERATION || + type === SearchNavigationType.TRANSLATION + ) { + return `(${ + getChapterData(chaptersData, `${surahNumber}`).transliteratedName + } ${toLocalizedVerseKey(resultKey as string, lang)})`; + } + + return ''; }; diff --git a/src/utils/url.ts b/src/utils/url.ts index ac266250fd..219010a062 100644 --- a/src/utils/url.ts +++ b/src/utils/url.ts @@ -45,20 +45,14 @@ export const navigateToExternalUrl = (url: string) => { * @returns {string} */ export const getBasePath = (): string => - `${process.env.NEXT_PUBLIC_VERCEL_ENV === 'development' ? 'https' : 'https'}://${ + `${process.env.NEXT_PUBLIC_VERCEL_ENV === 'development' ? 'http' : 'https'}://${ process.env.NEXT_PUBLIC_VERCEL_URL }`; -/** - * Get the auth api path. - * - * @param {string} path - * @returns {string} - */ -export const getAuthApiPath = (path: string): string => { - const PROXY_PATH = '/api/proxy/auth/'; +export const getProxiedServiceUrl = (service: string, path: string): string => { + const PROXY_PATH = `/api/proxy/${service}`; const BASE_PATH = isStaticBuild - ? `${process.env.API_GATEWAY_URL}/auth/` + ? `${process.env.API_GATEWAY_URL}/${service}` : `${getBasePath()}${PROXY_PATH}`; return `${BASE_PATH}${path}`; }; diff --git a/types/ApiRequests.ts b/types/ApiRequests.ts index cb44fb7f94..e7da06d773 100644 --- a/types/ApiRequests.ts +++ b/types/ApiRequests.ts @@ -1,11 +1,3 @@ -export type SearchRequest = { - query: string; - filterLanguages?: string; - filterTranslations?: string; - size?: number; - page?: number; -}; - export type AdvancedCopyRequest = { from: string; to: string; diff --git a/types/ApiResponses.ts b/types/ApiResponses.ts index cb55c05c9c..4f1f46e505 100644 --- a/types/ApiResponses.ts +++ b/types/ApiResponses.ts @@ -9,8 +9,9 @@ import LookupRange from './LookupRange'; import LookupRecord from './LookupRecord'; import MetaData from './MetaData'; import Reciter from './Reciter'; +import { SearchNavigationResult } from './Search/SearchNavigationResult'; import SearchService from './Search/SearchService'; -import { SearchNavigationResult } from './SearchNavigationResult'; +import SearchVerseItem from './Search/SearchVerseItem'; import TafsirInfo from './TafsirInfo'; import Verse from './Verse'; @@ -19,7 +20,7 @@ export interface BaseResponse { error?: string; } -interface Pagination { +export interface Pagination { perPage: number; currentPage: number; nextPage: number | null; @@ -84,7 +85,7 @@ export interface SearchResponse extends BaseResponse { pagination: Pagination; result?: { navigation: SearchNavigationResult[]; - verses: Verse[]; + verses: SearchVerseItem[]; }; } diff --git a/types/AuthError.ts b/types/AuthError.ts index 79df62a901..26365f7697 100644 --- a/types/AuthError.ts +++ b/types/AuthError.ts @@ -2,5 +2,6 @@ enum AuthError { AuthenticationError = 'AuthenticationError', TokenExpiredError = 'TokenExpiredError', GenerateCookieError = 'GenerateCookieError', + BannedUserError = 'BannedUserError', } export default AuthError; diff --git a/types/BaseAuthResponse.ts b/types/BaseAuthResponse.ts new file mode 100644 index 0000000000..fc5b398ff2 --- /dev/null +++ b/types/BaseAuthResponse.ts @@ -0,0 +1,10 @@ +interface BaseAuthResponse { + success: boolean; + error?: { + code: string; + message: string; + details: Record; + }; +} + +export default BaseAuthResponse; diff --git a/types/Language.ts b/types/Language.ts index ac70915379..670a98a600 100644 --- a/types/Language.ts +++ b/types/Language.ts @@ -25,6 +25,7 @@ enum Language { UZ = 'uz', DE = 'de', ES = 'es', + SW = 'sw', } export default Language; diff --git a/types/Media/MediaSettings.ts b/types/Media/MediaSettings.ts index 607523fd10..6419cc0289 100644 --- a/types/Media/MediaSettings.ts +++ b/types/Media/MediaSettings.ts @@ -2,6 +2,7 @@ import { QuranFont } from '../QuranReader'; import Alignment from '@/types/Media/Alignment'; import Orientation from '@/types/Media/Orientation'; +import PreviewMode from '@/types/Media/PreviewMode'; type MediaSettings = { verseTo: string; @@ -21,6 +22,7 @@ type MediaSettings = { orientation: Orientation; videoId: number; surah: number; + previewMode: PreviewMode; }; export type ChangedSettings = { diff --git a/types/Media/PreviewMode.ts b/types/Media/PreviewMode.ts new file mode 100644 index 0000000000..0af959c083 --- /dev/null +++ b/types/Media/PreviewMode.ts @@ -0,0 +1,6 @@ +enum PreviewMode { + DISABLED = 'disabled', + ENABLED = 'enabled', +} + +export default PreviewMode; diff --git a/types/QueryParam.ts b/types/QueryParam.ts index b3b2f5a562..1423fe08a1 100644 --- a/types/QueryParam.ts +++ b/types/QueryParam.ts @@ -7,6 +7,7 @@ enum QueryParam { FLOW = 'flow', STARTING_VERSE = 'startingVerse', QUERY = 'query', + QUERY_OLD = 'q', REDIRECT_TO = 'r', VERSE_TO = 'verseTo', VERSE_FROM = 'verseFrom', @@ -23,6 +24,10 @@ enum QueryParam { ORIENTATION = 'orientation', VIDEO_ID = 'videoId', SURAH = 'surah', + PAGE = 'page', + EMAIL = 'email', + TOKEN = 'token', + PREVIEW_MODE = 'previewMode', } export default QueryParam; diff --git a/types/QuranReflect/AyahReflectionsRequestParams.ts b/types/QuranReflect/AyahReflectionsRequestParams.ts index 47590bb8de..9a796a18dc 100644 --- a/types/QuranReflect/AyahReflectionsRequestParams.ts +++ b/types/QuranReflect/AyahReflectionsRequestParams.ts @@ -4,6 +4,8 @@ type AyahReflectionsRequestParams = { locale: string; page?: number; tab?: string; + reviewed?: boolean; + postTypeIds?: string[]; }; export default AyahReflectionsRequestParams; diff --git a/types/QuranReflect/ContentType.ts b/types/QuranReflect/ContentType.ts new file mode 100644 index 0000000000..35cfc431d0 --- /dev/null +++ b/types/QuranReflect/ContentType.ts @@ -0,0 +1,6 @@ +enum ContentType { + REFLECTIONS = 'reflections', + LESSONS = 'lessons', +} + +export default ContentType; diff --git a/types/SearchNavigationResult.ts b/types/Search/SearchNavigationResult.ts similarity index 68% rename from types/SearchNavigationResult.ts rename to types/Search/SearchNavigationResult.ts index bd3faa3100..50eb5d0107 100644 --- a/types/SearchNavigationResult.ts +++ b/types/Search/SearchNavigationResult.ts @@ -2,15 +2,20 @@ export enum SearchNavigationType { SURAH = 'surah', JUZ = 'juz', HIZB = 'hizb', - AYAH = 'ayah', RUB_EL_HIZB = 'rub_el_hizb', SEARCH_PAGE = 'search_page', PAGE = 'page', RANGE = 'range', + HISTORY = 'history', + AYAH = 'ayah', + TRANSLITERATION = 'transliteration', + TRANSLATION = 'translation', } export interface SearchNavigationResult { resultType: SearchNavigationType; name: string; key: number | string; + isArabic?: boolean; + isTransliteration?: boolean; } diff --git a/types/Search/SearchRequestParams.ts b/types/Search/SearchRequestParams.ts index 17029ccd85..210558d713 100644 --- a/types/Search/SearchRequestParams.ts +++ b/types/Search/SearchRequestParams.ts @@ -11,7 +11,6 @@ interface AdvancedSearchRequestParams { interface QuickSearchRequestParams { indexes?: string; - disableHighlighting?: SearchBoolean; } export type SearchRequestParams = { @@ -19,10 +18,11 @@ export type SearchRequestParams = { query: string; size?: number; page?: number; + perPage?: number; getText?: SearchBoolean; - filterTranslations?: string; - filterLanguages?: string; + translationIds?: string; fields?: string; translationFields?: string; words?: boolean; + highlight?: SearchBoolean; } & (Mode extends SearchMode.Advanced ? AdvancedSearchRequestParams : QuickSearchRequestParams); diff --git a/types/Search/SearchResponse.ts b/types/Search/SearchResponse.ts index 7bb72ad810..8ce399109b 100644 --- a/types/Search/SearchResponse.ts +++ b/types/Search/SearchResponse.ts @@ -1,6 +1,6 @@ -import { BaseResponse } from '../ApiResponses'; -import { SearchNavigationResult } from '../SearchNavigationResult'; +import { BaseResponse, Pagination } from '../ApiResponses'; +import { SearchNavigationResult } from './SearchNavigationResult'; import SearchVerseItem from './SearchVerseItem'; interface SearchResponse extends BaseResponse { @@ -8,13 +8,7 @@ interface SearchResponse extends BaseResponse { navigation: SearchNavigationResult[]; verses: SearchVerseItem[]; }; - pagination: { - perPage: number; - currentPage: number; - nextPage: number | null; - totalRecords: number; - totalPages: number; - }; + pagination: Pagination; } export default SearchResponse; diff --git a/types/Search/SearchService.ts b/types/Search/SearchService.ts index 9aff5c6b8c..33a2f83156 100644 --- a/types/Search/SearchService.ts +++ b/types/Search/SearchService.ts @@ -1,7 +1,6 @@ enum SearchService { KALIMAT = 'kalimat', QDC = 'qdc', - Tarteel = 'tarteel', } export default SearchService; diff --git a/types/Search/SearchVerseItem.ts b/types/Search/SearchVerseItem.ts index 1d85a42a3b..98cded5ea3 100644 --- a/types/Search/SearchVerseItem.ts +++ b/types/Search/SearchVerseItem.ts @@ -1,11 +1,4 @@ -import Verse from '../Verse'; -import Word from '../Word'; +import { SearchNavigationResult } from './SearchNavigationResult'; -type SearchVerseItem = Verse & { - words: Word[]; -} & { - kalimatData: { - matches?: string; - }; -}; +type SearchVerseItem = SearchNavigationResult; export default SearchVerseItem; diff --git a/types/SearchQuerySource.ts b/types/SearchQuerySource.ts index 1cd565e97d..0fc777df3c 100644 --- a/types/SearchQuerySource.ts +++ b/types/SearchQuerySource.ts @@ -5,7 +5,6 @@ enum SearchQuerySource { TranslationSettingsDrawer = 'settings_drawer_translation', TafsirSettingsDrawer = 'settings_drawer_tafsir', ReciterPageChapterList = 'reciter_page_chapter_list', - Tarteel = 'tarteel', SidebarNavigationChaptersList = 'sidebar_navigation_chapter_list', SidebarNavigationVersesList = 'sidebar_navigation_verse_list', SidebarNavigationJuzsList = 'sidebar_navigation_juz_list', diff --git a/types/SearchType.ts b/types/SearchType.ts index efb2c05193..f9665cc119 100644 --- a/types/SearchType.ts +++ b/types/SearchType.ts @@ -1,5 +1,4 @@ enum SearchType { - Voice = 'voice', Text = 'text', } diff --git a/types/Tarteel/Event.ts b/types/Tarteel/Event.ts deleted file mode 100644 index 671cb926a8..0000000000 --- a/types/Tarteel/Event.ts +++ /dev/null @@ -1,10 +0,0 @@ -enum Event { - START_STREAM = 'START_STREAM', - END_STREAM = 'END_STREAM', - SEARCH_LOADING = 'SEARCH_LOADING', - SEARCH_RESULT = 'SEARCH_RESULT', - PARTIAL_TRANSCRIPT = 'PARTIAL_TRANSCRIPT', - ERROR = 'ERROR', -} - -export default Event; diff --git a/types/Tarteel/PartialTranscript.ts b/types/Tarteel/PartialTranscript.ts deleted file mode 100644 index 9b2d621f8c..0000000000 --- a/types/Tarteel/PartialTranscript.ts +++ /dev/null @@ -1,5 +0,0 @@ -interface PartialTranscript { - queryText: string; -} - -export default PartialTranscript; diff --git a/types/Tarteel/Result.ts b/types/Tarteel/Result.ts deleted file mode 100644 index 87a5f65325..0000000000 --- a/types/Tarteel/Result.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Event from './Event'; -import PartialTranscript from './PartialTranscript'; -import SearchResult from './SearchResult'; - -interface Result { - event: Event; - data: SearchResult | PartialTranscript; -} - -export default Result; diff --git a/types/Tarteel/SearchResult.ts b/types/Tarteel/SearchResult.ts deleted file mode 100644 index f94f1e6b68..0000000000 --- a/types/Tarteel/SearchResult.ts +++ /dev/null @@ -1,9 +0,0 @@ -interface SearchResult { - queryText: string; - matches?: { - ayahNum: number; - surahNum: number; - }[]; -} - -export default SearchResult; diff --git a/types/Tarteel/VoiceError.ts b/types/Tarteel/VoiceError.ts deleted file mode 100644 index f867792019..0000000000 --- a/types/Tarteel/VoiceError.ts +++ /dev/null @@ -1,10 +0,0 @@ -enum VoiceError { - NO_PERMISSION = 'NO_PERMISSION', - NOT_SUPPORTED = 'NOT_SUPPORTED', - SOCKET_ERROR = 'SOCKET_ERROR', - RESPONSE_ERROR = 'RESPONSE_ERROR', - WORKLET_ERROR = 'WORKLET_ERROR', - GENERAL_ERROR = 'GENERAL_ERROR', -} - -export default VoiceError; diff --git a/types/auth/SignUpRequest.ts b/types/auth/SignUpRequest.ts new file mode 100644 index 0000000000..b0b13834b0 --- /dev/null +++ b/types/auth/SignUpRequest.ts @@ -0,0 +1,11 @@ +interface SignUpRequest { + firstName: string; + lastName: string; + email: string; + username: string; + password: string; + confirmPassword: string; + verificationCode?: string; +} + +export default SignUpRequest; diff --git a/types/auth/error.ts b/types/auth/error.ts new file mode 100644 index 0000000000..253d950188 --- /dev/null +++ b/types/auth/error.ts @@ -0,0 +1,33 @@ +export enum ServerErrorCodes { + INVALID = 'INVALID', + INVALID_CREDENTIALS = 'INVALID_CREDENTIALS', + MIN_LENGTH = 'MIN_LENGTH', + MAX_LENGTH = 'MAX_LENGTH', + MISSING = 'MISSING', + DUPLICATE = 'DUPLICATE', + EXACT_LENGTH = 'EXACT_LENGTH', + MISMATCH = 'MISMATCH', + USED = 'USED', + EXPIRED = 'EXPIRED', + BANNED = 'BANNED', + IMMUTABLE = 'IMMUTABLE', + BAD_REQUEST = 'BAD_REQUEST', + NOT_FOUND = 'NOT_FOUND', +} + +export const BASE_SERVER_ERRORS_MAP: Record = { + [ServerErrorCodes.DUPLICATE]: 'errors.taken', + [ServerErrorCodes.MIN_LENGTH]: 'errors.min', + [ServerErrorCodes.MAX_LENGTH]: 'errors.max', + [ServerErrorCodes.MISSING]: 'errors.required', + [ServerErrorCodes.INVALID]: 'errors.invalid', + [ServerErrorCodes.INVALID_CREDENTIALS]: 'errors.invalidEmailOrPassword', + [ServerErrorCodes.BANNED]: 'errors.banned', + [ServerErrorCodes.MISMATCH]: 'errors.confirm', + [ServerErrorCodes.USED]: 'errors.usedToken', + [ServerErrorCodes.EXPIRED]: 'errors.expiredToken', + [ServerErrorCodes.EXACT_LENGTH]: 'errors.exactLength', + [ServerErrorCodes.IMMUTABLE]: 'errors.immutable', + [ServerErrorCodes.BAD_REQUEST]: 'errors.badRequest', + [ServerErrorCodes.NOT_FOUND]: 'errors.notFound', +}; diff --git a/yarn.lock b/yarn.lock index e4dabe54f4..8c9d3147e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -260,15 +260,6 @@ resolved "https://registry.yarnpkg.com/@atomico/use-value-history/-/use-value-history-1.0.1.tgz#74ba40c382936f835c80435d2e67235216f32286" integrity sha512-a0mtNNQ7AXOtJF93ySqp0sw1AQg6GiAEtoThpePEH/CCU07tyW2lKsAINU4/SYxZKYhyMbqBTuziK4D7gixFXg== -"@aws-crypto/crc32@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz#07300eca214409c33e3ff769cd5697b57fdd38fa" - integrity sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA== - dependencies: - "@aws-crypto/util" "^3.0.0" - "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - "@aws-crypto/crc32@5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" @@ -278,75 +269,57 @@ "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" -"@aws-crypto/crc32c@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz#016c92da559ef638a84a245eecb75c3e97cb664f" - integrity sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w== +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - -"@aws-crypto/ie11-detection@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz#640ae66b4ec3395cee6a8e94ebcd9f80c24cd688" - integrity sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q== - dependencies: - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/sha1-browser@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz#f9083c00782b24714f528b1a1fef2174002266a3" - integrity sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw== +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-browser@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz#05f160138ab893f1c6ba5be57cfd108f05827766" - integrity sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ== +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== dependencies: - "@aws-crypto/ie11-detection" "^3.0.0" - "@aws-crypto/sha256-js" "^3.0.0" - "@aws-crypto/supports-web-crypto" "^3.0.0" - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" "@aws-sdk/util-locate-window" "^3.0.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" -"@aws-crypto/sha256-js@3.0.0", "@aws-crypto/sha256-js@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz#f06b84d550d25521e60d2a0e2a90139341e007c2" - integrity sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ== +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: - "@aws-crypto/util" "^3.0.0" + "@aws-crypto/util" "^5.2.0" "@aws-sdk/types" "^3.222.0" - tslib "^1.11.1" - -"@aws-crypto/supports-web-crypto@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz#5d1bf825afa8072af2717c3e455f35cda0103ec2" - integrity sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg== - dependencies: - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/util@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-3.0.0.tgz#1c7ca90c29293f0883468ad48117937f0fe5bfb0" - integrity sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w== +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== dependencies: - "@aws-sdk/types" "^3.222.0" - "@aws-sdk/util-utf8-browser" "^3.0.0" - tslib "^1.11.1" + tslib "^2.6.2" -"@aws-crypto/util@^5.2.0": +"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": version "5.2.0" resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== @@ -355,781 +328,781 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-cloudwatch-logs@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.583.0.tgz#2e5658e2ffe44176c9c04ef07316521c82f99e23" - integrity sha512-H9fQuy3M8WqNdnQOUAz9fMp+IsGqStoGJYPpRquSOKQt00wmnbNqTd0Nmz/xMlfJOCawNZb1yu1A+O1z/ugXag== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/eventstream-serde-browser" "^3.0.0" - "@smithy/eventstream-serde-config-resolver" "^3.0.0" - "@smithy/eventstream-serde-node" "^3.0.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/client-cloudwatch-logs@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.738.0.tgz#9dd23b4f927d22be5b3b02724e7f8ccce6bbedbf" + integrity sha512-C2TuIKZjBl4xIQEJC5IXFEClNkxaSEJ35Y95p+7KbzBAunRFYEwidCAN2j14l2kLFbr+Z7JO/txtSQebO22hJA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" + "@types/uuid" "^9.0.1" tslib "^2.6.2" uuid "^9.0.1" -"@aws-sdk/client-cognito-identity@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.583.0.tgz#f25360e29b46af8086f2b8f6bc6e51bcb5ac1c54" - integrity sha512-FrkVjrDRsXofw1F/iJqR/DOKPbIakIB+Dr04l25Em4PTWBj29NcQyYW49qcCHF0CPkqQpin8ASXDWzGv7A0yxg== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/client-cognito-identity@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.738.0.tgz#819f9764ee09bb151966852fad656dcf56a06edf" + integrity sha512-TjPpLZ2qkh+2jQIYtUbNh5D6jv4U0DQIUiLLZOKalUqSK2L9OzTc1463kX076QCpYlAZJNt3FvPyiMab0W8zBg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-iam@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.583.0.tgz#8dc95aa02c5470c012570e6ff3071bab781b9cad" - integrity sha512-EA6TTpN3Tkn7C16afyJpKvUrqmz0rJQKEBc/Baf3JMWfFkDYbM7DSW7WbDneebAAHucxIra1UKvzcHlJcwIHng== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.0.0" +"@aws-sdk/client-iam@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.738.0.tgz#4b4ebc2159f85c64111e16a9cbd5222ab6cb00d3" + integrity sha512-AZtHcqtWFOVlACYb5eoc1AefRxRxUmNcUcMzvfPiltCVNJD3S+ha8TFVYsCyGc850PIQZD75A8guIVzmAzw7VQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/client-lambda@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.583.0.tgz#fd4a1f6509ee7420edada39cc72414f7f3dd5768" - integrity sha512-d8rFjAA3UE+K7rTbp7XuMo2FVkr+S9IztkwyUo9hgWZDbdbUl7vhKSX220byJK/BZOnnIY4IXGNkbGoAT+aKyw== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/eventstream-serde-browser" "^3.0.0" - "@smithy/eventstream-serde-config-resolver" "^3.0.0" - "@smithy/eventstream-serde-node" "^3.0.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-stream" "^3.0.1" - "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.0.0" +"@aws-sdk/client-lambda@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.738.0.tgz#85cc97291ab147d70e4f8fe5e4923237aad7dd1d" + integrity sha512-arkwnxoMl1m83cMPNJ8HXyQgBBgHRQBaRyg1K/BjLB5QTXzFTnRQo9P+CJvb8J80wL+SkWgpl+07o33/qXP+WA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/client-s3@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.583.0.tgz#e65c149ece09d017d03e95c0bc9963b2608fa536" - integrity sha512-pS7wncugSuIQ8RgtRIE9Dystdmd3mMnjfjiO1iA1UhGXkyAgoJzQ4jH0r+5X+eWmYHYQcfy9fUQXT2gqV3t9GA== - dependencies: - "@aws-crypto/sha1-browser" "3.0.0" - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-bucket-endpoint" "3.577.0" - "@aws-sdk/middleware-expect-continue" "3.577.0" - "@aws-sdk/middleware-flexible-checksums" "3.577.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-location-constraint" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-sdk-s3" "3.582.0" - "@aws-sdk/middleware-signing" "3.577.0" - "@aws-sdk/middleware-ssec" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/signature-v4-multi-region" "3.582.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@aws-sdk/xml-builder" "3.575.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/eventstream-serde-browser" "^3.0.0" - "@smithy/eventstream-serde-config-resolver" "^3.0.0" - "@smithy/eventstream-serde-node" "^3.0.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-blob-browser" "^3.0.0" - "@smithy/hash-node" "^3.0.0" - "@smithy/hash-stream-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/md5-js" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-stream" "^3.0.1" - "@smithy/util-utf8" "^3.0.0" - "@smithy/util-waiter" "^3.0.0" +"@aws-sdk/client-s3@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.738.0.tgz#0bb71fa46d234c0bd7f86f61c4075453bdf61a8e" + integrity sha512-1Im/p5yfoV15ydVY+QlffsWQkQm7iGVI+3V9tCHEUT6SdmukYEpN3G8Y+lWofRBidxzUE2Xd+MbChCXfzLAoAg== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-bucket-endpoint" "3.734.0" + "@aws-sdk/middleware-expect-continue" "3.734.0" + "@aws-sdk/middleware-flexible-checksums" "3.735.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-location-constraint" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-sdk-s3" "3.734.0" + "@aws-sdk/middleware-ssec" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/signature-v4-multi-region" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@aws-sdk/xml-builder" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-blob-browser" "^4.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/hash-stream-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/md5-js" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/client-service-quotas@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-service-quotas/-/client-service-quotas-3.583.0.tgz#0d83d73e7d79fa5dc2b54ddd87a35af7efc12689" - integrity sha512-Rw9zuATgtkIXoF60C0tZ6y4VWeNl5c3O8nFMXwkNNgNPIPJEGfvXbmWrpbrGl7QEIlG25FlynFZQQQru5wqaYQ== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/client-service-quotas@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-service-quotas/-/client-service-quotas-3.738.0.tgz#fe1cfef036ed98d65c4f064fdfba01d58b70f1af" + integrity sha512-y1wMEfJWmbX2EYwEoUnVINUGcaam5rxe9gvx1K+pv8CbvYNMyELgUSPytADip+IndQiHOWvB2irOUMh/1knFaA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.583.0.tgz#71a00305f3d5d13041e6c2fff53cec62f621eb1f" - integrity sha512-LO3wmrFXPi2kNE46lD1XATfRrvdNxXd4DlTFouoWmr7lvqoUkcbmtkV2r/XChZA2z0HiDauphC1e8b8laJVeSg== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/client-sso@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.734.0.tgz#789c98267f07aaa7155b404d0bfd4059c4b4deb9" + integrity sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.583.0.tgz#fa18cadd19abe80e0c0378b6cbe6225ed0296595" - integrity sha512-FNJ2MmiBtZZwgkj4+GLVrzqwmD6D8FBptrFZk7PnGkSf7v1Q8txYNI6gY938RRhYJ4lBW4cNbhPvWoDxAl90Hw== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/client-sts@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.738.0.tgz#7e3ba2f860635af0c987bb9ed9eba3661c763f9b" + integrity sha512-aLrmIzTtfbu9JChh9k5jzmymSesOiadwPFLJx1Yqvwryy9EAXYL9jsAkqtJaaJyZ3zD04F1Q2Tm5koKCPi8sNw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.583.0.tgz#d8109ab588689a616d987f6b1d4faacafe49f598" - integrity sha512-xDMxiemPDWr9dY2Q4AyixkRnk/hvS6fs6OWxuVCz1WO47YhaAfOsEGAgQMgDLLaOfj/oLU5D14uTNBEPGh4rBA== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sso-oidc" "3.583.0" - "@aws-sdk/core" "3.582.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/middleware-host-header" "3.577.0" - "@aws-sdk/middleware-logger" "3.577.0" - "@aws-sdk/middleware-recursion-detection" "3.577.0" - "@aws-sdk/middleware-user-agent" "3.583.0" - "@aws-sdk/region-config-resolver" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@aws-sdk/util-user-agent-browser" "3.577.0" - "@aws-sdk/util-user-agent-node" "3.577.0" - "@smithy/config-resolver" "^3.0.0" - "@smithy/core" "^2.0.1" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/hash-node" "^3.0.0" - "@smithy/invalid-dependency" "^3.0.0" - "@smithy/middleware-content-length" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/middleware-retry" "^3.0.1" - "@smithy/middleware-serde" "^3.0.0" - "@smithy/middleware-stack" "^3.0.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/url-parser" "^3.0.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.1" - "@smithy/util-defaults-mode-node" "^3.0.1" - "@smithy/util-endpoints" "^2.0.0" - "@smithy/util-middleware" "^3.0.0" - "@smithy/util-retry" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/core@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.734.0.tgz#fa2289750efd75f4fb8c45719a4a4ea7e7755160" + integrity sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/core" "^3.1.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/core@3.582.0": - version "3.582.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.582.0.tgz#9ebb295290cba3d68738401fe4e3d51dfb0d1bfc" - integrity sha512-ofmD96IQc9g1dbyqlCyxu5fCG7kIl9p1NoN5+vGBUyLdbmPCV3Pdg99nRHYEJuv2MgGx5AUFGDPMHcqbJpnZIw== - dependencies: - "@smithy/core" "^2.0.1" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - fast-xml-parser "4.2.5" - tslib "^2.6.2" - -"@aws-sdk/credential-provider-cognito-identity@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.583.0.tgz#45468c8f3f73080cfdfd6708ab07e18c5cfdfb79" - integrity sha512-Z6VdDZApTxeI/n8qXBz3IkAdC0tL/mw+cz6EprqpkZG8bejHw78fVjeaVOBBkuskUikjwN4puv0SEJzoEMIqpA== +"@aws-sdk/credential-provider-cognito-identity@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.738.0.tgz#ff576487221c2e134b5aeaddbe2d81e008f1bdce" + integrity sha512-zh8ATHUjy9CyVrq7qa7ICh4t5OF7mps0A22NY2NyLpSYWOErNnze+FvBi2uh+Jp+VIoojH4R2d9/IHTxENhq7g== dependencies: - "@aws-sdk/client-cognito-identity" "3.583.0" - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/client-cognito-identity" "3.738.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.577.0.tgz#d587ea01a2288840e8483a236516c0f26cb4ba36" - integrity sha512-Jxu255j0gToMGEiqufP8ZtKI8HW90lOLjwJ3LrdlD/NLsAY0tOQf1fWc53u28hWmmNGMxmCrL2p66IOgMDhDUw== +"@aws-sdk/credential-provider-env@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.734.0.tgz#6c0b1734764a7fb1616455836b1c3dacd99e50a3" + integrity sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.582.0": - version "3.582.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.582.0.tgz#6ea9377461c4ce38d487ea0ae5888155f7c495a6" - integrity sha512-kGOUKw5ryPkDIYB69PjK3SicVLTbWB06ouFN2W1EvqUJpkQGPAUGzYcomKtt3mJaCTf/1kfoaHwARAl6KKSP8Q== - dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/fetch-http-handler" "^3.0.1" - "@smithy/node-http-handler" "^3.0.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/util-stream" "^3.0.1" +"@aws-sdk/credential-provider-http@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.734.0.tgz#21c5fbb380d1dd503491897b346e1e0b1d06ae41" + integrity sha512-JFSL6xhONsq+hKM8xroIPhM5/FOhiQ1cov0lZxhzZWj6Ai3UAjucy3zyIFDr9MgP1KfCYNdvyaUq9/o+HWvEDg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.583.0.tgz#948ebd3ca257d7d9362d3294259e0be9526cd662" - integrity sha512-8I0oWNg/yps6ctjhEeL/qJ9BIa/+xXP7RPDQqFKZ2zBkWbmLLOoMWXRvl8uKUBD6qCe+DGmcu9skfVXeXSesEQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.577.0" - "@aws-sdk/credential-provider-process" "3.577.0" - "@aws-sdk/credential-provider-sso" "3.583.0" - "@aws-sdk/credential-provider-web-identity" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@smithy/credential-provider-imds" "^3.0.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/shared-ini-file-loader" "^3.0.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-ini@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.734.0.tgz#5769ae28cd255d4fc946799c0273b4af6f2f12bb" + integrity sha512-HEyaM/hWI7dNmb4NhdlcDLcgJvrilk8G4DQX6qz0i4pBZGC2l4iffuqP8K6ZQjUfz5/6894PzeFuhTORAMd+cg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.583.0.tgz#8ce316409d91cddca0c85851ca50726ee666cff5" - integrity sha512-yBNypBXny7zJH85SzxDj8s1mbLXv9c/Vbq0qR3R3POj2idZ6ywB/qlIRC1XwBuv49Wvg8kA1wKXk3K3jrpcVIw== - dependencies: - "@aws-sdk/credential-provider-env" "3.577.0" - "@aws-sdk/credential-provider-http" "3.582.0" - "@aws-sdk/credential-provider-ini" "3.583.0" - "@aws-sdk/credential-provider-process" "3.577.0" - "@aws-sdk/credential-provider-sso" "3.583.0" - "@aws-sdk/credential-provider-web-identity" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@smithy/credential-provider-imds" "^3.0.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/shared-ini-file-loader" "^3.0.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-node@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.738.0.tgz#0a470fc4d2e791c26da57261b8b14f07de43cd74" + integrity sha512-3MuREsazwBxghKb2sQQHvie+uuK4dX4/ckFYiSoffzJQd0YHxaGxf8cr4NOSCQCUesWu8D3Y0SzlnHGboVSkpA== + dependencies: + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-ini" "3.734.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.577.0.tgz#ba35b4f012563762bbd86a71989d366272ee0f07" - integrity sha512-Gin6BWtOiXxIgITrJ3Nwc+Y2P1uVT6huYR4EcbA/DJUPWyO0n9y5UFLewPvVbLkRn15JeEqErBLUrHclkiOKtw== +"@aws-sdk/credential-provider-process@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.734.0.tgz#eb1de678a9c3d2d7b382e74a670fa283327f9c45" + integrity sha512-zvjsUo+bkYn2vjT+EtLWu3eD6me+uun+Hws1IyWej/fKFAqiBPwyeyCgU7qjkiPQSXqk1U9+/HG9IQ6Iiz+eBw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/shared-ini-file-loader" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.583.0.tgz#468bb6ca9bd7b89370d5ec7865a8e29e98772abc" - integrity sha512-G/1EvL9tBezSiU+06tG4K/kOvFfPjnheT4JSXqjPM7+vjKzgp2jxp1J9MMd69zs4jVWon932zMeGgjrCplzMEg== - dependencies: - "@aws-sdk/client-sso" "3.583.0" - "@aws-sdk/token-providers" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/shared-ini-file-loader" "^3.0.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-provider-sso@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.734.0.tgz#68a9d678319e9743d65cf59e2d29c0c440d8975c" + integrity sha512-cCwwcgUBJOsV/ddyh1OGb4gKYWEaTeTsqaAK19hiNINfYV/DO9r4RMlnWAo84sSBfJuj9shUNsxzyoe6K7R92Q== + dependencies: + "@aws-sdk/client-sso" "3.734.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/token-providers" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.577.0.tgz#294fb71fa832d9f55ea1c56678357efa3cd7ca55" - integrity sha512-ZGHGNRaCtJJmszb9UTnC7izNCtRUttdPlLdMkh41KPS32vfdrBDHs1JrpbZijItRj1xKuOXsiYSXLAaHGcLh8Q== +"@aws-sdk/credential-provider-web-identity@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.734.0.tgz#666b61cc9f498a3aaecd8e38c9ae34aef37e2e64" + integrity sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/credential-providers@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.583.0.tgz#138f4894cd2f00730b618434bfc86caec253636c" - integrity sha512-aD/lw6LJW51f+LgdR54UxyGvXqWZs4HCT310Qf794qFItDWXqhHK4EgS1x41BgAvXPUx0+HSO8OI4eb+AklckA== - dependencies: - "@aws-sdk/client-cognito-identity" "3.583.0" - "@aws-sdk/client-sso" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/credential-provider-cognito-identity" "3.583.0" - "@aws-sdk/credential-provider-env" "3.577.0" - "@aws-sdk/credential-provider-http" "3.582.0" - "@aws-sdk/credential-provider-ini" "3.583.0" - "@aws-sdk/credential-provider-node" "3.583.0" - "@aws-sdk/credential-provider-process" "3.577.0" - "@aws-sdk/credential-provider-sso" "3.583.0" - "@aws-sdk/credential-provider-web-identity" "3.577.0" - "@aws-sdk/types" "3.577.0" - "@smithy/credential-provider-imds" "^3.0.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/credential-providers@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.738.0.tgz#68a723843381c985c8bb773881fef082bd571872" + integrity sha512-Ff+7NMLmK9oadO1uHiMCS/V3Pmp3WnY7Ijy4ySx2HLUZQq7EKFZyFB0qslkeawdY0PGWqyj25anh8I/bhxqWoQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.738.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/credential-provider-cognito-identity" "3.738.0" + "@aws-sdk/credential-provider-env" "3.734.0" + "@aws-sdk/credential-provider-http" "3.734.0" + "@aws-sdk/credential-provider-ini" "3.734.0" + "@aws-sdk/credential-provider-node" "3.738.0" + "@aws-sdk/credential-provider-process" "3.734.0" + "@aws-sdk/credential-provider-sso" "3.734.0" + "@aws-sdk/credential-provider-web-identity" "3.734.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/core" "^3.1.1" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/lib-storage@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.583.0.tgz#43237c1cec8893f7326b14c4fd9a222f147514cd" - integrity sha512-To3mCeSpJiHWxAh00S5+cRfx8BkbdmWvZG2Rvcz20Qqh/GmhMWeDbN4OjDTqcewWpqNhU0n1ShZY/GcIWSn+Pg== +"@aws-sdk/lib-storage@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-storage/-/lib-storage-3.738.0.tgz#6b5f7d4e3fc2b918ab2e7f5017445f43f342e1d9" + integrity sha512-YUBGp3k5Dg8RqHrllS89PjRiqpyIR3eKcQsCTM0bLzf3uRCjiCeSzlnl/co5W7Kxgc+eCnq0IitGYXR/mYFKeA== dependencies: - "@smithy/abort-controller" "^3.0.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/smithy-client" "^3.0.1" + "@smithy/abort-controller" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/smithy-client" "^4.1.2" buffer "5.6.0" events "3.3.0" stream-browserify "3.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.577.0.tgz#e9e685264d442cd0840566f0696dd01de1a8d9c1" - integrity sha512-twlkNX2VofM6kHXzDEiJOiYCc9tVABe5cbyxMArRWscIsCWG9mamPhC77ezG4XsN9dFEwVdxEYD5Crpm/5EUiw== - dependencies: - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" - "@smithy/util-config-provider" "^3.0.0" +"@aws-sdk/middleware-bucket-endpoint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz#af63fcaa865d3a47fd0ca3933eef04761f232677" + integrity sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.577.0.tgz#47add47f17873a6044cb140f17033cb6e1d02744" - integrity sha512-6dPp8Tv4F0of4un5IAyG6q++GrRrNQQ4P2NAMB1W0VO4JoEu1C8GievbbDLi88TFIFmtKpnHB0ODCzwnoe8JsA== +"@aws-sdk/middleware-expect-continue@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz#8159d81c3a8d9a9d60183fdeb7e8d6674f01c1cd" + integrity sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.577.0.tgz#d61be414c446297ffea6df7153767a06a44babff" - integrity sha512-IHAUEipIfagjw92LV8SOSBiCF7ZnqfHcw14IkcZW2/mfrCy1Fh/k40MoS/t3Tro2tQ91rgQPwUoSgB/QCi2Org== - dependencies: - "@aws-crypto/crc32" "3.0.0" - "@aws-crypto/crc32c" "3.0.0" - "@aws-sdk/types" "3.577.0" - "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@aws-sdk/middleware-flexible-checksums@3.735.0": + version "3.735.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.735.0.tgz#e83850711d6750df764d7cf3a1a8434fe91f1fb9" + integrity sha512-Tx7lYTPwQFRe/wQEHMR6Drh/S+X0ToAEq1Ava9QyxV1riwtepzRLojpNDELFb3YQVVYbX7FEiBMCJLMkmIIY+A== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-crypto/util" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.577.0.tgz#a3fc626d409ec850296740478c64ef5806d8b878" - integrity sha512-9ca5MJz455CODIVXs0/sWmJm7t3QO4EUa1zf8pE8grLpzf0J94bz/skDWm37Pli13T3WaAQBHCTiH2gUVfCsWg== +"@aws-sdk/middleware-host-header@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz#a9a02c055352f5c435cc925a4e1e79b7ba41b1b5" + integrity sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.577.0.tgz#9372441a4ac5747b3176ac6378d92866a51de815" - integrity sha512-DKPTD2D2s+t2QUo/IXYtVa/6Un8GZ+phSTBkyBNx2kfZz4Kwavhl/JJzSqTV3GfCXkVdFu7CrjoX7BZ6qWeTUA== +"@aws-sdk/middleware-location-constraint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz#fd1dc0e080ed85dd1feb7db3736c80689db4be07" + integrity sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.577.0.tgz#6da3b13ae284fb3930961f0fc8e20b1f6cf8be30" - integrity sha512-aPFGpGjTZcJYk+24bg7jT4XdIp42mFXSuPt49lw5KygefLyJM/sB0bKKqPYYivW0rcuZ9brQ58eZUNthrzYAvg== +"@aws-sdk/middleware-logger@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz#d31e141ae7a78667e372953a3b86905bc6124664" + integrity sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.577.0.tgz#fff76abc6d4521636f9e654ce5bf2c4c79249417" - integrity sha512-pn3ZVEd2iobKJlR3H+bDilHjgRnNrQ6HMmK9ZzZw89Ckn3Dcbv48xOv4RJvu0aU8SDLl/SNCxppKjeLDTPGBNA== +"@aws-sdk/middleware-recursion-detection@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz#4fa1deb9887455afbb39130f7d9bc89ccee17168" + integrity sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.582.0": - version "3.582.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.582.0.tgz#226ed60ff2a8371ff7821d59d4cfc94ec4fa2f2b" - integrity sha512-PJqQpLoLaZPRI4L/XZUeHkd9UVK8VAr9R38wv0osGeMTvzD9iwzzk0I2TtBqFda/5xEB1YgVYZwyqvmStXmttg== - dependencies: - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-arn-parser" "3.568.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" - "@smithy/util-config-provider" "^3.0.0" +"@aws-sdk/middleware-sdk-s3@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.734.0.tgz#eaeec56fef54713a2a8baa1fbc8be74e8f49fb09" + integrity sha512-zeZPenDhkP/RXYMFG3exhNOe2Qukg2l2KpIjxq9o66meELiTULoIXjCmgPoWcM8zzrue06SBdTsaJDHfDl2vdA== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/core" "^3.1.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-signing@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.577.0.tgz#8c9a2e16fb0ac72043b271005c674a74db2b9ee6" - integrity sha512-QS/dh3+NqZbXtY0j/DZ867ogP413pG5cFGqBy9OeOhDMsolcwLrQbi0S0c621dc1QNq+er9ffaMhZ/aPkyXXIg== - dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/types" "^3.0.0" - "@smithy/util-middleware" "^3.0.0" +"@aws-sdk/middleware-ssec@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz#a5863b9c5a5006dbf2f856f14030d30063a28dfa" + integrity sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.577.0.tgz#9fcd74e8bf2c277b4349c537cbeceba279166f32" - integrity sha512-i2BPJR+rp8xmRVIGc0h1kDRFcM2J9GnClqqpc+NLSjmYadlcg4mPklisz9HzwFVcRPJ5XcGf3U4BYs5G8+iTyg== - dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/middleware-user-agent@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.734.0.tgz#12d400ccb98593f2b02e4fb08239cb9835d41d3a" + integrity sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg== + dependencies: + "@aws-sdk/core" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@smithy/core" "^3.1.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.583.0.tgz#5554b0de431cb3700368f01eb7425210fd3ee9a9" - integrity sha512-xVNXXXDWvBVI/AeVtSdA9SVumqxiZaESk/JpUn9GMkmtTKfter0Cweap+1iQ9j8bRAO0vNhmIkbcvdB1S4WVUw== - dependencies: - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-endpoints" "3.583.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/types" "^3.0.0" +"@aws-sdk/nested-clients@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.734.0.tgz#10a116d141522341c446b11783551ef863aabd27" + integrity sha512-iph2XUy8UzIfdJFWo1r0Zng9uWj3253yvW9gljhtu+y/LNmNvSnJxQk1f3D2BC5WmcoPZqTS3UsycT3mLPSzWA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.734.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.734.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/middleware-retry" "^4.0.3" + "@smithy/middleware-serde" "^4.0.1" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.3" + "@smithy/util-defaults-mode-node" "^4.0.3" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.577.0.tgz#1fab6dc6c4ec3ad9a0352c1ce1a757464219fb00" - integrity sha512-4ChCFACNwzqx/xjg3zgFcW8Ali6R9C95cFECKWT/7CUM1D0MGvkclSH2cLarmHCmJgU6onKkJroFtWp0kHhgyg== +"@aws-sdk/region-config-resolver@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz#45ffbc56a3e94cc5c9e0cd596b0fda60f100f70b" + integrity sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/types" "^3.0.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@aws-sdk/s3-request-presigner@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.583.0.tgz#2b3ca99ca43ab17c7a9db89e081666753c62838a" - integrity sha512-Xp48RdnUzERYraIczByhbV/92TtXeJNE7QXOyMGVdvQkVP+3rwuXRGg85FqNSkOq7TFaGhnuxPiYWvsTeEzZTg== - dependencies: - "@aws-sdk/signature-v4-multi-region" "3.582.0" - "@aws-sdk/types" "3.577.0" - "@aws-sdk/util-format-url" "3.577.0" - "@smithy/middleware-endpoint" "^3.0.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/smithy-client" "^3.0.1" - "@smithy/types" "^3.0.0" +"@aws-sdk/s3-request-presigner@3.738.0": + version "3.738.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.738.0.tgz#1771713ac8e30a228a8da74a7300eac2e510d9c7" + integrity sha512-cGENzkOxfAqrLfUdwYETDFiMOGjvicXV2EJe8sSH9Tw3wlm74WrIjZdw6ObHzm7AFnduHRNLVgX3KOtU7MlfCw== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-format-url" "3.734.0" + "@smithy/middleware-endpoint" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.2" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.582.0": - version "3.582.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.582.0.tgz#8679ac134ef37ff0a80f736dcc8699bb60a076d2" - integrity sha512-aFCOjjNqEX2l+V8QjOWy5F7CtHIC/RlYdBuv3No6yxn+pMvVUUe6zdMk2yHWcudVpHWsyvcZzAUBliAPeFLPsQ== +"@aws-sdk/signature-v4-multi-region@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.734.0.tgz#218d254d85b5e97409266725fdd6e9c28c3fbcab" + integrity sha512-GSRP8UH30RIYkcpPILV4pWrKFjRmmNjtUd41HTKWde5GbjJvNYpxqFXw2aIJHjKTw/js3XEtGSNeTaQMVVt3CQ== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.582.0" - "@aws-sdk/types" "3.577.0" - "@smithy/protocol-http" "^4.0.0" - "@smithy/signature-v4" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/middleware-sdk-s3" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/token-providers@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.577.0.tgz#8f9e96ff42994dfd0b5b3692b583644ccda04893" - integrity sha512-0CkIZpcC3DNQJQ1hDjm2bdSy/Xjs7Ny5YvSsacasGOkNfk+FdkiQy6N67bZX3Zbc9KIx+Nz4bu3iDeNSNplnnQ== +"@aws-sdk/token-providers@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.734.0.tgz#8880e94f21457fe5dd7074ecc52fdd43180cbb2c" + integrity sha512-2U6yWKrjWjZO8Y5SHQxkFvMVWHQWbS0ufqfAIBROqmIZNubOL7jXCiVdEFekz6MZ9LF2tvYGnOW4jX8OKDGfIw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/property-provider" "^3.0.0" - "@smithy/shared-ini-file-loader" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/nested-clients" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/types@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.577.0.tgz#7700784d368ce386745f8c340d9d68cea4716f90" - integrity sha512-FT2JZES3wBKN/alfmhlo+3ZOq/XJ0C7QOZcDNrpKjB0kqYoKjhVKZ/Hx6ArR0czkKfHzBBEs6y40ebIHx2nSmA== +"@aws-sdk/types@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.734.0.tgz#af5e620b0e761918282aa1c8e53cac6091d169a2" + integrity sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg== dependencies: - "@smithy/types" "^3.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@aws-sdk/types@^3.222.0": @@ -1140,31 +1113,31 @@ "@smithy/types" "^2.12.0" tslib "^2.6.2" -"@aws-sdk/util-arn-parser@3.568.0": - version "3.568.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz#6a19a8c6bbaa520b6be1c278b2b8c17875b91527" - integrity sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w== +"@aws-sdk/util-arn-parser@3.723.0": + version "3.723.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz#e9bff2b13918a92d60e0012101dad60ed7db292c" + integrity sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w== dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.583.0": - version "3.583.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.583.0.tgz#1554d3b4124be21a72a519603e9727d973845504" - integrity sha512-ZC9mb2jq6BFXPYsUsD2tmYcnlmd+9PGNwnFNn8jk4abna5Jjk2wDknN81ybktmBR5ttN9W8ugmktuKtvAMIDCQ== +"@aws-sdk/util-endpoints@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.734.0.tgz#43bac42a21a45477a386ccf398028e7f793bc217" + integrity sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" - "@smithy/util-endpoints" "^2.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + "@smithy/util-endpoints" "^3.0.1" tslib "^2.6.2" -"@aws-sdk/util-format-url@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.577.0.tgz#e6686c767e9809416179dbafbc2a39cbbb548259" - integrity sha512-SyEGC2J+y/krFRuPgiF02FmMYhqbiIkOjDE6k4nYLJQRyS6XEAGxZoG+OHeOVEM+bsDgbxokXZiM3XKGu6qFIg== +"@aws-sdk/util-format-url@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.734.0.tgz#d78c48d7fc9ff3e15e93d92620bf66b9d1e115fd" + integrity sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/querystring-builder" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": @@ -1174,39 +1147,33 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.577.0.tgz#d4d2cdb3a2b3d1c8b35f239ee9f7b2c87bee66ea" - integrity sha512-zEAzHgR6HWpZOH7xFgeJLc6/CzMcx4nxeQolZxVZoB5pPaJd3CjyRhZN0xXeZB0XIRCWmb4yJBgyiugXLNMkLA== +"@aws-sdk/util-user-agent-browser@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz#bbf3348b14bd7783f60346e1ce86978999450fe7" + integrity sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.577.0": - version "3.577.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.577.0.tgz#0215ea10ead622a61b575a7181a4c51ae8e71449" - integrity sha512-XqvtFjbSMtycZTWVwDe8DRWovuoMbA54nhUoZwVU6rW9OSD6NZWGR512BUGHFaWzW0Wg8++Dj10FrKTG2XtqfA== +"@aws-sdk/util-user-agent-node@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.734.0.tgz#d5c6ee192cea9d53a871178a2669b8b4dea39a68" + integrity sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA== dependencies: - "@aws-sdk/types" "3.577.0" - "@smithy/node-config-provider" "^3.0.0" - "@smithy/types" "^3.0.0" + "@aws-sdk/middleware-user-agent" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@aws-sdk/util-utf8-browser@^3.0.0": - version "3.259.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz#3275a6f5eb334f96ca76635b961d3c50259fd9ff" - integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== +"@aws-sdk/xml-builder@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz#174d3269d303919e3ebfbfa3dd9b6d5a6a7a9543" + integrity sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ== dependencies: - tslib "^2.3.1" - -"@aws-sdk/xml-builder@3.575.0": - version "3.575.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.575.0.tgz#233b2aae422dd789a078073032da1bc60317aa1d" - integrity sha512-cWgAwmbFYNCFzPwxL705+lWps0F3ZvOckufd2KKoEZUmtpVw9/txUXNrPySUXSmRTSRhoatIMABNfStWR043bQ== - dependencies: - "@smithy/types" "^3.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": @@ -2596,226 +2563,241 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.6.tgz#0ef08fd5897a362a1bf05bc15714cbb2e8896aee" - integrity sha512-pL0Ci8P9q1sWbtPx8CXbc8JvPvvYdJJQ+LO09PLFsbz3aYNdFBGWJjiHU+CaObO4Ames+GOFpXRAJZS2L3ZK/A== +"@esbuild/aix-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz#499600c5e1757a524990d5d92601f0ac3ce87f64" + integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ== "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.6.tgz#5f355ae54027360113e6aadcb25291d0d97976e0" - integrity sha512-J3lwhDSXBBppSzm/LC1uZ8yKSIpExc+5T8MxrYD9KNVZG81FOAu2VF2gXi/6A/LwDDQQ+b6DpQbYlo3VwxFepQ== +"@esbuild/android-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz#b9b8231561a1dfb94eb31f4ee056b92a985c324f" + integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g== "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.6.tgz#67340bed315fa200900ad26d58ff47564e9c6f74" - integrity sha512-hE2vZxOlJ05aY28lUpB0y0RokngtZtcUB+TVl9vnLEnY0z/8BicSvrkThg5/iI1rbf8TwXrbr2heEjl9fLf+EA== +"@esbuild/android-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.0.tgz#ca6e7888942505f13e88ac9f5f7d2a72f9facd2b" + integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g== "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/darwin-arm64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.6.tgz#0e60158a25aa30d73544c728b9e7c904ff3b7706" - integrity sha512-/tuyl4R+QhhoROQtuQj9E/yfJtZNdv2HKaHwYhhHGQDN1Teziem2Kh7BWQMumfiY7Lu9g5rO7scWdGE4OsQ6MQ== +"@esbuild/android-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.0.tgz#e765ea753bac442dfc9cb53652ce8bd39d33e163" + integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg== "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.6.tgz#16a4c802000d00b139281198017fc00134b8df12" - integrity sha512-L7IQga2pDT+14Ti8HZwsVfbCjuKP4U213T3tuPggOzyK/p4KaUJxQFXJgfUFHKzU0zOXx8QcYRYZf0hSQtppkw== +"@esbuild/darwin-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz#fa394164b0d89d4fdc3a8a21989af70ef579fa2c" + integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw== "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/freebsd-arm64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.6.tgz#71008abc926e47d0f91eba46bf9af643ce1118d4" - integrity sha512-bq10jFv42V20Kk77NvmO+WEZaLHBKuXcvEowixnBOMkaBgS7kQaqTc77ZJDbsUpXU3KKNLQFZctfaeINmeTsZA== +"@esbuild/darwin-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz#91979d98d30ba6e7d69b22c617cc82bdad60e47a" + integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg== "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.6.tgz#59195dbc35a1c73acf9f3804f4245702fc0669de" - integrity sha512-HbDLlkDZqUMBQaiday0pJzB6/8Xx/10dI3xRebJBReOEeDSeS+7GzTtW9h8ZnfB7/wBCqvtAjGtWQLTNPbR2+g== +"@esbuild/freebsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz#b97e97073310736b430a07b099d837084b85e9ce" + integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w== "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.6.tgz#744821299570fe676cac0db34d49e28ee8d50f57" - integrity sha512-NMY9yg/88MskEZH2s4i6biz/3av+M8xY5ua4HE7CCz5DBz542cr7REe317+v7oKjnYBCijHpkzo5vU85bkXQmQ== +"@esbuild/freebsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz#f3b694d0da61d9910ec7deff794d444cfbf3b6e7" + integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A== "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.6.tgz#f98002f9688fd3ac349e484a0de50ba4f7b47aeb" - integrity sha512-C+5kb6rgsGMmvIdUI7v1PPgC98A6BMv233e97aXZ5AE03iMdlILFD/20HlHrOi0x2CzbspXn9HOnlE4/Ijn5Kw== +"@esbuild/linux-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz#f921f699f162f332036d5657cad9036f7a993f73" + integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg== "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-ia32@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.6.tgz#4ceb486ad4aab4fbba702d21f40ab97bc3f3f0d4" - integrity sha512-AXazA0ljvQEp7cA9jscABNXsjodKbEcqPcAE3rDzKN82Vb3lYOq6INd+HOCA7hk8IegEyHW4T72Z7QGIhyCQEA== +"@esbuild/linux-arm@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz#cc49305b3c6da317c900688995a4050e6cc91ca3" + integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg== "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-loong64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.6.tgz#94c34253c006a894483b2b2587ba745f55dda8cf" - integrity sha512-JjBf7TwY7ldcPgHYt9UcrjZB03+WZqg/jSwMAfzOzM5ZG+tu5umUqzy5ugH/crGI4eoDIhSOTDp1NL3Uo/05Fw== +"@esbuild/linux-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz#3e0736fcfab16cff042dec806247e2c76e109e19" + integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg== "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-mips64el@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.6.tgz#db30368c6f827f0eb9600a165df4c93d6d8ccee6" - integrity sha512-kATNsslryVxcH1sO3KP2nnyUWtZZVkgyhAUnyTVVa0OQQ9pmDRjTpHaE+2EQHoCM5wt/uav2edrAUqbwn3tkKQ== +"@esbuild/linux-loong64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz#ea2bf730883cddb9dfb85124232b5a875b8020c7" + integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw== "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-ppc64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.6.tgz#7576dce4c2a7390ab21f6aeffbb14b1c5fd4d237" - integrity sha512-B+wTKz+8pi7mcWXFQV0LA79dJ+qhiut5uK9q0omoKnq8yRIwQJwfg3/vclXoqqcX89Ri5Y5538V0Se2v5qlcLA== +"@esbuild/linux-mips64el@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz#4cababb14eede09248980a2d2d8b966464294ff1" + integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ== "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-riscv64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.6.tgz#286984a7e34c9d8e8da610f45e23cdf4895dacc2" - integrity sha512-h44RBLVXFUSjvhOfseE+5UxQ/r9LVeqK2S8JziJKOm9W7SePYRPDyn7MhzhNCCFPkcjIy+soCxfhlJXHXXCR0A== +"@esbuild/linux-ppc64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz#8860a4609914c065373a77242e985179658e1951" + integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw== "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-s390x@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.6.tgz#82ca83bb86566413e1c5a80a164d41bda4c947cf" - integrity sha512-FlYpyr2Xc2AUePoAbc84NRV+mj7xpsISeQ36HGf9etrY5rTBEA+IU9HzWVmw5mDFtC62EQxzkLRj8h5Hq85yOQ== +"@esbuild/linux-riscv64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz#baf26e20bb2d38cfb86ee282dff840c04f4ed987" + integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA== "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.6.tgz#7655e8ac0147e3797944adfb12b04bada51f8651" - integrity sha512-Mc4EUSYwzLci77u0Kao6ajB2WbTe5fNc7+lHwS3a+vJISC/oprwURezUYu1SdWAYoczbsyOvKAJwuNftoAdjjg== +"@esbuild/linux-s390x@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz#8323afc0d6cb1b6dc6e9fd21efd9e1542c3640a4" + integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA== "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.6.tgz#5b7e69689f5d1047504dedfc32f3bb9d36df5f1f" - integrity sha512-3hgZlp7NqIM5lNG3fpdhBI5rUnPmdahraSmwAi+YX/bp7iZ7mpTv2NkypGs/XngdMtpzljICxnUG3uPfqLFd3w== +"@esbuild/linux-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz#08fcf60cb400ed2382e9f8e0f5590bac8810469a" + integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw== + +"@esbuild/netbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz#935c6c74e20f7224918fbe2e6c6fe865b6c6ea5b" + integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw== "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/openbsd-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.6.tgz#fb2abf3c8808dce87f4c01ea857d362469162900" - integrity sha512-aEWTdZQHtSRROlDYn7ygB8yAqtnall/UnmoVIJVqccKitkAWVVSYocQUWrBOxLEFk8XdlRouVrLZe6WXszyviA== +"@esbuild/netbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz#414677cef66d16c5a4d210751eb2881bb9c1b62b" + integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA== + +"@esbuild/openbsd-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz#8fd55a4d08d25cdc572844f13c88d678c84d13f7" + integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw== "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/sunos-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.6.tgz#2962c270d457b5f8ec2fc4ad1afacc7efe913fef" - integrity sha512-uxk/5yAGpjKZUHOECtI9W+9IcLjKj+2m0qf+RG7f7eRBHr8wP6wsr3XbNbgtOD1qSpPapd6R2ZfSeXTkCcAo5g== +"@esbuild/openbsd-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz#0c48ddb1494bbc2d6bcbaa1429a7f465fa1dedde" + integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg== "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/win32-arm64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.6.tgz#e22721c832fb083c31535dfbefb9c24d731728ba" - integrity sha512-oXlXGS9zvNCGoAT/tLHAsFKrIKye1JaIIP0anCdpaI+Dc10ftaNZcqfLzEwyhdzFAYInXYH4V7kEdH4hPyo9GA== +"@esbuild/sunos-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz#86ff9075d77962b60dd26203d7352f92684c8c92" + integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg== "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-ia32@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.6.tgz#47d21b78c71eabe0c4d08a189703e541e2f210ca" - integrity sha512-qh7IcAHUvvmMBmoIG+V+BbE9ZWSR0ohF51e5g8JZvU08kZF58uDFL5tHs0eoYz31H6Finv17te3W3QB042GqVA== +"@esbuild/win32-arm64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz#849c62327c3229467f5b5cd681bf50588442e96c" + integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw== "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-x64@0.18.6": - version "0.18.6" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.6.tgz#7b37eb2e6514fc09fedce6c1272e9a043bd26750" - integrity sha512-9UDwkz7Wlm4N9jnv+4NL7F8vxLhSZfEkRArz2gD33HesAFfMLGIGNVXRoIHtWNw8feKsnGly9Hq1EUuRkWl0zA== +"@esbuild/win32-ia32@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz#f62eb480cd7cca088cb65bb46a6db25b725dc079" + integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA== "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@esbuild/win32-x64@0.25.0": + version "0.25.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz#c8e119a30a7c8d60b9d2e22d2073722dde3b710b" + integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -4405,188 +4387,219 @@ redux-thunk "^3.1.0" reselect "^5.1.0" -"@remotion/bundler@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/bundler/-/bundler-4.0.206.tgz#b7fa40ba0549aa5a764e4d70a25e8514011593b6" - integrity sha512-dp3h7MGE7xMTFhGIh7G62rn1l7ujDV38OFuIFh9di1teu04gC9OWbTUWhdlZkKgKuMXDq0+AIT+iF/CYDxLOZw== +"@remotion/bundler@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/bundler/-/bundler-4.0.266.tgz#ca92cb7b574451db3b63aaed7b4fed830ad59f1f" + integrity sha512-7007V0WUQJxCPqDSp/cyT3qoamZyW41KO5hmGXlgNE7Nal3nYzzq/S1sVZbX1vKzmG8Fb97lWEcpJROB65zUwQ== dependencies: - "@remotion/studio" "4.0.206" - "@remotion/studio-shared" "4.0.206" + "@remotion/studio" "4.0.266" + "@remotion/studio-shared" "4.0.266" css-loader "5.2.7" - esbuild "0.18.6" + esbuild "0.25.0" react-refresh "0.9.0" - remotion "4.0.206" + remotion "4.0.266" source-map "0.7.3" style-loader "2.0.0" - webpack "5.83.1" - -"@remotion/cli@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/cli/-/cli-4.0.206.tgz#bb0d283be197a761570ce10a3058e6e859929c0f" - integrity sha512-fV+fVTsDRnAPbXUZMG0pCkuYc4eCxl5F7u4vm4qn7wqdIQG5Zh+EqZTAXSlWW0YJAnbDDfqQkrEBpj4Bwqhf7w== - dependencies: - "@remotion/bundler" "4.0.206" - "@remotion/media-utils" "4.0.206" - "@remotion/player" "4.0.206" - "@remotion/renderer" "4.0.206" - "@remotion/studio" "4.0.206" - "@remotion/studio-server" "4.0.206" - "@remotion/studio-shared" "4.0.206" + webpack "5.96.1" + +"@remotion/cli@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/cli/-/cli-4.0.266.tgz#a950d786b3727aa766f70216cefdb15e3a758305" + integrity sha512-VAi3MLYpzE7/gBt+xGjRsSkzuURupMIiq3KsuMmBBDxywGFvu4stB1Io2LZm7WW/VVdiYsA/m6ZhUUUEhT4LzA== + dependencies: + "@remotion/bundler" "4.0.266" + "@remotion/media-utils" "4.0.266" + "@remotion/player" "4.0.266" + "@remotion/renderer" "4.0.266" + "@remotion/studio" "4.0.266" + "@remotion/studio-server" "4.0.266" + "@remotion/studio-shared" "4.0.266" dotenv "9.0.2" minimist "1.2.6" prompts "2.4.2" - remotion "4.0.206" - -"@remotion/compositor-darwin-arm64@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.206.tgz#d10dec3530fc8d3ca0e56191c7facc55190d4d47" - integrity sha512-+h9ph1nDAd2RfcZtSzMZ0DDJHBgen8MUl8zhDGEMSlqMeDZ/jYbbDSVngHPsIuaW7937hVMiAmG3srxLujtqAQ== - -"@remotion/compositor-darwin-x64@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.206.tgz#cd1a696bc9d42b49e9022653969eeb0787029ce2" - integrity sha512-fjjkX5TQF+/grSmWLl2uOQATClgPAWHvRV4yyXA8ei+sGWkAuKxaUTBcY9wOkUJ/b00tLtO75nWXaGFqyolT/w== - -"@remotion/compositor-linux-arm64-gnu@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.206.tgz#05ca735046f3093b5af3b88e7624b7a378296377" - integrity sha512-t/KBfuxOMYSHeTNxsTcG19TWGh4MWe05ihqhbtganr+eOcBcL+civDqX8UXBjHIZJ6IFlU2b3w7YSKXwptgUzQ== - -"@remotion/compositor-linux-arm64-musl@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.206.tgz#c398790968bde2b51a0fc265b40b8d769dcf5d94" - integrity sha512-zG4+cliYnFhNAqlN89QV61EEQogaXZpsvu3y9pN8zeY69cGb3iMZ+cYFHKZdp5JeApJ7qrumg+lMMB/IEMiq1g== - -"@remotion/compositor-linux-x64-gnu@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.206.tgz#b1466454bb4da7b77be47acf8510cfac792128d3" - integrity sha512-r70nvKnQkqyjBkEKH9B941GnjAa9Xtd/53QfAOG/2vRvfShlrfhrf/6VQ1PY0IE30xTtSU42AU0Xa0p0IIVeCw== - -"@remotion/compositor-linux-x64-musl@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.206.tgz#d46bcdc7eae0c0594aab2e7ab8c7d6dbcb56654c" - integrity sha512-f+1QMMqIUqNwltNGo8MOVH+xh9FAeGwfVjx4voORsecHjaAmMmHmsZFfeMdYmJhF8ARVkNjIHyg2n5l/EORcng== - -"@remotion/compositor-win32-x64-msvc@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.206.tgz#90b252d973da7fcd55d6b4fa2588586d19e69ba5" - integrity sha512-3gMRSFyV9Zc3Y/DD/8IFdTq0al+OmDoCIiOPm6jJfyYQbM4jfbRKBRZdHNyYL9DlFnW5LWuFr49qoShxb4sE1A== - -"@remotion/eslint-plugin@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/eslint-plugin/-/eslint-plugin-4.0.206.tgz#cce16d2f4c39f0bb8733e96e52bc5753cca1b3cc" - integrity sha512-mTizkQYqWHCZTh3PYn9kG2ZH493ZH6SmpHCju1GEdJ91aEBIC9M63VIF3k0Q+2EavnsR1Q9wR+JNCeAqU34cEQ== + remotion "4.0.266" + +"@remotion/compositor-darwin-arm64@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-darwin-arm64/-/compositor-darwin-arm64-4.0.266.tgz#2c8e628779988d04520c56ac21a7dc68772f78a0" + integrity sha512-a3U3+L7bY1CbyCvnvnU5PmTNb3dtAkuYvDxizLlmEbK5Ki5xuZ5i1/4eWf1qmCSHktt+ln6iRdnaDz01jHS67Q== + +"@remotion/compositor-darwin-x64@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-darwin-x64/-/compositor-darwin-x64-4.0.266.tgz#e1b6801f217e7e1569eb44cf51b2363f790af428" + integrity sha512-8FIPz9cKrMSWQsdHCmaZHBx8TXkWXJcacGq4CoCbrBF1gth0uFuvjmfrB0iIGlKY3cQww5VwkGISUJ1Dk+/6UQ== + +"@remotion/compositor-linux-arm64-gnu@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-arm64-gnu/-/compositor-linux-arm64-gnu-4.0.266.tgz#9ba8d6a04d41912ed044f70e802bba468ee3abc8" + integrity sha512-96EtPFUryg1Z0aHSVJeimVqcgZJX2rQqzvOwLyx2tywp33yBlo7TGXhaCcbDnlmOBveIGqzY2ieZV7h/fkCSLw== + +"@remotion/compositor-linux-arm64-musl@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-arm64-musl/-/compositor-linux-arm64-musl-4.0.266.tgz#cb9e4583b5f9bd0bab189faca263cfa0c1e83a1c" + integrity sha512-q2fT99d777Ze8y0orqjf9Sx2besUNvU8CS7bUmX0b35yN4yNUqZPV346Ank/YpLhar3VDOBYJngv1Dq2GBAbkA== + +"@remotion/compositor-linux-x64-gnu@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-x64-gnu/-/compositor-linux-x64-gnu-4.0.266.tgz#8d6554db8332fe9de2e4baa3b32f6651eaa0e207" + integrity sha512-6bY/7zCMXh7tWVWwArHyWe5DcnkGmtuC7v/qfgNK3WErKBOwNBAQIJ5rHxJUxhpAv6cTPdnBimlzB+fziK1f1A== + +"@remotion/compositor-linux-x64-musl@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-linux-x64-musl/-/compositor-linux-x64-musl-4.0.266.tgz#5db59f684dc43cb0c586ecbf8f28dd9a8740e223" + integrity sha512-54LQ/Rs6GAHax/KgfZOftWjPzhca8xwDiBzmS0pK8x86/9/a7sREPrVZpl8CNytV6BZq6R8M7RYLDkwiIuEf+g== + +"@remotion/compositor-win32-x64-msvc@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/compositor-win32-x64-msvc/-/compositor-win32-x64-msvc-4.0.266.tgz#89c1356374858bf9e9d1389d70190d6b55eca681" + integrity sha512-O8yBVqHrUN2OgF9PAwMICJRw/GVGA103C8IVt8QGZbXwd9KEGlZNolEvadqV5srmt066na/Hon2aaTTPx6fz3g== + +"@remotion/eslint-plugin@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/eslint-plugin/-/eslint-plugin-4.0.266.tgz#6bc9b8c60e09a0ebed12d77675efbe815705ede7" + integrity sha512-QIuJIJFuXbJI9OY2X7XR8/FjQ+FJS3JKySAbIqbkWGQKfYvEp2wvkunl0UWyp3q5mh8+M0rpuS59YDRNSSuvxg== dependencies: "@typescript-eslint/utils" "5.19.0" -"@remotion/lambda@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/lambda/-/lambda-4.0.206.tgz#7faaa612f2b7400ca101f961022e02173ccd6af9" - integrity sha512-YBEJ8naNKE3nfXlqnUC6x70JVHwvEtywgsMDtOWaSaBdnbvfaa2dY0ojrb4d9FXNjOwl3kdpLCVmOfyb99NM5A== - dependencies: - "@aws-sdk/client-cloudwatch-logs" "3.583.0" - "@aws-sdk/client-iam" "3.583.0" - "@aws-sdk/client-lambda" "3.583.0" - "@aws-sdk/client-s3" "3.583.0" - "@aws-sdk/client-service-quotas" "3.583.0" - "@aws-sdk/client-sts" "3.583.0" - "@aws-sdk/credential-providers" "3.583.0" - "@aws-sdk/lib-storage" "3.583.0" - "@aws-sdk/s3-request-presigner" "3.583.0" - "@remotion/bundler" "4.0.206" - "@remotion/cli" "4.0.206" - "@remotion/renderer" "4.0.206" - "@remotion/serverless" "4.0.206" - "@remotion/streaming" "4.0.206" - "@remotion/studio-server" "4.0.206" - "@smithy/abort-controller" "3.0.0" +"@remotion/lambda-client@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/lambda-client/-/lambda-client-4.0.266.tgz#5f5114bba53f3772c44ffe34a9ee7bce7ebf9e3a" + integrity sha512-QT3VXCN7NZyKYmz83nTjMvDI+0jaZV8oXpf8wlFssKnvSJGRnmA2p38yHfKBBhUco/Jt0T18LDLiKn4jjoXkxA== + dependencies: + "@aws-sdk/client-cloudwatch-logs" "3.738.0" + "@aws-sdk/client-iam" "3.738.0" + "@aws-sdk/client-lambda" "3.738.0" + "@aws-sdk/client-s3" "3.738.0" + "@aws-sdk/client-service-quotas" "3.738.0" + "@aws-sdk/client-sts" "3.738.0" + "@aws-sdk/credential-providers" "3.738.0" + "@aws-sdk/s3-request-presigner" "3.738.0" mime-types "2.1.34" - remotion "4.0.206" + +"@remotion/lambda@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/lambda/-/lambda-4.0.266.tgz#a8d0429eb3b3f7913fc8a100dd6a833c0306dcb6" + integrity sha512-MHAumV/47/QphOF3g5bef9yHFvRdxpriDcG8+0XTt8O1WD3UvaEI5ig/v09t3pPwsmVpoUqRtSwIfh+KanxhLA== + dependencies: + "@aws-sdk/client-cloudwatch-logs" "3.738.0" + "@aws-sdk/client-iam" "3.738.0" + "@aws-sdk/client-lambda" "3.738.0" + "@aws-sdk/client-s3" "3.738.0" + "@aws-sdk/client-service-quotas" "3.738.0" + "@aws-sdk/client-sts" "3.738.0" + "@aws-sdk/credential-providers" "3.738.0" + "@aws-sdk/lib-storage" "3.738.0" + "@aws-sdk/s3-request-presigner" "3.738.0" + "@remotion/bundler" "4.0.266" + "@remotion/cli" "4.0.266" + "@remotion/lambda-client" "4.0.266" + "@remotion/renderer" "4.0.266" + "@remotion/serverless" "4.0.266" + "@remotion/streaming" "4.0.266" + "@smithy/abort-controller" "4.0.1" + remotion "4.0.266" zod "3.22.3" -"@remotion/media-utils@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/media-utils/-/media-utils-4.0.206.tgz#19f727e9ac04d6ac5494a94426b88b722a1ff91e" - integrity sha512-mV+9VHseqtZzlFUAPFOHZ9BBB7W4u+TBm2Ccn7q63iDPv2NF5ccgUe/MNM5pGR4RCUEhAgguYa9+6AY9Bhb3Xg== +"@remotion/licensing@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/licensing/-/licensing-4.0.266.tgz#aa32c2ff4f77c8f7450af397e87ea5cec05a3754" + integrity sha512-TzLvdB3032SjQbUGc8RR69Ig4kL2+htIlze5o6O2RAvUcVNdgetKA9hAdKlPFJ1jVjU7dI/+NybJcoFrdlqdqw== + +"@remotion/media-parser@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/media-parser/-/media-parser-4.0.266.tgz#f29af976fd3415c201836dce60768fd462794cae" + integrity sha512-RMVtmsGYbfy06rDXdfppYCqc0FCXKbSRsDiqvGd3VpsYJBAlsV40MbhTk2K2UcQyns5IPBRTAiEBIt0auJDuDQ== + +"@remotion/media-utils@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/media-utils/-/media-utils-4.0.266.tgz#0af4da80256e807e5bbd4b88f7db29b74fcd1bb4" + integrity sha512-yfc4vO5nYAHI/ghvbgLBX9IDAsD40S0X1u2kEuBxuk4QaDVNcDmdiPCYA0xT5R6cTPiBfMnmKKTnlcW2OJ3pVw== dependencies: - remotion "4.0.206" + remotion "4.0.266" -"@remotion/player@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/player/-/player-4.0.206.tgz#282b85773c9bb1d2ec4cad17e569ba1b4e7afa68" - integrity sha512-hOrHRI3hsB12A8JMX4XBFgCD04PFqR3+kcgsPsRk1SvpyVQ8oBKXI3Z1QF0HIlTIZXVmR/u0Lt6emvVCFCyppQ== +"@remotion/player@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/player/-/player-4.0.266.tgz#85aa1404b5424ec203582c4db62bcbbf428db075" + integrity sha512-xfVwwfQ8DhUFBEW5FKjRc9h6BTvoUx+2B0JumaqvCe4WHyjGp212MZ+Ot9UDJxq74Q91W45yMu1S1i4MdymznQ== dependencies: - remotion "4.0.206" + remotion "4.0.266" -"@remotion/renderer@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/renderer/-/renderer-4.0.206.tgz#376e6a5d08cbb6049ef99ce42d1b55f471ae0eed" - integrity sha512-lC6/J6achFpEODXk8A8urfdodovG1Ye8fF52asiXbDMlRdkOVMBmNV9nkwb7BBbbANatfBaHey0yE9HOaGkkKA== +"@remotion/renderer@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/renderer/-/renderer-4.0.266.tgz#6c9ad7283d1998f59afb9336a6e39d676b2f9a09" + integrity sha512-YKRaMBgp4jsi7EuuoZdD1SbbXLxGP+9FbNFujLSBOVTr9No+cWI5c4FkpHdhMzOKgOU4036NkfaYzbA8lfHtng== dependencies: - "@remotion/streaming" "4.0.206" + "@remotion/streaming" "4.0.266" execa "5.1.1" extract-zip "2.0.1" - remotion "4.0.206" + remotion "4.0.266" source-map "^0.8.0-beta.0" ws "8.17.1" optionalDependencies: - "@remotion/compositor-darwin-arm64" "4.0.206" - "@remotion/compositor-darwin-x64" "4.0.206" - "@remotion/compositor-linux-arm64-gnu" "4.0.206" - "@remotion/compositor-linux-arm64-musl" "4.0.206" - "@remotion/compositor-linux-x64-gnu" "4.0.206" - "@remotion/compositor-linux-x64-musl" "4.0.206" - "@remotion/compositor-win32-x64-msvc" "4.0.206" - -"@remotion/serverless@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/serverless/-/serverless-4.0.206.tgz#c06ffb5627f6a3db493e2a354048dbd9d50bf39f" - integrity sha512-ITzHDm4dFxkJMV5dpcgOFirgeS+e2uh2pUDGaxU4WzcbhZ6NaBOful2zgIOZ7EsfS1CXD2kw391GdhnmMm4cHg== - dependencies: - "@remotion/renderer" "4.0.206" - "@remotion/streaming" "4.0.206" - remotion "4.0.206" - -"@remotion/streaming@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/streaming/-/streaming-4.0.206.tgz#745e08a3cebf38dcb4fdeaef5103ac8f4f1a65ce" - integrity sha512-+cfdk2uCWesnDnQ6jkbxCqdZ1Sj8UBDInrYDEoo7c4xJqX99hApKXlGkRakD46gxFBuO577ymtZl4gkleNlJpw== - -"@remotion/studio-server@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/studio-server/-/studio-server-4.0.206.tgz#9f8e44f3ba89bac437131f0cd47b7e3cc97cb07d" - integrity sha512-BianuZFMjKL82UcfVA2EiOyMG1Hg1rHrQylq5v5T7ZxHfERL4x0qLBi/SYtt69N++eG4xihcmA4J/GAbMn3qYw== + "@remotion/compositor-darwin-arm64" "4.0.266" + "@remotion/compositor-darwin-x64" "4.0.266" + "@remotion/compositor-linux-arm64-gnu" "4.0.266" + "@remotion/compositor-linux-arm64-musl" "4.0.266" + "@remotion/compositor-linux-x64-gnu" "4.0.266" + "@remotion/compositor-linux-x64-musl" "4.0.266" + "@remotion/compositor-win32-x64-msvc" "4.0.266" + +"@remotion/serverless-client@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/serverless-client/-/serverless-client-4.0.266.tgz#cada958049abaa9cb7af616f433f74edb6ca9b4c" + integrity sha512-RoI6dFW8XieF+9vn2GfhXjGifkLibj91s72bB6Et/H8yv6fGQjquzzosYY5KSwnORbH/bpyNUS5EUPxyIHgz1Q== + +"@remotion/serverless@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/serverless/-/serverless-4.0.266.tgz#6e1b4e2b6e5db4844e4f5565b4ab94a60ac7f8bd" + integrity sha512-LPZNoZHsw/jSPNOukMs89U4WXcJ9waCLWkGXlVGXPq+FVhEaK1MzGEwrc6rQPSeqe88CXsqU3+T0LyczjBHfIQ== + dependencies: + "@remotion/bundler" "4.0.266" + "@remotion/licensing" "4.0.266" + "@remotion/renderer" "4.0.266" + "@remotion/serverless-client" "4.0.266" + +"@remotion/streaming@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/streaming/-/streaming-4.0.266.tgz#8cd8250a8e56fde093418356606c8bd8f0dceeba" + integrity sha512-VSA8nkv0a0TFS97olHBhab+1uwULSf6ou+k4wXJpmbV1Bx0jpdoSncuc5IXerGGNL4ph7nlJIM1sfzw4kuvl/w== + +"@remotion/studio-server@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/studio-server/-/studio-server-4.0.266.tgz#eaf8494ebfae116f612e11e8ce8c672860ad4435" + integrity sha512-+mSb6ELOxRz6vHY+vfDwK0G4gnbT1bFlECs1Og4gvKlAoAtulhxh0Tjlb2R4aQ0NsSd6c7DsNzdKCEaW5c5AYg== dependencies: "@babel/parser" "7.24.1" - "@remotion/bundler" "4.0.206" - "@remotion/renderer" "4.0.206" - "@remotion/studio-shared" "4.0.206" + "@remotion/bundler" "4.0.266" + "@remotion/renderer" "4.0.266" + "@remotion/studio-shared" "4.0.266" memfs "3.4.3" open "^8.4.2" - recast "0.23.6" - remotion "4.0.206" + recast "0.23.9" + remotion "4.0.266" semver "7.5.3" source-map "0.7.3" -"@remotion/studio-shared@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/studio-shared/-/studio-shared-4.0.206.tgz#20990aedaf25733d42ce24423105a0a0e40c4816" - integrity sha512-yohixGc5TesZ3+Zkrh+oAWQ2X5itgSgiPNxYnMH829QERkqXohBAjkERwVeTTArFzgjfFNPNsoztHIerq7lEKw== +"@remotion/studio-shared@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/studio-shared/-/studio-shared-4.0.266.tgz#70b930c4eedaf192b9f6870ed5d4247e8671df80" + integrity sha512-xawLzlL7tS1D0MLaS4NtmzRR5ArxxFnjLKCDBhWJYy+Mx+P8MuqqxxBybFG2ytcf5eWJxTt74+F1EZeInZm/hw== dependencies: - remotion "4.0.206" + remotion "4.0.266" -"@remotion/studio@4.0.206": - version "4.0.206" - resolved "https://registry.yarnpkg.com/@remotion/studio/-/studio-4.0.206.tgz#d5312672f3423637cffe94639f43a1e84666b4f5" - integrity sha512-iuj/HlIo5envtIsm0me7ansSuUWsaMu6zt4ievzlVjAHbmY2JQpbv3r+/RGjK//S2Rm/4J87ksnfpCaQBwJ5ng== +"@remotion/studio@4.0.266": + version "4.0.266" + resolved "https://registry.yarnpkg.com/@remotion/studio/-/studio-4.0.266.tgz#ff92525bef86f50fa7801757b368422cee077a19" + integrity sha512-sOI/EyzasIc2arCKCdkgKfa4eIzH0nu9nm2A3WGPxsXP7+MPp6PEKHIK9PcOYpsH2k2bikfvn8UW76pCsXCnTQ== dependencies: - "@remotion/media-utils" "4.0.206" - "@remotion/player" "4.0.206" - "@remotion/renderer" "4.0.206" - "@remotion/studio-shared" "4.0.206" + "@remotion/media-parser" "4.0.266" + "@remotion/media-utils" "4.0.266" + "@remotion/player" "4.0.266" + "@remotion/renderer" "4.0.266" + "@remotion/studio-shared" "4.0.266" memfs "3.4.3" open "^8.4.2" - remotion "4.0.206" + remotion "4.0.266" semver "7.5.3" source-map "0.7.3" @@ -4933,166 +4946,156 @@ dependencies: escape-string-regexp "^5.0.0" -"@smithy/abort-controller@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.0.0.tgz#5815f5d4618e14bf8d031bb98a99adabbb831168" - integrity sha512-p6GlFGBt9K4MYLu72YuJ523NVR4A8oHlC5M2JO6OmQqN8kAc/uh1JqLE+FizTokrSJGg0CSvC+BrsmGzKtsZKA== - dependencies: - "@smithy/types" "^3.0.0" - tslib "^2.6.2" - -"@smithy/abort-controller@^3.0.0", "@smithy/abort-controller@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.1.tgz#291210611ff6afecfc198d0ca72d5771d8461d16" - integrity sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ== +"@smithy/abort-controller@4.0.1", "@smithy/abort-controller@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.1.tgz#7c5e73690c4105ad264c2896bd1ea822450c3819" + integrity sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/chunked-blob-reader-native@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz#f1104b30030f76f9aadcbd3cdca4377bd1ba2695" - integrity sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg== +"@smithy/chunked-blob-reader-native@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz#33cbba6deb8a3c516f98444f65061784f7cd7f8c" + integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - "@smithy/util-base64" "^3.0.0" + "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/chunked-blob-reader@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz#e5d3b04e9b273ba8b7ede47461e2aa96c8aa49e0" - integrity sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA== +"@smithy/chunked-blob-reader@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz#3f6ea5ff4e2b2eacf74cefd737aa0ba869b2e0f6" + integrity sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw== dependencies: tslib "^2.6.2" -"@smithy/config-resolver@^3.0.0", "@smithy/config-resolver@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.5.tgz#727978bba7ace754c741c259486a19d3083431fd" - integrity sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA== +"@smithy/config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.0.1.tgz#3d6c78bbc51adf99c9819bb3f0ea197fe03ad363" + integrity sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/core@^2.0.1": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.4.0.tgz#56e917b6ab2dffeba681a05395c40a757d681147" - integrity sha512-cHXq+FneIF/KJbt4q4pjN186+Jf4ZB0ZOqEaZMBhT79srEyGDDBV31NqBRBjazz8ppQ1bJbDJMY9ba5wKFV36w== - dependencies: - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-retry" "^3.0.15" - "@smithy/middleware-serde" "^3.0.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-utf8" "^3.0.0" +"@smithy/core@^3.1.1", "@smithy/core@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.4.tgz#47ce2b1b363ba92be2b47551bdd30969c6435bd2" + integrity sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA== + dependencies: + "@smithy/middleware-serde" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.1.1" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.0.0", "@smithy/credential-provider-imds@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz#0e0e7ddaff1a8633cb927aee1056c0ab506b7ecf" - integrity sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA== +"@smithy/credential-provider-imds@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz#807110739982acd1588a4847b61e6edf196d004e" + integrity sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" tslib "^2.6.2" -"@smithy/eventstream-codec@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" - integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== +"@smithy/eventstream-codec@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz#8e0beae84013eb3b497dd189470a44bac4411bae" + integrity sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A== dependencies: "@aws-crypto/crc32" "5.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" tslib "^2.6.2" -"@smithy/eventstream-serde-browser@^3.0.0": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz#a4ab4f7cfbd137bcaa54c375276f9214e568fd8f" - integrity sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ== +"@smithy/eventstream-serde-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz#cdbbb18b9371da363eff312d78a10f6bad82df28" + integrity sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.5" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-config-resolver@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" - integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== +"@smithy/eventstream-serde-config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz#3662587f507ad7fac5bd4505c4ed6ed0ac49a010" + integrity sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-node@^3.0.0": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz#2bbf5c9312a28f23bc55ae284efa9499f8b8f982" - integrity sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ== +"@smithy/eventstream-serde-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz#3799c33e0148d2b923a66577d1dbc590865742ce" + integrity sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q== dependencies: - "@smithy/eventstream-serde-universal" "^3.0.5" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/eventstream-serde-universal@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz#e1cc2f71f4d174a03e00ce4b563395a81dd17bec" - integrity sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ== +"@smithy/eventstream-serde-universal@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz#ddb2ab9f62b8ab60f50acd5f7c8b3ac9d27468e2" + integrity sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA== dependencies: - "@smithy/eventstream-codec" "^3.1.2" - "@smithy/types" "^3.3.0" + "@smithy/eventstream-codec" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.0.1", "@smithy/fetch-http-handler@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz#c754de7e0ff2541b73ac9ba7cc955940114b3d62" - integrity sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg== +"@smithy/fetch-http-handler@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz#8463393442ca6a1644204849e42c386066f0df79" + integrity sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA== dependencies: - "@smithy/protocol-http" "^4.1.0" - "@smithy/querystring-builder" "^3.0.3" - "@smithy/types" "^3.3.0" - "@smithy/util-base64" "^3.0.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-blob-browser@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz#90281c1f183d93686fb4f26107f1819644d68829" - integrity sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg== +"@smithy/hash-blob-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz#cda18d5828e8724d97441ea9cc4fd16d0db9da39" + integrity sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw== dependencies: - "@smithy/chunked-blob-reader" "^3.0.0" - "@smithy/chunked-blob-reader-native" "^3.0.0" - "@smithy/types" "^3.3.0" + "@smithy/chunked-blob-reader" "^5.0.0" + "@smithy/chunked-blob-reader-native" "^4.0.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/hash-node@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.3.tgz#82c5cb7b0f1a29ee7319081853d2d158c07dff24" - integrity sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw== +"@smithy/hash-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.1.tgz#ce78fc11b848a4f47c2e1e7a07fb6b982d2f130c" + integrity sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w== dependencies: - "@smithy/types" "^3.3.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-stream-node@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz#89f0290ae44b113863878e75b10c484ff48af71c" - integrity sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g== +"@smithy/hash-stream-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz#06126859a3cb1a11e50b61c5a097a4d9a5af2ac1" + integrity sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw== dependencies: - "@smithy/types" "^3.3.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz#8d9fd70e3a94b565a4eba4ffbdc95238e1930528" - integrity sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw== +"@smithy/invalid-dependency@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz#704d1acb6fac105558c17d53f6d55da6b0d6b6fc" + integrity sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -5102,167 +5105,170 @@ dependencies: tslib "^2.6.2" -"@smithy/is-array-buffer@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" - integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== dependencies: tslib "^2.6.2" -"@smithy/md5-js@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-3.0.3.tgz#55ee40aa24075b096c39f7910590c18ff7660c98" - integrity sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q== +"@smithy/md5-js@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.1.tgz#d7622e94dc38ecf290876fcef04369217ada8f07" + integrity sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A== dependencies: - "@smithy/types" "^3.3.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.0": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz#1680aa4fb2a1c0505756103c9a5c2916307d9035" - integrity sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw== +"@smithy/middleware-content-length@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz#378bc94ae623f45e412fb4f164b5bb90b9de2ba3" + integrity sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ== dependencies: - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.0.0", "@smithy/middleware-endpoint@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz#9b8a496d87a68ec43f3f1a0139868d6765a88119" - integrity sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw== - dependencies: - "@smithy/middleware-serde" "^3.0.3" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" - "@smithy/url-parser" "^3.0.3" - "@smithy/util-middleware" "^3.0.3" +"@smithy/middleware-endpoint@^4.0.2", "@smithy/middleware-endpoint@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz#b3d58c0a44b5dcccb1da34267b6f651bc1ba7642" + integrity sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA== + dependencies: + "@smithy/core" "^3.1.4" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-middleware" "^4.0.1" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.1", "@smithy/middleware-retry@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.15.tgz#9b96900cde70d8aafd267e13f4e79241be90e0c7" - integrity sha512-iTMedvNt1ApdvkaoE8aSDuwaoc+BhvHqttbA/FO4Ty+y/S5hW6Ci/CTScG7vam4RYJWZxdTElc3MEfHRVH6cgQ== - dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/protocol-http" "^4.1.0" - "@smithy/service-error-classification" "^3.0.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-retry" "^3.0.3" +"@smithy/middleware-retry@^4.0.3": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz#07f8259dc05835e317aaf37af7e79bae349eabb4" + integrity sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/service-error-classification" "^4.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.0", "@smithy/middleware-serde@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz#74d974460f74d99f38c861e6862984543a880a66" - integrity sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA== +"@smithy/middleware-serde@^4.0.1", "@smithy/middleware-serde@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz#f792d72f6ad8fa6b172e3f19c6fe1932a856a56d" + integrity sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.0", "@smithy/middleware-stack@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz#91845c7e61e6f137fa912b623b6def719a4f6ce7" - integrity sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA== +"@smithy/middleware-stack@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz#c157653f9df07f7c26e32f49994d368e4e071d22" + integrity sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.0.0", "@smithy/node-config-provider@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz#05647bed666aa8036a1ad72323c1942e5d421be1" - integrity sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ== +"@smithy/node-config-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz#4e84fe665c0774d5f4ebb75144994fc6ebedf86e" + integrity sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ== dependencies: - "@smithy/property-provider" "^3.1.3" - "@smithy/shared-ini-file-loader" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.0.0", "@smithy/node-http-handler@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz#be4195e45639e690d522cd5f11513ea822ff9d5f" - integrity sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg== +"@smithy/node-http-handler@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz#48d47a046cf900ab86bfbe7f5fd078b52c82fab6" + integrity sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw== dependencies: - "@smithy/abort-controller" "^3.1.1" - "@smithy/protocol-http" "^4.1.0" - "@smithy/querystring-builder" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/abort-controller" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/property-provider@^3.0.0", "@smithy/property-provider@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.3.tgz#afd57ea82a3f6c79fbda95e3cb85c0ee0a79f39a" - integrity sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g== +"@smithy/property-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.1.tgz#8d35d5997af2a17cf15c5e921201ef6c5e3fc870" + integrity sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.0.0", "@smithy/protocol-http@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.0.tgz#23519d8f45bf4f33960ea5415847bc2b620a010b" - integrity sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA== +"@smithy/protocol-http@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.0.1.tgz#37c248117b29c057a9adfad4eb1d822a67079ff1" + integrity sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.0", "@smithy/querystring-builder@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz#6b0e566f885bb84938d077c69e8f8555f686af13" - integrity sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw== +"@smithy/querystring-builder@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz#37e1e05d0d33c6f694088abc3e04eafb65cb6976" + integrity sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg== dependencies: - "@smithy/types" "^3.3.0" - "@smithy/util-uri-escape" "^3.0.0" + "@smithy/types" "^4.1.0" + "@smithy/util-uri-escape" "^4.0.0" tslib "^2.6.2" -"@smithy/querystring-parser@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz#272a6b83f88dfcbbec8283d72a6bde850cc00091" - integrity sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ== +"@smithy/querystring-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz#312dc62b146f8bb8a67558d82d4722bb9211af42" + integrity sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/service-error-classification@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz#73484255060a094aa9372f6cd972dcaf97e3ce80" - integrity sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ== +"@smithy/service-error-classification@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz#84e78579af46c7b79c900b6d6cc822c9465f3259" + integrity sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" -"@smithy/shared-ini-file-loader@^3.0.0", "@smithy/shared-ini-file-loader@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz#7dceaf5a5307a2ee347ace8aba17312a1a3ede15" - integrity sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ== +"@smithy/shared-ini-file-loader@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz#d35c21c29454ca4e58914a4afdde68d3b2def1ee" + integrity sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/signature-v4@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-3.1.2.tgz#63fc0d4f9a955e902138fb0a57fafc96b9d4e8bb" - integrity sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA== - dependencies: - "@smithy/is-array-buffer" "^3.0.0" - "@smithy/types" "^3.3.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-middleware" "^3.0.3" - "@smithy/util-uri-escape" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/signature-v4@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.0.1.tgz#f93401b176150286ba246681031b0503ec359270" + integrity sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.0.1", "@smithy/smithy-client@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.2.0.tgz#6db94024e4bdaefa079ac68dbea23dafbea230c8" - integrity sha512-pDbtxs8WOhJLJSeaF/eAbPgXg4VVYFlRcL/zoNYA5WbG3wBL06CHtBSg53ppkttDpAJ/hdiede+xApip1CwSLw== - dependencies: - "@smithy/middleware-endpoint" "^3.1.0" - "@smithy/middleware-stack" "^3.0.3" - "@smithy/protocol-http" "^4.1.0" - "@smithy/types" "^3.3.0" - "@smithy/util-stream" "^3.1.3" +"@smithy/smithy-client@^4.1.2", "@smithy/smithy-client@^4.1.5": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.5.tgz#f4641ad6771f5e4f6de9e573b9deb1787e43ef71" + integrity sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw== + dependencies: + "@smithy/core" "^3.1.4" + "@smithy/middleware-endpoint" "^4.0.5" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.1.1" tslib "^2.6.2" "@smithy/types@^2.12.0": @@ -5272,42 +5278,42 @@ dependencies: tslib "^2.6.2" -"@smithy/types@^3.0.0", "@smithy/types@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" - integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== +"@smithy/types@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f" + integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.0", "@smithy/url-parser@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.3.tgz#e8a060d9810b24b1870385fc2b02485b8a6c5955" - integrity sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A== +"@smithy/url-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.1.tgz#b47743f785f5b8d81324878cbb1b5f834bf8d85a" + integrity sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g== dependencies: - "@smithy/querystring-parser" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/querystring-parser" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-base64@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" - integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-body-length-browser@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" - integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== dependencies: tslib "^2.6.2" -"@smithy/util-body-length-node@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" - integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== dependencies: tslib "^2.6.2" @@ -5319,96 +5325,96 @@ "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" -"@smithy/util-buffer-from@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" - integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - "@smithy/is-array-buffer" "^3.0.0" + "@smithy/is-array-buffer" "^4.0.0" tslib "^2.6.2" -"@smithy/util-config-provider@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" - integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.1": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.15.tgz#df73b9ae3dddc9126e0bb93ebc720b09d7163858" - integrity sha512-FZ4Psa3vjp8kOXcd3HJOiDPBCWtiilLl57r0cnNtq/Ga9RSDrM5ERL6xt+tO43+2af6Pn5Yp92x2n5vPuduNfg== +"@smithy/util-defaults-mode-browser@^4.0.3": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz#4ee93d8e32c8211709437aa29c5fe616895e7c51" + integrity sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w== dependencies: - "@smithy/property-provider" "^3.1.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.1": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.15.tgz#d52476e1f2e66525d918b51f8d5a9b0972bf518e" - integrity sha512-KSyAAx2q6d0t6f/S4XB2+3+6aQacm3aLMhs9aLMqn18uYGUepbdssfogW5JQZpc6lXNBnp0tEnR5e9CEKmEd7A== - dependencies: - "@smithy/config-resolver" "^3.0.5" - "@smithy/credential-provider-imds" "^3.2.0" - "@smithy/node-config-provider" "^3.1.4" - "@smithy/property-provider" "^3.1.3" - "@smithy/smithy-client" "^3.2.0" - "@smithy/types" "^3.3.0" +"@smithy/util-defaults-mode-node@^4.0.3": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz#213e5b32549beb48aeccbcf99cf56c97db47e70b" + integrity sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A== + dependencies: + "@smithy/config-resolver" "^4.0.1" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.5" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-endpoints@^2.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz#e3a7a4d1c41250bfd2b2d890d591273a7d8934be" - integrity sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg== +"@smithy/util-endpoints@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz#44ccbf1721447966f69496c9003b87daa8f61975" + integrity sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA== dependencies: - "@smithy/node-config-provider" "^3.1.4" - "@smithy/types" "^3.3.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-hex-encoding@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" - integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.0", "@smithy/util-middleware@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.3.tgz#07bf9602682f5a6c55bc2f0384303f85fc68c87e" - integrity sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw== +"@smithy/util-middleware@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.1.tgz#58d363dcd661219298c89fa176a28e98ccc4bf43" + integrity sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA== dependencies: - "@smithy/types" "^3.3.0" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.0", "@smithy/util-retry@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" - integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== +"@smithy/util-retry@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.1.tgz#fb5f26492383dcb9a09cc4aee23a10f839cd0769" + integrity sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw== dependencies: - "@smithy/service-error-classification" "^3.0.3" - "@smithy/types" "^3.3.0" + "@smithy/service-error-classification" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" -"@smithy/util-stream@^3.0.1", "@smithy/util-stream@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.3.tgz#699ee2397cc1d474e46d2034039d5263812dca64" - integrity sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw== - dependencies: - "@smithy/fetch-http-handler" "^3.2.4" - "@smithy/node-http-handler" "^3.1.4" - "@smithy/types" "^3.3.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/util-stream@^4.0.2", "@smithy/util-stream@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.1.1.tgz#d7edec543d65ed335d2fda9aae6a42ee97da4a4e" + integrity sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ== + dependencies: + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-uri-escape@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" - integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== dependencies: tslib "^2.6.2" @@ -5420,21 +5426,21 @@ "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" -"@smithy/util-utf8@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" - integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-3.1.2.tgz#2d40c3312f3537feee763459a19acafab4c75cf3" - integrity sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw== +"@smithy/util-waiter@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.2.tgz#0a73a0fcd30ea7bbc3009cf98ad199f51b8eac51" + integrity sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ== dependencies: - "@smithy/abort-controller" "^3.1.1" - "@smithy/types" "^3.3.0" + "@smithy/abort-controller" "^4.0.1" + "@smithy/types" "^4.1.0" tslib "^2.6.2" "@socket.io/component-emitter@~3.1.0": @@ -6163,7 +6169,7 @@ resolved "https://registry.yarnpkg.com/@types/escodegen/-/escodegen-0.0.6.tgz#5230a9ce796e042cda6f086dbf19f22ea330659c" integrity sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig== -"@types/eslint-scope@^3.7.3": +"@types/eslint-scope@^3.7.3", "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== @@ -6194,6 +6200,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/event-source-polyfill@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/event-source-polyfill/-/event-source-polyfill-1.0.2.tgz#3cc00a416c540361ec1763ccab0ed32491970d3a" @@ -6924,21 +6935,44 @@ "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + "@webassemblyjs/helper-buffer@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" @@ -6948,11 +6982,25 @@ "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + "@webassemblyjs/helper-wasm-section@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" @@ -6963,6 +7011,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/wasm-gen" "1.11.6" +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/ieee754@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" @@ -6970,6 +7028,13 @@ dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/leb128@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" @@ -6977,11 +7042,23 @@ dependencies: "@xtuc/long" "4.2.2" +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/utf8@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + "@webassemblyjs/wasm-edit@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" @@ -6996,6 +7073,20 @@ "@webassemblyjs/wasm-parser" "1.11.6" "@webassemblyjs/wast-printer" "1.11.6" +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + "@webassemblyjs/wasm-gen@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" @@ -7007,6 +7098,17 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + "@webassemblyjs/wasm-opt@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" @@ -7017,6 +7119,16 @@ "@webassemblyjs/wasm-gen" "1.11.6" "@webassemblyjs/wasm-parser" "1.11.6" +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" @@ -7029,6 +7141,18 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + "@webassemblyjs/wast-printer@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" @@ -7037,6 +7161,14 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + "@webpack-contrib/schema-utils@^1.0.0-beta.0": version "1.0.0-beta.0" resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" @@ -7118,7 +7250,7 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -acorn-import-assertions@^1.7.6, acorn-import-assertions@^1.9.0: +acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== @@ -7160,6 +7292,11 @@ acorn@^8.1.0, acorn@^8.11.0, acorn@^8.8.1, acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" @@ -7813,7 +7950,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.14.5, browserslist@^4.21.10: +browserslist@^4.21.10: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -7833,6 +7970,16 @@ browserslist@^4.23.1, browserslist@^4.23.3: node-releases "^2.0.18" update-browserslist-db "^1.1.0" +browserslist@^4.24.0: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -7965,6 +8112,11 @@ caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.300016 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz#b8af452f8f33b1c77f122780a4aecebea0caca56" integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw== +caniuse-lite@^1.0.30001688: + version "1.0.30001700" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz#26cd429cf09b4fd4e745daf4916039c794d720f6" + integrity sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ== + case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -8729,7 +8881,7 @@ debounce@^1.2.1: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9: +debug@2.6.9, debug@^2.1.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -9122,6 +9274,11 @@ electron-to-chromium@^1.4.668, electron-to-chromium@^1.5.4: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6" integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q== +electron-to-chromium@^1.5.73: + version "1.5.102" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz#81a452ace8e2c3fa7fba904ea4fed25052c53d3f" + integrity sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q== + elliptic@^6.5.3, elliptic@^6.5.5: version "6.5.5" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" @@ -9192,7 +9349,7 @@ engine.io-parser@~5.2.1: resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== -enhanced-resolve@^5.12.0, enhanced-resolve@^5.14.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: +enhanced-resolve@^5.12.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: version "5.15.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz#384391e025f099e67b4b00bfd7f0906a408214e1" integrity sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg== @@ -9200,6 +9357,14 @@ enhanced-resolve@^5.12.0, enhanced-resolve@^5.14.0, enhanced-resolve@^5.15.0, en graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -9474,33 +9639,36 @@ esbuild-register@^3.5.0: dependencies: debug "^4.3.4" -esbuild@0.18.6: - version "0.18.6" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.6.tgz#c779d5c6cffab264bd3b95e71354536037435700" - integrity sha512-5QgxWaAhU/tPBpvkxUmnFv2YINHuZzjbk0LeUUnC2i3aJHjfi5yR49lgKgF7cb98bclOp/kans8M5TGbGFfJlQ== +esbuild@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.0.tgz#0de1787a77206c5a79eeb634a623d39b5006ce92" + integrity sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw== optionalDependencies: - "@esbuild/android-arm" "0.18.6" - "@esbuild/android-arm64" "0.18.6" - "@esbuild/android-x64" "0.18.6" - "@esbuild/darwin-arm64" "0.18.6" - "@esbuild/darwin-x64" "0.18.6" - "@esbuild/freebsd-arm64" "0.18.6" - "@esbuild/freebsd-x64" "0.18.6" - "@esbuild/linux-arm" "0.18.6" - "@esbuild/linux-arm64" "0.18.6" - "@esbuild/linux-ia32" "0.18.6" - "@esbuild/linux-loong64" "0.18.6" - "@esbuild/linux-mips64el" "0.18.6" - "@esbuild/linux-ppc64" "0.18.6" - "@esbuild/linux-riscv64" "0.18.6" - "@esbuild/linux-s390x" "0.18.6" - "@esbuild/linux-x64" "0.18.6" - "@esbuild/netbsd-x64" "0.18.6" - "@esbuild/openbsd-x64" "0.18.6" - "@esbuild/sunos-x64" "0.18.6" - "@esbuild/win32-arm64" "0.18.6" - "@esbuild/win32-ia32" "0.18.6" - "@esbuild/win32-x64" "0.18.6" + "@esbuild/aix-ppc64" "0.25.0" + "@esbuild/android-arm" "0.25.0" + "@esbuild/android-arm64" "0.25.0" + "@esbuild/android-x64" "0.25.0" + "@esbuild/darwin-arm64" "0.25.0" + "@esbuild/darwin-x64" "0.25.0" + "@esbuild/freebsd-arm64" "0.25.0" + "@esbuild/freebsd-x64" "0.25.0" + "@esbuild/linux-arm" "0.25.0" + "@esbuild/linux-arm64" "0.25.0" + "@esbuild/linux-ia32" "0.25.0" + "@esbuild/linux-loong64" "0.25.0" + "@esbuild/linux-mips64el" "0.25.0" + "@esbuild/linux-ppc64" "0.25.0" + "@esbuild/linux-riscv64" "0.25.0" + "@esbuild/linux-s390x" "0.25.0" + "@esbuild/linux-x64" "0.25.0" + "@esbuild/netbsd-arm64" "0.25.0" + "@esbuild/netbsd-x64" "0.25.0" + "@esbuild/openbsd-arm64" "0.25.0" + "@esbuild/openbsd-x64" "0.25.0" + "@esbuild/sunos-x64" "0.25.0" + "@esbuild/win32-arm64" "0.25.0" + "@esbuild/win32-ia32" "0.25.0" + "@esbuild/win32-x64" "0.25.0" "esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0", esbuild@^0.21.3: version "0.21.5" @@ -9536,6 +9704,11 @@ escalade@^3.1.1, escalade@^3.1.2: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -10125,10 +10298,10 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== -fast-xml-parser@4.2.5: - version "4.2.5" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz#a6747a09296a6cb34f2ae634019bf1738f3b421f" - integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz#86dbf3f18edf8739326447bcaac31b4ae7f6514f" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== dependencies: strnum "^1.0.5" @@ -11907,6 +12080,13 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/jsonp/-/jsonp-0.2.1.tgz#a65b4fa0f10bda719a05441ea7b94c55f3e15bae" + integrity sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw== + dependencies: + debug "^2.1.3" + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -13307,6 +13487,11 @@ node-releases@^2.0.14, node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -13830,6 +14015,11 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -14597,6 +14787,14 @@ react-remove-scroll@2.5.7: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-share@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-share/-/react-share-5.2.0.tgz#7627bff0227a82f0916e5ec5affab09f114f3bf5" + integrity sha512-0gFXnW1qMO4BITbf0lSX03J0GWmYPRqMXcP9obl+T+8nvFeOpqhiow8tGryeY9vx35fprQvri0Q0fkqb3t9uag== + dependencies: + classnames "^2.3.2" + jsonp "^0.2.1" + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" @@ -14613,6 +14811,11 @@ react-toastify@^9.0.8: dependencies: clsx "^1.1.1" +react-verification-input@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/react-verification-input/-/react-verification-input-4.2.2.tgz#8d0e54705ed38b23adced59bd41a06ee6aa52a75" + integrity sha512-GqcsiZ5iwcXD4V0cKbZv1pbknqAZRszPoXzSKc5LLlfSdo3iOnxLxEbmDi+BWN1LfhCx2iXhEDGke9Bdk3q+4A== + react-virtuoso@^2.19.0: version "2.19.1" resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-2.19.1.tgz#a660a5c3cafcc7a84b59dfc356e1916e632c1e3a" @@ -14707,10 +14910,10 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -recast@0.23.6: - version "0.23.6" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.6.tgz#198fba74f66143a30acc81929302d214ce4e3bfa" - integrity sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ== +recast@0.23.9, recast@^0.23.5: + version "0.23.9" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.9.tgz#587c5d3a77c2cfcb0c18ccce6da4361528c2587b" + integrity sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q== dependencies: ast-types "^0.16.1" esprima "~4.0.0" @@ -14729,17 +14932,6 @@ recast@^0.23.3: tiny-invariant "^1.3.3" tslib "^2.0.1" -recast@^0.23.5: - version "0.23.9" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.9.tgz#587c5d3a77c2cfcb0c18ccce6da4361528c2587b" - integrity sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q== - dependencies: - ast-types "^0.16.1" - esprima "~4.0.0" - source-map "~0.6.1" - tiny-invariant "^1.3.3" - tslib "^2.0.1" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -14941,10 +15133,10 @@ remark@^15.0.1: remark-stringify "^11.0.0" unified "^11.0.0" -remotion@4.0.206: - version "4.0.206" - resolved "https://registry.yarnpkg.com/remotion/-/remotion-4.0.206.tgz#bdccbbc6f7eac13654f3ce3c414a4d204bcd2b8d" - integrity sha512-2RTM3BG6ep2POLndSG3EhgwzwVuQyho14hkxtZWZSRo1m1fW9NxtSDi4ULkifEupmwUMJQBWusGU+54/7E1TEQ== +remotion@4.0.266, remotion@^4.0.266: + version "4.0.266" + resolved "https://registry.yarnpkg.com/remotion/-/remotion-4.0.266.tgz#22dcb9608cb4a271ca0fcb839b98dac194acfc3f" + integrity sha512-becXz1SAskzcrlSjJ6vBhJoyQcohY0txVKiGGQa5yBNOD87G6byG3Dpt1cB7AohMLt0PCy3N7JndLRz1wRnEjw== renderkid@^3.0.0: version "3.0.0" @@ -15261,7 +15453,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2, schema-utils@^3.2.0: +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -15764,7 +15956,16 @@ string-range@~1.2, string-range@~1.2.1: resolved "https://registry.yarnpkg.com/string-range/-/string-range-1.2.2.tgz#a893ed347e72299bc83befbbf2a692a8d239d5dd" integrity sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15888,7 +16089,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15902,6 +16103,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -16199,7 +16407,7 @@ tempy@^3.1.0: type-fest "^2.12.2" unique-string "^3.0.0" -terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: +terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.3: version "5.3.10" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== @@ -16437,12 +16645,12 @@ tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.11.1, tslib@^1.13.0, tslib@^1.8.1: +tslib@^1.13.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -16759,6 +16967,14 @@ update-browserslist-db@^1.0.13, update-browserslist-db@^1.1.0: escalade "^3.1.2" picocolors "^1.0.1" +update-browserslist-db@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" + integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -16978,6 +17194,14 @@ watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -17102,34 +17326,33 @@ webpack@5: watchpack "^2.4.0" webpack-sources "^3.2.3" -webpack@5.83.1: - version "5.83.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.83.1.tgz#fcb69864a0669ac3539a471081952c45b15d1c40" - integrity sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" +webpack@5.96.1: + version "5.96.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" + integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.0" + enhanced-resolve "^5.17.1" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1: @@ -17435,7 +17658,7 @@ workbox-window@6.6.1, workbox-window@^6.5.4: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17453,6 +17676,15 @@ wrap-ansi@^6.0.1: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"