1/** 2 * ch-app-banner.js â invita a instalar la app Android (APK oficial) desde la 3 * web, con la maña de una PWA. UN script para los cuatro sitios (Yvenel, 4 * 2026-08-19): cada web lo carga con data-attributes: 5 * 6 * <script src="https://chateando.net/ch-app-banner.js" defer 7 * data-app="Ticket3D" data-paquete="com.ticket3d.app" 8 * data-apk="https://chateando.net/descargas/ticket3d-aptoide.apk" 9 * data-color="#43a047" data-derecha="84"></script> 10 * 11 * Reglas de la casa: 12 * - SOLO Android (ni iPhone ni escritorio) y nunca dentro de una app/PWA. 13 * - Si la app YA está instalada no se enseña nada â se comprueba con 14 * navigator.getInstalledRelatedApps(): exige el manifest de la web con 15 * related_applications y el asset_statements dentro del APK. Al 16 * desinstalarla, el banner vuelve solo. 17 * - El banner cerrado reaparece a la HORA (no a los 14 dÃas). El icono del 18 * header es persistente siempre. 19 * - 30 idiomas por navigator.languages, 10 mensajes por idioma elegidos al 20 * azar en cada impresión. Ãrabe y hebreo van con dir=rtl. 21 */ 22(function () { 23 'use strict'; 24 var cs = document.currentScript; 25 if (!cs) return; 26 var APP = cs.dataset.app || 'la app'; 27 var PAQUETE = cs.dataset.paquete || ''; 28 var APK = cs.dataset.apk || '#'; 29 // Cache-buster: el alias del APK cambia de contenido con cada versión y a 30 // algún navegador se le quedaba la build vieja pegada. La query rompe esa 31 // caché sin romper el nombre estable (subir el número al publicar builds). 32 if (APK.indexOf('?') < 0) APK += '?v=2'; 33 var COLOR = cs.dataset.color || '#e91e63'; 34 var DERECHA = parseInt(cs.dataset.derecha || '64', 10); 35 // Ajuste vertical opcional: algunos headers son más altos de lo que se ve 36 // (envuelven pestañas) y el 50% deja el icono colgando. data-arriba lo 37 // clava a N px del borde superior del header. 38 var ARRIBA = cs.dataset.arriba ? parseInt(cs.dataset.arriba, 10) : null; 39 40 if (!/Android/i.test(navigator.userAgent)) return; 41 if (window.matchMedia && matchMedia('(display-mode: standalone)').matches) return; 42 43 var RTL = { ar: 1, he: 1 }; 44 var L = { 45 es: { b: 'Instalar', s: 'APK oficial firmado', m: ['Instala la app de {app} para Android', '{app} completa, en tu Android', 'Llévate {app} en el bolsillo', 'La app de {app}: más rápida y cómoda', 'Mejor en la app: instala {app}', 'Un toque y {app} en tu móvil', 'Tu {app} de cada dÃa, ahora como app', 'Instala {app} y entra al instante', 'La experiencia completa de {app}, solo en la app', '¿Sin la app todavÃa? Instala {app}'] }, 46 en: { b: 'Install', s: 'Official signed APK', m: ['Install the {app} app for Android', 'The full {app}, on your Android', 'Take {app} with you â get the app', '{app} is faster in the app', 'Better in the app: install {app}', 'One tap and {app} is on your phone', 'Your everyday {app}, now as an app', 'Install {app} and jump right in', 'The complete {app} experience, app only', 'No app yet? Install {app}'] }, 47 fr: { b: 'Installer', s: 'APK officiel signé', m: ['Installez lâappli {app} pour Android', '{app} au complet, sur votre Android', 'Emportez {app} partout â installez lâappli', '{app} est plus rapide dans lâappli', 'Câest mieux dans lâappli : installez {app}', 'Un geste et {app} est sur votre téléphone', 'Votre {app} de tous les jours, en appli', 'Installez {app} et entrez direct', 'Lâexpérience {app} complète, dans lâappli', 'Pas encore lâappli ? Installez {app}'] }, 48 de: { b: 'Installieren', s: 'Offizielles signiertes APK', m: ['Hol dir die {app}-App für Android', '{app} komplett â auf deinem Android', 'Nimm {app} überallhin mit â als App', 'In der App ist {app} schneller', 'Besser in der App: {app} installieren', 'Ein Tipp und {app} ist auf deinem Handy', 'Dein tägliches {app}, jetzt als App', '{app} installieren und direkt loslegen', 'Das volle {app}-Erlebnis gibt es in der App', 'Noch keine App? Installier {app}'] }, 49 it: { b: 'Installa', s: 'APK ufficiale firmato', m: ['Installa lâapp di {app} per Android', '{app} al completo, sul tuo Android', 'Porta {app} con te â installa lâapp', 'Nellâapp {app} è più veloce', 'Meglio nellâapp: installa {app}', 'Un tocco e {app} è sul tuo telefono', 'Il tuo {app} di ogni giorno, ora come app', 'Installa {app} ed entra subito', 'Lâesperienza completa di {app}, solo nellâapp', 'Ancora senza app? Installa {app}'] }, 50 pt: { b: 'Instalar', s: 'APK oficial assinado', m: ['Instale o app do {app} para Android', '{app} completo, no seu Android', 'Leve o {app} com você â instale o app', 'No app, o {app} é mais rápido', 'Melhor no app: instale o {app}', 'Um toque e o {app} está no seu celular', 'Seu {app} de todo dia, agora como app', 'Instale o {app} e entre na hora', 'A experiência completa do {app}, só no app', 'Ainda sem o app? Instale o {app}'] }, 51 ru: { b: 'УÑÑановиÑÑ', s: 'ÐÑиÑиалÑнÑй подпиÑаннÑй APK', m: ['УÑÑановиÑе пÑиложение {app} Ð´Ð»Ñ Android', 'ÐеÑÑ {app} â на ваÑем Android', 'ÐозÑмиÑе {app} Ñ Ñобой â ÑÑÑановиÑе пÑиложение', 'РпÑиложении {app} бÑÑÑÑее', 'РпÑиложении Ñдобнее: ÑÑÑановиÑе {app}', 'Ðдно каÑание â и {app} на ваÑем ÑелеÑоне', 'ÐÐ°Ñ {app} каждÑй денÑ, ÑепеÑÑ ÐºÐ°Ðº пÑиложение', 'УÑÑановиÑе {app} и Ð·Ð°Ñ Ð¾Ð´Ð¸Ñе ÑÑазÑ', 'ÐолнÑй {app} â ÑолÑко в пÑиложении', 'ÐÑÑ Ð±ÐµÐ· пÑиложениÑ? УÑÑановиÑе {app}'] }, 52 uk: { b: 'ÐÑÑановиÑи', s: 'ÐÑÑÑÑйний пÑдпиÑаний APK', m: ['ÐÑÑановÑÑÑ Ð·Ð°ÑÑоÑÑнок {app} Ð´Ð»Ñ Android', 'УвеÑÑ {app} â на ваÑÐ¾Ð¼Ñ Android', 'ÐÑзÑмÑÑÑ {app} Ñз ÑÐ¾Ð±Ð¾Ñ â вÑÑановÑÑÑ Ð·Ð°ÑÑоÑÑнок', 'У заÑÑоÑÑÐ½ÐºÑ {app} ÑвидÑий', 'У заÑÑоÑÑÐ½ÐºÑ Ð·ÑÑÑнÑÑе: вÑÑановÑÑÑ {app}', 'Ðдин доÑик â Ñ {app} на ваÑÐ¾Ð¼Ñ ÑелеÑонÑ', 'ÐÐ°Ñ Ñоденний {app} â ÑÐµÐ¿ÐµÑ Ñк заÑÑоÑÑнок', 'ÐÑÑановÑÑÑ {app} Ñ Ð·Ð°Ñ Ð¾Ð´ÑÑе одÑазÑ', 'Ðовний {app} â лиÑе в заÑÑоÑÑнкÑ', 'Ще без заÑÑоÑÑнкÑ? ÐÑÑановÑÑÑ {app}'] }, 53 pl: { b: 'Zainstaluj', s: 'Oficjalny podpisany APK', m: ['Zainstaluj aplikacjÄ {app} na Androida', 'CaÅy {app} na Twoim Androidzie', 'Zabierz {app} ze sobÄ â zainstaluj aplikacjÄ', 'W aplikacji {app} dziaÅa szybciej', 'Lepiej w aplikacji: zainstaluj {app}', 'Jedno dotkniÄcie i {app} jest na telefonie', 'Twój codzienny {app}, teraz jako aplikacja', 'Zainstaluj {app} i wejdź od razu', 'PeÅny {app} tylko w aplikacji', 'Nie masz jeszcze aplikacji? Zainstaluj {app}'] }, 54 nl: { b: 'Installeren', s: 'Officiële ondertekende APK', m: ['Installeer de {app}-app voor Android', 'Heel {app} op je Android', 'Neem {app} overal mee â installeer de app', 'In de app is {app} sneller', 'Beter in de app: installeer {app}', 'Eén tik en {app} staat op je telefoon', 'Je dagelijkse {app}, nu als app', 'Installeer {app} en ga meteen verder', 'De volledige {app}-ervaring, alleen in de app', 'Nog geen app? Installeer {app}'] }, 55 ro: { b: 'InstaleazÄ', s: 'APK oficial semnat', m: ['InstaleazÄ aplicaÈia {app} pentru Android', '{app} complet, pe Androidul tÄu', 'Ia {app} cu tine â instaleazÄ aplicaÈia', 'Ãn aplicaÈie, {app} e mai rapid', 'Mai bine în aplicaÈie: instaleazÄ {app}', 'O atingere Èi {app} e pe telefonul tÄu', '{app} de zi cu zi, acum ca aplicaÈie', 'InstaleazÄ {app} Èi intrÄ imediat', 'ExperienÈa completÄ {app}, doar în aplicaÈie', 'ÃncÄ fÄrÄ aplicaÈie? InstaleazÄ {app}'] }, 56 cs: { b: 'Nainstalovat', s: 'Oficiálnà podepsaný APK', m: ['Nainstalujte si aplikaci {app} pro Android', 'Celý {app} ve vaÅ¡em Androidu', 'VezmÄte si {app} s sebou â nainstalujte aplikaci', 'V aplikaci je {app} rychlejÅ¡Ã', 'V aplikaci je to lepÅ¡Ã: nainstalujte {app}', 'Jedno klepnutà a {app} je v telefonu', 'Váš každodennà {app}, teÄ jako aplikace', 'Nainstalujte {app} a rovnou vstupte', 'Kompletnà {app} jen v aplikaci', 'JeÅ¡tÄ bez aplikace? Nainstalujte {app}'] }, 57 hu: { b: 'TelepÃtés', s: 'Hivatalos aláÃrt APK', m: ['TelepÃtsd a(z) {app} appot Androidra', 'A teljes {app} az Androidodon', 'Vidd magaddal a(z) {app}-ot â telepÃtsd az appot', 'Az appban a(z) {app} gyorsabb', 'Appban jobb: telepÃtsd a(z) {app}-ot', 'Egy érintés, és a(z) {app} a telefonodon van', 'A mindennapi {app}-od, most appként', 'TelepÃtsd a(z) {app}-ot, és lépj be azonnal', 'A teljes {app}-élmény csak az appban', 'Még nincs meg az app? TelepÃtsd a(z) {app}-ot'] }, 58 el: { b: 'ÎγκαÏάÏÏαÏη', s: 'ÎÏίÏημο Ï ÏογεγÏαμμÎνο APK', m: ['ÎγκαÏάÏÏηÏε Ïην εÏαÏμογή {app} για Android', 'Îλο Ïο {app} ÏÏο Android ÏÎ¿Ï ', 'ΠάÏε Ïο {app} μαζί ÏÎ¿Ï â βάλε Ïην εÏαÏμογή', 'ΣÏην εÏαÏμογή Ïο {app} είναι Ïιο γÏήγοÏο', 'ÎαλÏÏεÏα ÏÏην εÏαÏμογή: εγκαÏάÏÏηÏε Ïο {app}
58', 'Îνα άγγιγμα και Ïο {app} είναι ÏÏο κινηÏÏ ÏÎ¿Ï ', 'Το καθημεÏÎ¹Î½Ï ÏÎ¿Ï {app}, ÏÏÏα ÏÏ ÎµÏαÏμογή', 'ÎγκαÏάÏÏηÏε Ïο {app} και μÏÎµÏ Î±Î¼ÎÏÏÏ', 'Î ÏλήÏÎ·Ï ÎµÎ¼ÏειÏία {app}, μÏνο ÏÏην εÏαÏμογή', 'ÎκÏμα ÏÏÏÎ¯Ï Ïην εÏαÏμογή; ÎγκαÏάÏÏηÏε Ïο {app}'] }, 59 sv: { b: 'Installera', s: 'Officiell signerad APK', m: ['Installera {app}-appen för Android', 'Hela {app} pÃ¥ din Android', 'Ta med {app} överallt â skaffa appen', 'I appen är {app} snabbare', 'Bättre i appen: installera {app}', 'Ett tryck och {app} finns i din mobil', 'Ditt dagliga {app}, nu som app', 'Installera {app} och kom igÃ¥ng direkt', 'Hela {app}-upplevelsen, bara i appen', 'Ingen app än? Installera {app}'] }, 60 da: { b: 'Installér', s: 'Officiel signeret APK', m: ['Installér {app}-appen til Android', 'Hele {app} pÃ¥ din Android', 'Tag {app} med dig â hent appen', 'I appen er {app} hurtigere', 'Bedre i appen: installér {app}', 'Ãt tryk, og {app} er pÃ¥ din telefon', 'Din daglige {app}, nu som app', 'Installér {app} og kom i gang med det samme', 'Den fulde {app}-oplevelse, kun i appen', 'Ingen app endnu? Installér {app}'] }, 61 nb: { b: 'Installer', s: 'Offisiell signert APK', m: ['Installer {app}-appen for Android', 'Hele {app} pÃ¥ din Android', 'Ta med {app} overalt â hent appen', 'I appen er {app} raskere', 'Bedre i appen: installer {app}', 'Ett trykk, og {app} er pÃ¥ telefonen din', 'Din daglige {app}, nÃ¥ som app', 'Installer {app} og kom i gang med én gang', 'Hele {app}-opplevelsen, bare i appen', 'Ingen app ennÃ¥? Installer {app}'] }, 62 fi: { b: 'Asenna', s: 'Virallinen allekirjoitettu APK', m: ['Asenna {app}-sovellus Androidille', 'Koko {app} Androidillasi', 'Ota {app} mukaan â asenna sovellus', 'Sovelluksessa {app} on nopeampi', 'Parempi sovelluksessa: asenna {app}', 'Yksi napautus, ja {app} on puhelimessasi', 'Jokapäiväinen {app}, nyt sovelluksena', 'Asenna {app} ja aloita heti', 'Täysi {app}-kokemus vain sovelluksessa', 'Ei vielä sovellusta? Asenna {app}'] }, 63 tr: { b: 'Yükle', s: 'Resmî imzalı APK', m: ['Android için {app} uygulamasını yükle', '{app}âin tamamı Androidâinde', '{app}âi yanında taÅı â uygulamayı yükle', 'Uygulamada {app} daha hızlı', 'Uygulamada daha iyi: {app}âi yükle', 'Tek dokunuÅ, {app} telefonunda', 'Her günkü {app}âin, artık uygulama olarak', '{app}âi yükle, hemen gir', 'Tam {app} deneyimi yalnızca uygulamada', 'Uygulama hâlâ yok mu? {app}âi yükle'] }, 64 ar: { b: 'ØªØ«Ø¨ÙØª', s: 'APK رس٠٠٠ÙÙÙØ¹', m: ['Ø«Ø¨ÙØª تطبÙÙ {app} ÙØ£ÙدرÙÙØ¯', '{app} ÙØ§Ù ÙØ§Ù عÙÙ ÙØ§ØªÙÙ Ø£ÙØ¯Ø±ÙÙØ¯', 'خذ {app} ٠ع٠أÙÙ٠ا ÙÙØª â Ø«Ø¨Ùت Ø§ÙØªØ·Ø¨ÙÙ', '{app} أسرع Ø¯Ø§Ø®Ù Ø§ÙØªØ·Ø¨ÙÙ', 'Ø§ÙØªØ¬Ø±Ø¨Ø© Ø£ÙØ¶Ù ÙÙ Ø§ÙØªØ·Ø¨ÙÙ: Ø«Ø¨ÙØª {app}', 'Ù٠سة ÙØ§ØØ¯Ø© ÙÙØµØ¨Ø {app} عÙÙ ÙØ§ØªÙÙ', '{app} اÙÙÙÙ ÙØ Ø§ÙØ¢Ù ÙØªØ·Ø¨ÙÙ', 'Ø«Ø¨ÙØª {app} ÙØ§Ø¯Ø®Ù ÙÙØ±Ø§Ù', 'تجربة {app} اÙÙØ§Ù ÙØ© ÙÙ Ø§ÙØªØ·Ø¨ÙÙ ÙÙØ·', 'ÙÙ ØªØ«Ø¨ÙØª Ø§ÙØªØ·Ø¨ÙÙ Ø¨Ø¹Ø¯Ø Ø«Ø¨ÙØª {app}'] }, 65 he: { b: '××ª×§× ×', s: 'APK רש×× ×ת××', m: ['×תק×× × ×ת ×פ××קצ××ת {app} ××× ×ר××××', '×× {app} ××× ×ר×××× ×©×××', '×§×× ×ת {app} ××× ××§×× â ×תק×× × ×ת ××פ××קצ××', '××פ××קצ×× {app} ×××ר ××תר', '×¢×××£ ××פ××קצ××: ×תק×× × ×ת {app}', '× ×××¢× ××ת ×-{app} ×צ××× ×××פ××', '×-{app} ××××× ×©×××, ×¢×ש×× ××פ××קצ××', '×תק×× × ×ת {app} ××××× ×¡× ×××', '×××××ת {app} ×××××, רק ××פ××קצ××', '×¢×××× ××× ××פ××קצ××? ×תק×× × ×ת {app}'] }, 66 hi: { b: 'à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤', s: 'à¤à¤§à¤¿à¤à¤¾à¤°à¤¿à¤ हसà¥à¤¤à¤¾à¤à¥à¤·à¤°à¤¿à¤¤ APK', m: ['Android à¤à¥ लिठ{app} à¤à¤ª à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤', 'पà¥à¤°à¤¾ {app} à¤à¤ªà¤à¥ Android पर', '{app} साथ लॠà¤à¤²à¥à¤ â à¤à¤ª à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤', 'à¤à¤ª मà¥à¤ {app} à¤à¤° तà¥à¤à¤¼ हà¥', 'à¤à¤ª मà¥à¤ बà¥à¤¹à¤¤à¤°: {app}
66 à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤', 'à¤à¤ à¤à¥à¤ª à¤à¤° {app} à¤à¤ªà¤à¥ फ़à¥à¤¨ मà¥à¤', 'à¤à¤ªà¤à¤¾ रà¥à¤à¤¼ à¤à¤¾ {app}, ठब à¤à¤ª à¤à¥ रà¥à¤ª मà¥à¤', '{app} à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤ à¤à¤° तà¥à¤°à¤à¤¤ शà¥à¤°à¥ à¤à¤°à¥à¤', '{app} à¤à¤¾ पà¥à¤°à¤¾ ठनà¥à¤à¤µ सिरà¥à¤«à¤¼ à¤à¤ª मà¥à¤', 'ठà¤à¥ तठà¤à¤ª नहà¥à¤? {app} à¤à¤à¤¸à¥à¤à¥à¤² à¤à¤°à¥à¤'] }, 67 bn: { b: 'à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨', s: 'ঠফিসিয়াল সà§à¦¬à¦¾à¦à§à¦·à¦°à¦¿à¦¤ APK', m: ['Android-à¦à¦° à¦à¦¨à§à¦¯ {app} ঠà§à¦¯à¦¾à¦ª à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨', 'পà§à¦°à§ {app} à¦à¦ªà¦¨à¦¾à¦° Android-à¦', '{app} সাথৠরাà¦à§à¦¨ â ঠà§à¦¯à¦¾à¦ªà¦à¦¿ à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨', 'ঠà§à¦¯à¦¾à¦ªà§ {app} à¦à¦°à¦ দà§à¦°à§à¦¤', 'ঠà§à¦¯à¦¾à¦ªà§à¦ à¦à¦¾à¦²à§: {app} à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨', 'à¦à¦ à¦à§à¦à¦¾à¦¯à¦¼ {app} à¦à¦ªà¦¨à¦¾à¦° ফà§à¦¨à§', 'à¦à¦ªà¦¨à¦¾à¦° পà§à¦°à¦¤à¦¿à¦¦à¦¿à¦¨à§à¦° {app}, à¦à¦à¦¨ ঠà§à¦¯à¦¾à¦ª হিসà§à¦¬à§', '{app} à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨, সাথৠসাথৠঢà§à¦à§à¦¨', '{app}-à¦à¦° পà§à¦°à§à¦£ ঠà¦à¦¿à¦à§à¦à¦¤à¦¾ শà§à¦§à§ ঠà§à¦¯à¦¾à¦ªà§', 'à¦à¦à¦¨à¦ ঠà§à¦¯à¦¾à¦ª নà§à¦? {app} à¦à¦¨à¦¸à§à¦à¦² à¦à¦°à§à¦¨'] }, 68 id: { b: 'Instal', s: 'APK resmi bertanda tangan', m: ['Instal aplikasi {app} untuk Android', '{app} lengkap di Android kamu', 'Bawa {app} ke mana saja â instal aplikasinya', 'Di aplikasi, {app} lebih cepat', 'Lebih enak di aplikasi: instal {app}', 'Sekali ketuk, {app} ada di ponselmu', '{app} harianmu, kini sebagai aplikasi', 'Instal {app} dan langsung masuk', 'Pengalaman {app} seutuhnya hanya di aplikasi', 'Belum punya aplikasinya? Instal {app}'] }, 69 ms: { b: 'Pasang', s: 'APK rasmi ditandatangani', m: ['Pasang aplikasi {app} untuk Android', '{app} sepenuhnya di Android anda', 'Bawa {app} ke mana-mana â pasang aplikasinya', 'Dalam aplikasi, {app} lebih pantas', 'Lebih baik dalam aplikasi: pasang {app}', 'Satu ketukan dan {app} ada di telefon anda', '{app} harian anda, kini sebagai aplikasi', 'Pasang {app} dan terus masuk', 'Pengalaman penuh {app} hanya dalam aplikasi', 'Belum ada aplikasi? Pasang {app}'] }, 70 vi: { b: 'Cà i Äặt', s: 'APK chÃnh thức có chữ ký', m: ['Cà i ứng dụng {app} cho Android', 'Trá»n vẹn {app} trên Android cá»§a bạn', 'Mang {app} theo bên mình â cà i ứng dụng', 'Trong ứng dụng, {app} nhanh hÆ¡n', 'Dùng ứng dụng tá»t hÆ¡n: cà i {app}', 'Má»t chạm, {app} Äã có trên Äiá»n thoại', '{app} má»i ngà y cá»§a bạn, nay là ứng dụng', 'Cà i {app} và và o ngay', 'Trải nghiá»m {app} Äầy Äá»§ chá» có trong ứng dụng', 'Chưa có ứng dụng? Cà i {app} ngay'] }, 71 th: { b: 'à¸à¸´à¸à¸à¸±à¹à¸', s: 'APK à¸à¸²à¸à¸à¸²à¸£à¸à¸£à¹à¸à¸¡à¸¥à¸²à¸¢à¹à¸à¹à¸', m: ['à¸à¸´à¸à¸à¸±à¹à¸à¹à¸à¸ {app} สำหรัภAndroid', '{app} à¸à¸£à¸à¸à¸¸à¸à¸à¸¢à¹à¸²à¸à¸à¸ Android à¸à¸à¸à¸à¸¸à¸', 'à¸à¸ {app} à¹à¸à¸à¸¸à¸à¸à¸µà¹ â à¸à¸´à¸à¸à¸±à¹à¸à¹à¸à¸à¹à¸¥à¸¢', 'à¹à¸à¹à¸à¸ {app} à¹à¸£à¹à¸§à¸à¸§à¹à¸²', 'à¸à¸µà¸à¸§à¹à¸²à¹à¸à¹à¸à¸: à¸à¸´à¸à¸à¸±à¹à¸ {app}', 'à¹à¸à¸°à¸à¸£à¸±à¹à¸à¹à¸à¸µà¸¢à¸§ {app} à¸à¹à¸à¸¢à¸¹à¹à¹à¸à¸¡à¸·à¸à¸à¸·à¸à¸à¸¸à¸', '{app} à¸à¸¹à¹à¹à¸à¸à¸¸à¸à¸§à¸±à¸ à¸à¸à¸à¸à¸µà¹à¹à¸à¹à¸à¹à¸à¸à¹à¸¥à¹à¸§', 'à¸à¸´à¸à¸à¸±à¹à¸ {app} à¹à¸¥à¹à¸§à¹à¸à¹à¸²à¹à¸à¹à¹à¸à¹à¸à¸±à¸à¸à¸µ', 'à¸à¸£à¸°à¸ªà¸à¸à¸²à¸£à¸à¹ {app} à¹à¸à¹à¸¡à¸£à¸¹à¸à¹à¸à¸ à¹à¸à¸à¸²à¸°à¹à¸à¹à¸à¸', 'ยัà¸à¹à¸¡à¹à¸¡à¸µà¹à¸à¸? à¸à¸´à¸à¸à¸±à¹à¸ {app} à¹à¸¥à¸¢'] }, 72 ja: { b: 'ã¤ã³ã¹ãã¼ã«', s: 'å ¬å¼ç½²åæ¸ã¿APK', m: ['Androidç{app}ã¢ããªãã¤ã³ã¹ãã¼ã«', '{app}ã®ãã¹ã¦ãããªãã®Androidã«', '{app}ããã¤ã§ãæã¡æ©ãã â ã¢ããªãã©ãã', 'ã¢ããªãªã{app}ããã£ã¨éã', 'ã¢ããªã®æ¹ãå¿«é©ï¼{app}ãã¤ã³ã¹ãã¼ã«', 'ã¯ã³ã¿ããã§{app}ãã¹ããã«', 'æ¯æ¥ã®{app}ããã¢ããªã§', '{app}ãå ¥ãã¦ããã¹ã¿ã¼ã', '{app}ã®ãã«ä½é¨ã¯ã¢ããªã ã', 'ã¾ã ã¢ããªæªå°å ¥ï¼{app}ãã¤ã³ã¹ãã¼ã«'] }, 73 ko: { b: 'ì¤ì¹', s: 'ê³µì ìëª APK', m: ['Androidì© {app} ì±ì ì¤ì¹íì¸ì', '{app}ì 모ë ê²ì Androidìì', '{app}
73ì ì´ëìë â ì±ì ì¤ì¹íì¸ì', 'ì±ììë {app}ì´ ë 빨ë¼ì', 'ì±ì´ ë ì¢ìì: {app} ì¤ì¹', 'í ë²ì í°ì¹ë¡ {app}ì´ í°ì', 'ë§¤ì¼ ì°ë {app}, ì´ì ì±ì¼ë¡', '{app} ì¤ì¹íê³ ë°ë¡ ììíì¸ì', 'ìì í {app} ê²½íì ì±ììë§', 'ìì§ ì±ì´ ìëì? {app}ì ì¤ì¹íì¸ì'] }, 74 zh: { b: 'å®è£ ', s: '宿¹ç¾å APK', m: ['å®è£ {app} å®ååºç¨', '宿´ç {app}ï¼å°½å¨ä½ çå®åææº', 'é身带ç {app} â ç«å³å®è£ åºç¨', 'å¨åºç¨éï¼{app} æ´å¿«', 'åºç¨ä½éªæ´ä½³ï¼å®è£ {app}', 'ä¸é®å®è£ ï¼{app} ç«å»å°ææº', 'ä½ æ¯å¤©ç¨ç {app}ï¼ç°å¨æåºç¨äº', 'å®è£ {app}ï¼é©¬ä¸å¼å§', '宿´ç {app} ä½éªï¼åªå¨åºç¨é', 'è¿æ²¡æåºç¨ï¼å®è£ {app}'] } 75 }; 76 77 function idioma() { 78 var pref = navigator.languages || [navigator.language || 'en']; 79 for (var i = 0; i < pref.length; i++) { 80 var c = String(pref[i] || '').toLowerCase().split('-')[0]; 81 if (c === 'no') c = 'nb'; 82 if (L[c]) return c; 83 } 84 return 'en'; 85 } 86 87 var LANG = idioma(); 88 var T = L[LANG]; 89 var DIR = RTL[LANG] ? 'rtl' : 'ltr'; 90 var MSG = T.m[Math.floor(Math.random() * T.m.length)].split('{app}').join(APP); 91 92 // Cabeza del androide (SVG oficial simplificado) para el icono del header. 93 var ANDROIDE = '<svg viewBox="0 0 24 24" width="16" height="16" fill="#fff" aria-hidden="true"><path d="M17.6 9.48l1.84-3.18c.16-.31.04-.69-.26-.85-.29-.15-.65-.06-.83.22l-1.88 3.24a11.46 11.46 0 0 0-8.94 0L5.65 5.67c-.19-.29-.58-.38-.87-.2-.28.18-.37.54-.22.83l1.84 3.18C3.4 11.15 1.5 14.06 1.5 17.4h21c0-3.34-1.9-6.25-4.9-7.92zM7.75 14.9a1.05 1.05 0 1 1 0-2.1 1.05 1.05 0 0 1 0 2.1zm8.5 0a1.05 1.05 0 1 1 0-2.1 1.05 1.05 0 0 1 0 2.1z"/></svg>'; 94 95 function iconoHeader() { 96 if (document.getElementById('chAppIcono')) return; 97 var a = document.createElement('a'); 98 a.id = 'chAppIcono'; 99 a.href = APK; 100 a.rel = 'nofollow'; 101 a.title = MSG; 102 a.setAttribute('aria-label', T.b + ' · ' + APP); 103 a.innerHTML = ANDROIDE; 104 a.style.cssText = 'display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;background:' + COLOR + ';box-shadow:0 2px 8px rgba(0,0,0,.3);z-index:99998;'; 105 // data-fijo="1": ni buscar header â icono fijo (para barras superiores 106 // que son fixed pero no <header>, como la de Chateando). 107 if (cs.dataset.fijo === '1') { 108 a.style.position = 'fixed'; 109 a.style.top = (ARRIBA === null ? 10 : ARRIBA) + 'px'; 110 a.style[DIR === 'rtl' ? 'left' : 'right'] = DERECHA + 'px'; 111 document.body.appendChild(a); 112 return; 113 } 114 var head = document.querySelector('header, .site-header, #masthead, .main-header, .l-header, .td-header-wrap'); 115 if (head) { 116 var pos = getComputedStyle(head).position; 117 if (pos === 'static') head.style.position = 'relative'; 118 a.style.position = 'absolute'; 119 if (ARRIBA === null) { 120 a.style.top = '50%'; 121 a.style.transform = 'translateY(-50%)'; 122 } else { 123 a.style.top = ARRIBA + 'px'; 124 } 125 a.style[DIR === 'rtl' ? 'left' : 'right'] = DERECHA + 'px'; 126 head.appendChild(a); 127 } else { 128 a.style.position = 'fixed'; 129 a.style.top = '10px'; 130 a.style[DIR === 'rtl' ? 'left' : 'right'] = '10px'; 131 document.body.appendChild(a); 132 } 133 } 134 135 function banner() { 136 if (document.getElementById('chBannerApp')) return; 137 if (Number(localStorage.getItem('chBannerAppOff') || 0) > Date.now()) return; 138 var b = document.createElement('div'); 139 b.id = 'chBannerApp'; 140 b.dir = DIR; 141 b.style.cssText = 'position:fixed;left:0;right:0;bottom:0;z-index:99999;background:#111;color:#fff;font-family:system-ui,sans-serif;box-shadow:0 -4px 18px rgba(0,0,0,.35);padding:12px 14px calc(12px + env(safe-area-inset-bottom));display:flex;align-items:center;gap:12px;'; 142 b.innerHTML = 143 '<div style="flex:1;min-width:0">' + 144 '<div style="font-weight:700;font-size:.95rem">' + MSG + '</div>' + 145 '<div style="opacity:.75;font-size:.8rem">' + T.s + '</div>' + 146 '</div>' + 147 '<a href="' + APK + '" rel="nofollow" style="background:' + COLOR + ';color:#fff;text-decoration:none;font-weight:700;padding:10px 16px;border-radius:9px;white-space:nowrap;display:flex;align-items:center;gap:7px">' + ANDROIDE + T.b + '</a>' + 148 '<button id="chBannerAppX" aria-label="Ã" style="background:none;border:0;color:#fff;opacity:.6;font-size:1.3rem;line-height:1;padding:6px">×</button>'; 149 document.body.appendChild(b); 150 function calla() { 151 b.remove(); 152 // A la HORA vuelve: es un recordatorio persistente, no un adiós. 153 localStorage.setItem('chBannerAppOff', String(Date.now() + 36e5)); 154 } 155 document.getElementById('chBannerAppX').addEventListener('click', calla); 156 b.querySelector('a').addEventListener('click', function () { 157 localStorage.setItem('chBannerAppOff', String(Date.now() + 36e5)); 158 }); 159 } 160 161 // data-solo-icono="1": se dibuja SOLO el icono del header, sin el banner 162 // inferior. Lo usan los sitios que ya enseñan la hoja «Continuar enâ¦Â» 163 // (ch-app-continuar.js): dos avisos a la vez abajo se pisan, y el que se 164 // quedarÃa tapado es justo el que ofrece elegir. El icono del header no 165 // estorba a ninguno de los dos y es la puerta permanente. 166 var SOLO_ICONO = cs.dataset.soloIcono === '1'; 167 168 function pinta() { 169 function dibuja() { 170 iconoHeader(); 171 if (!SOLO_ICONO) banner(); 172 } 173 if (document.readyState === 'loading') { 174 document.addEventListener('DOMContentLoaded', dibuja); 175 } else { 176 dibuja(); 177 } 178 } 179 180 // Con la app instalada no se molesta; al desinstalarla, esto vuelve a dar 181 // false y todo reaparece solo. Si la API no existe (navegador viejo), se 182 // enseña igual: mejor un aviso de más que ninguno. 183 if (navigator.getInstalledRelatedApps) { 184 navigator.getInstalledRelatedApps().then(function (apps) { 185 var instalada = (apps || []).some(function (x) { return x && x.id === PAQUETE; });
186 if (!instalada) pinta(); 187 }).catch(pinta); 188 } else { 189 pinta(); 190 } 191})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.