Wikiviajes
eswikivoyage
https://es.wikivoyage.org/wiki/P%C3%A1gina_principal
MediaWiki 1.47.0-wmf.9
first-letter
Medio
Especial
Discusión
Usuario
Usuario discusión
Wikiviajes
Wikiviajes discusión
Archivo
Archivo discusión
MediaWiki
MediaWiki discusión
Plantilla
Plantilla discusión
Ayuda
Ayuda discusión
Categoría
Categoría discusión
TimedText
TimedText talk
Módulo
Módulo discusión
Evento
Evento discusión
Belice
0
851
255253
255252
2026-07-04T11:59:35Z
Urci dream
21466
/* Mantente seguro */
255253
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
br8v7nxb9suk0phak17yvgtnshzspsf
255259
255253
2026-07-04T12:05:30Z
Urci dream
21466
/* Llegar */
255259
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
[[Archivo:Visa policy of Belize.png|miniaturadeimagen|Los países en azul no requieren visado para entrar en Belice]]
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
[[Archivo:Philip S. W. Goldson International Airport 2016.JPG|miniaturadeimagen|Terminal del Aeropuerto Internacional Philip S.W. Goldson]]
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
pxry7fo4xmft12o861cpjim8nedsydu
255300
255259
2026-07-05T06:00:47Z
Urci dream
21466
/* Ver */
255300
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
[[Archivo:Visa policy of Belize.png|miniaturadeimagen|Los países en azul no requieren visado para entrar en Belice]]
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
[[Archivo:Philip S. W. Goldson International Airport 2016.JPG|miniaturadeimagen|Terminal del Aeropuerto Internacional Philip S.W. Goldson]]
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
El 60% del territorio de Belice es selva virgen que alberga una enorme biodiversidad: Desde cocodrilos, a varias especies de monos, tapires, armadillos o jaguares, siendo uno de los mayores lugares del mundo con mayor densidad de estos felinos, así como más de 600 especies diferentes de aves, entre las que destaca el tucán pico arcoiris, uno de los emblemas del país.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
h4ncixbikakekmqt94c8eqm3j77zpo4
255301
255300
2026-07-05T10:45:26Z
Urci dream
21466
/* Ver */
255301
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
[[Archivo:Visa policy of Belize.png|miniaturadeimagen|Los países en azul no requieren visado para entrar en Belice]]
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
[[Archivo:Philip S. W. Goldson International Airport 2016.JPG|miniaturadeimagen|Terminal del Aeropuerto Internacional Philip S.W. Goldson]]
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
El 60% del territorio de Belice es selva virgen que alberga una enorme biodiversidad: Desde cocodrilos, a varias especies de monos, tapires, armadillos o jaguares, siendo uno de los mayores lugares del mundo con mayor densidad de estos felinos, así como más de 600 especies diferentes de aves, entre las que destaca el tucán pico arcoiris, uno de los emblemas del país. La Reserva natural de Cockscomb, de 400 kilómetros cuadrados, que alberga bosques tropicales y cursos fluviales, creó en 1990, el primer santuario de jaguares en libertad. La zona tiene la mayor densidad de jaguares del mundo y es el lugar de referencia mundial de investigación de estos felinos.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
c4h3qqkgc6h5kathzz6t3npl9ki43zd
255302
255301
2026-07-05T11:47:42Z
Urci dream
21466
/* Ver */
255302
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
[[Archivo:Visa policy of Belize.png|miniaturadeimagen|Los países en azul no requieren visado para entrar en Belice]]
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
[[Archivo:Philip S. W. Goldson International Airport 2016.JPG|miniaturadeimagen|Terminal del Aeropuerto Internacional Philip S.W. Goldson]]
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
[[Archivo:Cockscomb Basin Wildlife Sanctuary 16.JPG|miniaturadeimagen|Vista de la Reserva Natural de Cockcomb]]
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
El 60% del territorio de Belice es selva virgen que alberga una enorme biodiversidad: Desde cocodrilos, a varias especies de monos, tapires, armadillos o jaguares, siendo uno de los mayores lugares del mundo con mayor densidad de estos felinos, así como más de 600 especies diferentes de aves, entre las que destaca el tucán pico arcoiris, uno de los emblemas del país. La Reserva natural de Cockscomb, de 400 kilómetros cuadrados, que alberga bosques tropicales y cursos fluviales, creó en 1990, el primer santuario de jaguares en libertad. La zona tiene la mayor densidad de jaguares del mundo y es el lugar de referencia mundial de investigación de estos felinos. El Santuario Crooked Tree es un área protegida característica por albergar una ingente cantidad avifauna. El área ocupa un total 6.600 hectáreas de diferentes ecosistemas: lagunas, arroyos, pantanos de madera de log, bosque de hoja ancha y sabana de pinos, y alberga a cientos de especies de fauna silvestre., entre ellas la tortuga de río de centroamérica, el mono aullador negro o la Amazona oratrix.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
bcwdswo7g9oznaq5xztlntvawhwma2t
255303
255302
2026-07-05T11:56:31Z
Urci dream
21466
/* Ver */
255303
wikitext
text/x-wiki
{{Top
|nombre_oficial = Belice
|imagen_bandera = Flag of Belize.svg
|imagen_escudo = Coat of arms of Belize.svg
|imagen_mapa = Belize on the globe (Americas centered).svg
|imagen = Laughing Bird Caye, Belize.jpg
|imagen_tamaño = 250px
|pie_de_imagen = Cayo Laughing Bird
|capital = Belmopán
|idioma_oficial = Ingles
|idiomas_oficiales =
|gentilicio = Beliceño, -a
|gobierno = Monarquía constitucional
|superficie = 22 966
|población = 322 000
|población_año = 2011
|población_densidad = 14,02
|PIB_per_cápita =
|IDH = 0,702
|IDH_categoría = <span style="color:#FFCC00">'''Medio'''</span>
|moneda = [[w:Dólar beliceño|dólar beliceño]]
|moneda_símbolo = $
|moneda_iso = BZD
|religión = [[w:Cristianismo|Cristianismo]] (40% [[w:Catolicismo|católicos]], 32% [[w:Protestantismo|protestantes]])
|horario = UTC-6
|horario_verano =
|código_ISO = 084 / BLZ / BZ
|cctld = .bz
|código_telefónico = 501
|electricidad = 110 V y 220 V, 50 Hz<br/>Enchufes: A, B, G
|intro = '''Belice''' (en inglés, ''Belize'') es un país del {{eb|América Central}}. Belice , anteriormente Honduras Británica , es el único país de Centroamérica con el inglés como idioma oficial. Las atracciones de clase mundial incluyen explorar las exuberantes selvas con plantas y animales exóticos, pescar en alta mar, nadar, hacer snorkel y bucear en el Mar Caribe con sus atractivos arrecifes y visitar las ruinas mayas. Los niveles de ingresos siguen siendo muy bajos y la infraestructura es muy básica. Los beliceños están muy orgullosos y son amigables con los visitantes y la industria turística creció enormemente en la última década.}}
==Regiones==
{{Regionlist
| regionmapa=Belize Regions map.png
| regionmapsize=350px
| regionmaptitle=Mapa de Belice
| region1nombre=[[Belice del Norte]]
| region1color=#578E86
| region1descripcion=Distritos de Corozal (costero) y Orange Walk (interior).
| region2nombre=[[Distrito de Belice]]
| region2color=#71B37B
| region2descripcion=Hogar de la ciudad más grande, el aeropuerto y una gran cantidad de islas populares frente a la costa.
| region3nombre=[[Cayo]]
| region3color=#558355
| region3descripcion=Lleno de aventuras, este distrito central está lleno de junglas, cuevas, ríos y ruinas mayas.
| region4nombre=[[Stann Creek]]
| region4color=#6BA6CD
| region4descripcion=Región costera al sur del Distrito de Belice, acceso a islas tranquilas en el arrecife y barcos a y desde Honduras.
| region5nombre=[[Toledo (distrito)|Toledo]]
| region5color=#B2C8A2
| region5descripcion=Región costera/interior del sur con más ruinas mayas y barcos hacia Guatemala.
}}
{{mapshape|type=geoshape|fill=#578E86|title=[[Belice del Norte]]|wikidata=Q14208400}}
{{mapshape|type=geoshape|fill=#71B37B|title=[[Distrito de Belice]]|wikidata=Q506056}}
{{mapshape|type=geoshape|fill=#558355|title=[[Cayo]]|wikidata=Q508773}}
{{mapshape|type=geoshape|fill=#6BA6CD|title=[[Stann Creek]]|wikidata=Q502652}}
{{mapshape|type=geoshape|fill=#B2C8A2|title=[[Toledo (distrito)|Toledo]]|wikidata=Q506049}}
==Ciudades==
* {{marker|type=city|name=[[Belmopán]]|wikidata=Q3043}} - capital en el interior
* {{marker|type=city|name=[[Belize City]]|wikidata=Q108223}} - la ciudad más grande de Belice, en el mar Caribe
* {{marker|type=city|name=[[Corozal Town]]|wikidata=Q882907}}
* {{marker|type=city|name=[[Crooked Tree]]|wikidata=Q5187866}}
* {{marker|type=city|name=[[Dangriga]]|wikidata=Q888300}} - Gran ciudad Garífuna en el sur, anteriormente conocida como Stann Creek Town
* {{marker|type=city|name=[[Hopkins (Belize)|Hopkins]]|wikidata=Q5900602}} - Pueblo Garífuna
* {{marker|type=city|name=[[Orange Walk Town]]|wikidata=Q882964}}
* {{marker|type=city|name=[[Punta Gorda (Belize)|Punta Gorda]]|wikidata=Q883362}} - Hermoso y tranquilo puerto en el sur; hogar de un complejo y diverso mercado amerindio los fines de semana
* {{marker|type=city|name=[[San Ignacio (Belize)|San Ignacio]]|wikidata=Q724815}} - Conocido como Cayo entre los lugareños, con influencias mayas e hispánicas cerca de la frontera con Guatemala
==Otras Destinos==
[[File:Altunha.jpg|thumb|Altun Ha]]
* {{marker|type=vicinity|name=[[Ambergris Caye]]|wikidata=Q457186}}–- gran isla barrera en el norte
* {{marker|type=vicinity|name=[[Caye Caulker]]|wikidata=Q1051967}} – isla barrera más pequeña en el norte
* {{marker|type=vicinity|name=[[Placencia Peninsula]]|wikidata=Q14229496}} – larga península (casi una isla) frente a Stann Creek
* {{marker|type=vicinity|name=[[Tobacco Caye]]|wikidata=Q7811458}} – pequeña isla popular entre los viajeros con presupuesto limitado
===Ruinas Mayas===
* {{marker|type=vicinity|name=[[Altun Ha]]|wikidata=Q446176}}
* {{marker|type=vicinity|name=[[Caracol]]|wikidata=Q1035336}}
* {{marker|type=vicinity|name=[[Lamanai]]|wikidata=Q968562}}
* {{marker|type=vicinity|name=[[Lubaantun]]|wikidata=Q529147}}
* {{marker|type=vicinity|name=[[Xunantunich]]|wikidata=Q1646630}}
== Comprender ==
Belice es uno de los países más pequeños de Centroamérica y el menos poblado. A pesar de ello, es un país lleno de selvas y naturaleza en estado puro, lo que lo convierten en un ambiente muy agradable para los turísticas más atrevidos.Belice es el único país de América Central sin costa en el Océano Pacífico (solo el Mar Caribe al este). Con su historia colonial británica y una larga costa caribeña, es culturalmente similar a muchas de las antiguas colonias de ''islas de las'' Indias Occidentales de Gran Bretaña , con una población mayoritariamente criolla o afrocaribeña. Pero también incluye una gran población maya nativa, especialmente en el norte y noroeste del país. Como resultado, aunque el Inglés es el idioma oficial, español también se habla a menudo. En el sureste a lo largo de la costa caribeña viven los garífunas (caribes negros), una cultura afroamerindia.
Después de largos viajes que comenzaron en lo que ahora son los Países Bajos en 1790, a través de Alemania, el sur de Rusia, Canadá, Estados Unidos y México, varios miles de cristianos menonitas de habla alemana llegaron a Belice en 1958 después de largas y detalladas discusiones con el gobierno sobre temas específicos. exenciones y privilegios. Son fácilmente reconocibles por su habla (algo distintiva del alemán estándar moderno) y su vestimenta "pintoresca".
=== Historia ===
Muelle en Caye Caulker
Al igual que las partes vecinas de Guatemala y México, esta área fue colonizada durante miles de años por el pueblo maya. Todavía están aquí, una parte importante de la gente y la cultura de Belice. Si bien el Imperio español reclamó el área en el siglo XVI, los españoles avanzaron poco para establecerse aquí. Los británicos se establecieron primero en la costa y las islas cercanas a la costa para la tala. En 1798, las fuerzas británicas de Belice derrotaron un intento español de expulsarlos en la Batalla de St. George's Caye, un aniversario que todavía se celebra como feriado cada 10 de septiembre.
La colonia de Honduras Británica creció en el siglo XIX. Al principio, los africanos fueron traídos como esclavos, pero la esclavitud fue abolida aquí en 1838. Después de la abolición de la esclavitud, los británicos traerían trabajadores indios contratados a la colonia para complementar la mano de obra, y sus descendientes siguen siendo una minoría significativa hasta el día de hoy. Muchos refugiados de la Guerra de Castas del siglo XIX en la península de Yucatán escaparon del conflicto para establecerse en Belice, especialmente en la sección norte.
El gobierno de Guatemala ha afirmado durante mucho tiempo haber heredado el reclamo español del siglo XV sobre Belice. Aunque los británicos estaban dispuestos a otorgar la independencia a Honduras Británica ya a mediados de la década de 1960, esta disputa en curso jugó un papel importante en el retraso de la independencia total de Belice hasta 1981, mucho después de que Londres concediera la independencia a otras antiguas colonias de la región. Guatemala se negó a reconocer un Belice independiente en absoluto hasta 1991, y hasta el día de hoy reclama prácticamente todo el territorio beliceño al sur de la ciudad de Belice. El tema sigue siendo delicado, particularmente en la mitad sur de Belice.
Belice escapó de los sangrientos conflictos civiles de la década de 1980 que envolvieron a gran parte de Centroamérica, y llegaron refugiados del conflicto en Guatemala, la mayoría asentados en el oeste. Si bien Belice no ha sido inmune al crimen desenfrenado de las drogas y la pobreza extrema de sus vecinos, es un destino comparativamente seguro en una parte del mundo propensa a los conflictos. Belice comparte lazos diplomáticos y económicos particularmente estrechos con el Reino Unido y los Estados Unidos. El país es una monarquía constitucional con el Rey del Reino Unido, actualmente Carlos III, como jefe de estado, y con un gobernador general designado como su representante.
El turismo se ha convertido en el pilar de la economía a medida que los antiguos productos agrícolas (azúcar, plátano y naranjas) han perdido terreno. El país sigue asolado por un alto desempleo, una creciente participación en el tráfico de drogas de América del Sur y un aumento de la delincuencia urbana. En 2006 se descubrieron cantidades comerciales de petróleo en la zona del Mirador Español.
=== Clima ===
Tropical, muy caluroso y húmedo. La temporada seca suele durar de febrero a mayo y luego la temporada de lluvias suele durar hasta noviembre. Los huracanes que provocan inundaciones costeras, especialmente en el sur, son frecuentes de junio a noviembre.
=== Terreno ===
La llanura costera plana es pantanosa con montañas bajas en el sur. El punto más alto es el pico Victoria a 1.160 m.
== Llegar ==
=== Requisitos de ingreso ===
Todos los visitantes deben tener fondos suficientes, US $ 75 por día y los documentos necesarios para su próximo destino.
Si ingresa por tierra desde México, la inmigración mexicana le cobrará una tarifa de P $ 533 ( pesos mexicanos ) (a partir de mayo de 2018), a '''menos''' que pueda mostrar prueba de que pagó la tarifa de inmigración cuando ingresó a México. Tu tarjeta de turista FMM no es suficiente. Si cruzó en una frontera terrestre, necesitará el recibo real de cuando pagó la tarifa. Si llegó a México en un vuelo comercial, es posible que ya haya pagado la tarifa con su pasaje aéreo, pero a los guardias fronterizos aquí no les importa. Es posible que pueda convencerlos si tiene una copia impresa de un recibo detallado de la aerolínea que demuestre que se incluyó esta tarifa específica.
[[Archivo:Visa policy of Belize.png|miniaturadeimagen|Los países en azul no requieren visado para entrar en Belice]]
==== Sin visa ====
Ciudadanos titulares de pasaportes o documentos de refugiado de todos los estados miembros de la Unión Europea, Andorra, Antigua y Barbuda, Argentina, Australia, Bahamas, Barbados, Bolivia, Botswana, Brasil, Brunei, Canadá, Chile, Colombia, Costa Rica, Dominica, Ecuador, El Salvador, Eswatini, Fiji, Gambia, Ghana, Granada, Guatemala, Guyana, Honduras, Hong Kong, Islandia, Israel, Jamaica, Japón, Kiribati, Lesotho, Malawi, Malasia, Maldivas, Islas Marshall, Mauricio, México, Micronesia, Mónaco, Namibia, Nueva Zelanda, Nicaragua, Noruega, Palau, Panamá, Papua Nueva Guinea, Perú, Samoa, Saint Kitts y Nevis, Santa Lucía, San Vicente y las Granadinas, Seychelles, Sierra Leona, Singapur, Islas Salomón, Sudáfrica, Corea del Sur, Surinam, Suiza, Taiwán, Tanzania, Tonga, Trinidad y Tobago, Túnez, Turquía, Tuvalu, Uganda, Estados Unidos, Uruguay, Vanuatu, Ciudad del Vaticano, Venezuela, Zambia y Zimbabwe, además de los pasaportes emitidos a ciudadanos de los Territorios Británicos de Ultramar, no requieren visa para visitar Belice.
Todos los ciudadanos extranjeros con una tarjeta verde válida de los EE. UU. O una visa para los EE. UU. O el Área Schengen están exentos de visa por una estadía máxima de 90 días.
Los residentes permanentes y los titulares de visas de entrada múltiple de los Estados Unidos pueden obtener una visa a su llegada por una tarifa de 50 dólares estadounidenses.
==== Visas ====
Todos los demás viajeros que no pertenecen a las categorías anteriores requieren una visa antes de viajar, que se puede obtener en una embajada de Belice o Reino Unido.
Nacionales de Afganistán, Argelia, Bangladesh, Bolivia, China, Cuba, Eritrea, Haití, India, Irán, Irak, Kenia, Corea del Norte, Líbano, Libia, Myanmar, Nepal, Nigeria, Pakistán, Palestina, Sri Lanka, Somalia, Sudán, Siria y Tailandia requieren autorización además de una visa.
Los ciudadanos de China (PRC) deben pagar una tarifa de repatriación de BZ $ 3.000 a su llegada.
Los ciudadanos de Bangladesh, India, Pakistán y Sri Lanka deben pagar una tasa de repatriación de 1.200 dólares de Belice a la llegada.
Los visitantes de cruceros ni siquiera necesitan un pasaporte.
La información actualizada de la Junta de Turismo de Belice mantiene información actualizada.
Al salir del país por tierra, prepárese para pagar impuestos (tarifa obligatoria de frontera de BZ $ 30 o US $ 15 por persona más una tarifa PACT de BZ $ 7.50 o US $ 3.75 por persona si la estadía excede las 24 horas (a partir de abril de 2016)) en efectivo, si paga Dólares estadounidenses, entonces puede o no recibir cambio en dólares BZ.
[[Archivo:Philip S. W. Goldson International Airport 2016.JPG|miniaturadeimagen|Terminal del Aeropuerto Internacional Philip S.W. Goldson]]
=== En avión ===
El Aeropuerto Internacional Philip SW Goldson (códigos IATA: BZE, la OACI: MZBZ) sirve a Ciudad de Belice. Es el mas grande y el de mayor actividad del País. Se encuentra en Ladyville, a unos 30 minutos del centro de Ciudad de Belice.
* <bdi>'''Aeropuerto Internacional Philip SW Goldson''' ('''BZE''' <sup><small> IATA</small></sup>) (en Ladyville, a 15 km al noroeste de la ciudad de Belice (aproximadamente 30 minutos en automóvil)). Los vuelos durante todo el año están disponibles desde los EE. UU. (American, Delta, Southwest y United); Centroamérica (Avianca El Salvador, Transportes Aéreos Guatemaltecos (TAG) y Copa Airlines); desde dentro de Belice y desde la adyacente Península de Yucatán en México ( Maya Island Air y Tropic Air ). Se ofrecen vuelos de temporada adicionales (octubre-marzo) desde Canadá con Air Canada Rouge y Westjet. editar</bdi>
Para una tarifa aérea internacional más baja, también puede considerar volar a Cancún o Chetumal . Desde Cancún hay un bus a Chetumal, que está en la frontera con Belice.
=== En barco ===
Existe la posibilidad de llegar a Punta Gorda en lancha desde Livinstong, Guatemala. Un trayecto corto y barato para los que quieran acercarse a los cayos de esta zona. Varias líneas de cruceros hacen escala en la ciudad de Belice. Desafortunadamente, por lo general se quedan solo un día, lo que no permite la oportunidad de ver realmente Belice. Puede visitar una de las ruinas mayas, montar en hidrodeslizador en las marismas a las afueras de la ciudad, comprar, ir al museo, ir al zoológico o hacer un viaje corto de rafting en cuevas o hacer esnórquel, pero eso es todo. Eso significa que alrededor del 70% de las cosas que a la mayoría de los turistas les gustaría no están disponibles, sin mencionar los puntos de interés del ecoturismo.
Hacia Puerto Cortés, Honduras, el ''Gulf Cruza'', una pequeña y destartalada lancha rápida (20 personas) sale de Placencia todos los viernes alrededor de las 9:30 a.m. (4 horas, US $ 50), yendo primero a Big Creek. Vuelve a Placencia el lunes. Las entradas se venden en la oficina de turismo junto a la gasolinera. Pasa primero por inmigración.
Las pequeñas lanchas rápidas operan a diario entre Puerto Barrios en Guatemala y Punta Gorda, el costo es de alrededor de US $ 20 por trayecto. Los martes y viernes, los barcos operan desde Livingston en Guatemala hasta Punta Gorda. El viaje no dura más de una hora. Son 50 dólares de Belice.
También hay un impuesto de salida de BZ $ 30 más una tarifa de parque marino de BZ $ 7.50. Los extranjeros deben pagar impuestos de salida y una tarifa de mantenimiento de conservación al salir de Belice por tierra, aire o agua. Estas tarifas solo se aplican a los lugareños cuando vuelan.
'''San Pedro Belize Express''' ha cerrado temporalmente sus operaciones debido al COVID-19 .
=== En coche ===
Si usted se encuentra en Guatemala puede llegar desde Flores,Peten o desde Melchor De Mencos,Guatemala. Desde México vía Chetumal , o por un camino mucho más accidentado desde Guatemala vía Melchor de Mencos . La Carretera Occidental conecta Melchor Mencos con la Ciudad de Belice a través de Belmopan , San Ignacio, mientras que la Carretera Philip Goldson (Carretera del Norte) conecta la Ciudad de Belice con Chetumal en México a través de Corozal Town y Orange Walk.
=== En bus ===
Del aeropuerto de Cancún, Quintana Roo en México, parte un bus a las 10:45 de la noche que va hasta Belize City. Y de Chetumal, Quintana Roo en el mercado nuevo salen diariamente autobuses para Belice City y otras ciudades del pais.
Las siguientes compañías operan autobuses desde Flores , Guatemala , y desde Chetumal , México a la ciudad de Belice:
* <bdi>'''Fuentes del Norte (FDN)''', Mundo Maya @ Suite # 26, Brown Sugar Market Place 90 Front St, Ciudad de Belice (250 m al este a lo largo de Front St desde el puente giratorio y la terminal de Ocean Ferry Belize.), <abbr>☏</abbr> [[Tel:+501223-1200|+501223-1200]]. Los boletos se venden a través de Mundo Maya Travel en la Terminal San Pedro Express en la Ciudad de Belice. Los autobuses paran en el mercado a lo largo de Front Street, donde se encuentra la terminal San Pedro Express. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Viajes y excursiones S & L''', 91 N Front St, Ciudad de Belice (mismo edificio que Image Factory, al lado de Spoonaz Coffee), <abbr>☏</abbr> [[Tel:+501227-7593|+501227-7593]]. Organizan el transporte de ida y vuelta a Tikal, Flores y Cancún desde la ciudad de Belice. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''Grupo ADO''', Terminal de autobuses de Novelos en la ciudad de Belice. Salida una vez por la noche hacia / desde Cancún y Mérida. (actualizado en septiembre de 2017 | editar )</bdi>
* <bdi>'''BBOC'''. Frecuente (¿por hora?) Desde Chetumal a la ciudad de Belice y viceversa, con paradas en Corozal, Orange Walk y otras ciudades en el camino. Los buses salen de Chetumal desde la "antigua estación ADO" ( ''la terminal antigua de ADO'' ) en la calle Salvador Novo cerca de la Av. Insurgentes y Av. Belice. (actualizado en mayo de 2018 | editar )</bdi>
Los autobuses entrantes solo pueden hacer paradas entre el cruce fronterizo y la ciudad de Belice, mientras que los autobuses salientes solo pueden recoger pasajeros que viajen a México o Guatemala. Hay otras compañías de autobuses de Belice y sindicatos de conductores que van al norte de la ciudad de Belice a Chetumal que pueden recoger y dejar pasajeros a lo largo de la carretera con servicios a Orange Walk y Corozal Town. Consulte "En autobús" debajo de cómo moverse a continuación.
=== En tren ===
Todo el transporte de carril adentro El Salvador se ha suspendido desde el octubre de 2002, a excepción de un tren de pasajero de breve duración de la lanzadera en medio Salvador de San y Soyapango durante reparaciones de la emergencia en un puente del camino en 2004 - 2005. Los ferrocarriles se han construido en El Salvador desde 1882 cerca El Salvador Rail Company se limitó (nombrado más adelante FES - Ferrocarril de El Salvador) y fruta unida (IRCA). En 1975, las dos compañías se combinaron en FENADESAL - Ferrocarriles Nacionales de El Salvador. Actualmente, esta agencia supervisa 554.8 kilómetros de las pistas averiadas, ciudades importantes que conectan y ligado antes a los ferrocarriles de Guatemala en Anguiatú. Los ferrocarriles en El Salvador estaban de la galga estrecha, 914 milímetros, iguales que Guatemala. Actualmente, Belice no ofrece ningún transporte de carril. En 1913, Ferrocarril del cala de Stann funcionado en medio Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo del Carretera del Hummingbird. El ferrocarril que conectaría los Estados Unidos y el México con Panamá con una galga de 1435m m puentearía Belice a menos que un rama fuera construido. Esta línea fue propuesta en 2007. Belice Actual, Belice no ofrece ningún transporte de carril. En 1913, el ferrocarril de la cala de Stann funcionado entre el Dangriga y el estado de Middlesex y fue abandonado en 1937 que dejaba algunos puentes ferroviarios a lo largo de la carretera del colibrí.
== Hablar ==
El idioma oficial es el inglés, aunque un alto porcentaje de la población de este país utiliza el español como lengua materna.
En el sur, son más reacios a utilizar el español, a pesar de entenderlo, y procuran contestar siempre en inglés.
Como excolonia británica, el idioma oficial de Belice es el inglés estándar, siguiendo las reglas de ortografía del Reino Unido. Esto hace que Belice se destaque de sus vecinos de habla hispana.
El español, el garífuna (caribe) y los idiomas o dialectos mayas —kekchí, mopán y yucateco— se hablan en varias partes del país. El español se usa ampliamente como primer idioma en el norte y el oeste. El llamado "español de cocina", una amalgama de español e inglés, es común en Cayo Ambergris. El criollo beliceño, que tiene cierto grado de inteligibilidad mutua con el inglés estándar, también se habla ampliamente. La mayoría de los beliceños dominan el inglés y al menos uno de estos otros idiomas.
Muchos beliceños hablan una mezcla de criollo e inglés entre amigos, y el inglés estándar para los extranjeros. El fuerte acento caribeño puede tomar algún tiempo para acostumbrarse.
== Moverse ==
Belice es un país bastante pequeño y el transporte entre la mayoría de los destinos rara vez es largo o tedioso.
=== En avión ===
'''Tropic Air''' y '''Maya Island Air''' tienen varios vuelos diarios a varias ciudades del país y a Ambergris Caye y Caye Caulker. Vuelan desde los dos aeropuertos de la ciudad de Belice, pero los vuelos desde el aeropuerto de la ciudad de Belice ( '''TZA''' <sup><small> IATA</small></sup> ) suelen ser significativamente más baratos que los de Phillip Goldson International ( '''BZE''' <sup><small> IATA</small></sup> ). Los vuelos nacionales generalmente tienen precios bastante razonables y, por lo tanto, son populares si su tiempo es limitado y su presupuesto no lo es. Los vuelos se operan con aviones de 8 a 68 asientos. Debido a la capacidad limitada, se recomienda reservar con anticipación. Para reservas desde fuera de Belice, solo hay un '''agente de Internet airviva''', que puede hacer reservas, aceptar pagos (tarjetas de crédito / débito / PayPal) y luego enviar boletos electrónicos. Algunos hoteles también ofrecen realizar la reserva del vuelo en su nombre.
=== En autobús ===
Varias líneas de autobuses de la competencia operan en la carretera principal en dirección norte-sur desde Punta Gorda a Belmopán y la ciudad de Belice . Hay estaciones de autobuses en las principales ciudades, o simplemente párese al costado de la carretera y salude a un autobús que se aproxima. La mayoría de los autobuses tienen un conductor además del conductor, que se para junto a la puerta y vendrá a su asiento para cobrar el pasaje en algún momento durante el viaje. Las tarifas oscilan entre 2 y 25 dólares de Belice según la distancia recorrida.
Los autobuses expresos pueden ahorrar hasta una hora y media (dependiendo de la distancia de su viaje); no se detienen para los pasajeros que esperan al costado de la carretera, haciendo solo recogidas y devoluciones programadas en las ciudades.
La mayoría de los autobuses en Belice son autobuses escolares estadounidenses retirados (Bluebirds), a los que se les ha dado un ligero cambio de imagen, se les ha instalado un portaequipajes y, a veces, se les ha aplicado una nueva pintura. Por lo general, no están ''demasiado'' llenos, pero es posible que deba pararse de vez en cuando. Algunos son los autobuses MCI (Motorcoach Industries) más antiguos que alguna vez sirvieron como autobús Greyhound (o para alguna otra compañía de autobuses interurbanos o de cercanías) en los EE. UU. Los autobuses MCI se utilizan normalmente para algunos servicios Express o para viajes internacionales a Chetumal o autobuses fletados a Flores.
Los niños que venden bocadillos y refrescos a menudo suben a los autobuses en las paradas, y esta es una forma económica de tomar un bocadillo si ha agotado lo que ha traído o simplemente quiere probar algunos alimentos de viaje caseros.
Consulte el blog de autobuses de Belice para obtener actualizaciones, horarios y / o enlaces a otros sitios relacionados con los viajes en autobús en Belice. El sitio del blog de Belize Bus se actualiza constantemente. Desde la ruptura del monopolio de Novelo en 2006, el gobierno de Belice ha dividido el país con qué compañía ir desde la ciudad de Belice:
* '''La Zona Norte (Ciudad de Belice - Orange Walk - Corozal - Chetumal)''' No todos los autobuses continúan a Chetumal desde Orange Walk. Otros pueden desviarse al este o al oeste de la autopista Philip Goldson (autopista del norte) hacia otras ciudades circundantes. Ellos son: Albion's, Belize Bus Owners Cooperative (BBOC), Cabrera's, Chell's, Frazer, Joshua's, Morales, Tillett's, T-Line y Valencia. Los autobuses en dirección norte salen de la ciudad de Belice aproximadamente cada media hora de 05:30 a 19:30. Jex and Sons Bus ofrece servicio de autobús entre la ciudad de Belice y Crooked Tree.
* '''La Zona Oeste (Ciudad de Belice - Belmopán - San Ignacio - Benque Viejo Del Carmen)''' Son: BBOC, D y E, Servicio de Autobuses de Guerra, Middleton's, Servicio de Autobuses de Shaw y Westline. Los autobuses en dirección oeste salen de la ciudad de Belice entre las 05:00 y las 21:00. Algunos pueden continuar hacia el oeste desde San Ignacio hasta la frontera con Guatemala en Melchor del Mencos, pero ''no'' cruzan a Guatemala. Otros pueden continuar hacia el norte o el sur desde Belmopán, San Ignacio, etc. para llegar a otros pueblos que no están en la Carretera Occidental.
* '''Zona Sur (Ciudad de Belice - Belmopan - Dangriga - Placencia - Punta Gorda)''' Los autobuses hacia los distritos de Cayo y Stann Creek hacia el sur son: James Bus Line, G-Line Service, Ritchie's Bus Service y Usher Bus Line. Los buses autorizados para operar en las áreas rurales de la Zona Sur son la Línea de Buses Chen, Línea de Buses Yascal, Linea de Buses Smith, Linea de Buses Richie, Linea de Buses Martinez, Linea de Buses Williams, Linea de Buses Radiance Ritchie y Linea de Buses Polanco.
=== En taxi ===
Los taxis son comunes y relativamente baratos en Belice. La mayoría de los taxis no utilizan taxímetros, así que asegúrese de negociar el precio de antemano.
=== En taxi acuático ===
Para aquellos que quieran una experiencia verdaderamente beliceña, tomen los taxis acuáticos de ciudad en ciudad. El '''Expreso de San Pedro Belice''' tiene la mayor cantidad de recorridos diarios y sale de la Terminal de Azúcar Morena en la Ciudad de Belice a las 09:00, 11:00, 12:00, 13:00, 15:00, 16:00 y 17:30 a San Pedro y Caye Caulker.
Salida desde el muelle de San Pedro Town en Black Coral Street junto al Wahoo's Bar and Grill y sale a las 07:00, 08:30, 10:00, 11:30, 12:30, 14:30, 16:30 hacia Caye Caulker y Ciudad de Belice, así como un último barco a Caye Caulker solo a las 18:00.
Hay botes que parten de Caye Caulker a la ciudad de Belice y San Pedro Town y parten desde el muelle frente al Basket Ball Court. Caye Caulker a la ciudad de Belice: 07:30, 09:00, 10:30, 12:00, 13:00, 15:00, 17:00 y Caye Caulker a San Pedro: 07:00 (conexión a Chetumal), 09 : 45, 11:45, 12:45, 13:45, 15:45, 16:45 y último barco a las 18:15.
Chetumal Runs están disponibles desde Caye Caulker a las 07:00 y desde San Pedro a las 07:30.
Viajando de Chetumal a Belice, el bote sale del Muelle Municipal a las 15:30 en ruta a San Pedro (90 min) y Caye Caulker (120 min).
Tarifas: Ciudad de Belice a San Pedro o ida y vuelta: BZ $ 30 o US $ 15 (ida), BZ $ 55 o US $ 27,50 (ida y vuelta). Caye Caulker a San Pedro, Ciudad de Belice a Caye Caulker: BZ $ 20 o US $ 10 (solo ida), BZ $ 35 o US $ 17.50 (ida y vuelta).
=== En coche ===
En comparación con la mayoría de los países centroamericanos, conducir en Belice es relativamente seguro. No hay mucho tráfico y las cuatro carreteras principales están en buenas condiciones. Desafortunadamente, casi todas las carreteras que salen de las cuatro carreteras principales no están pavimentadas, por lo que se recomienda un vehículo con tracción en las cuatro ruedas. Es mejor no conducir tarde por la noche porque casi no hay iluminación, las señales de tráfico son malas y es casi seguro que el último tramo sea en una carretera sin pavimentar (¡corre el riesgo de romper un eje en un bache invisible pero inmenso!) No necesitará un mapa porque hay pocas carreteras y es difícil perderse.
Las tarifas de alquiler a menudo incluyen un seguro, por lo que generalmente no es necesario comprar un seguro por separado. Si planea usar un automóvil de alquiler para visitar Tikal en Guatemala, debe planificar con anticipación y debe alquilar en Crystal Auto Rental porque ninguna otra compañía le permitirá sacar su automóvil de Belice. El seguro de Belice no es válido en Guatemala, así que consulte con su tarjeta de crédito o compañía de seguro de automóvil para ver si lo cubrirán para un viaje a Guatemala.
==== Carreteras ====
* La '''Carretera del Norte''' (también conocida como '''Carretera Phillip Goldson''' ) va desde Corozal en la frontera entre Belice y México hasta la Ciudad de Belice a través de Orange Walk. Esta es la autopista que utilizará para el aeropuerto internacional, Altun Ha y Lamanai.
* '''Western Highway''' (también conocida como '''George Price Highway''' ) se extiende desde la ciudad de Belice, a través de Belmopán y el distrito de Cayo, hasta la frontera con el estado guatemalteco de Petén en Benque. En el camino se encuentran el Zoológico de Belice (milla 29), la Carretera Hummingbird (milla 47), Belmopán y San Ignacio (milla 68). Los principales lugares de interés de esta ruta incluyen los itinerarios de aventura en el distrito de Cayo, las ruinas mayas de Xunantunich y el acceso a la carretera a Caracol y, desde la frontera con Guatemala, las ruinas de Tikal. Para llegar a la Western Highway desde el aeropuerto, diríjase hacia el norte por la Northern Highway, gire a la izquierda en Burrell Boom y siga la carretera durante 19 km hasta la Western Highway en Hattieville.
* '''Hummingbird Highway''' va de Belmopan a Dangriga conectando la Western Highway con la Southern Highway. Utilizará esta carretera para llegar desde Cayo, Ciudad de Belice o desde el norte hasta la parte sur de Belice. Una autopista costera alternativa, un poco más corta, lo lleva desde la ciudad de Belice hasta la autopista sur, ¡pero es un desastre que es mejor evitar!
* '''La Carretera Austral''' va desde Dangriga (la Carretera Colibrí) hasta Punta Gorda, con un tramo que se dirige a la frontera sur con Guatemala. En el camino se encuentran los pueblos costeros de Hopkins y Placencia.
== Ver ==
[[Archivo:Cockscomb Basin Wildlife Sanctuary 16.JPG|miniaturadeimagen|Vista de la Reserva Natural de Cockcomb]]
Belice alberga un Patrimonio Mundial de la Humanidad por la UNESCO: El '''sistema de reservas de la Barrera de Arrecife de Belice''', que comprende el mayor arrecife de barrera del hemisferio norte y la segunda del mundo, atolones costeros, centenares de cayos arenosos, bosques de mangles, lagunas litorales y estuarios. Además alberga fauna marina en peligro como tortugas marinas, manatíes o el cocodrilo marino de América.
El 60% del territorio de Belice es selva virgen que alberga una enorme biodiversidad: Desde cocodrilos, a varias especies de monos, tapires, armadillos o jaguares, siendo uno de los mayores lugares del mundo con mayor densidad de estos felinos, así como más de 600 especies diferentes de aves, entre las que destaca el tucán pico arcoiris, uno de los emblemas del país. La Reserva natural de Cockscomb, de 400 kilómetros cuadrados, que alberga bosques tropicales y cursos fluviales, creó en 1990, el primer santuario de jaguares en libertad. La zona tiene la mayor densidad de jaguares del mundo y es el lugar de referencia mundial de investigación de estos felinos. El Santuario Crooked Tree es un área protegida característica por albergar una ingente cantidad avifauna. El área ocupa un total 6.600 hectáreas de diferentes ecosistemas: lagunas, arroyos, pantanos de madera de log, bosque de hoja ancha y sabana de pinos, y alberga a cientos de especies de fauna silvestre., entre ellas la tortuga de río de centroamérica, el mono aullador negro o la Amazona oratrix.El Parque Nacional Mayflower Bocawina es un bosque tropical lluvioso, con numerosas cascadas, entre las que destacan las cataratas de Bocawina, las cataratas de las Tres Hermanas y las cataratas de Antelope. El espacio protegido es destino para los amantes del turismo activo, ya que dispone de numerosas rutas de senderismo, de muy diferente duración y dificultad, además de poder hacer deportes aventura como barranquismo o tirolina.
[[Archivo:Belize Caye Caulker-222.jpg|miniaturadeimagen|Vista aérea del Cayo Caulker]]
Belice alberga un inmenso '''patrimonio arqueológico maya,''' con más de 900 ruinas, algunas de ellas son de las más antiguas de esta civilización. Entre las más destacables están:
* Caracol: Es la ciudad maya más grande del país, y se encuentra rodeada de profunda selva. Allí está el Caana, el "palacio del cielo", la estructura más alta de todo Belice.
* Lamanai: una de las ciudades mayas más antiguas, fundada alrededor del año 1600 a. C.; gran parte de las ruinas que se pueden ver hoy en día se construyeron a finales del periodo Preclásico (aproximadamente entre el año 400 a. C. y el 100 d. C.). A diferencia de muchas ciudades mayas, no fue abandonada en el siglo X d. C., ni en el periodo posterior a la conquista española o la ocupación británica, y siguió estando habitada por los mayas hasta el siglo XX.[[Archivo:Caracol-Temple.jpg|miniaturadeimagen|Templo de Caana, en Caracol]]
* Xunantunich: gran yacimiento situado en el oeste de Belice, a orillas del río Mopan, cerca de la frontera con Guatemala. El yacimiento es conocido por su gran cantidad de plazas y templos, y por una pirámide de 133 metros de altura (la segunda más alta de Belice).
* Altun Ha: fue un yacimiento ceremonial construido en la época preclásica, cuyas estructuras más antiguas datan aproximadamente del año 900 a. C. El Templo del Dios Sol, Kinich Ahau, reveló un gran alijo de esculturas y joyas de jade, incluido el objeto de jade más grande jamás recuperado de un yacimiento maya. Altun Ha se encuentra justo al norte de la ciudad de Belice.
== Hacer ==
=== Forro de cremallera ===
Vuele sobre la selva tropical de Belice con un recorrido en tirolina. Estos recorridos generalmente comienzan con una caminata corta hasta la primera base, donde se brinda un tutorial sobre cómo usar su equipo de manera segura.
* Los precios oscilan entre US $ 65 y US $ 100 y los recorridos están a cargo de dos compañías, Jaguar Paw y Back-A-Bush.
=== Pesca deportiva ===
La pesca deportiva en Belice es insuperable. El bonefish es el principal pez de pesca con mosca en el mundo y se puede encontrar en los bajíos de pasto a través de Belice. Es libra por libra quizás el animal más fuerte en agua salada.
=== Buceo y snorkel ===
El esnórquel y el buceo son de clase mundial y hay muchos sitios de buceo excepcionales en Belice. Una de las mejores formas de explorar las aguas de Belice es alquilando un yate para aprovechar al máximo el tiempo de buceo disponible.
Para aquellos con un presupuesto más reducido, se pueden encontrar excursiones de snorkel y conducción a lo largo de las playas de Cayo Ambergris y Cayo Caulker. Las excursiones más comunes lo llevarán a la reserva marina de Hol Chan y al Shark Ray Alley. Estos viajes suelen costar alrededor de US $ 35 e incluyen equipo de snorkel. Tenga en cuenta los BZ $ 10 adicionales que se cobran a los extranjeros como impuesto del parque. Este dinero se destina al mantenimiento y protección del arrecife. También se ofrecen excursiones de buceo al Blue Hole, pero espere pagar mucho más por el privilegio.
=== Exploración de cuevas ===
El distrito de Cayo se caracteriza por colinas de piedra caliza sustentadas por una red de ríos subterráneos, cuevas y sumideros. Las cuevas son magníficas, con enormes cavernas y pasajes estrechos, cascadas subterráneas y deslumbrantes conjuntos de estalactitas y estalagmitas con incrustaciones de minerales. Este mundo subterráneo era sagrado para los antiguos mayas y muchos artefactos, desde vasijas decoradas hasta restos humanos, todavía están intactos en las cuevas. Es peligroso (e ilegal) ingresar a las cuevas sin un guía autorizado. La mayoría de los guías están capacitados en geología y mitología de las cuevas y en técnicas modernas de primeros auxilios y rescate en cuevas.
* <bdi>'''Compañía de aventuras de Ian Anderson's Caves Branch y Jungle Lodge''' ,Rama Cuevas (Carretera Hummingbird al sur de Belmopán). Anderson organizó los programas iniciales de capacitación de guías en el país, de los cuales surgió el Equipo de Respuesta a Rescate y Desastres de Belice llamado localmente BDARRT (ahora una ONG independiente). editar</bdi>
Sleeping Giant y Caves Branch son operados por el mismo propietario. Hay hasta 16 recorridos diferentes que operan todos los días. Las cuevas Actun Tunichil Muknal o ATM tienen el mayor número de turistas que visitan un destino turístico en Centroamérica. También conocida como la Cueva del Sepulcro de Cristal, esta cueva fluvial tiene restos prístinos de algunos sacrificios humanos mayas. Es una experiencia surrealista completa con hermosas formaciones de cuevas, un río subterráneo y coleccionables mayas. No es de extrañar que los mayas lo llamaran Xibalba o el inframundo oscuro.
== Comprar ==
{{Tasa de cambio/infobox|BZD}}
La moneda de Belice es el dólar (código ISO '''BZD''' ), dividido en 100 centavos.
El dólar beliceño - a veces escrito como "BZ $" o simplemente como un signo de dólar: "$" - se ha fijado al dólar estadounidense (USD) en una proporción de 2: 1 desde 1978 (es decir, BZ $ 2 = US $ 1).
Debido a este tipo de cambio constante, los dólares estadounidenses son ampliamente aceptados, pero debe tener cuidado de aclarar de qué "dólares" está hablando al negociar los precios. A menudo es mejor asumir dólares de Belice porque muchos comerciantes se abalanzarán sobre su incertidumbre e intentarán duplicar su precio diciendo "No, en dólares estadounidenses". El cambio también se puede dar en dólares estadounidenses o en una combinación de billetes y monedas de dólares estadounidenses y beliceños. Los dólares de Belice vienen en denominaciones de BZ $ 2, 5, 10, 20, 50 y 100. B $ 1 y cantidades menores son monedas. La moneda de 25 centavos a menudo se llama "chelín".
* Los cajeros automáticos de tres bancos en Belice aceptan Mastercard: Belize Bank, Scotiabank y Atlantic Bank.
== Comer ==
* La comida principal que se encuentra prácticamente en todas partes son los frijoles rojos, el arroz limpio y el pollo.
* La mayor parte del pollo del país se prepara y se sirve con hueso.
* '''El arroz y los frijoles''' es un plato mixto con algunas especias y, por lo general, se agrega leche de coco para hacer un alimento dulce y picante de la dieta beliceña. '''Frijoles y arroz''' es '''arroz''' blanco cocido con una guarnición de frijoles pintos guisados.
* Las plantaciones de cítricos son numerosas, por lo que abundan '''las naranjas frescas y los pomelos''' . También se cultivan y venden piñas, papayas, bananas y plátanos en los mercados de las carreteras.
* Una salsa picante famosa en Belice es la de '''Marie Sharp''' hecha con el muy potente chile habanero local. Viene en una variedad de sabores (suave, picante, extremadamente picante).
* Esa salsa de aspecto extraño en tu mesa es realmente un ceviche. El ceviche -también deletreado como cebiche o seviche- es un platillo de mariscos marinado con cítricos. Los beliceños utilizan caracoles y verduras crudas y frescas.
* Las papusas son tortitas de maíz con diferentes aderezos que se venden en puestos en las calles del pueblo de San Pedro. Es la opción más económica si quieres comer con poco presupuesto.
Comer en San Pedro puede resultar caro si se come en los restaurantes turísticos; sin embargo, si encuentra los lugares locales, las comidas pueden ser muy económicas y muy sabrosas.
== Beber ==
Belikin es la cerveza nacional y viene en cuatro variedades: Premium, Beer, Stout y Lighthouse Lager. Guinness Stout también está disponible en Belice, pero también es elaborada por Belikin Brewing Co. Todas se venden en botellas retornables, así que asegúrese de conocer el depósito si lleva sus bebidas para llevar.
One Barrel Rum es el ron con sabor a melaza destilado localmente y la destilería Traveller's Liquors se encuentra en la Carretera Norte, a unas 6 millas de la ciudad de Belice, con una tienda de regalos y un bar de hospitalidad. Puede comprar ron en una variedad de colores y tamaños, hasta un barril de 70 galones.
Ambos están ampliamente disponibles en todo el país. Pero si también te gusta el vino, hay vino de anacardo (que es muy popular en Belice), vino de jengibre, vino de acedera y vino de mora.
== Aprende ==
Hay grandes oportunidades para bucear en los atolones de Belice. Echa un vistazo a reefci para ver algunas aventuras muy interesantes de 1 semana que son tanto educación informativa sobre conservación como excelente buceo. Si desea aprender sobre la historia de Belice, se recomienda visitar el Museo de Belice, la Casa de la Cultura y, por supuesto, viajar y descubrir.
En Belice, la escolarización es obligatoria y gratuita para las edades de 5 a 14 años. Solo los libros escolares y los uniformes los debe pagar usted mismo.
== Trabajo ==
Para los inmigrantes y aquellos que deseen trabajar, www.konsulate.de [http://www.konsulate.de/visum/visum_einreise_belize.php <nowiki>[2]</nowiki>] o www.belize24.de [http://www.belize24.de/deutsch/arbeitserlaubnis.htm <nowiki>[3]</nowiki>] son definitivamente interesantes.
== Vacaciones ==
* 1 de enero año nuevo
* 9 de marzo Día del Barón Bliss
* Semana Santa Marzo / Abril
* 1 de mayo día del trabajo
* 21 de mayo Día de la Commonwealth
* 10 de septiembre Día de Cayo St. Georges
* 21 de septiembre Día de la Independencia
* 2do lunes de octubre, Día de la Raza
* 19 de noviembre Día Garífuna
* 25./26. Diciembre navidad
== Seguridad ==
La seguridad en el país es mala, los delitos violentos como atracos, asaltos y asesinatos en el país son altos, por lo que debe tenerse mucha precaución al visitar el país.
La ciudad de Belice es la zona más peligrosa de Belice, aunque es muy fácil estar seguro allí. Debe permanecerse en la zona turística que corre justo al norte del puerto deportivo hasta la extensión sur al este del canal principal. Hay un montón de policías turísticos de color caqui vigilando la zona y, si tiene algún problema, no dude en acercarse a ellos. Debe evitarse a toda costa caminar solo y de noche por la ciudad, así como hacer ostentación de objetos de valor como relojes, joyas o cámaras. No aventurarse en sitios desconocidos ni explorar sin tener las certeza de a dónde se dirige. Manténgase cerca de áreas turísticas u otras zonas comerciales Es recomendable en todo momento desplazarse con guía. El lado sur de la ciudad de Belice es hermoso y peligroso, y hay una frecuente actividad pandillera que son las que realizan la parte más violenta de los delitos.
La zona fronteriza de Belice con Guatemala alberga una alta tasa de criminalidad.
Otras áreas de Belice son generalmente seguras, pero como en cualquier otro lugar del mundo, siempre se debe tener cierto escepticismo cuando se trata con extraños. La mayoría son realmente útiles, pero nunca está de más ser cauteloso.
Se desaconseja los trayectos en coche solo y por la noche.
Bajo la Sección 5 (1) de la Ley de Inmigración, el gobierno tiene derecho a negar la entrada a Belice a los viajeros LGBT . Tampoco existen protecciones legales para las víctimas de discriminación contra los homosexuales en Belice.
== Salud ==
Belice es un país relativamente sano. '''El agua embotellada''' es imprescindible en la mayoría de las áreas. Y, a menos que coma solo en restaurantes ultra-turísticos, la disentería probablemente se presente en algún momento; Esté preparado con medicamentos de venta libre y antibióticos recetados.
Los Centros para el Control de Enfermedades de EE. UU. Enumeran todo Belice, excepto la ciudad de Belice, como un área de riesgo de malaria , y recomiendan el medicamento antipalúdico cloroquina. La fiebre del dengue también es un riesgo en Belice. También se pueden recomendar otros medicamentos en determinadas circunstancias; consulte a un especialista profesional calificado.
Las picaduras de insectos / mosquitos deben evitarse con ropa adecuada, repelentes e insecticidas, y mosquiteros si duerme en habitaciones sin aire acondicionado o sin mosquiteros.
El sol , como en cualquier otro lugar del trópico, es muy intenso. Use una camisa de manga larga, un sombrero y gafas de sol, y aplíquese bloqueador solar de alto FPS con regularidad. Si pasa mucho tiempo en botes o en el agua, como pescando o haciendo esnórquel, tome precauciones adicionales: zapatos cubiertos (no sandalias), camisa de natación / protector contra erupciones, polainas para el cuello y guantes para el sol.
Muchos lugares en Belice son muy calurosos y húmedos, y la deshidratación es un riesgo. Un expatriado sugiere beber tanta agua como quieras y luego volver a beber esa cantidad.
La tasa de '''prevalencia del VIH / SIDA en''' adultos es de ''2.5%'' o ''uno de cada cuarenta'' adultos, esto es notablemente más alto que en la mayor parte de Europa o Angloamérica y también bastante más alto que en otras partes de Centroamérica como Nicaragua o Costa Rica.
== Respeto ==
Los beliceños son algunas de las personas más relajadas socialmente del mundo, especialmente si se aventura tierra adentro lejos de las islas turísticas de Ambergris Caye y Caye Caulker. El ritmo de vida es generalmente más lento en Belice, por lo que es una buena práctica comenzar cualquier interacción social, incluso para hacer una pregunta rápida, con contacto visual y un saludo genuinamente agradable. La mayoría de los habitantes de las zonas rurales de Belice disfrutan de una conversación informal y es fácil que te encuentres charlando durante unas horas. ¡Oye, es parte del encanto!
Las comunidades mayas pueden ser un poco más reservadas a veces. Como siempre, un poco de respeto y cortesía te ayudarán.
== Conectar ==
Los teléfonos públicos son los teléfonos públicos más comunes y aceptan tarjetas telefónicas compradas previamente.
Los cibercafés se pueden encontrar en las zonas turísticas más grandes, pero son poco frecuentes en las zonas rurales.
El gobierno solía prohibir el uso de Skype y obligaba a los turistas a llamar fuera del país utilizando la compañía telefónica propiedad del gobierno. La principal compañía telefónica, Belize Telemedia Limited, ha eliminado los bloqueos de todos los servicios de protocolo de voz por Internet. Las aplicaciones como Skype y Vonage ahora pueden funcionar dentro del país y pueden resultar un medio de comunicación más barato cuando se llama a casa.{{estado artículo|tipo=país |calidad=esquemático }}
{{geo|17.2|-88.7|zoom=8}}
{{EstáEn|Centroamérica y el Caribe}}
[[Categoría:Belice| ]]
nd8ntmgfdgf0esl6skjzakkop8jl84q
MediaWiki:Gadgets-definition
8
1435
255262
251773
2026-07-04T23:15:15Z
Bromoxido
21781
Preparando implementación de gadgets.
255262
wikitext
text/x-wiki
== navegacion ==
* CorrectorOrtografico [ResourceLoader|dependencies=mediawiki.util] | CorrectorOrtografico.js
* DetectaDesambiguaciones [ResourceLoader|dependencies=mediawiki.util] | DetectaDesambiguaciones.js
* a-commons-directo [ResourceLoader | dependencies=mediawiki.util | default] | a-commons-directo.js
* reversion [ResourceLoader | dependencies=mediawiki.util | rights=autoconfirmed] | reversion.js
* contrib-numeradas | contrib-numeradas.css
* rightsfilter [ResourceLoader|dependencies=mediawiki.util] | rightsfilter.js
* RTRC [ResourceLoader] | RTRC.js
* DeleteBot [ResourceLoader | rights=delete] | DeleteBot.js
* TripPlanner[ResourceLoader|type=general|default|rights=viewmywatchlist|dependencies=mediawiki.util|skins=vector-2022,vector,timeless,modern,cologneblue,monobook,minerva|maintainers=User:Andree.sk]|TripPlanner.js
* TravelTracker[ResourceLoader|default|rights=viewmywatchlist|dependencies=mediawiki.api,mediawiki.util|maintainers=User:SHB2000]|TravelTracker.js
== edicion==
* serena [ResourceLoader] | serena.js
<!-- * ListingEditor[ResourceLoader|skins=vector,vector-2022,monobook,timeless,modern,cologneblue|default|dependencies=mediawiki.util,jquery.ui|type=general]|ListingEditor.js|ListingEditor.css -->
* HotCat [ResourceLoader] | HotCat.js
* botonera [ResourceLoader] | botonera.js
* mensajes-predefinidos [ResourceLoader|dependencies=mediawiki.util] | mensajes-predefinidos.js
* editHysteria [ResourceLoader | rights=autoconfirmed] | editHysteria.js
* edittop [ResourceLoader] | edittop.js
* patrollinks [ResourceLoader|dependencies=mediawiki.util | rights=patrol] | patrollinks.js
== apariencia ==
* Carousel[ResourceLoader|default|type=general|dependencies=mediawiki.util]|Carousel.js|Carousel.css
* CaracteresOff | CaracteresOff.css
* deluxe-history [ResourceLoader] | Objects.js | DeluxeHistory.js | DeluxeHistory.css
* boton-purgar [ResourceLoader | dependencies=mediawiki.util] | boton-purgar.js
* corchete-refs | corchete-refs.css
* UTCLiveClock [ResourceLoader] | UTCLiveClock.js
* popups[ResourceLoader]|popups.js|popups.css
* wikilimpia | wikilimpia.css
* quickeditcounter [ResourceLoader|dependencies=mediawiki.util] |quickeditcounter.js
* typographyrefreshoverride [ResourceLoader]|typographyrefreshoverride.css
* coloresdiscu [ResourceLoader] | coloresdiscu.js | coloresdiscu.css
== admin-gadgets ==
* AjaxSysop[ResourceLoader|rights=delete] | AjaxSysop.js
== hidden gadgets ==
* ListingEditorStyles[ResourceLoader|type=general|default|hidden]|ListingEditor.css
* ListingEditor-Config[ResourceLoader|default|hidden]|ListingEditor-Config.js
* ListingEditor[ResourceLoader|dependencies=mediawiki.util, mediawiki.api, jquery.ui, jquery.chosen|type=general|default|hidden]|ListingEditor.js
* ListingInfo[ResourceLoader|dependencies=ext.kartographer.box, ext.kartographer.dialog|default|hidden]|ListingInfo.css|ListingInfo.js
* MapTools[ResourceLoader|dependencies=ext.kartographer.box, ext.kartographer.dialog|default|hidden]|MapTools.css|MapTools.js
* MarkerTooltip[ResourceLoader|default|hidden]|MarkerTooltip.css|MarkerTooltip.js
* MarkerUtilities[ResourceLoader|default|hidden]|MarkerUtilities.js
4ikno640574anix2ywzp1amagyjdr57
Plantilla:Ediciones
10
6579
255254
255231
2026-07-04T12:01:01Z
Jembot
2355
Bot: Actualizando datos
255254
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#switch:{{ucfirst:{{{1|{{{User|{{{user}}}}}}}}}}}
|Jembot=26848
|Galahad=9224
|Renamed user 0f302287bb0255da1e6eba23d871d103=9156
|KLBot2=8323
|ZrbtWm=4725
|Urci dream=4292
|Zerojosefer=4146
|Aavargasp=4020
|Baji=3769
|Igallards7=3502
|Alan=3477
|Joancastro21=3441
|B1mbo=3110
|Mpeinadopa=3041
|RolandUnger=2934
|Kizar=2933
|MediaWiki message delivery=2806
|Elreysintrono=2763
|MABot=2473
|Aguzado=2446
|Meruleh=2338
|HrAd=2254
|Bromoxido=2210
|Jorge Abellán=2210
|Razr Nation=1687
|Green Mostaza=1461
|Green Mostaza Bot=1288
|Superzerocool=1252
|ElGuruCesar=1060
|Althair=1048
|Eclipsis Proteo=1042
|Patricio.lorente=997
|HJGN2=956
|Naturista2018=942
|Ksn.kenny=931
|Lomeno 24=920
|HrAd-ATO=906
|Jormtz=834
|Jsmura=786
|CarsracBot=736
|Kirito=731
|Olea=716
|B1m-bot=713
|Sumone's bot=710
|Viajero del cantábrico=675
|SteveRBot=653
|Alakrano=620
|Grillitus=606
|Banfield=595
|TheDarkFear=576
|FocaBot=562
|Veronidae=543
|CommonsDelinker=534
|Texugo=486
|Marrovi=467
|DerFussi=467
|Racso=460
|Jdiez (LaOfi)=453
|Bradford=435
|Vanbasten 23=424
|Amílcar=405
|Olea (LaOfi)=393
|Travelour=365
|Onwa=338
|Camerano Viejo=337
|AnniAriel=327
|Igna=327
|Viajaste=324
|Gmagno=323
|Lord Ravager=321
|ProtoplasmaKid=320
|Mauvika=310
|Castorice=309
|19Tarrestnom65=303
|Willicab=301
|Orniosviajero=301
|Lingsha=296
|Luxbane=286
|Rheedia=279
|Felino Volador=277
|Mualani=270
|Savh=261
|Julián L. Páez=258
|Angellbosque88=245
|LlamaAl=239
|Turbo8000=235
|Antoniograjal=235
|MarcoAurelio=222
|Babel AutoCreate=208
|ElGatoSaez=198
|PetrohsW=197
|SelfieCity=191
|Iho jose=190
|Community Tech bot=189
|Steinsplitter=185
|Jualve=184
|DARIO SEVERI=178
|Kiwumi=178
|Ezarate=171
|Alexis Jazz=170
|WOSlinker=166
|Hmaglione10=161
|Millars=158
|Trescilindros=157
|Simon Peter Hughes=149
|Marinna=149
|Villalaso=147
|Hasley=143
|Linehalt=143
|SrCerberus=141
|Angela Ciccimarra25=141
|Penarc=140
|JOAN=140
|Municipalidad de Trujillo=139
|DutchTina=131
|RoBeRtArAmIrEz=130
|Renamed user f26394dcb19bd7bdad78f0d752896653=127
|Adolfobrigido=125
|Crochet.david.bot=125
|Hodolog=123
|Pathoschild=122
|Isaac agredano=120
|Sonoko Konishi=120
|Juanantonaya=118
|Agustin Bartolome=112
|Rodriweb=111
|Esturismo=109
|Laberinto16=109
|Alberto.turismo2023=109
|B25es=108
|SHB2000=108
|Vinicius10=104
|AlvaroMolina=99
|Zafkiel GD=95
|The Sophocrat=93
|Stïnger=93
|Loco085=91
|Polsaker=89
|CityForEveryone=88
|BOToronja=88
|ThunderingTyphoons!=86
|Je7roi=86
|Zolsemiya=86
|William y Chesterfield=85
|Carlos Abisai=85
|Eihel=84
|Venex=83
|IanTrobsky=83
|Isaacvp=82
|Jmcp17=82
|Rodelar=81
|Bangladesh=80
|Addicted04=79
|Mazbel=77
|Barcex=77
|Luzcaru=76
|Pedelecs=74
|Kassanmoor=74
|Morgalexandra=72
|Matiia=72
|RileyBot=71
|Joseenriquetk=71
|Chocolate con galleta=70
|Bojraif=69
|Samaniego123=67
|Schumi4ever=67
|Lamder=67
|Carloshistory=65
|Salvador alc=62
|Tourister21=62
|Hassanito69=61
|Soljaguar=61
|Strakhov=61
|Jluismendoza=61
|Hobbitschuster=60
|Villa de Zújar=60
|Adroidthene=59
|Hugener=59
|Carlosmatalive=58
|Pecohuh=58
|Decla971=58
|Invadibot=57
|DavidSedeno=56
|GuDeMi=56
|Luchy04=56
|JuanToño=55
|Chongkian=55
|Simon antonio 2009=55
|Taichi=54
|Translation Notification Bot=53
|Raimundo Pastor=53
|AvicBot=53
|Dojite=52
|MI GENERAL ZAPATA=52
|Heimo66=51
|Minorax=51
|Sanurca=51
|~2025-38357-25=51
|DMzlC=50
|HabibiAyllón=49
|Miacara76=49
|Carlosahuatzin=49
|JulieLespinasse=48
|Ji-Elle=47
|Sanjorgepinho=46
|HeraldFrancisco NI=46
|Arcibel=46
|Lizluz89=46
|Paula García=45
|Romaine=45
|RafaelVinueza=45
|Hprmedina=44
|Mey2008=44
|Tipiskayla=44
|Alrejo00=44
|Aqurs1=44
|Angel Casta Turismo2023=44
|Marmadri=43
|Trymir=43
|Varlaam=43
|EmausBot=42
|Laura Fiorucci=42
|Chapeau.judicael=42
|Alzinous=41
|Koavf=41
|MF-Warburg=41
|AntoFran=40
|Geógrafo23=40
|Katdrei=40
|Ralf Roletschek=40
|Maor X=40
|Edjoerv=40
|Herreral81=39
|Kolega2357-Bot=39
|LaberintoBOT=38
|Anonyme Wikipe-tan=38
|Pimpollo=38
|Sterlabot=38
|ViatorDigitalis=37
|Remux=37
|Petefarrand=37
|Kolega2357=37
|Darrelljon=36
|RBT2232=36
|Meltryth=35
|FSDmar=35
|Renamed user 23o2iqy4ewqoiudh=34
|Ziv=34
|Cgbraschi=34
|Balou46=34
|RomainGP=33
|Jellysandwich0=33
|Rteranb=33
|Mfrancoavellaneda=33
|Judiosefardi=33
|Credcre=33
|Alhen=33
|Cmasi=33
|Guiller96=32
|Teseo=32
|Giselle Bordoy (WMAR)=32
|Wikiwikiman28=32
|Cynthia.turismo2023=32
|Santiagocienfuegosm=32
|Charai.06=32
|5R-MFT=32
|(SVPG)=31
|Clock&horlogue=31
|Pietro=31
|Nicanlanu=31
|Billinghurst=31
|Wakapalabra=31
|Wilfredor=31
|Kulmalukko=30
|Eddy566=30
|Camilapulka=30
|Feliperma18=30
|Roarboleda=30
|Martin.rr=30
|EdwardsBot=30
|Robertbt666=29
|EmBOTellado=29
|Cacen Gymraeg=29
|Maejr=29
|Mmorell=29
|Tefita228=29
|NHhotels=28
|Viajero673=28
|Jourdant=28
|Chamarasca=28
|Link58=28
|-ecarv-=28
|Joseluis2352=28
|Fernando10000=28
|Adrián Cerón=28
|Josefito123=28
|Rotideypoc41352=28
|Intelelihu=28
|Sombra Inquieta=28
|Bienvenidos Wikipedistas=27
|Antonio GarMi=27
|Mikas56=27
|WhiskypediaXDDD=27
|Ferney antonio bolivar ramirez=27
|Rizos.13=27
|Alan ffm=27
|Anibal Maysonet=27
|Guiller=26
|~2025-35644-08=26
|SoleFabrizio=26
|Jofrigerio=25
|Rsanabriia=25
|Javalema=25
|~riley=25
|Tantoparanada=25
|Vicocruz10=25
|Aaharoni-WMF=25
|Calciopedia=25
|Correogsk=25
|Script de cambio de nombres de usuario=25
|Axmf=25
|Campagna 2007=25
|Alpinu=24
|Sahaquiel9102=24
|Yandrak=24
|Krinkle=24
|Peterfitzgerald=24
|Rodpractice=24
|JesusLuc11=23
|LuigiStudio=23
|Karl776=23
|Kzamudio1020=23
|Tradel=23
|Seepferd=23
|Madamebiblio=23
|MONUMENTALMELILLA=23
|CarlosEduardoPA=23
|AlbertonGil=23
|MJSB73MP=23
|Mayra García=23
|Intijacinto=23
|ReyDerayos24=22
|Anaisagj=22
|Didival44=22
|Dorieo=22
|EdwinJs=22
|ויקיג'אנקי=22
|Discasto=22
|Sergio Andres Segovia=22
|Abelmas=22
|Aniverso=21
|Linealle=21
|Emijrp=21
|CUNInsider=21
|AnónimoMCG=21
|Oscar .=21
|Foximus04=21
|Quinlan83=21
|Ltronador=21
|~2025-36394-17=21
|Holaquetalcomoteva=21
|Luismiguel.vell=21
|ColaborarConBuenaFe=21
|Someonehere12345=21
|Use223332237282=21
|Peripheria=21
|AntonelaTroncoso=21
|Jinotega93=20
|Karturo332=20
|HakanIST=20
|MathXplore=20
|Penquista=20
|Andyrom75=20
|Gray16=20
|Xarucoponce=20
|Jara-Arroyo=20
|Attvaritoo Moninitaa DESBANEAME AHORRRAA EN IRC wikipedia-es OBEDECE=19
|Mylovedsystem=19
|-jem-=19
|Anjo-sozinho=19
|Handrian=19
|Pedrito63=19
|Rafael Calvo Alvarez=19
|Carsrac=19
|Xiva91=19
|Cuenqui=19
|Txolo=19
|Yurek48=19
|Kasok=19
|Toniamartinez=19
|Feliperma15=19
|Carliitaeliza=19
|PaolaSelena=18
|Morza=18
|~2026-11792-0=18
|Kwamikagami=18
|Martin Urbanec=18
|Aldo Fabian=18
|JorgeGamarraM=18
|Hari Seldon=18
|DSan=18
|隼鷹=18
|Montxohache=18
|Johonana 21=18
|Laurilsilva32=18
|Rkl=18
|AIvaroMolina=18
|Litlok=17
|~2026-30258-90=17
|Cohenxx=17
|Agomga14=17
|Syum90=17
|R1107=17
|Skipi=17
|Duar srs=17
|NoonIcarus=17
|Plantillero=17
|Tierrasvivas=17
|Hinestrosavive137=17
|Irn=17
|Majalindo=17
|Patrickpedia=17
|Lmoras7=17
|Ladsgroup=17
|Osgaca=17
|Jake Park=17
|Makea=17
|Austral blizzard=17
|Ulughmuztagh=17
|Ana Matilde Upolo Ebuka=17
|AHT2018=17
|Tegel=16
|Rubores=16
|3BRBS=16
|Vogone=16
|Monchitooo=16
|Loreestef23=16
|Jonhvalecilloss=16
|Mamagrrr=16
|Ykartz44=16
|Rschen7754=16
|Jcdemarca=16
|Æ. L. V. Æ. R. Œ. * M. Œ. L. I. N. Æ=16
|Ferjelo=16
|Phoebe=16
|Fry1989=16
|Bestoernesto=16
|Isaguinju=16
|No invadamos Surco=16
|Casandrii=16
|A01274192 Marlen=16
|Zekialves=16
|MiguelAlanCS=16
|Ivanhercaz=16
|Air fans=16
|SernaturLosRios=16
|Jorge Blanco dragon=16
|Juliandiazmr=16
|NDG=16
|Ceancata=15
|JonaCalhoun=15
|~2025-41754-89=15
|Juan Emilio Prades Bel=15
|NataSciuto=15
|Ginés90=15
|Juancar22=15
|Dpcossio=15
|Yealmon=15
|ElPabloRN=15
|Macacc=15
|Glaisher=15
|MiPueblo2018=15
|User93823728642=15
|A01274526 Diana=15
|Sagoo.19=15
|Renamed user 5dbfb4c0f8f1d8a129f7e872fb518963=15
|Galopix=15
|Warko=15
|Agomea=15
|Tai93=15
|Sereniis=15
|Mrkstvns=15
|Isabel A01706197=15
|Reinapepiada23=15
|Ayanami San=15
|AKardej=15
|Adr-geo=15
|Lojwe=15
|KrzysztofPoplawski=14
|Lacasadeljotta=14
|HelloKitty2010=14
|Cyrax=14
|Adriana513=14
|AIIIllttvaaardooo Moooommlliiinaaa DESBANEAME EN IRC wikipedia-es O TE MATO=14
|Kisoito=14
|Michael junior obregon pozo=14
|FLYTOCUBA=14
|Antonio132002=14
|Lelacd'arth=14
|Hispano77=14
|#default=Usuario desconocido
}}<noinclude>{{documentación}}</noinclude>
pa7i3lme77b1j0tjh5quek6rfth5yom
Plantilla:Ranking de ediciones
10
6580
255255
255232
2026-07-04T12:01:02Z
Jembot
2355
Bot: Actualizando ranking
255255
wikitext
text/x-wiki
{| class="wikitable sortable" style="font-size: 90%;text-align: center;float: right;"
! #
! Usuario
! Ediciones
|-
| 1 || [[User:Galahad|<span style="color:gray">Galahad</span>]] || [[Special:Contributions/Galahad|{{formatnum:9224}}]]
|-
| 2 || [[User:Renamed user 0f302287bb0255da1e6eba23d871d103|<span style="color:gray">Renamed user 0f302287bb0255da1e6eba23d871d103</span>]] || [[Special:Contributions/Renamed user 0f302287bb0255da1e6eba23d871d103|{{formatnum:9156}}]]
|-
| 3 || [[User:KLBot2|<span style="color:gray">KLBot2</span>]] || [[Special:Contributions/KLBot2|{{formatnum:8323}}]]
|-
| 4 || [[User:ZrbtWm|<span style="color:gray">ZrbtWm</span>]] || [[Special:Contributions/ZrbtWm|{{formatnum:4725}}]]
|-
| 5 || [[User:Urci dream|Urci dream]] || [[Special:Contributions/Urci dream|{{formatnum:4292}}]]
|-
| 6 || [[User:Zerojosefer|<span style="color:gray">Zerojosefer</span>]] || [[Special:Contributions/Zerojosefer|{{formatnum:4146}}]]
|-
| 7 || [[User:Aavargasp|<span style="color:gray">Aavargasp</span>]] || [[Special:Contributions/Aavargasp|{{formatnum:4020}}]]
|-
| 8 || [[User:Baji|<span style="color:gray">Baji</span>]] || [[Special:Contributions/Baji|{{formatnum:3769}}]]
|-
| 9 || [[User:Igallards7|Igallards7]] || [[Special:Contributions/Igallards7|{{formatnum:3502}}]]
|-
| 10 || [[User:Alan|<span style="color:gray">Alan</span>]] || [[Special:Contributions/Alan|{{formatnum:3477}}]]
|-
| colspan="3" | Véase también [[Wikiviajes:Ranking de ediciones]]<br/><small>Actualizado por [[Usuario:Jembot|Jembot]] ([[Usuario discusión:Jembot|disc.]]), 4 de julio de 2026, 11:59 (UTC)</small>
|}<noinclude>{{documentación}}</noinclude>
gqj725f4cwm0ax96icym9h8tagstps2
Wikiviajes:Ranking de ediciones
4
6581
255256
255220
2026-07-04T12:01:03Z
Jembot
2355
Bot: Actualizando ranking
255256
wikitext
text/x-wiki
{{/begin|50}}
|-
| 1 || [[User:Galahad|<span style="color:gray">Galahad</span>]] || [[Special:Contributions/Galahad|{{formatnum:9224}}]]
|-
| 2 || [[User:Renamed user 0f302287bb0255da1e6eba23d871d103|<span style="color:gray">Renamed user 0f302287bb0255da1e6eba23d871d103</span>]] || [[Special:Contributions/Renamed user 0f302287bb0255da1e6eba23d871d103|{{formatnum:9156}}]]
|-
| 3 || [[User:KLBot2|<span style="color:gray">KLBot2</span>]] || [[Special:Contributions/KLBot2|{{formatnum:8323}}]]
|-
| 4 || [[User:ZrbtWm|<span style="color:gray">ZrbtWm</span>]] || [[Special:Contributions/ZrbtWm|{{formatnum:4725}}]]
|-
| 5 || [[User:Urci dream|Urci dream]] || [[Special:Contributions/Urci dream|{{formatnum:4292}}]]
|-
| 6 || [[User:Zerojosefer|<span style="color:gray">Zerojosefer</span>]] || [[Special:Contributions/Zerojosefer|{{formatnum:4146}}]]
|-
| 7 || [[User:Aavargasp|<span style="color:gray">Aavargasp</span>]] || [[Special:Contributions/Aavargasp|{{formatnum:4020}}]]
|-
| 8 || [[User:Baji|<span style="color:gray">Baji</span>]] || [[Special:Contributions/Baji|{{formatnum:3769}}]]
|-
| 9 || [[User:Igallards7|Igallards7]] || [[Special:Contributions/Igallards7|{{formatnum:3502}}]]
|-
| 10 || [[User:Alan|<span style="color:gray">Alan</span>]] || [[Special:Contributions/Alan|{{formatnum:3477}}]]
|-
| 11 || [[User:Joancastro21|<span style="color:gray">Joancastro21</span>]] || [[Special:Contributions/Joancastro21|{{formatnum:3441}}]]
|-
| 12 || [[User:B1mbo|<span style="color:gray">B1mbo</span>]] || [[Special:Contributions/B1mbo|{{formatnum:3110}}]]
|-
| 13 || [[User:Mpeinadopa|<span style="color:gray">Mpeinadopa</span>]] || [[Special:Contributions/Mpeinadopa|{{formatnum:3041}}]]
|-
| 14 || [[User:RolandUnger|RolandUnger]] || [[Special:Contributions/RolandUnger|{{formatnum:2934}}]]
|-
| 15 || [[User:Kizar|<span style="color:gray">Kizar</span>]] || [[Special:Contributions/Kizar|{{formatnum:2933}}]]
|-
| 16 || [[User:Elreysintrono|<span style="color:gray">Elreysintrono</span>]] || [[Special:Contributions/Elreysintrono|{{formatnum:2763}}]]
|-
| 17 || [[User:Aguzado|<span style="color:gray">Aguzado</span>]] || [[Special:Contributions/Aguzado|{{formatnum:2446}}]]
|-
| 18 || [[User:Meruleh|<span style="color:gray">Meruleh</span>]] || [[Special:Contributions/Meruleh|{{formatnum:2338}}]]
|-
| 19 || [[User:HrAd|<span style="color:gray">HrAd</span>]] || [[Special:Contributions/HrAd|{{formatnum:2254}}]]
|-
| 20 || [[User:Bromoxido|<span style="color:gray">Bromoxido</span>]] (Admin) || [[Special:Contributions/Bromoxido|{{formatnum:2210}}]]
|-
| 21 || [[User:Jorge Abellán|<span style="color:gray">Jorge Abellán</span>]] || [[Special:Contributions/Jorge Abellán|{{formatnum:2210}}]]
|-
| 22 || [[User:Razr Nation|<span style="color:gray">Razr Nation</span>]] || [[Special:Contributions/Razr Nation|{{formatnum:1687}}]]
|-
| 23 || [[User:Green Mostaza|<span style="color:gray">Green Mostaza</span>]] || [[Special:Contributions/Green Mostaza|{{formatnum:1461}}]]
|-
| 24 || [[User:Green Mostaza Bot|<span style="color:gray">Green Mostaza Bot</span>]] || [[Special:Contributions/Green Mostaza Bot|{{formatnum:1288}}]]
|-
| 25 || [[User:Superzerocool|<span style="color:gray">Superzerocool</span>]] || [[Special:Contributions/Superzerocool|{{formatnum:1252}}]]
|-
| 26 || [[User:ElGuruCesar|ElGuruCesar]] || [[Special:Contributions/ElGuruCesar|{{formatnum:1060}}]]
|-
| 27 || [[User:Althair|<span style="color:gray">Althair</span>]] || [[Special:Contributions/Althair|{{formatnum:1048}}]]
|-
| 28 || [[User:Eclipsis Proteo|<span style="color:gray">Eclipsis Proteo</span>]] || [[Special:Contributions/Eclipsis Proteo|{{formatnum:1042}}]]
|-
| 29 || [[User:Patricio.lorente|<span style="color:gray">Patricio.lorente</span>]] || [[Special:Contributions/Patricio.lorente|{{formatnum:997}}]]
|-
| 30 || [[User:HJGN2|<span style="color:gray">HJGN2</span>]] || [[Special:Contributions/HJGN2|{{formatnum:956}}]]
|-
| 31 || [[User:Naturista2018|<span style="color:gray">Naturista2018</span>]] || [[Special:Contributions/Naturista2018|{{formatnum:942}}]]
|-
| 32 || [[User:Ksn.kenny|<span style="color:gray">Ksn.kenny</span>]] || [[Special:Contributions/Ksn.kenny|{{formatnum:931}}]]
|-
| 33 || [[User:Lomeno 24|<span style="color:gray">Lomeno 24</span>]] || [[Special:Contributions/Lomeno 24|{{formatnum:920}}]]
|-
| 34 || [[User:HrAd-ATO|<span style="color:gray">HrAd-ATO</span>]] || [[Special:Contributions/HrAd-ATO|{{formatnum:906}}]]
|-
| 35 || [[User:Jormtz|<span style="color:gray">Jormtz</span>]] || [[Special:Contributions/Jormtz|{{formatnum:834}}]]
|-
| 36 || [[User:Jsmura|<span style="color:gray">Jsmura</span>]] || [[Special:Contributions/Jsmura|{{formatnum:786}}]]
|-
| 37 || [[User:CarsracBot|<span style="color:gray">CarsracBot</span>]] || [[Special:Contributions/CarsracBot|{{formatnum:736}}]]
|-
| 38 || [[User:Kirito|<span style="color:gray">Kirito</span>]] || [[Special:Contributions/Kirito|{{formatnum:731}}]]
|-
| 39 || [[User:Olea|<span style="color:gray">Olea</span>]] || [[Special:Contributions/Olea|{{formatnum:716}}]]
|-
| 40 || [[User:B1m-bot|<span style="color:gray">B1m-bot</span>]] || [[Special:Contributions/B1m-bot|{{formatnum:713}}]]
|-
| 41 || [[User:Sumone's bot|<span style="color:gray">Sumone's bot</span>]] || [[Special:Contributions/Sumone's bot|{{formatnum:710}}]]
|-
| 42 || [[User:Viajero del cantábrico|<span style="color:gray">Viajero del cantábrico</span>]] || [[Special:Contributions/Viajero del cantábrico|{{formatnum:675}}]]
|-
| 43 || [[User:SteveRBot|<span style="color:gray">SteveRBot</span>]] || [[Special:Contributions/SteveRBot|{{formatnum:653}}]]
|-
| 44 || [[User:Alakrano|<span style="color:gray">Alakrano</span>]] || [[Special:Contributions/Alakrano|{{formatnum:620}}]]
|-
| 45 || [[User:Grillitus|<span style="color:gray">Grillitus</span>]] || [[Special:Contributions/Grillitus|{{formatnum:606}}]]
|-
| 46 || [[User:Banfield|<span style="color:gray">Banfield</span>]] || [[Special:Contributions/Banfield|{{formatnum:595}}]]
|-
| 47 || [[User:TheDarkFear|<span style="color:gray">TheDarkFear</span>]] || [[Special:Contributions/TheDarkFear|{{formatnum:576}}]]
|-
| 48 || [[User:FocaBot|<span style="color:gray">FocaBot</span>]] || [[Special:Contributions/FocaBot|{{formatnum:562}}]]
|-
| 49 || [[User:Veronidae|<span style="color:gray">Veronidae</span>]] || [[Special:Contributions/Veronidae|{{formatnum:543}}]]
|-
| 50 || [[User:Texugo|<span style="color:gray">Texugo</span>]] || [[Special:Contributions/Texugo|{{formatnum:486}}]]
{{/end}}
1vj95vxc93r07qjp4xa9c15vj6eht6r
Wikiviajes:Ranking de ediciones (incluye bots)
4
6582
255257
255233
2026-07-04T12:01:04Z
Jembot
2355
Bot: Actualizando ranking
255257
wikitext
text/x-wiki
{{/begin|50}}
|-
| 1 || [[User:Jembot|Jembot]] (Bot) || [[Special:Contributions/Jembot|{{formatnum:26848}}]]
|-
| 2 || [[User:Galahad|<span style="color:gray">Galahad</span>]] || [[Special:Contributions/Galahad|{{formatnum:9224}}]]
|-
| 3 || [[User:Renamed user 0f302287bb0255da1e6eba23d871d103|<span style="color:gray">Renamed user 0f302287bb0255da1e6eba23d871d103</span>]] || [[Special:Contributions/Renamed user 0f302287bb0255da1e6eba23d871d103|{{formatnum:9156}}]]
|-
| 4 || [[User:KLBot2|<span style="color:gray">KLBot2</span>]] || [[Special:Contributions/KLBot2|{{formatnum:8323}}]]
|-
| 5 || [[User:ZrbtWm|<span style="color:gray">ZrbtWm</span>]] || [[Special:Contributions/ZrbtWm|{{formatnum:4725}}]]
|-
| 6 || [[User:Urci dream|Urci dream]] || [[Special:Contributions/Urci dream|{{formatnum:4292}}]]
|-
| 7 || [[User:Zerojosefer|<span style="color:gray">Zerojosefer</span>]] || [[Special:Contributions/Zerojosefer|{{formatnum:4146}}]]
|-
| 8 || [[User:Aavargasp|<span style="color:gray">Aavargasp</span>]] || [[Special:Contributions/Aavargasp|{{formatnum:4020}}]]
|-
| 9 || [[User:Baji|<span style="color:gray">Baji</span>]] || [[Special:Contributions/Baji|{{formatnum:3769}}]]
|-
| 10 || [[User:Igallards7|Igallards7]] || [[Special:Contributions/Igallards7|{{formatnum:3502}}]]
|-
| 11 || [[User:Alan|<span style="color:gray">Alan</span>]] || [[Special:Contributions/Alan|{{formatnum:3477}}]]
|-
| 12 || [[User:Joancastro21|<span style="color:gray">Joancastro21</span>]] || [[Special:Contributions/Joancastro21|{{formatnum:3441}}]]
|-
| 13 || [[User:B1mbo|<span style="color:gray">B1mbo</span>]] || [[Special:Contributions/B1mbo|{{formatnum:3110}}]]
|-
| 14 || [[User:Mpeinadopa|<span style="color:gray">Mpeinadopa</span>]] || [[Special:Contributions/Mpeinadopa|{{formatnum:3041}}]]
|-
| 15 || [[User:RolandUnger|RolandUnger]] || [[Special:Contributions/RolandUnger|{{formatnum:2934}}]]
|-
| 16 || [[User:Kizar|<span style="color:gray">Kizar</span>]] || [[Special:Contributions/Kizar|{{formatnum:2933}}]]
|-
| 17 || [[User:MediaWiki message delivery|MediaWiki message delivery]] (Bot) || [[Special:Contributions/MediaWiki message delivery|{{formatnum:2806}}]]
|-
| 18 || [[User:Elreysintrono|<span style="color:gray">Elreysintrono</span>]] || [[Special:Contributions/Elreysintrono|{{formatnum:2763}}]]
|-
| 19 || [[User:MABot|MABot]] (Bot) || [[Special:Contributions/MABot|{{formatnum:2473}}]]
|-
| 20 || [[User:Aguzado|<span style="color:gray">Aguzado</span>]] || [[Special:Contributions/Aguzado|{{formatnum:2446}}]]
|-
| 21 || [[User:Meruleh|<span style="color:gray">Meruleh</span>]] || [[Special:Contributions/Meruleh|{{formatnum:2338}}]]
|-
| 22 || [[User:HrAd|<span style="color:gray">HrAd</span>]] || [[Special:Contributions/HrAd|{{formatnum:2254}}]]
|-
| 23 || [[User:Bromoxido|<span style="color:gray">Bromoxido</span>]] (Admin) || [[Special:Contributions/Bromoxido|{{formatnum:2210}}]]
|-
| 24 || [[User:Jorge Abellán|<span style="color:gray">Jorge Abellán</span>]] || [[Special:Contributions/Jorge Abellán|{{formatnum:2210}}]]
|-
| 25 || [[User:Razr Nation|<span style="color:gray">Razr Nation</span>]] || [[Special:Contributions/Razr Nation|{{formatnum:1687}}]]
|-
| 26 || [[User:Green Mostaza|<span style="color:gray">Green Mostaza</span>]] || [[Special:Contributions/Green Mostaza|{{formatnum:1461}}]]
|-
| 27 || [[User:Green Mostaza Bot|<span style="color:gray">Green Mostaza Bot</span>]] || [[Special:Contributions/Green Mostaza Bot|{{formatnum:1288}}]]
|-
| 28 || [[User:Superzerocool|<span style="color:gray">Superzerocool</span>]] || [[Special:Contributions/Superzerocool|{{formatnum:1252}}]]
|-
| 29 || [[User:ElGuruCesar|ElGuruCesar]] || [[Special:Contributions/ElGuruCesar|{{formatnum:1060}}]]
|-
| 30 || [[User:Althair|<span style="color:gray">Althair</span>]] || [[Special:Contributions/Althair|{{formatnum:1048}}]]
|-
| 31 || [[User:Eclipsis Proteo|<span style="color:gray">Eclipsis Proteo</span>]] || [[Special:Contributions/Eclipsis Proteo|{{formatnum:1042}}]]
|-
| 32 || [[User:Patricio.lorente|<span style="color:gray">Patricio.lorente</span>]] || [[Special:Contributions/Patricio.lorente|{{formatnum:997}}]]
|-
| 33 || [[User:HJGN2|<span style="color:gray">HJGN2</span>]] || [[Special:Contributions/HJGN2|{{formatnum:956}}]]
|-
| 34 || [[User:Naturista2018|<span style="color:gray">Naturista2018</span>]] || [[Special:Contributions/Naturista2018|{{formatnum:942}}]]
|-
| 35 || [[User:Ksn.kenny|<span style="color:gray">Ksn.kenny</span>]] || [[Special:Contributions/Ksn.kenny|{{formatnum:931}}]]
|-
| 36 || [[User:Lomeno 24|<span style="color:gray">Lomeno 24</span>]] || [[Special:Contributions/Lomeno 24|{{formatnum:920}}]]
|-
| 37 || [[User:HrAd-ATO|<span style="color:gray">HrAd-ATO</span>]] || [[Special:Contributions/HrAd-ATO|{{formatnum:906}}]]
|-
| 38 || [[User:Jormtz|<span style="color:gray">Jormtz</span>]] || [[Special:Contributions/Jormtz|{{formatnum:834}}]]
|-
| 39 || [[User:Jsmura|<span style="color:gray">Jsmura</span>]] || [[Special:Contributions/Jsmura|{{formatnum:786}}]]
|-
| 40 || [[User:CarsracBot|<span style="color:gray">CarsracBot</span>]] || [[Special:Contributions/CarsracBot|{{formatnum:736}}]]
|-
| 41 || [[User:Kirito|<span style="color:gray">Kirito</span>]] || [[Special:Contributions/Kirito|{{formatnum:731}}]]
|-
| 42 || [[User:Olea|<span style="color:gray">Olea</span>]] || [[Special:Contributions/Olea|{{formatnum:716}}]]
|-
| 43 || [[User:B1m-bot|<span style="color:gray">B1m-bot</span>]] || [[Special:Contributions/B1m-bot|{{formatnum:713}}]]
|-
| 44 || [[User:Sumone's bot|<span style="color:gray">Sumone's bot</span>]] || [[Special:Contributions/Sumone's bot|{{formatnum:710}}]]
|-
| 45 || [[User:Viajero del cantábrico|<span style="color:gray">Viajero del cantábrico</span>]] || [[Special:Contributions/Viajero del cantábrico|{{formatnum:675}}]]
|-
| 46 || [[User:SteveRBot|<span style="color:gray">SteveRBot</span>]] || [[Special:Contributions/SteveRBot|{{formatnum:653}}]]
|-
| 47 || [[User:Alakrano|<span style="color:gray">Alakrano</span>]] || [[Special:Contributions/Alakrano|{{formatnum:620}}]]
|-
| 48 || [[User:Grillitus|<span style="color:gray">Grillitus</span>]] || [[Special:Contributions/Grillitus|{{formatnum:606}}]]
|-
| 49 || [[User:Banfield|<span style="color:gray">Banfield</span>]] || [[Special:Contributions/Banfield|{{formatnum:595}}]]
|-
| 50 || [[User:TheDarkFear|<span style="color:gray">TheDarkFear</span>]] || [[Special:Contributions/TheDarkFear|{{formatnum:576}}]]
{{/end}}
1y4nspllphm4h769b0o785zxz2bfphk
Plantilla:Tasa de cambio/datos
10
8915
255260
255240
2026-07-04T19:02:04Z
Jembot
2355
Bot: Actualizando datos
255260
wikitext
text/x-wiki
{{#switch:{{uc:{{{1|}}}}}<!--
Las cifras indican el valor de un dólar estadounidense en la moneda correspondiente-->
|AED=3.672504
|AFN=64.000368
|ALL=82.156443
|AMD=367.863732
|ANG=1.790403
|AOA=917.503981
|ARS=1492.901385
|AUD=1.443002
|AWG=1.8025
|AZN=1.70397
|BAM=1.710168
|BBD=2.01609
|BDT=123.414041
|BGN=1.69088
|BHD=0.377395
|BIF=2977.186678
|BMD=1
|BND=1.291677
|BOB=6.931438
|BRL=5.170399
|BSD=1.001006
|BTN=95.363561
|BWP=13.50094
|BYN=2.904289
|BYR=19600
|BZD=2.013204
|CAD=1.41995
|CDF=2246.000362
|CHF=0.803085
|CLF=0.023434
|CLP=922.290396
|CNY=6.789104
|COP=3350.48
|CRC=456.004127
|CUP=26.5
|CVE=96.416673
|CZK=21.144704
|DJF=178.251935
|DKK=6.535604
|DOP=59.297801
|DZD=133.361297
|ECS=25000
|EGP=49.283873
|EHP=145,405390944
|ERN=15
|ETB=160.514013
|EUR|€=0.873904
|FJD=2.26045
|FKP=0.748732
|GBP|£=0.748727
|GEL=2.63504
|GHS=11.37081
|GIP=0.748732
|GMD=72.503851
|GNF=8778.18875
|GTQ=7.638834
|GYD=209.368415
|HKD=7.84465
|HNL=26.792007
|HRK=6.587504
|HTG=130.916468
|HUF=308.910388
|IDR=17994.4
|ILS=2.99865
|INR=95.52215
|IQD=1311.175817
|IRR=1375950.000352
|ISK=125.920386
|JMD=158.462682
|JOD=0.70904
|JPY|¥=161.370385
|KES=129.420385
|KGS=87.447704
|KHR=4008.289394
|KMF=431.00035
|KPW=900.00035
|KRW=1528.775039
|KWD=0.31029
|KYD=0.834186
|KZT=473.343651
|LAK=22602.422281
|LBP=89638.056928
|LKR=335.280486
|LRD=181.679857
|LSL=16.236282
|LTL=2.95274
|LVL=0.60489
|LYD=6.415985
|MAD=9.360283
|MDL=17.60745
|MGA=4243.802195
|MKD=53.896771
|MMK=2099.691108
|MNT=3584.859602
|MOP=8.085657
|MRU=39.946486
|MUR=47.050378
|MVR=15.460378
|MWK=1735.822658
|MXN=17.469104
|MYR=4.071039
|MZN=63.910377
|NAD=16.236282
|NGN=1370.080377
|NIO=36.830094
|NOK=9.841039
|NPR=152.581872
|NZD=1.752235
|OMR=0.385872
|PAB=1
|PEN=3.405909
|PGK=4.397401
|PHP=61.501038
|PKR=278.298544
|PLN=3.75205
|PYG=6086.310174
|QAR=3.658963
|RON=4.568038
|RSD=102.570892
|RUB=77.145891
|RWF=1465.436579
|SAR=3.748374
|SBD=8.058541
|SCR=13.46616
|SDG=600.503676
|SEK=9.65806
|SGD=1.291404
|SHP=0.746601
|SLL=20969.503664
|SOS=572.078178
|SRD=37.566038
|SSP=
|STD=20697.981008
|SVC=8.75
|SYP=110.532098
|SZL=16.233658
|THB=33.170369
|TJS=9.278438
|TMT=3.51
|TND=2.954102
|TOP=2.40776
|TRY=46.767504
|TTD=6.784137
|TWD=31.938038
|TZS=2626.827038
|UAH=44.581348
|UGX=3653.27947
|USD|$=1
|UYU=40.257776
|UZS=11990.766244
|VED=
|VEF=
|VES=638.90327
|VND=26296
|VUV=119.804122
|WST=2.773179
|XAF=573.614621
|XCD=2.70255
|XDR=0.713393
|XOF=573.614621
|XPF=104.281979
|YER=237.050363
|ZAR=16.231504
|ZMW=18.392724
|ZWL=321.999592
|#default=4 de julio de 2026
}}
aw0ywzxo63bjvykikhis2qud13dtdpp
Plantilla:IDDC/Imagen
10
12726
255269
255241
2026-07-05T00:00:05Z
Jembot
2355
Bot: Actualizando imagen del día de Commons
255269
wikitext
text/x-wiki
Pastellkreide -- 2025 -- 8665.jpg <!-- FILENAME HERE, e.g. Foo.jpg -->
02unr39r4nsw0smpoa126xrn95mbyua
Plantilla:IDDC/Descripción
10
12727
255270
255242
2026-07-05T00:00:06Z
Jembot
2355
Bot: Actualizando descripción de la imagen del día de Commons
255270
wikitext
text/x-wiki
[[:c:Category:Photo art|Arte fotográfico]] con tizas pastel. La foto se tomó utilizando [[:c:Category:Intentional camera movement|movimiento intencional de la cámara]] y [[:c:Category:Multiple exposure|exposiciones múltiples]].
7vzxcwlzvfqfk38o1wt19oj0sov6d1m
Plantilla:Portada:Cabecera/DDM
10
13136
255276
254857
2026-07-05T00:33:50Z
Luxbane
30785
255276
wikitext
text/x-wiki
<includeonly>{{#switch: {{#time: Y-m}}
| 2026-06 = {{#switch:{{{1}}}|ddm=Maracaibo|img=General Rafael Urdaneta Bridge view from the lake to Cabimas side (esvoy banner).jpg|texto=Maracaibo posee atracciones turísticas y arquitectónicas, y su historia cultural, colonial y moderna, que abarca desde sus barrios emblemáticos hasta las zonas más contemporáneas de la ciudad.}}
| 2026-07 = {{#switch:{{{1}}}|ddm=París|img=Paris Night f (esvoy banner).jpg|texto=París, capital de Francia, tiene 3 millones de habitantes en la zona urbana y unos 12 millones en los suburbios, sumando 15 millones, siendo una de las ciudades más pobladas de Europa y la más visitada del mundo. Ubicada en el norte del país, a orillas del Sena, es conocida como "La ciudad de las luces" y es famosa por su historia, belleza, romanticismo, cultura, arte, gastronomía, moda y diseño.}}
| 2026-08 = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-09 = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-10 = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-11 = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-12 = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| #default = {{#switch:{{{1}}}|ddm=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
}}</includeonly><noinclude>
{{#switch:{{{1}}}|ddm=|img=|texto=}}
[[Categoría:Plantillas:Plantillas en portada]]
</noinclude>
gb8w0gijaluqt59khi47feliauacvm3
Wikiviajes:GUS2Wiki
4
15223
255261
255152
2026-07-04T20:58:47Z
Alexis Jazz
20561
Updating gadget usage statistics from [[Special:GadgetUsage]] ([[phab:T121049]])
255261
wikitext
text/x-wiki
{{#ifexist:Project:GUS2Wiki/top|{{/top}}|This page provides a historical record of [[Special:GadgetUsage]] through its page history. To get the data in CSV format, see wikitext. To customize this message or add categories, create [[/top]].}}
Los siguientes datos provienen de la caché, y fueron actualizados por última vez a fecha de: 2026-07-04T11:07:28Z. La caché contiene {{PLURAL:5000|un resultado|5000 resultados}} como máximo.
{| class="sortable wikitable"
! Accesorio !! data-sort-type="number" | Número de usuarios !! data-sort-type="number" | Usuarios activos
|-
|AjaxSysop || 1 || 0
|-
|CaracteresOff || 5 || 0
|-
|CorrectorOrtografico || 74 || 0
|-
|DetectaDesambiguaciones || 63 || 0
|-
|HotCat || 76 || 3
|-
|RTRC || 16 || 0
|-
|UTCLiveClock || 38 || 0
|-
|boton-purgar || 24 || 0
|-
|botonera || 51 || 0
|-
|coloresdiscu || 12 || 0
|-
|contrib-numeradas || 14 || 0
|-
|corchete-refs || 20 || 0
|-
|deluxe-history || 31 || 0
|-
|editHysteria || 3 || 0
|-
|edittop || 25 || 0
|-
|mensajes-predefinidos || 29 || 0
|-
|patrollinks || 1 || 0
|-
|popups || 37 || 0
|-
|quickeditcounter || 26 || 0
|-
|reversion || 15 || 0
|-
|rightsfilter || 11 || 0
|-
|serena || 7 || 0
|-
|typographyrefreshoverride || 4 || 0
|-
|wikilimpia || 6 || 0
|}
* [[Especial:Uso de accesorios]]
* [[m:Meta:GUS2Wiki/Script|GUS2Wiki]]
<!-- data in CSV format:
AjaxSysop,1,0
CaracteresOff,5,0
CorrectorOrtografico,74,0
DetectaDesambiguaciones,63,0
HotCat,76,3
RTRC,16,0
UTCLiveClock,38,0
boton-purgar,24,0
botonera,51,0
coloresdiscu,12,0
contrib-numeradas,14,0
corchete-refs,20,0
deluxe-history,31,0
editHysteria,3,0
edittop,25,0
mensajes-predefinidos,29,0
patrollinks,1,0
popups,37,0
quickeditcounter,26,0
reversion,15,0
rightsfilter,11,0
serena,7,0
typographyrefreshoverride,4,0
wikilimpia,6,0
-->
63yneg4wt2h2hxx4hrx1s2hvto3rczh
Wikiviajes:Usuarios activos
4
16437
255258
255234
2026-07-04T12:01:05Z
Jembot
2355
Bot: Actualizando ranking
255258
wikitext
text/x-wiki
{{/begin|15}}
|-
| 1 || [[User:Urci dream|Urci dream]] || [[Special:Contributions/Urci dream|{{formatnum:126}}]]
|-
| 2 || [[User:Igallards7|Igallards7]] || [[Special:Contributions/Igallards7|{{formatnum:84}}]]
|-
| 3 || [[User:Sanurca|Sanurca]] || [[Special:Contributions/Sanurca|{{formatnum:49}}]]
|-
| 4 || [[User:Viajero673|Viajero673]] || [[Special:Contributions/Viajero673|{{formatnum:28}}]]
|-
| 5 || [[User:Javalema|Javalema]] || [[Special:Contributions/Javalema|{{formatnum:23}}]]
|-
| 6 || [[User:Jayaras|Jayaras]] || [[Special:Contributions/Jayaras|{{formatnum:12}}]]
|-
| 7 || [[User:CUNInsiderRP|CUNInsiderRP]] || [[Special:Contributions/CUNInsiderRP|{{formatnum:12}}]]
|-
| 8 || [[User:Yhaher|Yhaher]] || [[Special:Contributions/Yhaher|{{formatnum:11}}]]
|-
| 9 || [[User:Osgaca|Osgaca]] || [[Special:Contributions/Osgaca|{{formatnum:10}}]]
|-
| 10 || [[User:Androllan|Androllan]] || [[Special:Contributions/Androllan|{{formatnum:9}}]]
|-
| 11 || [[User:Yealmon|Yealmon]] || [[Special:Contributions/Yealmon|{{formatnum:8}}]]
|-
| 12 || [[User:Joaban|Joaban]] || [[Special:Contributions/Joaban|{{formatnum:8}}]]
|-
| 13 || [[User:Juamapuen|Juamapuen]] || [[Special:Contributions/Juamapuen|{{formatnum:7}}]]
|-
| 14 || [[User:Aralemen|Aralemen]] || [[Special:Contributions/Aralemen|{{formatnum:7}}]]
|-
| 15 || [[User:Arobaldo|Arobaldo]] || [[Special:Contributions/Arobaldo|{{formatnum:5}}]]
{{/end}}
5m2p2k7apnrf6437pwo16u2bllpt8ia
Wikiviajes:Taberna
4
17308
255298
255186
2026-07-05T02:14:21Z
Bromoxido
21781
Sección nueva: /* Rastreador de viajes implementado + borrado de plantillas Userbox */
255298
wikitext
text/x-wiki
{{atajos|WV:T|WV:Taberna}}
{{Mensaje
|clase = misc
|cabecera = Bienvenid{{U@}} a la Taberna
|imagen = Wikivoyage-Logo-v3-icon.svg
|ancho de imagen = 50px
|texto = La taberna es el espacio de reunión y discusión de la comunidad de Wikiviajes.
Cumple las siguientes funciones:
* Anunciar [[WV:NAP|nominaciones a permisos]] como [[Wikiviajes:Ingenieros|ingenieros]], [[Wikiviajes:maquinistas|maquinistas]], [[Wikiviajes:Navegantes|navegantes]] o [[Wikiviajes:Revisores|revisores]] ante la comunidad.
* Aclarar dudas y resolver problemas relacionados con el funcionamiento del proyecto.
* Discutir tareas, propuestas y planes a futuro en torno al desarrollo de Wikiviajes.
* Comunicar novedades técnicas y organizativas relevantes para los usuarios.
* Proponer y debatir cambios importantes en la interfaz o en las páginas del proyecto.técnicos y ayudar a otros.
Firma tus comentarios (<nowiki>~~~~</nowiki>) y deja tus mensajes '''al final'''.
Si una sección desaparece, revisa el [[Wikiviajes:Taberna/Archivo|archivo]]. Para asuntos administrativos, usa el [[WV:PM|panel de los maquinistas]]. Preguntas sobre artículos deben ir a su discusión. Problemas con [[mw:|software MediaWiki]], a [[phab:|Phabricator]]. Para cambios en la configuración de Wikiviajes, haz clic [https://es.wikivoyage.org/w/index.php?title=Wikiviajes:Taberna&action=edit§ion=new&preload=Plantilla:Bugreq/precarga aquí].
|comentario= <hr>
;Mantén la taberna limpia trasladando las conversaciones antiguas a su lugar correspondiente<nowiki>:</nowiki>
* Preguntas sobre destinos → discusión del artículo.
* Preguntas simples → discusión del usuario.
* Discusiones estancadas → archivar tras un mes.</small>
}}
[[Categoría:Wikiviajes]]
{{Usuario:MABot/config
|archive = Wikiviajes:Taberna/Archivo/%(year)d/%(month)02d
|algo = old(15d)
|counter = 1
|minthreadstoarchive = 1
|archiveheader = {{archivo}}
}}
<div class="plainlinks" style="margin-top:10px; margin-bottom:10px; text-align:center;"> [https://es.wikivoyage.org/w/index.php?title=Wikiviajes:Taberna&action=edit§ion=new {{Botón|Inicia un nuevo hilo|color=blue}}]
[[Wikiviajes:Taberna/Archivo|{{Botón|Archivo|color=green}}]]
</div>
<!-- Las discusiones inician abajo -->
__TOC__ __NEWSECTIONLINK__
== Noticias técnicas: 2026-25 ==
<section begin="technews-2026-W25"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/25|Traducciones en varios idiomas]] están disponibles.
'''Lo más destacado de la semana'''
* El [[mw:Special:MyLanguage/Readers/Reader Growth|equipo de Crecimiento de Lectura]] ha lanzado la función beta [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Image Browsing]] en la versión de la web móvil de todas las Wikipedias. La característica muestra un carrusel de imágenes al inicio del artículo con 3 o más imágenes. Los editores pueden configurar esta característica con los siguientes controles: ocultar una imagen específica de una página, usando <code>class=notpageimage</code> para excluirla de la vista previa de miniaturas; o <code>class=noviewer</code> para excluirla de MediaViewer. El carrusel también se puede deshabilitar en una página utilizando la palabra mágica <code><nowiki>__NOMEDIAVIEWERCAROUSEL__</nowiki></code>. Para enviar retroalimentación o reportar fallos, por favor visite la [[mw:Talk:Readers/Reader Growth/Image Browsing|página del proyecto]].
* [[mw:Special:MyLanguage/Help:Tables#class="wikitable"|Wikitablas]] pueden ser [[mw:Special:MyLanguage/Help:Sortable tables#Forcing the initial sort direction|ordenadas en orden descendente]] al hacer el primer clic al añadir <code dir=ltr>data-sort-order="desc"</code> en la celda de encabezado. Anteriormente, por defecto, al hacer clic en el encabezado de una columna por primera vez, se ordenaba de manera ascendente. Esta opción añade más control y flexibilidad a las wikitablas, mientras se mantiene el comportamiento por defecto de los clics posteriores. [https://phabricator.wikimedia.org/T398416]
'''Actualizaciones para editores'''
* La [[mw:Special:MyLanguage/Article guidance|asistencia de artículos]] es una función que se está probando actualmente con algunos editores al crear nuevos artículos en las Wikipedias en inglés simple, francés y turco. El experimento comenzará próximamente en las Wikipedias en árabe y bengalí. [[w:simple:Special:NewArticle|Esta función]] les entrega una guía creada por la comunidad a los editores para ayudarles a crear algunos artículos siguiendo los estándares comunitarios. Los usuarios con experiencia pueden seguir creando o adaptando criterios para tipos específicos de artículos que comúnmente son creados por usuarios con menos experiencia. Las pautas guían a los usuarios con menos experiencia en la creación de artículos de mejor calidad. Se puede consultar una guía rápida del el marcado usado en las pautas en [[mw:Special:MyLanguage/Article guidance/Test feature guide#Markups in outlines|esta página]]. [[w:simple:Wikipedia:Article Guidance|Las pautas de ejemplos]] que pueden ser adaptadas y sus instrucciones de cómo adaptarlas se encuentran en [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|esta sección]] de la página del proyecto.
* Las wikis que deseen reemplazar el botón "Indefinido" en la página de Especial:Bloquear para cuentas temporales (por ejemplo, wikis que bloquean a los usuarios temporales hasta la expiración de su cuenta) pueden hacerlo al crear [[MediaWiki:ipb-indefinite-expiry-temporary-account]] con la duración del bloqueo que deseen. [https://phabricator.wikimedia.org/T427125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:41}} {{PLURAL:41|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]].
'''Actualizaciones para los colaboradores técnicos'''
* A finales de junio, se comenzará a requerir una cadena de agente de usuario (''user-agent'') para las descargas automáticas desde dumps.wikimedia.org. Las solicitudes automáticas que provean un agente genérico o vacío serán bloqueadas. Esto es parte del [[phab:T400119|cumplimiento de las normas]] de la [[foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|política de agente de usuario]]. No se cambiará el acceso a los dumps mediante Wikimedia Cloud Services.
* Se completó el proceso de implementación de los [[mw:Wikimedia APIs/Rate limits|límites de solicitudes de la API]], con el cumplimiento de la política en todas las API y con su documentación de niveles para todos los grupos. Bots que se ejecutan desde Toolfoge/WMCS o bots con permisos de usuarios de bot en cualquier wiki se mantendrán exceptuados. Todos los bots deberán seguir las buenas prácticas documentadas para evitar ser limitados.
* La [https://api.wikimedia.org/wiki/Main_Page wiki de API Portal] será marcada como solo lectura a partir de esta semana (del 15 al 18 de junio). La semana siguiente (del 22 al 25 de junio), todas las URLs del portal serán redirigidas a [[mw:Wikimedia APIs|APIs de Wikimedia en mediawiki.org]]. Lee más información en [[wikitech:API Portal/Deprecation|la página del proyecto]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.7|MediaWiki]]
'''Reuniones y eventos'''
* El 17 de junio a las 6pm UTC, la WMF sostendrá una llamada de Discord enfocada en la revisión de código. Hemos escuchado a través de la [[mw:Special:MyLanguage/Developer Satisfaction Survey/2026|Encuesta de satisfacción de desarrolladores]] que los voluntarios tienen problemas con la revisión de código y deseamos discutir sus experiencias, con el objetivo de plantear soluciones. Puedes unirte a la llamada [https://discord.gg/wikipedia?event=1514727511102062664 mediante el servidor de Discord de la comunidad Wikimedia].
* La [[m:Special:MyLanguage/Conferencia Wikimedia de América Latina 2026|Conferencia de Latinoamérica]] tendrá una sesión de hackathon regional que reunirá a la comunidad técnica, que incluye desarrolladores, administradores de sistemas, científicos de datos y usuarios con permisos extendidos. Las personas interesadas en participar pueden [https://docs.google.com/forms/d/e/1FAIpQLSf4osJzTHBJjQbYJk7TMVEJjTEQv7IgtsUDfP-o-qTgeRQQxw/viewform solicitar una beca] para participar hasta el 21 de junio a medianoche (hora de Bolivia, UTC-4)
* Apúntate a los Desafíos en Equipos de Wikimanía para unirte a este evento especial. Los desafíos en equipos tendrán lugar en línea y en persona los días 21 y 22 de julio, antes de la Wikimania. Todas las personas son bienvenidas, sin importar sus conocimientos o su participación en Wikimania. Los equipos trabajarán en 10 desafíos importantes que apoyen a la comunidad Wikimedia. Para más detalles, visita [[wmania:Special:MyLanguage/2026:Team challenges|la página del desafío]] y [https://wikimedia.eventyay.com/wm/teamchallenges/ regístrate aquí]. El registro cierra el 20 de junio a las 11pm UTC.
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/25|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W25"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:48 15 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:UOzurumba (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30689604 -->
== Noticias técnicas: 2026-26 ==
<section begin="technews-2026-W26"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/26|Traducciones en varios idiomas]] están disponibles.
'''Lo más destacado de la semana'''
* [[mw:Special:MyLanguage/Growth/Feature summary|Las características de crecimiento]] ya están [[phab:T418115|disponibles en Wikidata]]. Esta actualización habilita las Mentorías ([[mw:Special:MyLanguage/Help:Growth/Mentorship|si está configurada]]), el módulo de Impacto, el Panel de Ayuda y una página simplificada para Recién Llegados (sin Ediciones Sugeridas). Los administradores de Wikidatra pueden configurar la Configuración Comunitaria.
'''Actualizaciones para editores'''
* Se ha creado la página espacial [[{{#special:RangeCalculator}}]]. Permite a los usuarios encontrar un rango de IP sin la necesidad de acceder a herramientas externas. Hasta ahora, la herramienta estaba disponible solamente a los CheckUsers. [https://phabricator.wikimedia.org/T268429]
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referenciación]] es una nueva característica de MediaWiki que permite a los usuarios reutilizar referencias con diferentes detalles. Será desplegado el 23 de junio para la mayoría de las Wikipedia de tamaños pequeños y medianos. Las [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|Preguntas Frecuentes]] presentan una lista de posibles acciones que debes realizar en tu wiki para poder utilizar esta característica. Chequea el [[:phab:T414094|plan de lanzamiento]] para los siguientes pasos de lanzamiento. [https://phabricator.wikimedia.org/T428902]
* A partir de la próxima semana, los usuarios recibirán una notificación cuando estén bloqueados o desbloqueados de la edición, o si el bloqueo es modificado. [https://phabricator.wikimedia.org/T100974]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:32}} {{PLURAL:32|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]].
'''Actualizaciones para los colaboradores técnicos'''
* A partir de la próxima semana, los filtros de abuso que están configurados para "exigir verificación CAPTCHA" comenzarán a afectar también a los usuarios con el permiso <code>skipcaptcha</code>, que incluye a la mayoría de los usuarios autoconfirmados. Los bots están exentos. Este cambio solo afecta a las modificaciones que activan un filtro de abuso. El derecho de <code>skipcaptcha</code> seguirá eximiendo a los usuarios de tener que resolver CAPTCHA en el curso ordinario de usar las wikis. [https://phabricator.wikimedia.org/T402595]
* La documentación de referencia para la [[wikitech:Machine_Learning/LiftWing/API|API Lift Wing]] fue trasladada desde el portal API a la [https://wikitech.wikimedia.org/w/index.php?api=lift-wing&title=Special%3ARestSandbox zona de pruebas REST].
* La wiki del Portal API ya ha sido cerrada. Para la documentación de API, revisa la página [[mw:Special:MyLanguage/Wikimedia_APIs|APIs Wikimedia en mediawiki.org]]. Todas las URL del portal de API (https://api.wikimedia.org/wiki/) serán redireccionadas a la página de mediawiki.org a partir del 22 de junio. [https://phabricator.wikimedia.org/T427537]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.8|MediaWiki]]
'''Reuniones y eventos'''
* Únete a una llamada en línea el 25 de junio a las 2:30pm UTC para reunirte con los actuales internos del [[mw:Google_Summer_of_Code/2026|Google Summer of Code]] y [[mw:Outreachy/Round_32|Outreachy]]. Los internos resumirán sus proyectos y harán una breve demostración de sus trabajos. Los participantes podrán [[mw:event:Google_Summer_of_Code/Summer_2026_June_Internship_open_session|compartir ideas y conectarse mw:Google_Summer_of_Code/2026con sus comunidades]].
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/26|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W26"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:05 23 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Trizek (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30722494 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|discusión]])</bdi> 17:12 23 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Codename Noreste@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== Incorporación del enlace «Contactos legales y de seguridad» en el pie de página de vuestra wiki ==
<section begin="Message"/>
'''Contactos legales y de seguridad'''
Hola a toda la comunidad: la Fundación Wikimedia ha puesto a vuestra disposición una [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|página única de contacto sobre cuestiones legales y de seguridad]], que debéis incluir en el pie de página de vuestra wiki para garantizar el acceso a información jurídica precisa. Se trata de un requisito normativo. Ya hemos implementado enlaces a las wikis en inglés, alemán, italiano, español y otros idiomas de Wikipedia, y pronto los implementaremos en vuestra wiki. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Por favor, leed más información en la página del proyecto]] y dejad vuestros comentarios en este hilo o en la [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|página de discusión]].
<section end="Message"/>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31 25 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:Sannita (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Noticias técnicas: 2026-27 ==
<section begin="technews-2026-W27"/><div class="plainlinks">
Las últimas '''[[m:Special:MyLanguage/Tech/News|noticias técnicas]]''' desde la comunidad técnica de Wikimedia. Por favor, comenta estos cambios con otros usuarios. No todos los cambios te afectarán. [[m:Special:MyLanguage/Tech/News/2026/27|Traducciones en varios idiomas]] están disponibles.
'''Actualizaciones para editores'''
* Como parte de los [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|experimentos de Creación de Cuentas]], el equipo de Crecimiento probó agregar el icono de cuenta de usuario en el encabezado para usuarios no registrados, el cual es un acceso directo a las acciones de "Crear una cuenta" e "Iniciar sesión". El experimento aumentó la creación de cuentas en un 20 % sin afectar negativamente la calidad de las ediciones o la tasa de ediciones constructivas. La característica se habilitará en todas las wikis de Fundación Wikimedia en la versión móvil durante la primera semana de julio. [https://phabricator.wikimedia.org/T428220]
* Después de un [[phab:T426248|experimento exitoso]], los usuarios registrados que no [[mw:Special:MyLanguage/Help:Email_confirmation|confirmaron su correo electrónico]] al crear la cuenta verán un mensaje que les pedirá finalizar el proceso. Esto ayudará a reducir el riesgo de que los usuarios pierdan el acceso a su cuenta y permitirá que las cuentas de correo electrónico sean más fiables. Esto forma parte del proyecto de [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Seguridad de Cuentas]]. [https://phabricator.wikimedia.org/T428292]
* Una actualización en [[Special:Search|Buscar]] está refinando el comportamiento de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> cuando se utiliza para excluir resultados. Anteriormente, el uso de <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> con negación podía ampliar involuntariamente los resultados de búsqueda al añadir los espacios de nombres incluidos en el alcance de la búsqueda, lo que generaba un comportamiento confuso para los usuarios que esperaban un filtro de exclusión directo. Con la actualización, <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> ahora excluirá estrictamente los títulos de página coincidentes según lo previsto y podría mostrar una advertencia si el espacio de nombres correspondiente no se ha seleccionado explícitamente. Sin embargo, el comportamiento de <bdi lang="zxx" dir="ltr"><code><nowiki>prefix:</nowiki></code></bdi> sin negación se mantiene sin cambios. [https://phabricator.wikimedia.org/T427443]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Revisa las {{formatnum:33}} {{PLURAL:33|tarea enviada|tareas enviadas}} por la comunidad que fueron [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resueltas la semana pasada]]. Por ejemplo, se solucionó un error por el cual los revisores que utilizaban la barra de herramientas de curación de páginas (Page Curation) no se suscribían automáticamente a las discusiones que iniciaban en las páginas de discusión. Ahora, los revisores recibirán notificaciones cuando alguien responda a esos hilos. [https://phabricator.wikimedia.org/T329346]
'''Actualizaciones para los colaboradores técnicos'''
* A partir del 29 de junio, las descargas automáticas desde el sitio web dumps.wikimedia.org estarán sujetas a la [[Foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|política de agentes de usuario]] (user-agent). Las solicitudes automáticas provenientes de un agente de usuario genérico o vacío serán bloqueadas. El acceso a los volcados mediante Wikimedia Cloud Services se mantendrá sin cambios. Esto forma parte del anuncio realizado en las [[m:Special:MyLanguage/Tech/News/2026/25|Noticias Técnicas 2026/25]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Elemento recurrente]] Actualizaciones detalladas de código de esta semana: [[mw:MediaWiki 1.47/wmf.9|MediaWiki]]
''Las '''[[m:Special:MyLanguage/Tech/News|Noticias Técnicas]]''' son preparadas por [[m:Special:MyLanguage/Tech/News/Writers|los escritores de Noticias Técnicas]] y publicadas con un [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Colabore]] • [[m:Special:MyLanguage/Tech/News/2026/27|traduzca]] • [[m:Tech|obtenga ayuda]] • [[m:Talk:Tech/News|denos su opinión]] • [[m:Global message delivery/Targets/Tech ambassadors|suscríbase o cancele su suscripción]].''
</div><section end="technews-2026-W27"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 11:48 29 jun 2026 (UTC)
<!-- Mensaje enviado por Usuario:STei (WMF)@metawiki mediante la lista en https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30744833 -->
== Rastreador de viajes implementado + borrado de plantillas Userbox ==
Finalmente se ha implementado el rastreador de viajes al proyecto. Con ello, las plantillas [[Plantilla:Userbox/origen|Userbox/origen]], [[Plantilla:Userbox/país|Userbox/país]] y la [https://es.wikivoyage.org/wiki/Categor%C3%ADa:Plantillas:Userboxes_de_pa%C3%ADses Categoría:Plantillas:Userboxes_de_países] serán descontinuadas y borradas en favor de esta nueva implementación. <span style="font-family: 'Verdana', sans-serif; color: #4a4a4a; padding: 3px 8px; border: 1px solid #a2a2a2; border-radius: 4px; background: #f9f9f9;">✈️ '''Bromoxido '''<sup>([[Usuario Discusión:Bromoxido|💬]])</sup></span> 02:14 5 jul 2026 (UTC)
qpn175ndufjojpln6h2oimblbef249l
Plantilla:Portada/FRT
10
18295
255277
254858
2026-07-05T00:42:07Z
Luxbane
30785
255277
wikitext
text/x-wiki
<includeonly>{{#switch: {{#time: Y-m}}
| 2026-06 = {{#switch:{{{1}}}|frt=Kamphaeng Phet|img=Kamphaeng_Phet04_(esvoy_banner).JPG|texto=Kamphaeng Phet (กำแพงเพชร) es una ciudad ubicada en la provincia homónima al norte de Tailandia. Su parque histórico con ruinas de templos del siglo XIV al XVI, murallas de la ciudad y estatuas de Buda son parte del sitio Patrimonio de la Humanidad de la UNESCO «Ciudad histórica de Sukhothai y ciudades históricas asociadas».}}
| 2026-07 = {{#switch:{{{1}}}|frt=Estados Federados de Micronesia|img=Federal States of Micronesia (esvoy banner).jpg|texto=Los Estados Federados de Micronesia, con más de 600 islas en el Pacífico, están compuestos por Yap, Chuuk, Pohnpei y Kosrae. Limita al suroeste con Papúa Nueva Guinea, al norte con las Islas Marianas y Guam, al este con Nauru y las Islas Marshall, y al oeste con Palaos y Filipinas.}}
| 2026-08 = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-09 = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-10 = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-11 = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-12 = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| #default = {{#switch:{{{1}}}|frt=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
}}</includeonly><noinclude>
{{#switch:{{{1}}}|frt=|img=|texto=}}
[[Categoría:Plantillas:Plantillas en portada]]
</noinclude>
o2m22h531p353961bsibf525fntduj6
Plantilla:Portada/NVD
10
18297
255278
254860
2026-07-05T00:50:16Z
Luxbane
30785
255278
wikitext
text/x-wiki
<includeonly>{{#switch: {{#time: Y-m}}
| 2026-06 = {{#switch:{{{1}}}|nvd=Viajes LGBT|img=Marcha del Orgullo LGBTIQ+ en Caracas, Venezuela. Foto Vertical (esvoy banner).jpg|texto=Las personas LGBT (lesbianas, gays, bisexuales, transexuales y otros) suelen tener preocupaciones o intereses especiales cuando viajan. Esta página enumera tres cosas: eventos y actividades de especial interés para los viajeros LGBT, o dirigidos a ellos; destinos en los que es aceptable salir del armario como LGBT; y destinos a los que puede ser peligroso viajar si se conoce la condición de transgénero o la orientación no heterosexual.}}
| 2026-07 = {{#switch:{{{1}}}|nvd=Ruta 66|img=R66streetsignPontiacIL (esvoy banner).jpg|texto=La Ruta 66, también conocida como US 66, fue una autopista que conectaba Chicago con Los Ángeles, atravesando el Medio Oeste, las Grandes Llanuras y el Suroeste. Aunque ya no está en servicio como autopista estadounidense, más de cuatro quintas partes de su trazado aún son transitables como carreteras estatales y locales, aunque no siempre bien señalizadas}}
| 2026-08 = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-09 = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-10 = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-11 = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| 2026-12 = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
| #default = {{#switch:{{{1}}}|nvd=Acampar sin dejar rastro|img=A Room With a View (bannerportada esvoy).jpg|texto=Un enfoque cada vez más popular —y necesario— para los campistas cuyo objetivo es tener el menor impacto posible al medio ambiente. Uno de sus lemas es «Tomar solo fotos y dejar nada más que las huellas».}}
}}</includeonly><noinclude>
{{#switch:{{{1}}}|nvd=|img=|texto=}}
[[Categoría:Plantillas:Plantillas en portada]]
</noinclude>
m7itvnhyrnn19eyljn6emog907fyt55
Usuario:Luxbane/Gadget-TripPlanner.js
2
18311
255266
252094
2026-07-04T23:34:59Z
Bromoxido
21781
Actualización.
255266
javascript
text/javascript
/**
* Wikivoyage Trip Planner Gadget
* ==============================
* A client-side tool for planning trips using Wikivoyage listings.
* Allows users to drag listings from articles into custom buckets or days,
* organize them, view them on a map, and calculate/optimize routes.
*
* CORE FEATURES:
* ------------------
* 1. UI Modes: Dual-mode application:
* - Mini Widget Mode: A floating, minimizable widget suitable for reading articles.
* - Full View Mode: A split-screen full-page interface with a persistent map,
* routing, and bucket controls.
* 2. Data Source & Drag-and-Drop:
* - Drag-and-drop POIs between day/bucket bins.
* - Parses data-lat, data-lon, and wikidata attributes from vcards.
* - Allows wikidata and ListingBrowser as sources too
* 3. Multi-Tab Synchronization:
* - Uses BroadcastChannel to sync trip plans in real-time across all open tabs.
* - Protects local tab UI states (minimized/expanded) during synchronization events.
* 4. Persistence: Dual-mode storage:
* - Anonymous: Uses browser LocalStorage.
* - Logged-in: Uses MediaWiki User Options API ('userjs-wv-trip-planner-*').
* - Auto-merge: Merges local data into account data upon login.
* 5. Mapping: Interactive markers (colored by day) with popup image loading from Wikidata.
* 6. Routing: Integrated with OpenRouteService (ORS) API.
* - Calculates travel time/distance between POIs.
* - Optimizes day itinerary (TSP) using ORS Optimization API.
* - Draws colored route polylines on the map.
* 7. I/O: Import/Export support for JSON, GPX, WikiText ({{listing}}), and GeoJSON.
*
* EXTERNAL SERVICES:
* ------------------
* 1. OpenRouteService (api.openrouteservice.org): Used for routing and optimization.
* Requires a user-provided API Key (stored in settings).
* 2. Wikidata API: Used to fetch thumbnail images for map popups.
* 3. Wikimedia Maps: Tile server for the Leaflet map.
*
* CODE STRUCTURE (Singleton 'TripPlanner'):
* -----------------------------------------
* - Config:
* - storageKey/optionKey: Persistence identifiers.
* - colors: Palette for different days.
*
* - Lifecycle:
* - init(): Entry point after the launcher icon is clicked or auto-run in Full Mode.
* - load()/save(): Handles LocalStorage vs API serialization logic.
*
* - UI Generation:
* - injectStyles(): CSS definitions (Widget, Overlays, Map, Split-Screen).
* - drawUI(): Renders the main widget container and sets up layout modes.
* - renderBins(): Renders the list of items (Custom Buckets + Days).
* - toggleMap(): Lazy-loads Leaflet libraries and renders map container.
*
* - Logic & Handlers:
* - setupListeners(): Central event delegation (Clicks, Drag&Drop, Changes).
* - calculateRoutes(): Orchestrates ORS API calls for routing.
* - optimizeDay(): Orchestrates ORS API calls for ordering.
* - exportData(): Generates file blobs for download.
*
* - Map Helpers:
* - updateMapMarkers(): Draws L.marker/L.divIcon based on current data.
* - highlightDay(): Manages opacity/visibility of specific day layers.
*
* DEPENDENCIES:
* -------------
* - MediaWiki Modules: 'mediawiki.util', 'mediawiki.api', 'mediawiki.user', 'mediawiki.notification'.
* - OOJS UI: 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'.
* - Kartographer: 'ext.kartographer.box' for Leaflet (L) access.
* - jQuery ($).
*/
(function (mw, $) {
'use strict';
if (mw.config.get('wgAction') !== 'view') return;
let BucketEditDialog;
function initOOUI() {
if (BucketEditDialog) return;
BucketEditDialog = function (config) {
BucketEditDialog.super.call(this, config);
};
OO.inheritClass(BucketEditDialog, OO.ui.ProcessDialog);
BucketEditDialog.static.name = 'bucketEditDialog';
BucketEditDialog.static.title = 'Edit Bucket';
BucketEditDialog.static.actions = [
{ action: 'save', label: 'Save', flags: ['primary', 'progressive'] },
{ label: 'Cancel', flags: 'safe' }
];
BucketEditDialog.prototype.initialize = function () {
BucketEditDialog.super.prototype.initialize.call(this);
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.nameInput = new OO.ui.TextInputWidget({
placeholder: 'Enter bucket name (e.g. food, sleep)'
});
this.nameField = new OO.ui.FieldLayout(this.nameInput, {
label: 'Bucket Name',
align: 'top'
});
this.customIconInput = new OO.ui.TextInputWidget({
maxLength: 2
});
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
const buttonItems = presetIcons.map(function (icon) {
return new OO.ui.ButtonOptionWidget({
data: icon,
label: icon,
title: icon
});
});
this.presetSelect = new OO.ui.ButtonSelectWidget({
items: buttonItems
});
const thiss = this;
this.presetSelect.on('select', function (item) {
if (item) {
thiss.customIconInput.setValue(item.getData());
}
});
this.customIconInput.on('change', function (value) {
if (presetIcons.indexOf(value) === -1) {
thiss.presetSelect.selectItem(null);
} else {
const opt = thiss.presetSelect.findItemFromData(value);
if (opt) {
thiss.presetSelect.selectItem(opt);
}
}
});
this.nameInput.on('change', function (value) {
thiss.actions.setAbilities({ save: !!value.trim() });
});
this.presetField = new OO.ui.FieldLayout(this.presetSelect, {
label: 'Choose a Predefined Icon',
align: 'top'
});
this.customIconField = new OO.ui.FieldLayout(this.customIconInput, {
label: 'Icon (emoji or character)',
align: 'top'
});
this.fieldset = new OO.ui.FieldsetLayout();
this.fieldset.addItems([this.nameField, this.presetField, this.customIconField]);
this.content.$element.append(this.fieldset.$element);
this.$body.append(this.content.$element);
};
BucketEditDialog.prototype.getSetupProcess = function (data) {
data = data || {};
return BucketEditDialog.super.prototype.getSetupProcess.call(this, data)
.next(function () {
this.title.setLabel(data.title || 'Edit Bucket');
this.nameInput.setValue(data.name || '');
this.customIconInput.setValue(data.icon || '🗂️');
this.actions.setAbilities({ save: !!(data.name || '').trim() });
const val = data.icon || '🗂️';
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
if (presetIcons.indexOf(val) !== -1) {
const opt = this.presetSelect.findItemFromData(val);
if (opt) {
this.presetSelect.selectItem(opt);
}
} else {
this.presetSelect.selectItem(null);
}
this.onSave = data.onSave;
}, this);
};
BucketEditDialog.prototype.getActionProcess = function (action) {
if (action === 'save') {
const name = this.nameInput.getValue().trim();
const icon = this.customIconInput.getValue().trim();
if (!name) {
return new OO.ui.Process(function () {
alert('Please enter a name for the bucket.');
});
}
const thiss = this;
return new OO.ui.Process(function () {
if (thiss.onSave) {
thiss.onSave(name, icon || '🗂️');
}
thiss.close({ action: action });
});
}
return BucketEditDialog.super.prototype.getActionProcess.call(this, action);
};
}
const TripPlanner = {
storageKey: 'wv-trip-planner',
optionKey: 'userjs-wv-trip-planner',
saveTimer: null,
syncTimer: null,
map: null,
markerLayer: null,
localTripIndex: null, // Isolated tab-local trip selection
data: { activeTripIndex: 0, minimized: false, trips: [] },
colors: ['#d33', '#36c', '#2a7b39', '#f60', '#72309d', '#e2127a', '#00af89'],
init: function () {
if ($('.vcard').length === 0 && $('.listing').length > 0) {
console.warn("TripPlanner: vcard class not found, listings might be un-draggable.");
}
this.load();
if (this.data.trips.length === 0) this.createNewTrip("My First Trip");
this.data.closed = false;
this.data.minimized = false;
this.cachedRoutes = {}
this.injectStyles();
this.initMap(); // Ensure map container and Leaflet exist
this.setupListeners();
this.makeListingsDraggable();
this.drawUI();
this.syncChannel = window.BroadcastChannel ? new BroadcastChannel('wv-trip-planner-sync') : null;
if (this.syncChannel) {
this.syncChannel.onmessage = (msg) => {
if (msg.data.type === 'sync') {
// Preserve local UI state flags
const wasClosed = this.data.closed;
const wasMinimized = this.data.minimized;
this.data = msg.data.data;
this.data.closed = wasClosed;
this.data.minimized = wasMinimized;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.renderTripOptions();
this.renderBins();
this.updateMapMarkers();
// Sync topbar inputs without full redraw
const trip = this.getActiveTrip();
$('#tp-rename-input').val(trip.name);
$('#tp-start-date').val(trip.startDate);
$('#tp-length').val(trip.length);
} else {
this.drawUI();
}
}
};
}
},
load: function () {
const defaults = { activeTripIndex: 0, minimized: false, trips: [], orsKey: '' };
// 1. Read Local Storage (Used for Anon, or for merging after login)
const localStr = localStorage.getItem(this.storageKey);
let localData = null;
if (localStr) {
try {
localData = $.extend({}, defaults, JSON.parse(localStr));
} catch (e) {
console.error("Local load error", e);
}
}
if (mw.user.isAnon()) {
// --- CASE 1: Anonymous User -> Use Local Storage ---
if (localData) this.data = localData;
} else {
// --- CASE 2: Logged In -> Use Account Options ---
const remoteStr = mw.user.options.get(this.optionKey);
let remoteData = {
activeTripIndex: 0, minimized: false, trips: []
};
if (remoteStr) {
try {
$.extend(remoteData, JSON.parse(remoteStr));
} catch (e) { console.error("Remote load error", e); }
}
// --- MERGE LOGIC: If local data exists, merge it into account and clear local ---
if (localData && localData.trips && localData.trips.length > 0) {
// Avoid merging empty default trips if possible
const validLocalTrips = localData.trips.filter(t => {
const hasItemsInBuckets = t.buckets ? t.buckets.some(b => b.items.length > 0) : (t.backlog && t.backlog.length > 0);
return hasItemsInBuckets || t.days.some(d => d.items.length > 0) || t.name !== "My First Trip";
});
if (validLocalTrips.length > 0) {
remoteData.trips = remoteData.trips.concat(validLocalTrips);
// Trigger immediate save to server to persist the merge
this.saveDataToApi(remoteData);
}
// Clear local storage so we don't merge again next reload
localStorage.removeItem(this.storageKey);
}
this.data = remoteData;
if (!this.data.closed)
this.data.closed = false;
}
this.migrateData();
},
migrateData: function () {
if (!this.data || !this.data.trips) return;
this.data.trips.forEach(trip => {
if (!trip.buckets) {
trip.buckets = [
{ id: "backlog", name: "Backlog", icon: "📦", items: trip.backlog || [] }
];
}
delete trip.backlog;
// Ensure every bucket has an id, name, icon, items
trip.buckets.forEach(b => {
if (!b.id) b.id = 'bucket_' + Math.random().toString(36).substr(2, 9);
if (!b.icon) b.icon = '📦';
if (!b.items) b.items = [];
});
});
},
save: function () {
const dataToSave = $.extend(true, {}, this.data);
// cleanup non-persistent flags
delete dataToSave.closed;
delete dataToSave.minimized;
if (dataToSave.trips) {
dataToSave.trips.forEach(trip => {
delete trip.backlog;
});
}
// 1. Sync other tabs (100ms delay)
this.broadcastSync(dataToSave);
if (mw.user.isAnon()) {
// Anon: Save directly to LocalStorage
localStorage.setItem(this.storageKey, JSON.stringify(dataToSave));
} else {
// Logged In: Save to API (Debounced 2s)
clearTimeout(this.saveTimer);
this.saveTimer = setTimeout(() => {
this.saveDataToApi(dataToSave);
}, 2000);
}
},
broadcastSync: function (data) {
if (!this.syncChannel) return;
clearTimeout(this.syncTimer);
this.syncTimer = setTimeout(() => {
this.syncChannel.postMessage({ type: 'sync', data: data });
}, 100);
},
saveDataToApi: function (dataToSave) {
new mw.Api().saveOption(this.optionKey, JSON.stringify(dataToSave))
.fail(function (code, data) { console.error("TripPlanner Sync Error", code, data); });
},
getActiveTrip: function () {
const idx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
return this.data.trips[idx] || this.data.trips[0];
},
injectStyles: function () {
mw.util.addCSS(`
/* --- DESKTOP / DEFAULT STYLES --- */
#tp-widget {
position: fixed; bottom: 10px; right: 10px;
width: 360px;
max-width: 95vw;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #a2a9b1; border-radius: 8px;
z-index: 2000; box-shadow: 0 4px 15px rgba(0,0,0,0.3);
font-family: sans-serif; display: flex; flex-direction: column;
box-sizing: border-box;
}
#tp-widget * { box-sizing: border-box; }
.tp-header { background: #36c; color: white; padding: 10px; border-radius: 8px 8px 0 0; cursor: pointer; display: flex; justify-content: space-between; align-items: center; }
.tp-content { position: relative; display: flex; flex-direction: column; height: 100%; }
.tp-settings {
padding: 8px;
border-bottom: 1px solid var(--border-color-subtle, #eee);
background: var(--background-color-interactive-subtle, #f8f9fa);
font-size: 0.85em;
}
.tp-settings-row { display: flex; gap: 5px; margin-bottom: 5px; align-items: center; }
.tp-body { padding: 10px; max-height: 400px; overflow-y: auto; background: var(--background-color-base, #fff); flex-grow: 1; }
.tp-section-title { font-size: 0.75em; font-weight: bold; color: var(--color-subtle, #72777d); text-transform: uppercase; margin: 12px 0 5px; display: flex; justify-content: space-between; }
.tp-bin { border: 1px solid #c8ccd1; border-radius: 4px; padding: 8px; margin-bottom: 10px; background: var(--background-color-interactive-subtle, #fdfdfd); min-height: 35px; }
.tp-bin.drag-over { background: var(--background-color-progressive-subtle, #eaf3ff); border: 2px solid #36c; }
.tp-item {
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #eaecf0; padding: 6px; margin: 4px 0; font-size: 0.85em; display: flex; justify-content: space-between; cursor: grab; align-items: center; box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.tp-item:hover { border-color: var(--border-color-progressive, #36c); }
.tp-controls {
display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 4px; padding: 8px; border-top: 1px solid #eee;
background: var(--background-color-base, #fff);
}
/* Overlays */
#tp-menu-overlay, #tp-edit-form, #tp-settings-overlay, #tp-route-overlay {
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
z-index: 110;
display: none; flex-direction: column; padding: 15px; border-radius: 0 0 8px 8px;
}
.tp-menu-btn {
display: block; width: 100%; text-align: left; padding: 8px; border: 1px solid #ccc;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122); margin-bottom: 5px; cursor: pointer; border-radius: 4px; font-size: 0.85em;
}
.tp-menu-btn:hover { background: var(--background-color-progressive-subtle, #f0f4ff); border-color: #36c; color: #36c; }
.tp-form-row { margin-bottom: 8px; display: flex; flex-direction: column; font-size: 0.8em; }
.tp-form-row input, .tp-form-row textarea {
padding: 4px;
border: 1px solid var(--border-color-subtle, #ccc);
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border-radius: 3px;
}
/* Map & Helpers */
#tp-map-container { position: fixed; top: 60px; left: 60px; right: 420px; bottom: 60px; background: var(--background-color-base, white); border: 2px solid #36c; border-radius: 8px; z-index: 1999; display: none; box-shadow: 0 0 20px rgba(0,0,0,0.4); }
#tp-map-canvas { width: 100%; height: 100%; }
.tp-btn-move, .tp-btn-edit { cursor: pointer; color: var(--color-progressive, #36c); font-size: 10px; border: 1px solid #36c; padding: 1px 4px; border-radius: 3px; }
.tp-remove { color: var(--color-destructive, #d33); cursor: pointer; font-weight: bold; padding: 0 5px; }
.listing-draggable-proxy { cursor: move !important; }
.tp-in-trip::before { content: "✅ "; }
.tp-route-stats {
font-size: 10px;
color: var(--color-subtle, #555);
background: var(--background-color-neutral-subtle, #f0f0f0);
text-align: center; padding: 2px; margin: 2px 10px; border-radius: 4px; border: 1px dashed #ccc;
}
.tp-item-error { border: 2px solid #d33 !important; background: #fff1f0 !important; }
.tp-error-msg { font-size: 0.8em; color: #d33; font-style: italic; margin-top: 2px; }
.tp-setting-block { margin-bottom: 12px; }
.tp-setting-block label { display: block; font-weight: bold; font-size: 0.8em; color: var(--color-subtle, #555); margin-bottom: 3px; }
.tp-setting-block input { width: 100%; padding: 5px; border: 1px solid #ccc; border-radius: 4px; }
.tp-divider { border-bottom: 1px solid var(--border-color-subtle, #eee); margin: 10px 0; }
#tp-minimized-icon {
position: fixed; bottom: 20px; right: 20px;
width: 48px; height: 48px;
background: #36c; color: white;
border-radius: 50%;
text-align: center; line-height: 48px; font-size: 24px;
box-shadow: 0 4px 12px rgba(0,0,0,0.4);
cursor: pointer; z-index: 2000;
transition: transform 0.1s;
user-select: none;
}
#tp-minimized-icon:hover { transform: scale(1.1); background: #2a5ab0; }
#tp-widget .mw-ui-button { font-size: 0.8em; font-weight: bold; padding: 4px 8px; min-height: 24px; line-height: 1.4; width: 100%; }
#tp-new-trip, #tp-open-settings { padding: 3px 8px; min-width: auto; width: auto !important; }
/* MOBILE / TOUCHSCREEN OPTIMIZATIONS */
@media (max-width: 1200px) and (pointer: coarse) {
/*#tp-widget {
width: 100% !important;
left: 0 !important; right: 0 !important;
bottom: 0 !important;
border-radius: 8px 8px 0 0 !important;
max-height: 80vh;
transition: transform 0.3s;
z-index: 2000;
box-shadow: 0 -2px 10px rgba(0,0,0,0.2) !important;
}
#tp-body {
max-height: 15em;
} */
/* 2. FULLSCREEN MAP MODE */
/* Hide widget when map is open to give full screen to map */
/* body.tp-mobile-map-open #tp-widget {
display: none !important;
} */
/* Map covers 100% of viewport */
body.tp-mobile-map-open #tp-map-container {
display: block !important;
position: fixed !important;
top: 0 !important; left: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important;
border-radius: 0 !important;
z-index: 2001 !important; /* Above everything */
}
/* Large, Touch-Friendly Close Button */
body.tp-mobile-map-open #tp-map-hide {
display: block !important;
top: 15px !important;
right: 15px !important;
background: white !important;
color: #333 !important;
padding: 10px 20px !important; /* Larger touch target */
border-radius: 4px !important;
box-shadow: 0 2px 8px rgba(0,0,0,0.3) !important;
font-weight: bold !important;
font-size: 16px !important;
border: 1px solid #ccc !important;
}
/* 3. Mobile "Tap to Add" Button */
.tp-mobile-add {
display: inline-block;
padding: 6px 12px;
background: #eaf3ff;
color: #36c;
border: 1px solid #36c;
border-radius: 16px;
margin: 4px 0 4px 8px;
font-weight: bold;
cursor: pointer;
font-size: 0.9em;
white-space: nowrap;
}
.tp-mobile-add:active { background: #36c; color: white; }
}
/* --- FULL MODE / SPLIT SCREEN STYLES --- */
.tp-full-app {
display: flex; flex-direction: column;
height: 80vh; min-height: 600px;
border: 1px solid #a2a9b1; border-radius: 8px; overflow: hidden;
background: var(--background-color-base, #fff); color: var(--color-base, #202122);
font-family: sans-serif;
}
.tp-full-app * { box-sizing: border-box; }
.tp-full-topbar {
display: flex; gap: 10px; align-items: center; padding: 10px 15px;
background: #f8f9fa; border-bottom: 1px solid #eee; flex-wrap: wrap;
}
.tp-full-topbar .tp-setting-block { margin-bottom: 0; display: flex; align-items: center; gap: 5px; }
.tp-full-topbar .tp-setting-block label { margin-bottom: 0; }
.tp-full-split {
display: flex; flex-grow: 1; overflow: hidden; position: relative;
}
.tp-full-sidebar {
flex-shrink: 0; max-width: 360px;
overflow-y: auto; padding: 10px;
border-right: 1px solid #eee;
background: var(--background-color-base, #fff);
}
@media (max-width: 720px) {
.tp-full-app {
height: auto;
min-height: auto;
}
.tp-full-split {
flex-direction: column;
overflow: visible;
}
.tp-full-sidebar {
max-width: 100%;
height: 350px;
border-right: none;
border-bottom: 1px solid #eee;
}
.tp-full-main {
height: 80vh;
min-height: 500px;
flex-grow: 1;
position: relative;
}
}
.tp-full-main {
flex-grow: 1; position: relative;
}
.tp-full-main #tp-map-container {
/* Override fixed positioning when inside full mode */
position: absolute !important; top: 0 !important; left: 0 !important;
right: 0 !important; bottom: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important; border-radius: 0 !important; box-shadow: none !important;
z-index: 10 !important; display: block !important;
}
.tp-full-main #tp-map-hide {
display: none !important; /* Hide map close button in full mode */
}
`);
},
drawUI: function () {
const isFullMode = $('#trip-planner-app').length > 0;
// 1. Handle "Closed" state (Launcher in user menu)
if (this.data.closed && !isFullMode) {
$('#tp-widget, #tp-minimized-icon').remove();
$('#tp-map-container').hide().detach().appendTo('body');
this.drawLauncher();
return;
} else {
$('.tp-launcher-icon, #tp-launcher-li').remove();
$('#tp-launcher').remove();
}
// 2. Handle "Minimized" state (Floating Icon)
if (this.data.minimized && !isFullMode) {
$('#tp-widget').remove();
$('#tp-map-container').hide().detach().appendTo('body');
$('body').append(`<div id="tp-minimized-icon" title="Expand Trip Planner">🎒</div>`);
return;
}
// 3. Handle "Open" state
$('#tp-widget, #tp-minimized-icon').remove();
// Detach map container before resetting app
const $mapContainer = $('#tp-map-container').detach();
if (isFullMode) {
$('#trip-planner-app').empty();
}
const trip = this.getActiveTrip();
if (this.lastActiveTrip && this.lastActiveTrip !== trip) {
if (this.routeLayer) {
this.routeLayer.clearLayers();
}
this.cachedRoutes = {};
$('.tp-route-stats').remove();
}
this.lastActiveTrip = trip;
let dayOptions = "";
trip.days.forEach((d, i) => {
dayOptions += `<option value="${i}">Day ${i + 1}</option>`;
});
const safeName = mw.html.escape(trip.name);
const safeKey = mw.html.escape(this.data.orsKey || '');
const helpUrl = mw.util.getUrl('Wikivoyage:Trip_Planner');
const fullModeUrl = mw.util.getUrl('Trip Planner');
let $widget;
if (isFullMode) {
$widget = $(`
<div class="tp-full-app">
<div class="tp-full-topbar">
<div class="tp-setting-block" style="margin-right:15px">
<label>Trip:</label>
<select id="tp-select-trip" style="padding:4px; max-width:150px; border:1px solid #ccc; border-radius:4px;"></select>
<button id="tp-new-trip" class="mw-ui-button" title="New Trip" style="padding:3px 8px; min-width:auto">+</button>
</div>
<div class="tp-setting-block" style="flex-grow:1; flex-basis: 250px">
<label>Name:</label>
<input type="text" id="tp-rename-input" value="${safeName}">
</div>
<div class="tp-setting-block">
<label>Start:</label>
<input type="date" id="tp-start-date" value="${trip.startDate}" style="width:130px">
</div>
<div class="tp-setting-block" style="margin-right:15px">
<label>Days:</label>
<input type="number" id="tp-length" value="${trip.length}" min="1" style="width:60px">
</div>
<div>
<button id="tp-btn-route" class="mw-ui-button">🚗 Route</button>
<button id="tp-btn-export" class="mw-ui-button">💾 Save...</button>
<button id="tp-import" class="mw-ui-button">📂 Load</button>
<button id="tp-del-trip" class="mw-ui-button mw-ui-destructive mw-ui-quiet" title="Delete Trip" style="padding:4px 8px; min-width:auto; margin-left:auto;">🗑️</button>
</div>
</div>
<div class="tp-full-split">
<div class="tp-full-sidebar tp-body" style="max-height:none">
<div class="tp-section-title" style="border-bottom: 1px solid #ccc; padding-bottom: 4px; margin-bottom: 10px;">
<span>🗂️ Buckets</span>
<div>
<span class="tp-btn-edit" id="tp-add-bucket" title="Add custom bucket">+ Bucket</span>
</div>
</div>
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-full-main" id="tp-map-container-wrapper">
</div>
</div>
<div id="tp-menu-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-menu-title">Menu</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancel</button>
</div>
<div id="tp-edit-form" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-form-title">Edit Entry</b>
<div class="tp-form-row"><label>Title</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Lat</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Lon</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="e.g. Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Fetch Title & Coordinates">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Note</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Source Page</label><input type="text" id="f-source" placeholder="e.g. Rome"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Save</button>
<button class="mw-ui-button" id="f-cancel">Cancel</button>
</div>
</div>
<div id="tp-route-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b style="margin-bottom:10px; display:block">Route Calculator</b>
<div class="tp-setting-block">
<label>ORS API Key <a href="https://openrouteservice.org/dev/#/signup" target="_blank" style="font-weight:normal; font-size:0.9em">(Get Free Key)</a></label>
<input type="text" id="tp-ors-key" placeholder="Paste key here..." value="${safeKey}">
</div>
<div class="tp-setting-block">
<label>Travel Mode</label>
<div style="display:flex; gap:5px">
<select id="tp-route-profile" style="flex: 1; padding:5px; border:1px solid #ccc; border-radius:4px">
<option value="foot-walking">🚶 Walking</option>
<option value="driving-car">🚗 Driving (Car)</option>
</select>
<button id="tp-run-route" class="mw-ui-button mw-ui-progressive" style="flex:1">Calculate Routes</button>
</div>
</div>
<div class="tp-divider"></div>
<div class="tp-setting-block">
<label>Optimize Day Order</label>
<div style="display:flex; gap:5px">
<select id="tp-opt-day" style="flex:1; padding:5px; border:1px solid #ccc; border-radius:4px">
${dayOptions}
</select>
<button id="tp-run-opt" class="mw-ui-button" style="flex:1">Optimize</button>
</div>
<div style="font-size:0.75em; color:#666; margin-top:2px">Keeps 1st item fixed, reorders the rest.</div>
</div>
<button id="tp-close-route" class="mw-ui-button" style="margin-top:auto; width:100%">Close</button>
</div>
</div>
`);
$('#trip-planner-app').append($widget);
// Move map container into its Full Mode wrapper
$mapContainer.appendTo($widget.find('#tp-map-container-wrapper')).show();
// Refresh map layout immediately as it might have been moved/resized
if (this.map) {
setTimeout(() => {
this.map.invalidateSize();
this.updateMapMarkers(true); // pass true to fit bounds
}, 200); // slightly longer timeout to ensure DOM catch-up
}
} else {
$widget = $(`
<div id="tp-widget">
<div class="tp-header">
<span id="tp-toggle" style="flex-grow:1">🎒 Trip Planner</span>
<span>
<a href="${helpUrl}" target="_blank" style="color:white; text-decoration:none; font-weight:bold; cursor:pointer;" title="Help / Documentation">?</a>
<span id="tp-toggle-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Minimize to Icon">-</span>
<span id="tp-close-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Close">✕</span>
</span>
</div>
<div class="tp-content" style="display: block; position:relative">
<div id="tp-menu-overlay">
<b id="tp-menu-title">Menu</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancel</button>
</div>
<div id="tp-edit-form">
<b id="tp-form-title">Edit Entry</b>
<div class="tp-form-row"><label>Title</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Lat</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Lon</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="e.g. Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Fetch Title & Coordinates">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Note</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Source Page</label><input type="text" id="f-source" placeholder="e.g. Rome"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Save</button>
<button class="mw-ui-button" id="f-cancel">Cancel</button>
</div>
</div>
<div class="tp-settings">
<div class="tp-settings-row">
<select id="tp-select-trip" style="flex-grow:1"></select>
</div>
</div>
<div class="tp-body">
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-controls" style="grid-template-columns: 1fr;">
<a href="${fullModeUrl}" class="mw-ui-button mw-ui-progressive" style="text-align:center; text-decoration:none; display:block">🗺️ Open Full Trip Planner</a>
</div>
</div>
<input type="file" id="tp-file-input" style="display:none" accept=".json">
</div>
`);
$('body').append($widget);
// Keep map detached/hidden in Widget Mode
$mapContainer.hide().appendTo('body');
}
if ($('#tp-file-input').length === 0) {
$('body').append('<input type="file" id="tp-file-input" style="display:none" accept=".json">');
}
this.renderTripOptions();
this.renderBins();
if (!isFullMode) {
$('body').removeClass('tp-mobile-map-open');
}
if (isFullMode && this.map) {
this.updateMapMarkers();
}
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updateWidgetButtonsVisibility: function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) {
// Hide day action buttons that are injected constantly in renderBins
$('#tp-widget .tp-btn-move').hide();
$('#tp-widget .tp-edit-bucket').hide();
$('#tp-widget .tp-remove-bucket').hide();
$('#tp-widget .tp-add-custom-btn').hide();
}
},
drawLauncher: function () {
createLauncherIcon(() => {
this.data.closed = false;
this.saveAndRefresh();
});
},
renderTripOptions: function () {
const $select = $('#tp-select-trip').empty();
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
this.data.trips.forEach((t, i) => $select.append($('<option>', { value: i, text: t.name, selected: i === currentIdx })));
},
renderBins: function () {
const isFullMode = $('#trip-planner-app').length > 0;
const trip = this.getActiveTrip();
// Render all buckets
const $bucketsContainer = $('#tp-buckets-container').empty();
trip.buckets.forEach(b => {
const isBacklog = b.id === 'backlog';
const $bucketBlock = $(`
<div class="tp-section-title tp-bucket-header" data-bucket-id="${b.id}">
<span class="tp-bucket-title-text" style="cursor: pointer;" title="Click to highlight on map, double-click to edit/rename">${b.icon} ${b.name}</span>
<div>
${isFullMode ? `
<span class="tp-btn-edit tp-add-custom-btn" data-bucket-id="${b.id}">+ POI</span>
<span class="tp-btn-move" data-move-type="bucket" data-bucket-id="${b.id}">Move</span>
<span class="tp-btn-edit tp-edit-bucket" data-bucket-id="${b.id}" title="Edit/Rename Bucket">✏️</span>
${!isBacklog ? `<span class="tp-remove tp-remove-bucket" data-bucket-id="${b.id}" title="Delete Bucket" style="font-weight:bold; margin-left:5px">×</span>` : ''}
` : `
<span class="tp-btn-edit tp-add-article-btn" data-bucket-id="${b.id}" title="Add current article as destination">+ Article</span>
`}
</div>
</div>
<div class="tp-bin tp-bucket-bin" data-type="bucket" data-bucket-id="${b.id}"></div>
`);
b.items.forEach((item, idx) => {
$bucketBlock.filter('.tp-bucket-bin').append(this.createItemHTML(item, 'bucket', idx, b.id));
});
$bucketsContainer.append($bucketBlock);
});
// Render days
const $daysContainer = $('#tp-days-container').empty();
trip.days.forEach((day, dIdx) => {
const dayDate = new Date(trip.startDate);
dayDate.setDate(dayDate.getDate() + dIdx);
const $dayBlock = $(`
<div class="tp-section-title" style="color:${this.colors[dIdx % this.colors.length]}">
Day ${dIdx + 1} (${dayDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })})
${isFullMode ? `<span class="tp-btn-move" data-move-type="day" data-day-idx="${dIdx}">Move</span>` : ''}
</div>
<div class="tp-bin tp-day-bin" data-type="day" data-day-idx="${dIdx}"></div>
`);
day.items.forEach((item, iIdx) => {
$dayBlock.filter('.tp-day-bin').append(this.createItemHTML(item, 'day', iIdx, dIdx));
});
$daysContainer.append($dayBlock);
});
if (isFullMode)
this.updateMapMarkers();
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updatePageIndicators: function () {
const thiss = this;
const trip = this.getActiveTrip();
const allItems = [...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)];
// Create Sets for fast lookup (Wikidata ID or Lat,Lon string)
const wdSet = new Set(allItems.map(i => i.wikidata).filter(Boolean));
const locSet = new Set(allItems.map(i => i.lat + "," + i.lon));
$('.vcard').each(function () {
const $l = $(this);
// Extract same data as draggable logic
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
const wdId = $l.find('[id]').filter(function () { return /^Q\d+$/.test(this.id); }).attr('id');
// Check if this listing is in our data
const isPresent = (wdId && wdSet.has(wdId)) ||
(lat && lon && locSet.has(thiss.parseCoordinate(lat) + "," + thiss.parseCoordinate(lon)));
if (isPresent) $l.addClass('tp-in-trip');
else $l.removeClass('tp-in-trip');
});
},
createItemHTML: function (item, type, idx, binIdOrIdx) {
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
const orderHtml = (type === 'day')
? `<span style="color:#555; margin-right:6px; min-width:15px;">${idx + 1}.</span>`
: '';
return $(`
<div class="tp-item" draggable="true" data-type="${type}" data-idx="${idx}" data-bin-id="${binIdOrIdx}">
${orderHtml}
<div style="display:flex; flex-direction:column; overflow:hidden; flex-grow:1; margin-right:5px">
<span style="overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:bold" title="${safeTitle}">${safeTitle}</span>
${safeNote ? `<span style="font-size:0.75em; color:#666; overflow:hidden; text-overflow:ellipsis; white-space:nowrap">${safeNote}</span>` : ''}
</div>
<span style="display:flex; align-items:center; flex-shrink:0">
<span class="tp-btn-edit item-edit-trigger" style="border:none; padding:0 3px; font-size:1.1em">✏️</span>
${item.sourcePage ? `<a href="${url}" target="_blank" style="text-decoration:none; margin:0 3px">🔗</a>` : ''}
<span class="tp-remove">×</span>
</span>
</div>
`);
},
showMenu: function (title, options) {
$('#tp-menu-title').text(title);
const $cont = $('#tp-menu-content').empty();
options.forEach(opt => {
if (opt.header) {
$cont.append(`
<div style="
font-weight: bold;
color: #555;
margin: 12px 0 4px 0;
border-bottom: 1px solid #eee;
padding-bottom: 2px;
font-size: 0.9em;
">${mw.html.escape(opt.header)}</div>
`);
return;
}
// Standard Buttons
const $btn = $(`<button class="tp-menu-btn">${opt.label}</button>`);
if (opt.disabled) {
$btn.prop('disabled', true).css({ opacity: 0.6, cursor: 'not-allowed', background: '#f8f8f8', color: '#888' });
if (opt.helpText) {
$btn.append(`<div style="font-size:0.8em; font-style:italic; margin-top:2px">${opt.helpText}</div>`);
}
} else {
$btn.on('click', () => { opt.action(); $('#tp-menu-overlay').hide(); });
}
$cont.append($btn);
});
$('#tp-menu-overlay').css('display', 'flex');
},
exportData: function (format) {
const trip = this.getActiveTrip();
let content = "", mime = "text/plain", ext = "txt";
switch (format) {
case 'trip':
content = JSON.stringify(trip, null, 2);
mime = "application/json";
ext = "json";
break;
case 'all':
const cleanData = {
trips: this.data.trips
};
content = JSON.stringify(cleanData, null, 2);
mime = "application/json";
ext = "json";
break;
case 'gpx':
content = `<?xml version="1.0" encoding="UTF-8"?><gpx version="1.1" creator="WVPlanner">`;
[...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)].forEach(i => { if (i.lat) content += `<wpt lat="${i.lat}" lon="${i.lon}"><name>${i.title}</name></wpt>`; });
content += `</gpx>`;
mime = "application/gpx+xml";
ext = "gpx";
break;
case 'wiki':
trip.days.forEach((d, idx) => {
content += `\n=== Day ${idx + 1} ===\n`;
d.items.forEach(i => content += `* {{listing|name=${i.title}|lat=${i.lat}|long=${i.lon}|wikidata=${i.wikidata || ''}|content=${i.note || ''}}}\n`);
});
break;
case 'geojson-full':
var fc = { type: "FeatureCollection", features: [] };
// 1. Flatten all items (Buckets + all Days)
var allItems = trip.buckets.flatMap(b => b.items).concat(trip.days.reduce(function (acc, d) {
return acc.concat(d.items);
}, []));
// 2. Add Points (Listings)
allItems.forEach(function (i) {
if (i.lat && i.lon) {
fc.features.push({
type: "Feature",
geometry: { type: "Point", coordinates: [i.lon, i.lat] },
properties: {
name: i.title,
note: i.note || "",
wikidata: i.wikidata,
day: i.day !== undefined ? i.day + 1 : 'bucket'
}
});
}
});
// 3. Add Lines (Routes) from Leaflet Layer using concat
if (this.routeLayer && window.L) {
var routes = this.routeLayer.toGeoJSON();
if (routes && routes.features) {
fc.features = fc.features.concat(routes.features);
}
}
content = JSON.stringify(fc, null, 2);
mime = "application/geo+json";
ext = "geojson";
break;
}
const blob = new Blob([content], { type: mime });
const a = document.createElement('a'); a.href = URL.createObjectURL(blob);
a.download = `${trip.name.replace(/\s/g, '_')}.${ext}`; a.click();
},
setupListeners: function () {
const self = this;
const thiss = this;
$(document).on('click', '#tp-minimized-icon', function () {
self.data.minimized = false;
self.saveAndRefresh();
});
// Settings Overlay Toggles
$(document).on('click', '#tp-open-settings', () => $('#tp-settings-overlay').css('display', 'flex'));
$(document).on('click', '#tp-close-settings', () => {
$('#tp-settings-overlay').hide();
self.saveAndRefresh(); // Ensure changes (like rename) reflect in the main UI immediately
});
// NEW: Rename Logic
$(document).on('change', '#tp-rename-input', function () {
self.getActiveTrip().name = $(this).val();
self.save(); // Just save, don't redraw whole UI yet (wait for Close)
});
// Move Trip Logic
$(document).on('click', '.tp-btn-move', function () {
const moveType = $(this).data('move-type'); // 'bucket' or 'day'
const bucketId = $(this).data('bucket-id'); // if bucket
const sourceDayIdx = $(this).data('day-idx') !== undefined ? parseInt($(this).data('day-idx')) : -1;
const currentTripIdx = self.data.activeTripIndex;
const currentTrip = self.getActiveTrip();
let menuOptions = [];
// Helper to perform the move
const performMove = (targetTrip, targetType, targetBinIdOrIdx) => {
let items;
// Cut
if (moveType === 'bucket') {
const bucket = currentTrip.buckets.find(b => b.id === bucketId);
items = bucket ? bucket.items.splice(0) : [];
} else {
items = currentTrip.days[sourceDayIdx].items.splice(0);
}
// Paste
if (targetType === 'bucket') {
const targetBucket = targetTrip.buckets.find(b => b.id === targetBinIdOrIdx);
if (targetBucket) targetBucket.items.push(...items);
} else {
targetTrip.days[targetBinIdOrIdx].items.push(...items);
}
self.saveAndRefresh();
};
// Helper to add options for a specific trip
const addTripOptions = (trip, isCurrent) => {
let addedHeader = false;
const ensureHeader = () => {
if (!addedHeader) {
menuOptions.push({ header: isCurrent ? "Current Trip" : trip.name });
addedHeader = true;
}
};
// 1. Bucket Options
trip.buckets.forEach(b => {
// Show if: It's another trip OR (It's current trip AND we aren't already in this specific bucket)
if (!isCurrent || moveType !== 'bucket' || b.id !== bucketId) {
ensureHeader();
menuOptions.push({
label: `${b.icon} ${b.name}`,
action: () => performMove(trip, 'bucket', b.id)
});
}
});
// 2. Day Options
trip.days.forEach((day, dIdx) => {
// Show if: It's another trip OR (It's current trip AND we aren't in this specific day)
if (!isCurrent || (moveType !== 'day' || dIdx !== sourceDayIdx)) {
ensureHeader();
menuOptions.push({
label: `➡ Day ${dIdx + 1}`,
action: () => performMove(trip, 'day', dIdx)
});
}
});
};
// A. Process Current Trip First
addTripOptions(currentTrip, true);
// B. Process Other Trips
self.data.trips.forEach((trip, tIdx) => {
if (tIdx === currentTripIdx) return;
addTripOptions(trip, false);
});
if (menuOptions.length === 0) {
alert("No destinations available.");
} else {
const title = (moveType === 'bucket') ? `Move Bucket Items to:` : `Move Day ${sourceDayIdx + 1} Items to:`;
self.showMenu(title, menuOptions);
}
});
// Save Menu Logic
$(document).on('click', '#tp-btn-export', () => {
const hasRoutes = self.routeLayer && window.L && self.routeLayer.getLayers().length > 0;
self.showMenu("Export Format:", [
{ label: "Current Trip (JSON)", action: () => self.exportData('trip') },
{ label: "All Data Backup (JSON)", action: () => self.exportData('all') },
{ label: "GPS File (GPX)", action: () => self.exportData('gpx') },
{ label: "Wikivoyage Text (WikiText)", action: () => self.exportData('wiki') },
{
label: "Trip + Routes (GeoJSON)",
action: () => self.exportData('geojson-full'),
disabled: !hasRoutes,
helpText: !hasRoutes ? "(Calculate routes first to enable)" : ""
}
]);
});
$(document).on('click', '#tp-menu-close', () => $('#tp-menu-overlay').hide());
// Add / Edit Forms
$(document).on('click', '#tp-add-article, .tp-add-article-btn', function () {
const bucketId = $(this).data('bucket-id') || 'backlog';
const pageName = mw.config.get('wgPageName');
const wdId = mw.config.get('wgWikibaseItemId');
if (!wdId) return alert("This page has no Wikidata ID.");
self.fetchWikidata(wdId, pageName, (item) => {
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId) || trip.buckets[0];
if (bucket) {
bucket.items.push(item);
self.saveAndRefresh();
mw.notify(`Added article: ${item.title}`);
}
}).fail(() => alert("Failed to fetch article data."));
});
$(document).on('click', '#f-fetch-wd', function () {
const id = $('#f-wikidata').val().trim().toUpperCase();
if (!/^Q\d+$/.test(id)) {
return;
}
const $btn = $(this);
const originalText = $btn.text();
$btn.text('⏳').prop('disabled', true);
self.fetchWikidata(id, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
})
.fail(err => alert(err.message || "Fetch failed."))
.always(function () {
$btn.text(originalText).prop('disabled', false);
});
});
let editingRef = null;
$(document).on('click', '#tp-add-custom, .tp-add-custom-btn, .item-edit-trigger', function () {
const isNew = $(this).attr('id') === 'tp-add-custom' || $(this).hasClass('tp-add-custom-btn');
if (isNew) {
const bucketId = $(this).data('bucket-id') || 'backlog';
editingRef = { type: 'bucket', idx: -1, binId: bucketId };
} else {
const p = $(this).closest('.tp-item');
editingRef = { type: p.data('type'), idx: p.data('idx'), binId: p.data('bin-id') };
}
const item = isNew ?
{ title: "", lat: "", lon: "", note: "", sourcePage: "" } :
(editingRef.type === 'bucket' ?
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] :
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx]
);
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val(item.note || "");
$('#f-source').val(item.sourcePage || "");
$('#tp-edit-form').css('display', 'flex');
});
$(document).on('click', '#tp-add-bucket', () => {
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Add Custom Bucket',
name: '',
icon: '🗂️',
onSave: function (name, icon) {
const trip = self.getActiveTrip();
const id = 'bucket_' + Math.random().toString(36).substr(2, 9);
trip.buckets.push({
id: id,
name: name,
icon: icon,
items: []
});
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-edit-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId);
if (!bucket) return;
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Edit Bucket: ' + bucket.name,
name: bucket.name,
icon: bucket.icon,
onSave: function (name, icon) {
bucket.name = name;
bucket.icon = icon;
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-remove-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
if (bucketId === 'backlog') {
alert("The default backlog bucket cannot be deleted.");
return;
}
const trip = self.getActiveTrip();
const bucketIdx = trip.buckets.findIndex(b => b.id === bucketId);
if (bucketIdx === -1) return;
const bucket = trip.buckets[bucketIdx];
if (bucket.items.length > 0) {
if (confirm(`Bucket "${bucket.name}" contains ${bucket.items.length} item(s). Move them to Backlog first?`)) {
const backlog = trip.buckets.find(b => b.id === 'backlog');
if (backlog) backlog.items.push(...bucket.items);
} else if (!confirm("Are you sure you want to delete this bucket and ALL its items permanently?")) {
return;
}
}
trip.buckets.splice(bucketIdx, 1);
self.saveAndRefresh();
});
$(document).on('click', '#f-save', () => {
const item = {
title: $('#f-title').val(),
lat: self.parseCoordinate($('#f-lat').val()),
lon: self.parseCoordinate($('#f-lon').val()),
note: $('#f-note').val(),
wikidata: $('#f-wikidata').val(),
sourcePage: $('#f-source').val().trim()
};
if (editingRef.idx === -1) {
const list = (editingRef.type === 'bucket')
? self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items
: self.getActiveTrip().days[parseInt(editingRef.binId)].items;
if (editingRef.insertIdx !== undefined && editingRef.insertIdx !== -1) {
list.splice(editingRef.insertIdx, 0, item);
} else {
list.push(item);
}
} else if (editingRef.type === 'bucket') {
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] = item;
} else {
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx] = item;
}
$('#tp-edit-form').hide(); self.saveAndRefresh();
});
$(document).on('click', '#f-cancel', () => $('#tp-edit-form').hide());
// Widget Basics
$(document).on('click', '#tp-close-btn', function (e) {
e.stopPropagation(); // Prevent triggering the header toggle
self.data.closed = true;
self.saveAndRefresh();
});
$(document).on('click', '#tp-toggle-btn', function (e) {
e.stopPropagation();
self.data.minimized = true;
self.saveAndRefresh();
});
$(document).on('change', '#tp-select-trip', (e) => {
const newIdx = parseInt($(e.target).val());
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
this.drawUI();
} else {
this.data.activeTripIndex = newIdx;
this.saveAndRefresh();
}
});
$(document).on('click', '#tp-new-trip', () => {
const n = prompt("Trip Name?");
if (n) {
self.createNewTrip(n);
const newIdx = self.data.trips.length - 1;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
} else {
this.data.activeTripIndex = newIdx;
}
self.saveAndRefresh();
}
});
// Delete Trip Logic
$(document).on('click', '#tp-del-trip', () => {
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
if (this.data.trips.length > 1 && confirm("Are you sure you want to delete this trip permanently?")) {
this.data.trips.splice(currentIdx, 1);
this.data.activeTripIndex = 0;
this.localTripIndex = 0;
self.migrateData();
this.saveAndRefresh();
} else if (this.data.trips.length <= 1) {
alert("You cannot delete the only remaining trip.");
}
});
$(document).on('change', '#tp-length', (e) => {
const trip = self.getActiveTrip();
const n = Math.max(1, parseInt($(e.target).val()));
if (n < trip.days.length) {
const backlog = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
trip.days.splice(n).forEach(d => backlog.items.push(...d.items));
} else {
while (trip.days.length < n)
trip.days.push({ items: [] });
}
trip.length = n;
self.saveAndRefresh();
});
$(document).on('change', '#tp-start-date', function (e) {
self.getActiveTrip().startDate = $(this).val();
self.saveAndRefresh();
});
$(document).on('click', '.tp-remove', function () {
const p = $(this).closest('.tp-item');
const trip = self.getActiveTrip();
const binType = p.data('type');
const binId = p.data('bin-id');
const idx = p.data('idx');
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
if (bucket) bucket.items.splice(idx, 1);
} else {
trip.days[parseInt(binId)].items.splice(idx, 1);
}
self.saveAndRefresh();
});
$(document).on('click', '#tp-run-opt', () => {
const dayIdx = parseInt($('#tp-opt-day').val());
const profile = $('#tp-route-profile').val(); // Get selected profile
self.optimizeDay(dayIdx, profile);
$('#tp-route-overlay').hide();
});
// D&D
$(document).on('dragenter', '.tp-bin', function (e) { $(this).addClass('drag-over'); });
$(document).on('dragleave', '.tp-bin', function (e) { $(this).removeClass('drag-over'); });
$(document).on('dragover', '.tp-bin', (e) => e.preventDefault());
$(document).on('drop', '.tp-bin', function (e) {
e.preventDefault();
e.stopPropagation();
$(this).removeClass('drag-over');
const self = thiss;
$('.tp-route-stats').remove();
if (self.routeLayer) self.routeLayer.clearLayers();
self.cachedRoutes = {};
const trip = self.getActiveTrip();
const transfer = e.originalEvent.dataTransfer;
let isPoiDrop = false;
let jsonData = transfer.getData('application/json') || transfer.getData('text/plain');
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (item.title && item.lat) {
isPoiDrop = true;
}
} catch (err) { }
}
if (!isPoiDrop) {
const htmlData = transfer.getData('text/html');
const $html = htmlData ? $(htmlData) : $();
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const isWdDrop = rawText && /wikidata\.org/i.test(rawText);
if (!$m.length && !isWdDrop) {
mw.notify("To drag and drop listings, the Trip Planner widget must be opened first on the source page.", { type: 'warn' });
}
}
const binType = $(this).data('type'); // 'bucket' or 'day'
const binId = $(this).data('bucket-id'); // for buckets
const dayIdx = $(this).data('day-idx'); // for days
const targetList = (binType === 'bucket')
? trip.buckets.find(b => b.id === binId).items
: trip.days[parseInt(dayIdx)].items;
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (!item.title || !item.lat) throw "not a POI";
// 1. HANDLE REMOVAL FROM SOURCE
if (item._srcType !== undefined && !e.ctrlKey && !e.shiftKey) {
const srcTrip = self.data.trips[item._srcTripIdx];
if (srcTrip) {
if (item._srcType === 'bucket') {
const srcBucket = srcTrip.buckets.find(b => b.id === item._srcBinId);
if (srcBucket) srcBucket.items.splice(item._srcIdx, 1);
} else {
srcTrip.days[parseInt(item._srcBinId)].items.splice(item._srcIdx, 1);
}
}
// Clean up metadata
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
} else if (item._srcType !== undefined) {
// Duplication mode
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
}
// 2. HANDLE INSERTION
const $targetItem = $(e.target).closest('.tp-item');
if ($targetItem.length && $targetItem.data('idx') !== undefined) {
targetList.splice($targetItem.data('idx'), 0, item);
} else {
targetList.push(item);
}
self.saveAndRefresh();
return;
} catch (e) { /* not JSON listing, continue */ }
}
// .marker from ListingBrowser
const htmlData = transfer.getData('text/html');
if (htmlData) {
const $html = $(htmlData);
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
var pageName = '';
const href = $html.attr('href');
const match = href.match(/.*\/wiki\/(.+)#(Q\d+)/);
const match2 = href.match(/.*\/wiki\/(.+)/);
if (match) {
pageName = decodeURIComponent(match[1]);
} else if (match2) {
pageName = decodeURIComponent(match2[1]);
} else {
pageName = href;
}
if ($m.length && ($m.attr('marker-lat') || $m.attr('marker-wikidata'))) {
targetList.push({
title: $m.attr('marker-name') || $m.text().trim(),
lat: self.parseCoordinate($m.attr('marker-lat')),
lon: self.parseCoordinate($m.attr('marker-long')),
wikidata: $m.attr('marker-wikidata'),
sourcePage: pageName,
note: ""
});
self.saveAndRefresh();
return;
}
}
// Wikidata URL Drop
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const wdUrlMatch = rawText ? rawText.match(/wikidata\.org\/.*?(Q\d+)/i) : null;
if (wdUrlMatch) {
const wdId = wdUrlMatch[1];
const $bin = $(this);
const binType = $bin.data('type');
const binId = $bin.data('bucket-id');
const dayIdx = $bin.data('day-idx');
const $targetItem = $(e.target).closest('.tp-item');
const insertIdx = ($targetItem.length && $targetItem.data('idx') !== undefined) ? parseInt($targetItem.data('idx')) : -1;
mw.notify(`Fetching Wikidata item ${wdId}...`);
self.fetchWikidata(wdId, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val("");
$('#f-source').val("");
editingRef = {
type: binType,
idx: -1,
binId: binType === 'bucket' ? binId : parseInt(dayIdx),
insertIdx: insertIdx
};
$('#tp-edit-form').css('display', 'flex');
}).fail(() => {
mw.notify(`Failed to fetch Wikidata item ${wdId}`, { type: 'error' });
});
return;
}
// Article[/Subarticle]#Qid
if (rawText && rawText.includes('#Q')) {
const match = rawText.match(/.*\/wiki\/(.+)#(Q\d+)/);
if (match) {
const pageName = decodeURIComponent(match[1]);
const wdId = match[2];
self.fetchWikidata(wdId, pageName, (item) => {
targetList.push(item);
self.saveAndRefresh();
}).fail(() => mw.notify("Failed to parse dropped link.", { type: 'error' }));
return;
}
}
});
$(document).on('dragstart', '.tp-item', function (e) {
const p = $(this);
const trip = self.getActiveTrip();
let item;
const binType = p.data('type'); // 'bucket' or 'day'
const binId = p.data('bin-id'); // bucket.id or dayIdx
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
item = bucket ? bucket.items[p.data('idx')] : null;
} else {
item = trip.days[parseInt(binId)].items[p.data('idx')];
}
if (!item) return;
// Add source metadata
const payload = Object.assign({}, item, {
_srcTripIdx: (self.localTripIndex !== null) ? self.localTripIndex : self.data.activeTripIndex,
_srcType: binType,
_srcIdx: p.data('idx'),
_srcBinId: binId
});
e.originalEvent.dataTransfer.setData('application/json', JSON.stringify(payload));
});
$(document).on('click', '.tp-item', function (e) {
// Ignore clicks on action buttons/links
if ($(e.target).closest('.tp-btn-edit, .tp-remove, a').length) {
return;
}
const $item = $(this);
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) return;
const type = $item.data('type');
const idx = parseInt($item.data('idx'));
const binId = $item.data('bin-id');
self.zoomToMapItem(type, idx, binId);
});
// Map & Import
$(document).on('click', '#tp-import', () => $('#tp-file-input').click());
$(document).on('change', '#tp-file-input', function (e) {
const reader = new FileReader();
reader.onload = (ev) => {
const imp = JSON.parse(ev.target.result);
if (imp.trips) {
const defaults = {
activeTripIndex: 0,
minimized: false,
trips: [],
orsKey: self.data.orsKey || ''
};
self.data = $.extend({}, defaults, imp);
}
else if (imp.days) {
self.data.trips.push(imp);
}
self.migrateData();
self.saveAndRefresh();
};
reader.readAsText(e.target.files[0]);
});
$(document).on('click', '#tp-btn-route', () => {
$('#tp-ors-key').val(self.data.orsKey || '');
$('#tp-route-overlay').css('display', 'flex');
});
$(document).on('click', '#tp-close-route', () => $('#tp-route-overlay').hide());
$(document).on('click', '#tp-run-route', () => {
const key = $('#tp-ors-key').val().trim();
const profile = $('#tp-route-profile').val();
if (!key) return alert("API Key is required.");
self.data.orsKey = key;
self.save();
$('#tp-route-overlay').hide();
self.calculateRoutes(profile);
});
$(document).on('click', '.tp-section-title', function (e) {
if ($(e.target).hasClass('tp-btn-move') || $(e.target).hasClass('tp-btn-edit') || $(e.target).hasClass('tp-remove')) return;
const $moveBtn = $(this).find('.tp-btn-move');
const type = $moveBtn.data('move-type');
if (type === 'bucket') {
const bucketId = $moveBtn.data('bucket-id');
self.highlightDay(bucketId, 'bucket');
} else if (type === 'day') {
const idx = $moveBtn.data('day-idx');
if (idx !== undefined) self.highlightDay(parseInt(idx), 'day');
}
});
},
initMap: function () {
if ($('#tp-map-container').length === 0) {
// Initial placement on body, hidden
$('body').append(`
<div id="tp-map-container" style="display:none">
<div id="tp-map-canvas"></div>
</div>
`);
}
if (!this.map) {
this.map = L.map('tp-map-canvas').setView([20, 0], 2); // Default whole-world-ish view
L.tileLayer('https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png').addTo(this.map);
this.map.on('click', () => this.highlightDay(null));
this.routeLayer = L.featureGroup().addTo(this.map);
this.markerLayer = L.featureGroup().addTo(this.map);
if (this.cachedRoutes) {
Object.keys(this.cachedRoutes).forEach(dIdx => {
this.drawRouteLayer(parseInt(dIdx), this.cachedRoutes[dIdx]);
});
}
}
},
// toggleMap removed as per request - map is now persistent in full mode.
/**
* Lazy-loads an image from Wikidata based on QID
*/
loadWikidataImage: function ($container) {
const qid = $container.data('qid');
// Don't fetch if already loaded
if ($container.find('img').length || $container.data('loading')) return;
$container.data('loading', true);
const wdApiUrl = `https://www.wikidata.org/w/api.php?action=wbgetclaims&entity=${qid}&property=P18&format=json&origin=*`;
$.getJSON(wdApiUrl).done(function (data) {
try {
// Dig into Wikidata response for the filename
const claims = data.claims.P18;
if (claims && claims[0].mainsnak.datavalue.value) {
const filename = claims[0].mainsnak.datavalue.value;
// Thumb URL (200px) and Full URL (Original)
const baseUrl = `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(filename)}`;
const thumbUrl = `${baseUrl}?width=200`;
const $img = $('<img>').attr('src', thumbUrl).css({
maxWidth: '100%', maxHeight: '100%', display: 'none', cursor: 'zoom-in'
});
// Wrap in a link to the full-size image
const $link = $('<a>')
.attr({ href: baseUrl, target: '_blank', title: 'View full size' })
.append($img);
$img.on('load', function () {
$container.empty().append($link);
$img.fadeIn();
});
} else {
$container.html('<small style="color:#999">No image available</small>');
}
} catch (e) {
$container.hide();
}
}).fail(function () {
$container.hide();
});
},
/**
* Parses a coordinate string into decimal degrees.
* Supports decimal format and Degrees, Minutes, Seconds (DMS) format.
* @param {string|number} input
* @returns {number} Decimal degrees or NaN
*/
parseCoordinate: function (input) {
if (typeof input === 'number') return input;
if (typeof input !== 'string') return NaN;
let str = input.trim();
if (!str) return NaN;
// 1. Try simple decimal (with optional hemisphere)
// Matches: 48.8566, -48.8566, 48.8566 N, S 48.8566
const decimalMatch = str.match(/^([NSEW])?\s*(-?\d+(?:\.\d+)?)\s*([NSEW])?$/i);
if (decimalMatch) {
let val = parseFloat(decimalMatch[2]);
const h = (decimalMatch[1] || decimalMatch[3] || '').toUpperCase();
if (h === 'S' || h === 'W') val = -Math.abs(val);
if (h === 'N' || h === 'E') val = Math.abs(val);
return val;
}
// 2. Try DMS format
// Matches: 48° 51' 24" N, 48°51′24″S, 48 51 24 N, N 48 51 24, etc.
const dmsMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2})['′\s]+(\d{1,2}(?:\.\d+)?)["″\s]+([NSEW])?$/i);
if (dmsMatch) {
const deg = parseFloat(dmsMatch[2]);
const min = parseFloat(dmsMatch[3]);
const sec = parseFloat(dmsMatch[4]);
const h = (dmsMatch[1] || dmsMatch[5] || '').toUpperCase();
let val = deg + min / 60 + sec / 3600;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 3. Try DM format (no seconds)
const dmMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2}(?:\.\d+)?)['′\s]+([NSEW])?$/i);
if (dmMatch) {
const deg = parseFloat(dmMatch[2]);
const min = parseFloat(dmMatch[3]);
const h = (dmMatch[1] || dmMatch[4] || '').toUpperCase();
let val = deg + min / 60;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 4. Try D [symbols] H
const dSymMatch = str.match(/^([NSEW])?\s*(\d{1,3}(?:\.\d+)?)[°\s]+([NSEW])?$/i);
if (dSymMatch) {
const deg = parseFloat(dSymMatch[2]);
const h = (dSymMatch[1] || dSymMatch[3] || '').toUpperCase();
let val = deg;
if (h === 'S' || h === 'W') val = -val;
return val;
}
return parseFloat(str);
},
updateMapMarkers: function (shouldFitBounds) {
if (!this.markerLayer || !window.L) return;
this.markerLayer.clearLayers();
const trip = this.getActiveTrip();
const bounds = [];
const thiss = this;
const add = (item, color, label, binIdOrIdx, itemIdx, type) => {
if (!item.lat || !item.lon) return;
const icon = L.divIcon({
className: '', // Clear default class to avoid side-effects
html: `<div style="
background: ${color};
color: white;
width: 24px; height: 24px;
border: 2px solid white;
border-radius: 50%;
text-align: center;
line-height: 20px;
font-family: sans-serif;
font-weight: bold;
font-size: 11px;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
box-sizing: border-box;
">${label}</div>`,
iconSize: [24, 24],
iconAnchor: [12, 12], // Center the icon
popupAnchor: [0, -12]
});
// 1. Create Marker
const m = L.marker([item.lat, item.lon], { icon: icon });
m.tpBinId = binIdOrIdx;
m.tpIdx = itemIdx;
m.tpType = type;
m.on('click', (e) => {
// Prevent map background click from firing
L.DomEvent.stopPropagation(e);
this.highlightDay(binIdOrIdx, type);
this.highlightListItem(type, itemIdx, binIdOrIdx);
});
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
// 2. Build Link URL
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
// 3. Prepare Popup HTML (with placeholder for image)
let popupHtml = `<div style="text-align:center">
<b style="font-size:1.1em"><a href="${url}" target="_blank">${safeTitle}</a></b>
${safeNote ? `<br><span style="font-size:0.9em; color:#555">${safeNote}</span>` : ''}
</div>`;
if (item.wikidata) {
popupHtml += `
<div class="wd-img" data-qid="${item.wikidata}" style="min-width:200px; min-height:100px; background:#f0f0f0; margin-top:8px; display:flex; align-items:center; justify-content:center; border-radius:4px;">
<small>Loading Image...</small>
</div>`
}
m.bindPopup(popupHtml);
// 4. Fetch Image on Click (Lazy Load)
if (item.wikidata) {
m.on('popupopen', function (e) {
thiss.loadWikidataImage($(e.popup.getElement()).find('.wd-img'));
});
}
m.addTo(this.markerLayer);
bounds.push([item.lat, item.lon]);
};
trip.buckets.forEach((b) => {
b.items.forEach((item, idx) => {
const label = b.icon || "B";
add(item, "#777", label, b.id, idx, 'bucket');
});
});
// Days: Label is the day number (index + 1)
trip.days.forEach((d, dayIdx) => {
d.items.forEach((item, itemIdx) => {
add(item, this.colors[dayIdx % this.colors.length], itemIdx + 1, dayIdx, itemIdx, 'day');
});
});
if (shouldFitBounds && bounds.length) {
this.map.fitBounds(bounds, { padding: [50, 50] });
}
},
drawRouteLayer: function (dIdx, geojson) {
if (!this.routeLayer || !window.L) return;
const color = this.colors[dIdx % this.colors.length];
const routeGroup = L.geoJSON(geojson, {
style: { color: color, weight: 5, opacity: 0.7 },
onEachFeature: (feature, layer) => {
layer.on('click', (e) => {
L.DomEvent.stopPropagation(e);
this.highlightDay(dIdx);
});
}
});
routeGroup.tpBinId = dIdx;
routeGroup.tpType = 'day';
routeGroup.tpDayIdx = dIdx;
routeGroup.addTo(this.routeLayer);
},
saveAndRefresh: function () {
// Capture scroll position
const $body = $('.tp-body');
const scrollTop = $body.length ? $body.scrollTop() : 0;
this.save();
this.drawUI();
// Restore scroll position
$('.tp-body').scrollTop(scrollTop);
},
createNewTrip: function (n) {
this.data.trips.push({
name: n,
startDate: new Date().toISOString().split('T')[0],
length: 3,
buckets: [
{ id: 'backlog', name: 'Backlog', icon: '📦', items: [] }
],
days: [{ items: [] }, { items: [] }, { items: [] }]
});
this.save();
},
makeListingsDraggable: function () {
const thiss = this;
const pageName = mw.config.get('wgPageName');
const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
//$('.vcard, .listing-metadata, .mw-kartographer-maplink').each(function () {
$('.vcard').each(function () {
//console.log($(this));
const $l = $(this);
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
if (lat && lon) {
const wdId = $l.find('[id]').filter(function () {
return /^Q\d+$/.test(this.id);
}).attr('id') || "";
const title = $l.find('.fn, .listing-name').first().text().trim() || $l.text().trim();
$l.attr('draggable', 'true').addClass('listing-draggable-proxy');
$l.on('dragstart', (e) => {
const data = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName
};
const json = JSON.stringify(data);
e.originalEvent.dataTransfer.setData('application/json', json);
e.originalEvent.dataTransfer.setData('text/plain', json);
});
if (isTouch && $l.find('.tp-mobile-add').length === 0) {
const $btn = $('<span class="tp-mobile-add">+ Trip</span>');
$btn.on('click', (e) => {
e.preventDefault();
e.stopPropagation(); // Stop Wikivoyage from opening the map/listing details
const item = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName,
note: ""
};
const trip = thiss.getActiveTrip();
const backlogBucket = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
backlogBucket.items.push(item);
thiss.saveAndRefresh();
mw.notify(`Added "${title}" to Trip Backlog`);
});
// Insert button next to the Listing Name
const $nameTarget = $l.find('.listing-name, .fn').first();
if ($nameTarget.length) {
$nameTarget.after($btn);
} else {
$l.prepend($btn);
}
}
}
});
},
calculateRoutes: function (profile) {
const trip = this.getActiveTrip();
// UI Cleanup
$('.tp-route-stats').remove();
$('.tp-item').removeClass('tp-item-error').find('.tp-error-msg').remove();
if (this.routeLayer) this.routeLayer.clearLayers();
this.cachedRoutes = {}; // Clear old cache
mw.notify("Calculating continuous routes...");
// Track the end of the previous leg to link days together
let previousEndItem = null;
const promises = trip.days.map((day, dIdx) => {
// 1. Identify valid items in current day
// We preserve original indices for DOM injection later
const currentDayItems = day.items
.map((item, idx) => Object.assign({}, item, { day: dIdx, idx: idx }))
.filter(i => i.lat && i.lon);
// 2. Construct the routing batch for this day
// Start with the last point of the previous day (if exists) to form the bridge
let routePoints = [];
if (previousEndItem) {
routePoints.push(previousEndItem);
}
routePoints = routePoints.concat(currentDayItems);
// Update the tracker: The last item of this day becomes the start for the next non-empty day
if (currentDayItems.length > 0) {
previousEndItem = currentDayItems[currentDayItems.length - 1];
}
// 3. Check if we have enough points to form a line
if (routePoints.length < 2) {
return Promise.resolve();
}
// 4. API Request
const coords = routePoints.map(i => [i.lon, i.lat]);
return $.ajax({
method: "POST",
url: `https://api.openrouteservice.org/v2/directions/${profile}/geojson`,
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ coordinates: coords })
}).then((resp) => {
this.cachedRoutes[dIdx] = resp;
// Draw Line (Colored by the Current Day)
if (this.routeLayer && window.L) {
this.drawRouteLayer(dIdx, resp);
}
// Inject Stats
const segments = resp.features[0].properties.segments;
segments.forEach((seg, sIdx) => {
// Map the segment back to our batch items
const startItem = routePoints[sIdx];
const endItem = routePoints[sIdx + 1];
const dist = seg.distance > 1000 ? (seg.distance / 1000).toFixed(1) + " km" : Math.round(seg.distance) + " m";
const time = seg.duration > 3600
? Math.floor(seg.duration / 3600) + "h " + Math.round((seg.duration % 3600) / 60) + "m"
: Math.round(seg.duration / 60) + " min";
const html = `<div class="tp-route-stats">⬇️ ${dist} / ${time} ⬇️</div>`;
if (startItem.day === endItem.day) {
// Intra-day travel: Inject between items
$(`.tp-day-bin[data-day-idx="${startItem.day}"] .tp-item[data-idx="${startItem.idx}"]`).after(html);
} else {
// Inter-day travel: Inject at the bottom of the previous day's bin
// This visually represents "Travel after finishing Day X, before Day Y"
$(`.tp-bin[data-day-idx="${startItem.day}"]`).append(html);
}
});
}).catch(err => {
console.error(`Routing Error (Day ${dIdx + 1}):`, err);
let msg = "Routing failed.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Try to extract coordinate index from message like "...coordinate 3: ..."
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
const item = routePoints[coordIdx];
if (item) {
const $itemEl = $(`.tp-day-bin[data-day-idx="${item.day}"] .tp-item[data-idx="${item.idx}"]`);
$itemEl.addClass('tp-item-error');
if ($itemEl.find('.tp-error-msg').length === 0) {
$itemEl.find('div:first').append(`<div class="tp-error-msg">⚠️ Point not routable</div>`);
}
msg = `Point "${item.title}" is not routable. Try moving it or removing it.`;
}
}
}
} catch (e) { console.error("Error parsing response", e); }
}
mw.notify(msg, { type: 'error' });
});
});
Promise.all(promises).then(() => {
// Route calculation complete
});
},
optimizeDay: function (dayIdx, profile) {
const day = this.getActiveTrip().days[dayIdx];
const items = day.items;
if (items.length < 3) return mw.notify("Need at least 3 items to optimize.");
if (!this.data.orsKey) return alert("API Key missing.");
// 1. Prepare Payload
// Fixed Start: The first item in the list
const startItem = items[0];
// Jobs: All subsequent items
const jobs = items.slice(1).map((item, index) => ({
id: index + 1, // Use original index as ID (offset by 1 because we sliced)
location: [item.lon, item.lat],
service: 300 // Assume 5 min stop per POI (optional, helps calc ETA)
}));
// Vehicle: Starts at item[0]
const vehicles = [{
id: 1,
profile: profile,
start: [startItem.lon, startItem.lat],
// For a round-trip, add: end: [startItem.lon, startItem.lat]
}];
mw.notify("Optimizing schedule...");
$.ajax({
method: "POST",
url: "https://api.openrouteservice.org/optimization",
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ jobs: jobs, vehicles: vehicles })
}).done((resp) => {
const steps = resp.routes[0].steps;
// 2. Reconstruct Order
// Start with the fixed first item
const newOrder = [startItem];
// Append items in the order returned by API
steps.forEach(step => {
if (step.type === 'job') {
// step.id corresponds to the index in the original 'items' array
newOrder.push(items[step.id]);
}
});
// Check if all items were visited (API might skip unreachable ones)
if (newOrder.length !== items.length) {
alert("Warning: Some locations were unreachable and removed from the optimized list.");
}
// 3. Save
day.items = newOrder;
this.saveAndRefresh();
mw.notify("Optimization Complete!");
}).fail((err) => {
console.error(err);
let msg = "Optimization failed. Check API Key or constraints.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Similar coordinate matching for optimization errors
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
// In optimizeDay, coordinte 0 is startItem, others are jobs
const item = (coordIdx === 0) ? startItem : items[coordIdx];
if (item) {
$(`.tp-day-bin[data-day-idx="${dayIdx}"] .tp-item[data-idx="${(coordIdx === 0) ? 0 : coordIdx}"]`).addClass('tp-item-error');
msg = `Point "${item.title}" is not routable.`;
}
}
}
} catch (e) { }
}
alert(msg);
});
},
zoomToMapItem: function (type, idx, binIdOrIdx) {
if (!this.map || !this.markerLayer) return;
let targetMarker = null;
this.markerLayer.eachLayer((layer) => {
if (layer.tpType === type && layer.tpBinId === binIdOrIdx && layer.tpIdx === idx) {
targetMarker = layer;
}
});
if (targetMarker) {
const currentZoom = this.map.getZoom();
const targetZoom = Math.max(15, currentZoom);
this.map.setView(targetMarker.getLatLng(), targetZoom);
targetMarker.openPopup();
}
},
highlightListItem: function (type, idx, binIdOrIdx) {
let $targetItem;
if (type === 'bucket') {
$targetItem = $(`.tp-bucket-bin[data-bucket-id="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
} else {
$targetItem = $(`.tp-day-bin[data-day-idx="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
}
if ($targetItem.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetItem.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 30
}, 300);
$targetItem.css({
'transition': 'background 0.3s, border-color 0.3s',
'background': '#fff9c4',
'border-color': '#fbc02d'
});
setTimeout(() => {
$targetItem.css({
'transition': 'background 0.8s, border-color 0.8s',
'background': '',
'border-color': ''
});
setTimeout(() => {
$targetItem.css('transition', '');
}, 800);
}, 1500);
}
},
highlightDay: function (targetIdx, type = 'day') {
if (!this.map) return;
const setOpacity = (layer) => {
let isMatch;
if (targetIdx === null) {
isMatch = true;
} else if (type === 'bucket') {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'bucket');
} else {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'day');
}
const op = isMatch ? 1 : 0.2;
const fillOp = isMatch ? 0.9 : 0.2;
if (layer.setOpacity) {
layer.setOpacity(op);
if (isMatch) layer.setZIndexOffset(1000); else layer.setZIndexOffset(0);
} else if (layer.setStyle) {
layer.setStyle({ opacity: op, fillOpacity: fillOp });
if (isMatch && layer.bringToFront) layer.bringToFront();
}
};
if (this.markerLayer) this.markerLayer.eachLayer(setOpacity);
if (this.routeLayer) this.routeLayer.eachLayer(setOpacity);
$('.tp-section-title').css({ 'background': '', 'transition': '' });
if (targetIdx === null) return;
let $targetHeader;
if (type === 'bucket') {
$targetHeader = $(`.tp-bucket-bin[data-bucket-id="${targetIdx}"]`).prev('.tp-section-title');
} else {
$targetHeader = $(`.tp-day-bin[data-day-idx="${targetIdx}"]`).prev('.tp-section-title');
}
if ($targetHeader.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetHeader.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 10
}, 300);
$targetHeader.css({
'background': '#fff9c4',
'transition': 'background 0.5s'
});
setTimeout(() => {
$targetHeader.css('background', '');
}, 1500);
}
},
fetchWikidata: function (wdId, sourcePage, onDone) {
const lang = mw.config.get('wgContentLanguage') || 'en';
return $.ajax({
url: 'https://www.wikidata.org/w/api.php',
data: {
action: 'wbgetentities',
ids: wdId,
props: 'labels|claims',
languages: lang,
format: 'json',
origin: '*'
},
dataType: 'json'
}).then((data) => {
const entity = data.entities ? data.entities[wdId] : null;
if (!entity || entity.missing) throw new Error("Wikidata item not found.");
// 1. Extract Title (Localized label -> First label -> Fallback)
let title = sourcePage ? sourcePage.replace(/_/g, ' ') : wdId;
if (entity.labels && entity.labels[lang]) {
title = entity.labels[lang].value;
} else {
const keys = Object.keys(entity.labels || {});
if (keys.length > 0) title = entity.labels[keys[0]].value;
}
// 2. Extract Coordinates (P625)
let lat = 0, lon = 0;
const p625 = entity.claims && entity.claims.P625;
if (p625 && p625[0].mainsnak.datavalue) {
lat = p625[0].mainsnak.datavalue.value.latitude;
lon = p625[0].mainsnak.datavalue.value.longitude;
}
onDone({ title, lat, lon, wikidata: wdId, sourcePage: sourcePage || "", note: "" });
});
},
};
function createLauncherIcon(onClickHandler) {
// 1. Prevent Duplicates
if ($('.tp-launcher-icon').length) return;
// 2. Create Icon Element factory
const iconFactory = () => $('<a>')
.addClass('tp-launcher-icon')
.attr('href', '#')
.attr('title', 'Open Trip Planner')
.text('🎒')
.css({
'cursor': 'pointer',
'font-size': '1.2em', 'text-decoration': 'none',
'filter': 'grayscale(0.8) contrast(1) brightness(1.4)'
})
.on('click', function (e) {
e.preventDefault();
onClickHandler(e, $(this));
});
// 4. Insert into DOM (Mobile vs Desktop)
if (mw.config.get('skin') === 'minerva') {
const $icon = iconFactory().css({ 'font-size': '1.5em', 'margin': '0 12px', 'display': 'flex', 'align-items': 'center' });
if ($('#pt-notifications-alert').length == 0) {
// Mobile
$("#page-actions-overflow").before($("<li id=\"tp-launcher-li\" class=\"page-actions-menu__list-item\"></li>").append($icon))
} else {
$('#pt-notifications-alert').parent().before($icon);
}
} else {
$('#pt-notifications-alert').before(iconFactory());
const $sticky = $('.vector-sticky-header-icons');
if ($sticky.length) {
$sticky.prepend(iconFactory().css('margin-right', '10px'));
}
}
}
// lightweight bootstrap
$(function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
// Auto-load in full mode
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
TripPlanner.init();
});
} else {
// Create the initial "Lazy" icon for widget mode
createLauncherIcon(function (e, $btn) {
// Visual feedback
$btn.text('⏳').css('cursor', 'wait');
// Load dependencies on demand
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
// Remove the bootstrap icon/wrapper
// (TripPlanner.drawUI will handle creating the actual widget UI)
$('#tp-launcher-li').remove();
$('.tp-launcher-icon').remove();
// Initialize App
TripPlanner.init();
});
});
}
});
}(mediaWiki, jQuery));
mtt3roj35xd7ohvd3q0nv73jl2lhwkm
255272
255266
2026-07-05T00:23:58Z
Bromoxido
21781
Bromoxido trasladó la página [[MediaWiki:Gadget-TripPlanner.js]] a [[Usuario:Luxbane/Gadget-TripPlanner.js]]: Trasladado para traducción.
255266
javascript
text/javascript
/**
* Wikivoyage Trip Planner Gadget
* ==============================
* A client-side tool for planning trips using Wikivoyage listings.
* Allows users to drag listings from articles into custom buckets or days,
* organize them, view them on a map, and calculate/optimize routes.
*
* CORE FEATURES:
* ------------------
* 1. UI Modes: Dual-mode application:
* - Mini Widget Mode: A floating, minimizable widget suitable for reading articles.
* - Full View Mode: A split-screen full-page interface with a persistent map,
* routing, and bucket controls.
* 2. Data Source & Drag-and-Drop:
* - Drag-and-drop POIs between day/bucket bins.
* - Parses data-lat, data-lon, and wikidata attributes from vcards.
* - Allows wikidata and ListingBrowser as sources too
* 3. Multi-Tab Synchronization:
* - Uses BroadcastChannel to sync trip plans in real-time across all open tabs.
* - Protects local tab UI states (minimized/expanded) during synchronization events.
* 4. Persistence: Dual-mode storage:
* - Anonymous: Uses browser LocalStorage.
* - Logged-in: Uses MediaWiki User Options API ('userjs-wv-trip-planner-*').
* - Auto-merge: Merges local data into account data upon login.
* 5. Mapping: Interactive markers (colored by day) with popup image loading from Wikidata.
* 6. Routing: Integrated with OpenRouteService (ORS) API.
* - Calculates travel time/distance between POIs.
* - Optimizes day itinerary (TSP) using ORS Optimization API.
* - Draws colored route polylines on the map.
* 7. I/O: Import/Export support for JSON, GPX, WikiText ({{listing}}), and GeoJSON.
*
* EXTERNAL SERVICES:
* ------------------
* 1. OpenRouteService (api.openrouteservice.org): Used for routing and optimization.
* Requires a user-provided API Key (stored in settings).
* 2. Wikidata API: Used to fetch thumbnail images for map popups.
* 3. Wikimedia Maps: Tile server for the Leaflet map.
*
* CODE STRUCTURE (Singleton 'TripPlanner'):
* -----------------------------------------
* - Config:
* - storageKey/optionKey: Persistence identifiers.
* - colors: Palette for different days.
*
* - Lifecycle:
* - init(): Entry point after the launcher icon is clicked or auto-run in Full Mode.
* - load()/save(): Handles LocalStorage vs API serialization logic.
*
* - UI Generation:
* - injectStyles(): CSS definitions (Widget, Overlays, Map, Split-Screen).
* - drawUI(): Renders the main widget container and sets up layout modes.
* - renderBins(): Renders the list of items (Custom Buckets + Days).
* - toggleMap(): Lazy-loads Leaflet libraries and renders map container.
*
* - Logic & Handlers:
* - setupListeners(): Central event delegation (Clicks, Drag&Drop, Changes).
* - calculateRoutes(): Orchestrates ORS API calls for routing.
* - optimizeDay(): Orchestrates ORS API calls for ordering.
* - exportData(): Generates file blobs for download.
*
* - Map Helpers:
* - updateMapMarkers(): Draws L.marker/L.divIcon based on current data.
* - highlightDay(): Manages opacity/visibility of specific day layers.
*
* DEPENDENCIES:
* -------------
* - MediaWiki Modules: 'mediawiki.util', 'mediawiki.api', 'mediawiki.user', 'mediawiki.notification'.
* - OOJS UI: 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'.
* - Kartographer: 'ext.kartographer.box' for Leaflet (L) access.
* - jQuery ($).
*/
(function (mw, $) {
'use strict';
if (mw.config.get('wgAction') !== 'view') return;
let BucketEditDialog;
function initOOUI() {
if (BucketEditDialog) return;
BucketEditDialog = function (config) {
BucketEditDialog.super.call(this, config);
};
OO.inheritClass(BucketEditDialog, OO.ui.ProcessDialog);
BucketEditDialog.static.name = 'bucketEditDialog';
BucketEditDialog.static.title = 'Edit Bucket';
BucketEditDialog.static.actions = [
{ action: 'save', label: 'Save', flags: ['primary', 'progressive'] },
{ label: 'Cancel', flags: 'safe' }
];
BucketEditDialog.prototype.initialize = function () {
BucketEditDialog.super.prototype.initialize.call(this);
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.nameInput = new OO.ui.TextInputWidget({
placeholder: 'Enter bucket name (e.g. food, sleep)'
});
this.nameField = new OO.ui.FieldLayout(this.nameInput, {
label: 'Bucket Name',
align: 'top'
});
this.customIconInput = new OO.ui.TextInputWidget({
maxLength: 2
});
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
const buttonItems = presetIcons.map(function (icon) {
return new OO.ui.ButtonOptionWidget({
data: icon,
label: icon,
title: icon
});
});
this.presetSelect = new OO.ui.ButtonSelectWidget({
items: buttonItems
});
const thiss = this;
this.presetSelect.on('select', function (item) {
if (item) {
thiss.customIconInput.setValue(item.getData());
}
});
this.customIconInput.on('change', function (value) {
if (presetIcons.indexOf(value) === -1) {
thiss.presetSelect.selectItem(null);
} else {
const opt = thiss.presetSelect.findItemFromData(value);
if (opt) {
thiss.presetSelect.selectItem(opt);
}
}
});
this.nameInput.on('change', function (value) {
thiss.actions.setAbilities({ save: !!value.trim() });
});
this.presetField = new OO.ui.FieldLayout(this.presetSelect, {
label: 'Choose a Predefined Icon',
align: 'top'
});
this.customIconField = new OO.ui.FieldLayout(this.customIconInput, {
label: 'Icon (emoji or character)',
align: 'top'
});
this.fieldset = new OO.ui.FieldsetLayout();
this.fieldset.addItems([this.nameField, this.presetField, this.customIconField]);
this.content.$element.append(this.fieldset.$element);
this.$body.append(this.content.$element);
};
BucketEditDialog.prototype.getSetupProcess = function (data) {
data = data || {};
return BucketEditDialog.super.prototype.getSetupProcess.call(this, data)
.next(function () {
this.title.setLabel(data.title || 'Edit Bucket');
this.nameInput.setValue(data.name || '');
this.customIconInput.setValue(data.icon || '🗂️');
this.actions.setAbilities({ save: !!(data.name || '').trim() });
const val = data.icon || '🗂️';
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
if (presetIcons.indexOf(val) !== -1) {
const opt = this.presetSelect.findItemFromData(val);
if (opt) {
this.presetSelect.selectItem(opt);
}
} else {
this.presetSelect.selectItem(null);
}
this.onSave = data.onSave;
}, this);
};
BucketEditDialog.prototype.getActionProcess = function (action) {
if (action === 'save') {
const name = this.nameInput.getValue().trim();
const icon = this.customIconInput.getValue().trim();
if (!name) {
return new OO.ui.Process(function () {
alert('Please enter a name for the bucket.');
});
}
const thiss = this;
return new OO.ui.Process(function () {
if (thiss.onSave) {
thiss.onSave(name, icon || '🗂️');
}
thiss.close({ action: action });
});
}
return BucketEditDialog.super.prototype.getActionProcess.call(this, action);
};
}
const TripPlanner = {
storageKey: 'wv-trip-planner',
optionKey: 'userjs-wv-trip-planner',
saveTimer: null,
syncTimer: null,
map: null,
markerLayer: null,
localTripIndex: null, // Isolated tab-local trip selection
data: { activeTripIndex: 0, minimized: false, trips: [] },
colors: ['#d33', '#36c', '#2a7b39', '#f60', '#72309d', '#e2127a', '#00af89'],
init: function () {
if ($('.vcard').length === 0 && $('.listing').length > 0) {
console.warn("TripPlanner: vcard class not found, listings might be un-draggable.");
}
this.load();
if (this.data.trips.length === 0) this.createNewTrip("My First Trip");
this.data.closed = false;
this.data.minimized = false;
this.cachedRoutes = {}
this.injectStyles();
this.initMap(); // Ensure map container and Leaflet exist
this.setupListeners();
this.makeListingsDraggable();
this.drawUI();
this.syncChannel = window.BroadcastChannel ? new BroadcastChannel('wv-trip-planner-sync') : null;
if (this.syncChannel) {
this.syncChannel.onmessage = (msg) => {
if (msg.data.type === 'sync') {
// Preserve local UI state flags
const wasClosed = this.data.closed;
const wasMinimized = this.data.minimized;
this.data = msg.data.data;
this.data.closed = wasClosed;
this.data.minimized = wasMinimized;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.renderTripOptions();
this.renderBins();
this.updateMapMarkers();
// Sync topbar inputs without full redraw
const trip = this.getActiveTrip();
$('#tp-rename-input').val(trip.name);
$('#tp-start-date').val(trip.startDate);
$('#tp-length').val(trip.length);
} else {
this.drawUI();
}
}
};
}
},
load: function () {
const defaults = { activeTripIndex: 0, minimized: false, trips: [], orsKey: '' };
// 1. Read Local Storage (Used for Anon, or for merging after login)
const localStr = localStorage.getItem(this.storageKey);
let localData = null;
if (localStr) {
try {
localData = $.extend({}, defaults, JSON.parse(localStr));
} catch (e) {
console.error("Local load error", e);
}
}
if (mw.user.isAnon()) {
// --- CASE 1: Anonymous User -> Use Local Storage ---
if (localData) this.data = localData;
} else {
// --- CASE 2: Logged In -> Use Account Options ---
const remoteStr = mw.user.options.get(this.optionKey);
let remoteData = {
activeTripIndex: 0, minimized: false, trips: []
};
if (remoteStr) {
try {
$.extend(remoteData, JSON.parse(remoteStr));
} catch (e) { console.error("Remote load error", e); }
}
// --- MERGE LOGIC: If local data exists, merge it into account and clear local ---
if (localData && localData.trips && localData.trips.length > 0) {
// Avoid merging empty default trips if possible
const validLocalTrips = localData.trips.filter(t => {
const hasItemsInBuckets = t.buckets ? t.buckets.some(b => b.items.length > 0) : (t.backlog && t.backlog.length > 0);
return hasItemsInBuckets || t.days.some(d => d.items.length > 0) || t.name !== "My First Trip";
});
if (validLocalTrips.length > 0) {
remoteData.trips = remoteData.trips.concat(validLocalTrips);
// Trigger immediate save to server to persist the merge
this.saveDataToApi(remoteData);
}
// Clear local storage so we don't merge again next reload
localStorage.removeItem(this.storageKey);
}
this.data = remoteData;
if (!this.data.closed)
this.data.closed = false;
}
this.migrateData();
},
migrateData: function () {
if (!this.data || !this.data.trips) return;
this.data.trips.forEach(trip => {
if (!trip.buckets) {
trip.buckets = [
{ id: "backlog", name: "Backlog", icon: "📦", items: trip.backlog || [] }
];
}
delete trip.backlog;
// Ensure every bucket has an id, name, icon, items
trip.buckets.forEach(b => {
if (!b.id) b.id = 'bucket_' + Math.random().toString(36).substr(2, 9);
if (!b.icon) b.icon = '📦';
if (!b.items) b.items = [];
});
});
},
save: function () {
const dataToSave = $.extend(true, {}, this.data);
// cleanup non-persistent flags
delete dataToSave.closed;
delete dataToSave.minimized;
if (dataToSave.trips) {
dataToSave.trips.forEach(trip => {
delete trip.backlog;
});
}
// 1. Sync other tabs (100ms delay)
this.broadcastSync(dataToSave);
if (mw.user.isAnon()) {
// Anon: Save directly to LocalStorage
localStorage.setItem(this.storageKey, JSON.stringify(dataToSave));
} else {
// Logged In: Save to API (Debounced 2s)
clearTimeout(this.saveTimer);
this.saveTimer = setTimeout(() => {
this.saveDataToApi(dataToSave);
}, 2000);
}
},
broadcastSync: function (data) {
if (!this.syncChannel) return;
clearTimeout(this.syncTimer);
this.syncTimer = setTimeout(() => {
this.syncChannel.postMessage({ type: 'sync', data: data });
}, 100);
},
saveDataToApi: function (dataToSave) {
new mw.Api().saveOption(this.optionKey, JSON.stringify(dataToSave))
.fail(function (code, data) { console.error("TripPlanner Sync Error", code, data); });
},
getActiveTrip: function () {
const idx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
return this.data.trips[idx] || this.data.trips[0];
},
injectStyles: function () {
mw.util.addCSS(`
/* --- DESKTOP / DEFAULT STYLES --- */
#tp-widget {
position: fixed; bottom: 10px; right: 10px;
width: 360px;
max-width: 95vw;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #a2a9b1; border-radius: 8px;
z-index: 2000; box-shadow: 0 4px 15px rgba(0,0,0,0.3);
font-family: sans-serif; display: flex; flex-direction: column;
box-sizing: border-box;
}
#tp-widget * { box-sizing: border-box; }
.tp-header { background: #36c; color: white; padding: 10px; border-radius: 8px 8px 0 0; cursor: pointer; display: flex; justify-content: space-between; align-items: center; }
.tp-content { position: relative; display: flex; flex-direction: column; height: 100%; }
.tp-settings {
padding: 8px;
border-bottom: 1px solid var(--border-color-subtle, #eee);
background: var(--background-color-interactive-subtle, #f8f9fa);
font-size: 0.85em;
}
.tp-settings-row { display: flex; gap: 5px; margin-bottom: 5px; align-items: center; }
.tp-body { padding: 10px; max-height: 400px; overflow-y: auto; background: var(--background-color-base, #fff); flex-grow: 1; }
.tp-section-title { font-size: 0.75em; font-weight: bold; color: var(--color-subtle, #72777d); text-transform: uppercase; margin: 12px 0 5px; display: flex; justify-content: space-between; }
.tp-bin { border: 1px solid #c8ccd1; border-radius: 4px; padding: 8px; margin-bottom: 10px; background: var(--background-color-interactive-subtle, #fdfdfd); min-height: 35px; }
.tp-bin.drag-over { background: var(--background-color-progressive-subtle, #eaf3ff); border: 2px solid #36c; }
.tp-item {
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #eaecf0; padding: 6px; margin: 4px 0; font-size: 0.85em; display: flex; justify-content: space-between; cursor: grab; align-items: center; box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.tp-item:hover { border-color: var(--border-color-progressive, #36c); }
.tp-controls {
display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 4px; padding: 8px; border-top: 1px solid #eee;
background: var(--background-color-base, #fff);
}
/* Overlays */
#tp-menu-overlay, #tp-edit-form, #tp-settings-overlay, #tp-route-overlay {
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
z-index: 110;
display: none; flex-direction: column; padding: 15px; border-radius: 0 0 8px 8px;
}
.tp-menu-btn {
display: block; width: 100%; text-align: left; padding: 8px; border: 1px solid #ccc;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122); margin-bottom: 5px; cursor: pointer; border-radius: 4px; font-size: 0.85em;
}
.tp-menu-btn:hover { background: var(--background-color-progressive-subtle, #f0f4ff); border-color: #36c; color: #36c; }
.tp-form-row { margin-bottom: 8px; display: flex; flex-direction: column; font-size: 0.8em; }
.tp-form-row input, .tp-form-row textarea {
padding: 4px;
border: 1px solid var(--border-color-subtle, #ccc);
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border-radius: 3px;
}
/* Map & Helpers */
#tp-map-container { position: fixed; top: 60px; left: 60px; right: 420px; bottom: 60px; background: var(--background-color-base, white); border: 2px solid #36c; border-radius: 8px; z-index: 1999; display: none; box-shadow: 0 0 20px rgba(0,0,0,0.4); }
#tp-map-canvas { width: 100%; height: 100%; }
.tp-btn-move, .tp-btn-edit { cursor: pointer; color: var(--color-progressive, #36c); font-size: 10px; border: 1px solid #36c; padding: 1px 4px; border-radius: 3px; }
.tp-remove { color: var(--color-destructive, #d33); cursor: pointer; font-weight: bold; padding: 0 5px; }
.listing-draggable-proxy { cursor: move !important; }
.tp-in-trip::before { content: "✅ "; }
.tp-route-stats {
font-size: 10px;
color: var(--color-subtle, #555);
background: var(--background-color-neutral-subtle, #f0f0f0);
text-align: center; padding: 2px; margin: 2px 10px; border-radius: 4px; border: 1px dashed #ccc;
}
.tp-item-error { border: 2px solid #d33 !important; background: #fff1f0 !important; }
.tp-error-msg { font-size: 0.8em; color: #d33; font-style: italic; margin-top: 2px; }
.tp-setting-block { margin-bottom: 12px; }
.tp-setting-block label { display: block; font-weight: bold; font-size: 0.8em; color: var(--color-subtle, #555); margin-bottom: 3px; }
.tp-setting-block input { width: 100%; padding: 5px; border: 1px solid #ccc; border-radius: 4px; }
.tp-divider { border-bottom: 1px solid var(--border-color-subtle, #eee); margin: 10px 0; }
#tp-minimized-icon {
position: fixed; bottom: 20px; right: 20px;
width: 48px; height: 48px;
background: #36c; color: white;
border-radius: 50%;
text-align: center; line-height: 48px; font-size: 24px;
box-shadow: 0 4px 12px rgba(0,0,0,0.4);
cursor: pointer; z-index: 2000;
transition: transform 0.1s;
user-select: none;
}
#tp-minimized-icon:hover { transform: scale(1.1); background: #2a5ab0; }
#tp-widget .mw-ui-button { font-size: 0.8em; font-weight: bold; padding: 4px 8px; min-height: 24px; line-height: 1.4; width: 100%; }
#tp-new-trip, #tp-open-settings { padding: 3px 8px; min-width: auto; width: auto !important; }
/* MOBILE / TOUCHSCREEN OPTIMIZATIONS */
@media (max-width: 1200px) and (pointer: coarse) {
/*#tp-widget {
width: 100% !important;
left: 0 !important; right: 0 !important;
bottom: 0 !important;
border-radius: 8px 8px 0 0 !important;
max-height: 80vh;
transition: transform 0.3s;
z-index: 2000;
box-shadow: 0 -2px 10px rgba(0,0,0,0.2) !important;
}
#tp-body {
max-height: 15em;
} */
/* 2. FULLSCREEN MAP MODE */
/* Hide widget when map is open to give full screen to map */
/* body.tp-mobile-map-open #tp-widget {
display: none !important;
} */
/* Map covers 100% of viewport */
body.tp-mobile-map-open #tp-map-container {
display: block !important;
position: fixed !important;
top: 0 !important; left: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important;
border-radius: 0 !important;
z-index: 2001 !important; /* Above everything */
}
/* Large, Touch-Friendly Close Button */
body.tp-mobile-map-open #tp-map-hide {
display: block !important;
top: 15px !important;
right: 15px !important;
background: white !important;
color: #333 !important;
padding: 10px 20px !important; /* Larger touch target */
border-radius: 4px !important;
box-shadow: 0 2px 8px rgba(0,0,0,0.3) !important;
font-weight: bold !important;
font-size: 16px !important;
border: 1px solid #ccc !important;
}
/* 3. Mobile "Tap to Add" Button */
.tp-mobile-add {
display: inline-block;
padding: 6px 12px;
background: #eaf3ff;
color: #36c;
border: 1px solid #36c;
border-radius: 16px;
margin: 4px 0 4px 8px;
font-weight: bold;
cursor: pointer;
font-size: 0.9em;
white-space: nowrap;
}
.tp-mobile-add:active { background: #36c; color: white; }
}
/* --- FULL MODE / SPLIT SCREEN STYLES --- */
.tp-full-app {
display: flex; flex-direction: column;
height: 80vh; min-height: 600px;
border: 1px solid #a2a9b1; border-radius: 8px; overflow: hidden;
background: var(--background-color-base, #fff); color: var(--color-base, #202122);
font-family: sans-serif;
}
.tp-full-app * { box-sizing: border-box; }
.tp-full-topbar {
display: flex; gap: 10px; align-items: center; padding: 10px 15px;
background: #f8f9fa; border-bottom: 1px solid #eee; flex-wrap: wrap;
}
.tp-full-topbar .tp-setting-block { margin-bottom: 0; display: flex; align-items: center; gap: 5px; }
.tp-full-topbar .tp-setting-block label { margin-bottom: 0; }
.tp-full-split {
display: flex; flex-grow: 1; overflow: hidden; position: relative;
}
.tp-full-sidebar {
flex-shrink: 0; max-width: 360px;
overflow-y: auto; padding: 10px;
border-right: 1px solid #eee;
background: var(--background-color-base, #fff);
}
@media (max-width: 720px) {
.tp-full-app {
height: auto;
min-height: auto;
}
.tp-full-split {
flex-direction: column;
overflow: visible;
}
.tp-full-sidebar {
max-width: 100%;
height: 350px;
border-right: none;
border-bottom: 1px solid #eee;
}
.tp-full-main {
height: 80vh;
min-height: 500px;
flex-grow: 1;
position: relative;
}
}
.tp-full-main {
flex-grow: 1; position: relative;
}
.tp-full-main #tp-map-container {
/* Override fixed positioning when inside full mode */
position: absolute !important; top: 0 !important; left: 0 !important;
right: 0 !important; bottom: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important; border-radius: 0 !important; box-shadow: none !important;
z-index: 10 !important; display: block !important;
}
.tp-full-main #tp-map-hide {
display: none !important; /* Hide map close button in full mode */
}
`);
},
drawUI: function () {
const isFullMode = $('#trip-planner-app').length > 0;
// 1. Handle "Closed" state (Launcher in user menu)
if (this.data.closed && !isFullMode) {
$('#tp-widget, #tp-minimized-icon').remove();
$('#tp-map-container').hide().detach().appendTo('body');
this.drawLauncher();
return;
} else {
$('.tp-launcher-icon, #tp-launcher-li').remove();
$('#tp-launcher').remove();
}
// 2. Handle "Minimized" state (Floating Icon)
if (this.data.minimized && !isFullMode) {
$('#tp-widget').remove();
$('#tp-map-container').hide().detach().appendTo('body');
$('body').append(`<div id="tp-minimized-icon" title="Expand Trip Planner">🎒</div>`);
return;
}
// 3. Handle "Open" state
$('#tp-widget, #tp-minimized-icon').remove();
// Detach map container before resetting app
const $mapContainer = $('#tp-map-container').detach();
if (isFullMode) {
$('#trip-planner-app').empty();
}
const trip = this.getActiveTrip();
if (this.lastActiveTrip && this.lastActiveTrip !== trip) {
if (this.routeLayer) {
this.routeLayer.clearLayers();
}
this.cachedRoutes = {};
$('.tp-route-stats').remove();
}
this.lastActiveTrip = trip;
let dayOptions = "";
trip.days.forEach((d, i) => {
dayOptions += `<option value="${i}">Day ${i + 1}</option>`;
});
const safeName = mw.html.escape(trip.name);
const safeKey = mw.html.escape(this.data.orsKey || '');
const helpUrl = mw.util.getUrl('Wikivoyage:Trip_Planner');
const fullModeUrl = mw.util.getUrl('Trip Planner');
let $widget;
if (isFullMode) {
$widget = $(`
<div class="tp-full-app">
<div class="tp-full-topbar">
<div class="tp-setting-block" style="margin-right:15px">
<label>Trip:</label>
<select id="tp-select-trip" style="padding:4px; max-width:150px; border:1px solid #ccc; border-radius:4px;"></select>
<button id="tp-new-trip" class="mw-ui-button" title="New Trip" style="padding:3px 8px; min-width:auto">+</button>
</div>
<div class="tp-setting-block" style="flex-grow:1; flex-basis: 250px">
<label>Name:</label>
<input type="text" id="tp-rename-input" value="${safeName}">
</div>
<div class="tp-setting-block">
<label>Start:</label>
<input type="date" id="tp-start-date" value="${trip.startDate}" style="width:130px">
</div>
<div class="tp-setting-block" style="margin-right:15px">
<label>Days:</label>
<input type="number" id="tp-length" value="${trip.length}" min="1" style="width:60px">
</div>
<div>
<button id="tp-btn-route" class="mw-ui-button">🚗 Route</button>
<button id="tp-btn-export" class="mw-ui-button">💾 Save...</button>
<button id="tp-import" class="mw-ui-button">📂 Load</button>
<button id="tp-del-trip" class="mw-ui-button mw-ui-destructive mw-ui-quiet" title="Delete Trip" style="padding:4px 8px; min-width:auto; margin-left:auto;">🗑️</button>
</div>
</div>
<div class="tp-full-split">
<div class="tp-full-sidebar tp-body" style="max-height:none">
<div class="tp-section-title" style="border-bottom: 1px solid #ccc; padding-bottom: 4px; margin-bottom: 10px;">
<span>🗂️ Buckets</span>
<div>
<span class="tp-btn-edit" id="tp-add-bucket" title="Add custom bucket">+ Bucket</span>
</div>
</div>
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-full-main" id="tp-map-container-wrapper">
</div>
</div>
<div id="tp-menu-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-menu-title">Menu</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancel</button>
</div>
<div id="tp-edit-form" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-form-title">Edit Entry</b>
<div class="tp-form-row"><label>Title</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Lat</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Lon</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="e.g. Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Fetch Title & Coordinates">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Note</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Source Page</label><input type="text" id="f-source" placeholder="e.g. Rome"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Save</button>
<button class="mw-ui-button" id="f-cancel">Cancel</button>
</div>
</div>
<div id="tp-route-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b style="margin-bottom:10px; display:block">Route Calculator</b>
<div class="tp-setting-block">
<label>ORS API Key <a href="https://openrouteservice.org/dev/#/signup" target="_blank" style="font-weight:normal; font-size:0.9em">(Get Free Key)</a></label>
<input type="text" id="tp-ors-key" placeholder="Paste key here..." value="${safeKey}">
</div>
<div class="tp-setting-block">
<label>Travel Mode</label>
<div style="display:flex; gap:5px">
<select id="tp-route-profile" style="flex: 1; padding:5px; border:1px solid #ccc; border-radius:4px">
<option value="foot-walking">🚶 Walking</option>
<option value="driving-car">🚗 Driving (Car)</option>
</select>
<button id="tp-run-route" class="mw-ui-button mw-ui-progressive" style="flex:1">Calculate Routes</button>
</div>
</div>
<div class="tp-divider"></div>
<div class="tp-setting-block">
<label>Optimize Day Order</label>
<div style="display:flex; gap:5px">
<select id="tp-opt-day" style="flex:1; padding:5px; border:1px solid #ccc; border-radius:4px">
${dayOptions}
</select>
<button id="tp-run-opt" class="mw-ui-button" style="flex:1">Optimize</button>
</div>
<div style="font-size:0.75em; color:#666; margin-top:2px">Keeps 1st item fixed, reorders the rest.</div>
</div>
<button id="tp-close-route" class="mw-ui-button" style="margin-top:auto; width:100%">Close</button>
</div>
</div>
`);
$('#trip-planner-app').append($widget);
// Move map container into its Full Mode wrapper
$mapContainer.appendTo($widget.find('#tp-map-container-wrapper')).show();
// Refresh map layout immediately as it might have been moved/resized
if (this.map) {
setTimeout(() => {
this.map.invalidateSize();
this.updateMapMarkers(true); // pass true to fit bounds
}, 200); // slightly longer timeout to ensure DOM catch-up
}
} else {
$widget = $(`
<div id="tp-widget">
<div class="tp-header">
<span id="tp-toggle" style="flex-grow:1">🎒 Trip Planner</span>
<span>
<a href="${helpUrl}" target="_blank" style="color:white; text-decoration:none; font-weight:bold; cursor:pointer;" title="Help / Documentation">?</a>
<span id="tp-toggle-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Minimize to Icon">-</span>
<span id="tp-close-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Close">✕</span>
</span>
</div>
<div class="tp-content" style="display: block; position:relative">
<div id="tp-menu-overlay">
<b id="tp-menu-title">Menu</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancel</button>
</div>
<div id="tp-edit-form">
<b id="tp-form-title">Edit Entry</b>
<div class="tp-form-row"><label>Title</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Lat</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Lon</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="e.g. Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Fetch Title & Coordinates">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Note</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Source Page</label><input type="text" id="f-source" placeholder="e.g. Rome"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Save</button>
<button class="mw-ui-button" id="f-cancel">Cancel</button>
</div>
</div>
<div class="tp-settings">
<div class="tp-settings-row">
<select id="tp-select-trip" style="flex-grow:1"></select>
</div>
</div>
<div class="tp-body">
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-controls" style="grid-template-columns: 1fr;">
<a href="${fullModeUrl}" class="mw-ui-button mw-ui-progressive" style="text-align:center; text-decoration:none; display:block">🗺️ Open Full Trip Planner</a>
</div>
</div>
<input type="file" id="tp-file-input" style="display:none" accept=".json">
</div>
`);
$('body').append($widget);
// Keep map detached/hidden in Widget Mode
$mapContainer.hide().appendTo('body');
}
if ($('#tp-file-input').length === 0) {
$('body').append('<input type="file" id="tp-file-input" style="display:none" accept=".json">');
}
this.renderTripOptions();
this.renderBins();
if (!isFullMode) {
$('body').removeClass('tp-mobile-map-open');
}
if (isFullMode && this.map) {
this.updateMapMarkers();
}
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updateWidgetButtonsVisibility: function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) {
// Hide day action buttons that are injected constantly in renderBins
$('#tp-widget .tp-btn-move').hide();
$('#tp-widget .tp-edit-bucket').hide();
$('#tp-widget .tp-remove-bucket').hide();
$('#tp-widget .tp-add-custom-btn').hide();
}
},
drawLauncher: function () {
createLauncherIcon(() => {
this.data.closed = false;
this.saveAndRefresh();
});
},
renderTripOptions: function () {
const $select = $('#tp-select-trip').empty();
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
this.data.trips.forEach((t, i) => $select.append($('<option>', { value: i, text: t.name, selected: i === currentIdx })));
},
renderBins: function () {
const isFullMode = $('#trip-planner-app').length > 0;
const trip = this.getActiveTrip();
// Render all buckets
const $bucketsContainer = $('#tp-buckets-container').empty();
trip.buckets.forEach(b => {
const isBacklog = b.id === 'backlog';
const $bucketBlock = $(`
<div class="tp-section-title tp-bucket-header" data-bucket-id="${b.id}">
<span class="tp-bucket-title-text" style="cursor: pointer;" title="Click to highlight on map, double-click to edit/rename">${b.icon} ${b.name}</span>
<div>
${isFullMode ? `
<span class="tp-btn-edit tp-add-custom-btn" data-bucket-id="${b.id}">+ POI</span>
<span class="tp-btn-move" data-move-type="bucket" data-bucket-id="${b.id}">Move</span>
<span class="tp-btn-edit tp-edit-bucket" data-bucket-id="${b.id}" title="Edit/Rename Bucket">✏️</span>
${!isBacklog ? `<span class="tp-remove tp-remove-bucket" data-bucket-id="${b.id}" title="Delete Bucket" style="font-weight:bold; margin-left:5px">×</span>` : ''}
` : `
<span class="tp-btn-edit tp-add-article-btn" data-bucket-id="${b.id}" title="Add current article as destination">+ Article</span>
`}
</div>
</div>
<div class="tp-bin tp-bucket-bin" data-type="bucket" data-bucket-id="${b.id}"></div>
`);
b.items.forEach((item, idx) => {
$bucketBlock.filter('.tp-bucket-bin').append(this.createItemHTML(item, 'bucket', idx, b.id));
});
$bucketsContainer.append($bucketBlock);
});
// Render days
const $daysContainer = $('#tp-days-container').empty();
trip.days.forEach((day, dIdx) => {
const dayDate = new Date(trip.startDate);
dayDate.setDate(dayDate.getDate() + dIdx);
const $dayBlock = $(`
<div class="tp-section-title" style="color:${this.colors[dIdx % this.colors.length]}">
Day ${dIdx + 1} (${dayDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })})
${isFullMode ? `<span class="tp-btn-move" data-move-type="day" data-day-idx="${dIdx}">Move</span>` : ''}
</div>
<div class="tp-bin tp-day-bin" data-type="day" data-day-idx="${dIdx}"></div>
`);
day.items.forEach((item, iIdx) => {
$dayBlock.filter('.tp-day-bin').append(this.createItemHTML(item, 'day', iIdx, dIdx));
});
$daysContainer.append($dayBlock);
});
if (isFullMode)
this.updateMapMarkers();
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updatePageIndicators: function () {
const thiss = this;
const trip = this.getActiveTrip();
const allItems = [...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)];
// Create Sets for fast lookup (Wikidata ID or Lat,Lon string)
const wdSet = new Set(allItems.map(i => i.wikidata).filter(Boolean));
const locSet = new Set(allItems.map(i => i.lat + "," + i.lon));
$('.vcard').each(function () {
const $l = $(this);
// Extract same data as draggable logic
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
const wdId = $l.find('[id]').filter(function () { return /^Q\d+$/.test(this.id); }).attr('id');
// Check if this listing is in our data
const isPresent = (wdId && wdSet.has(wdId)) ||
(lat && lon && locSet.has(thiss.parseCoordinate(lat) + "," + thiss.parseCoordinate(lon)));
if (isPresent) $l.addClass('tp-in-trip');
else $l.removeClass('tp-in-trip');
});
},
createItemHTML: function (item, type, idx, binIdOrIdx) {
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
const orderHtml = (type === 'day')
? `<span style="color:#555; margin-right:6px; min-width:15px;">${idx + 1}.</span>`
: '';
return $(`
<div class="tp-item" draggable="true" data-type="${type}" data-idx="${idx}" data-bin-id="${binIdOrIdx}">
${orderHtml}
<div style="display:flex; flex-direction:column; overflow:hidden; flex-grow:1; margin-right:5px">
<span style="overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:bold" title="${safeTitle}">${safeTitle}</span>
${safeNote ? `<span style="font-size:0.75em; color:#666; overflow:hidden; text-overflow:ellipsis; white-space:nowrap">${safeNote}</span>` : ''}
</div>
<span style="display:flex; align-items:center; flex-shrink:0">
<span class="tp-btn-edit item-edit-trigger" style="border:none; padding:0 3px; font-size:1.1em">✏️</span>
${item.sourcePage ? `<a href="${url}" target="_blank" style="text-decoration:none; margin:0 3px">🔗</a>` : ''}
<span class="tp-remove">×</span>
</span>
</div>
`);
},
showMenu: function (title, options) {
$('#tp-menu-title').text(title);
const $cont = $('#tp-menu-content').empty();
options.forEach(opt => {
if (opt.header) {
$cont.append(`
<div style="
font-weight: bold;
color: #555;
margin: 12px 0 4px 0;
border-bottom: 1px solid #eee;
padding-bottom: 2px;
font-size: 0.9em;
">${mw.html.escape(opt.header)}</div>
`);
return;
}
// Standard Buttons
const $btn = $(`<button class="tp-menu-btn">${opt.label}</button>`);
if (opt.disabled) {
$btn.prop('disabled', true).css({ opacity: 0.6, cursor: 'not-allowed', background: '#f8f8f8', color: '#888' });
if (opt.helpText) {
$btn.append(`<div style="font-size:0.8em; font-style:italic; margin-top:2px">${opt.helpText}</div>`);
}
} else {
$btn.on('click', () => { opt.action(); $('#tp-menu-overlay').hide(); });
}
$cont.append($btn);
});
$('#tp-menu-overlay').css('display', 'flex');
},
exportData: function (format) {
const trip = this.getActiveTrip();
let content = "", mime = "text/plain", ext = "txt";
switch (format) {
case 'trip':
content = JSON.stringify(trip, null, 2);
mime = "application/json";
ext = "json";
break;
case 'all':
const cleanData = {
trips: this.data.trips
};
content = JSON.stringify(cleanData, null, 2);
mime = "application/json";
ext = "json";
break;
case 'gpx':
content = `<?xml version="1.0" encoding="UTF-8"?><gpx version="1.1" creator="WVPlanner">`;
[...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)].forEach(i => { if (i.lat) content += `<wpt lat="${i.lat}" lon="${i.lon}"><name>${i.title}</name></wpt>`; });
content += `</gpx>`;
mime = "application/gpx+xml";
ext = "gpx";
break;
case 'wiki':
trip.days.forEach((d, idx) => {
content += `\n=== Day ${idx + 1} ===\n`;
d.items.forEach(i => content += `* {{listing|name=${i.title}|lat=${i.lat}|long=${i.lon}|wikidata=${i.wikidata || ''}|content=${i.note || ''}}}\n`);
});
break;
case 'geojson-full':
var fc = { type: "FeatureCollection", features: [] };
// 1. Flatten all items (Buckets + all Days)
var allItems = trip.buckets.flatMap(b => b.items).concat(trip.days.reduce(function (acc, d) {
return acc.concat(d.items);
}, []));
// 2. Add Points (Listings)
allItems.forEach(function (i) {
if (i.lat && i.lon) {
fc.features.push({
type: "Feature",
geometry: { type: "Point", coordinates: [i.lon, i.lat] },
properties: {
name: i.title,
note: i.note || "",
wikidata: i.wikidata,
day: i.day !== undefined ? i.day + 1 : 'bucket'
}
});
}
});
// 3. Add Lines (Routes) from Leaflet Layer using concat
if (this.routeLayer && window.L) {
var routes = this.routeLayer.toGeoJSON();
if (routes && routes.features) {
fc.features = fc.features.concat(routes.features);
}
}
content = JSON.stringify(fc, null, 2);
mime = "application/geo+json";
ext = "geojson";
break;
}
const blob = new Blob([content], { type: mime });
const a = document.createElement('a'); a.href = URL.createObjectURL(blob);
a.download = `${trip.name.replace(/\s/g, '_')}.${ext}`; a.click();
},
setupListeners: function () {
const self = this;
const thiss = this;
$(document).on('click', '#tp-minimized-icon', function () {
self.data.minimized = false;
self.saveAndRefresh();
});
// Settings Overlay Toggles
$(document).on('click', '#tp-open-settings', () => $('#tp-settings-overlay').css('display', 'flex'));
$(document).on('click', '#tp-close-settings', () => {
$('#tp-settings-overlay').hide();
self.saveAndRefresh(); // Ensure changes (like rename) reflect in the main UI immediately
});
// NEW: Rename Logic
$(document).on('change', '#tp-rename-input', function () {
self.getActiveTrip().name = $(this).val();
self.save(); // Just save, don't redraw whole UI yet (wait for Close)
});
// Move Trip Logic
$(document).on('click', '.tp-btn-move', function () {
const moveType = $(this).data('move-type'); // 'bucket' or 'day'
const bucketId = $(this).data('bucket-id'); // if bucket
const sourceDayIdx = $(this).data('day-idx') !== undefined ? parseInt($(this).data('day-idx')) : -1;
const currentTripIdx = self.data.activeTripIndex;
const currentTrip = self.getActiveTrip();
let menuOptions = [];
// Helper to perform the move
const performMove = (targetTrip, targetType, targetBinIdOrIdx) => {
let items;
// Cut
if (moveType === 'bucket') {
const bucket = currentTrip.buckets.find(b => b.id === bucketId);
items = bucket ? bucket.items.splice(0) : [];
} else {
items = currentTrip.days[sourceDayIdx].items.splice(0);
}
// Paste
if (targetType === 'bucket') {
const targetBucket = targetTrip.buckets.find(b => b.id === targetBinIdOrIdx);
if (targetBucket) targetBucket.items.push(...items);
} else {
targetTrip.days[targetBinIdOrIdx].items.push(...items);
}
self.saveAndRefresh();
};
// Helper to add options for a specific trip
const addTripOptions = (trip, isCurrent) => {
let addedHeader = false;
const ensureHeader = () => {
if (!addedHeader) {
menuOptions.push({ header: isCurrent ? "Current Trip" : trip.name });
addedHeader = true;
}
};
// 1. Bucket Options
trip.buckets.forEach(b => {
// Show if: It's another trip OR (It's current trip AND we aren't already in this specific bucket)
if (!isCurrent || moveType !== 'bucket' || b.id !== bucketId) {
ensureHeader();
menuOptions.push({
label: `${b.icon} ${b.name}`,
action: () => performMove(trip, 'bucket', b.id)
});
}
});
// 2. Day Options
trip.days.forEach((day, dIdx) => {
// Show if: It's another trip OR (It's current trip AND we aren't in this specific day)
if (!isCurrent || (moveType !== 'day' || dIdx !== sourceDayIdx)) {
ensureHeader();
menuOptions.push({
label: `➡ Day ${dIdx + 1}`,
action: () => performMove(trip, 'day', dIdx)
});
}
});
};
// A. Process Current Trip First
addTripOptions(currentTrip, true);
// B. Process Other Trips
self.data.trips.forEach((trip, tIdx) => {
if (tIdx === currentTripIdx) return;
addTripOptions(trip, false);
});
if (menuOptions.length === 0) {
alert("No destinations available.");
} else {
const title = (moveType === 'bucket') ? `Move Bucket Items to:` : `Move Day ${sourceDayIdx + 1} Items to:`;
self.showMenu(title, menuOptions);
}
});
// Save Menu Logic
$(document).on('click', '#tp-btn-export', () => {
const hasRoutes = self.routeLayer && window.L && self.routeLayer.getLayers().length > 0;
self.showMenu("Export Format:", [
{ label: "Current Trip (JSON)", action: () => self.exportData('trip') },
{ label: "All Data Backup (JSON)", action: () => self.exportData('all') },
{ label: "GPS File (GPX)", action: () => self.exportData('gpx') },
{ label: "Wikivoyage Text (WikiText)", action: () => self.exportData('wiki') },
{
label: "Trip + Routes (GeoJSON)",
action: () => self.exportData('geojson-full'),
disabled: !hasRoutes,
helpText: !hasRoutes ? "(Calculate routes first to enable)" : ""
}
]);
});
$(document).on('click', '#tp-menu-close', () => $('#tp-menu-overlay').hide());
// Add / Edit Forms
$(document).on('click', '#tp-add-article, .tp-add-article-btn', function () {
const bucketId = $(this).data('bucket-id') || 'backlog';
const pageName = mw.config.get('wgPageName');
const wdId = mw.config.get('wgWikibaseItemId');
if (!wdId) return alert("This page has no Wikidata ID.");
self.fetchWikidata(wdId, pageName, (item) => {
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId) || trip.buckets[0];
if (bucket) {
bucket.items.push(item);
self.saveAndRefresh();
mw.notify(`Added article: ${item.title}`);
}
}).fail(() => alert("Failed to fetch article data."));
});
$(document).on('click', '#f-fetch-wd', function () {
const id = $('#f-wikidata').val().trim().toUpperCase();
if (!/^Q\d+$/.test(id)) {
return;
}
const $btn = $(this);
const originalText = $btn.text();
$btn.text('⏳').prop('disabled', true);
self.fetchWikidata(id, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
})
.fail(err => alert(err.message || "Fetch failed."))
.always(function () {
$btn.text(originalText).prop('disabled', false);
});
});
let editingRef = null;
$(document).on('click', '#tp-add-custom, .tp-add-custom-btn, .item-edit-trigger', function () {
const isNew = $(this).attr('id') === 'tp-add-custom' || $(this).hasClass('tp-add-custom-btn');
if (isNew) {
const bucketId = $(this).data('bucket-id') || 'backlog';
editingRef = { type: 'bucket', idx: -1, binId: bucketId };
} else {
const p = $(this).closest('.tp-item');
editingRef = { type: p.data('type'), idx: p.data('idx'), binId: p.data('bin-id') };
}
const item = isNew ?
{ title: "", lat: "", lon: "", note: "", sourcePage: "" } :
(editingRef.type === 'bucket' ?
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] :
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx]
);
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val(item.note || "");
$('#f-source').val(item.sourcePage || "");
$('#tp-edit-form').css('display', 'flex');
});
$(document).on('click', '#tp-add-bucket', () => {
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Add Custom Bucket',
name: '',
icon: '🗂️',
onSave: function (name, icon) {
const trip = self.getActiveTrip();
const id = 'bucket_' + Math.random().toString(36).substr(2, 9);
trip.buckets.push({
id: id,
name: name,
icon: icon,
items: []
});
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-edit-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId);
if (!bucket) return;
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Edit Bucket: ' + bucket.name,
name: bucket.name,
icon: bucket.icon,
onSave: function (name, icon) {
bucket.name = name;
bucket.icon = icon;
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-remove-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
if (bucketId === 'backlog') {
alert("The default backlog bucket cannot be deleted.");
return;
}
const trip = self.getActiveTrip();
const bucketIdx = trip.buckets.findIndex(b => b.id === bucketId);
if (bucketIdx === -1) return;
const bucket = trip.buckets[bucketIdx];
if (bucket.items.length > 0) {
if (confirm(`Bucket "${bucket.name}" contains ${bucket.items.length} item(s). Move them to Backlog first?`)) {
const backlog = trip.buckets.find(b => b.id === 'backlog');
if (backlog) backlog.items.push(...bucket.items);
} else if (!confirm("Are you sure you want to delete this bucket and ALL its items permanently?")) {
return;
}
}
trip.buckets.splice(bucketIdx, 1);
self.saveAndRefresh();
});
$(document).on('click', '#f-save', () => {
const item = {
title: $('#f-title').val(),
lat: self.parseCoordinate($('#f-lat').val()),
lon: self.parseCoordinate($('#f-lon').val()),
note: $('#f-note').val(),
wikidata: $('#f-wikidata').val(),
sourcePage: $('#f-source').val().trim()
};
if (editingRef.idx === -1) {
const list = (editingRef.type === 'bucket')
? self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items
: self.getActiveTrip().days[parseInt(editingRef.binId)].items;
if (editingRef.insertIdx !== undefined && editingRef.insertIdx !== -1) {
list.splice(editingRef.insertIdx, 0, item);
} else {
list.push(item);
}
} else if (editingRef.type === 'bucket') {
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] = item;
} else {
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx] = item;
}
$('#tp-edit-form').hide(); self.saveAndRefresh();
});
$(document).on('click', '#f-cancel', () => $('#tp-edit-form').hide());
// Widget Basics
$(document).on('click', '#tp-close-btn', function (e) {
e.stopPropagation(); // Prevent triggering the header toggle
self.data.closed = true;
self.saveAndRefresh();
});
$(document).on('click', '#tp-toggle-btn', function (e) {
e.stopPropagation();
self.data.minimized = true;
self.saveAndRefresh();
});
$(document).on('change', '#tp-select-trip', (e) => {
const newIdx = parseInt($(e.target).val());
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
this.drawUI();
} else {
this.data.activeTripIndex = newIdx;
this.saveAndRefresh();
}
});
$(document).on('click', '#tp-new-trip', () => {
const n = prompt("Trip Name?");
if (n) {
self.createNewTrip(n);
const newIdx = self.data.trips.length - 1;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
} else {
this.data.activeTripIndex = newIdx;
}
self.saveAndRefresh();
}
});
// Delete Trip Logic
$(document).on('click', '#tp-del-trip', () => {
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
if (this.data.trips.length > 1 && confirm("Are you sure you want to delete this trip permanently?")) {
this.data.trips.splice(currentIdx, 1);
this.data.activeTripIndex = 0;
this.localTripIndex = 0;
self.migrateData();
this.saveAndRefresh();
} else if (this.data.trips.length <= 1) {
alert("You cannot delete the only remaining trip.");
}
});
$(document).on('change', '#tp-length', (e) => {
const trip = self.getActiveTrip();
const n = Math.max(1, parseInt($(e.target).val()));
if (n < trip.days.length) {
const backlog = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
trip.days.splice(n).forEach(d => backlog.items.push(...d.items));
} else {
while (trip.days.length < n)
trip.days.push({ items: [] });
}
trip.length = n;
self.saveAndRefresh();
});
$(document).on('change', '#tp-start-date', function (e) {
self.getActiveTrip().startDate = $(this).val();
self.saveAndRefresh();
});
$(document).on('click', '.tp-remove', function () {
const p = $(this).closest('.tp-item');
const trip = self.getActiveTrip();
const binType = p.data('type');
const binId = p.data('bin-id');
const idx = p.data('idx');
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
if (bucket) bucket.items.splice(idx, 1);
} else {
trip.days[parseInt(binId)].items.splice(idx, 1);
}
self.saveAndRefresh();
});
$(document).on('click', '#tp-run-opt', () => {
const dayIdx = parseInt($('#tp-opt-day').val());
const profile = $('#tp-route-profile').val(); // Get selected profile
self.optimizeDay(dayIdx, profile);
$('#tp-route-overlay').hide();
});
// D&D
$(document).on('dragenter', '.tp-bin', function (e) { $(this).addClass('drag-over'); });
$(document).on('dragleave', '.tp-bin', function (e) { $(this).removeClass('drag-over'); });
$(document).on('dragover', '.tp-bin', (e) => e.preventDefault());
$(document).on('drop', '.tp-bin', function (e) {
e.preventDefault();
e.stopPropagation();
$(this).removeClass('drag-over');
const self = thiss;
$('.tp-route-stats').remove();
if (self.routeLayer) self.routeLayer.clearLayers();
self.cachedRoutes = {};
const trip = self.getActiveTrip();
const transfer = e.originalEvent.dataTransfer;
let isPoiDrop = false;
let jsonData = transfer.getData('application/json') || transfer.getData('text/plain');
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (item.title && item.lat) {
isPoiDrop = true;
}
} catch (err) { }
}
if (!isPoiDrop) {
const htmlData = transfer.getData('text/html');
const $html = htmlData ? $(htmlData) : $();
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const isWdDrop = rawText && /wikidata\.org/i.test(rawText);
if (!$m.length && !isWdDrop) {
mw.notify("To drag and drop listings, the Trip Planner widget must be opened first on the source page.", { type: 'warn' });
}
}
const binType = $(this).data('type'); // 'bucket' or 'day'
const binId = $(this).data('bucket-id'); // for buckets
const dayIdx = $(this).data('day-idx'); // for days
const targetList = (binType === 'bucket')
? trip.buckets.find(b => b.id === binId).items
: trip.days[parseInt(dayIdx)].items;
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (!item.title || !item.lat) throw "not a POI";
// 1. HANDLE REMOVAL FROM SOURCE
if (item._srcType !== undefined && !e.ctrlKey && !e.shiftKey) {
const srcTrip = self.data.trips[item._srcTripIdx];
if (srcTrip) {
if (item._srcType === 'bucket') {
const srcBucket = srcTrip.buckets.find(b => b.id === item._srcBinId);
if (srcBucket) srcBucket.items.splice(item._srcIdx, 1);
} else {
srcTrip.days[parseInt(item._srcBinId)].items.splice(item._srcIdx, 1);
}
}
// Clean up metadata
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
} else if (item._srcType !== undefined) {
// Duplication mode
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
}
// 2. HANDLE INSERTION
const $targetItem = $(e.target).closest('.tp-item');
if ($targetItem.length && $targetItem.data('idx') !== undefined) {
targetList.splice($targetItem.data('idx'), 0, item);
} else {
targetList.push(item);
}
self.saveAndRefresh();
return;
} catch (e) { /* not JSON listing, continue */ }
}
// .marker from ListingBrowser
const htmlData = transfer.getData('text/html');
if (htmlData) {
const $html = $(htmlData);
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
var pageName = '';
const href = $html.attr('href');
const match = href.match(/.*\/wiki\/(.+)#(Q\d+)/);
const match2 = href.match(/.*\/wiki\/(.+)/);
if (match) {
pageName = decodeURIComponent(match[1]);
} else if (match2) {
pageName = decodeURIComponent(match2[1]);
} else {
pageName = href;
}
if ($m.length && ($m.attr('marker-lat') || $m.attr('marker-wikidata'))) {
targetList.push({
title: $m.attr('marker-name') || $m.text().trim(),
lat: self.parseCoordinate($m.attr('marker-lat')),
lon: self.parseCoordinate($m.attr('marker-long')),
wikidata: $m.attr('marker-wikidata'),
sourcePage: pageName,
note: ""
});
self.saveAndRefresh();
return;
}
}
// Wikidata URL Drop
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const wdUrlMatch = rawText ? rawText.match(/wikidata\.org\/.*?(Q\d+)/i) : null;
if (wdUrlMatch) {
const wdId = wdUrlMatch[1];
const $bin = $(this);
const binType = $bin.data('type');
const binId = $bin.data('bucket-id');
const dayIdx = $bin.data('day-idx');
const $targetItem = $(e.target).closest('.tp-item');
const insertIdx = ($targetItem.length && $targetItem.data('idx') !== undefined) ? parseInt($targetItem.data('idx')) : -1;
mw.notify(`Fetching Wikidata item ${wdId}...`);
self.fetchWikidata(wdId, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val("");
$('#f-source').val("");
editingRef = {
type: binType,
idx: -1,
binId: binType === 'bucket' ? binId : parseInt(dayIdx),
insertIdx: insertIdx
};
$('#tp-edit-form').css('display', 'flex');
}).fail(() => {
mw.notify(`Failed to fetch Wikidata item ${wdId}`, { type: 'error' });
});
return;
}
// Article[/Subarticle]#Qid
if (rawText && rawText.includes('#Q')) {
const match = rawText.match(/.*\/wiki\/(.+)#(Q\d+)/);
if (match) {
const pageName = decodeURIComponent(match[1]);
const wdId = match[2];
self.fetchWikidata(wdId, pageName, (item) => {
targetList.push(item);
self.saveAndRefresh();
}).fail(() => mw.notify("Failed to parse dropped link.", { type: 'error' }));
return;
}
}
});
$(document).on('dragstart', '.tp-item', function (e) {
const p = $(this);
const trip = self.getActiveTrip();
let item;
const binType = p.data('type'); // 'bucket' or 'day'
const binId = p.data('bin-id'); // bucket.id or dayIdx
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
item = bucket ? bucket.items[p.data('idx')] : null;
} else {
item = trip.days[parseInt(binId)].items[p.data('idx')];
}
if (!item) return;
// Add source metadata
const payload = Object.assign({}, item, {
_srcTripIdx: (self.localTripIndex !== null) ? self.localTripIndex : self.data.activeTripIndex,
_srcType: binType,
_srcIdx: p.data('idx'),
_srcBinId: binId
});
e.originalEvent.dataTransfer.setData('application/json', JSON.stringify(payload));
});
$(document).on('click', '.tp-item', function (e) {
// Ignore clicks on action buttons/links
if ($(e.target).closest('.tp-btn-edit, .tp-remove, a').length) {
return;
}
const $item = $(this);
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) return;
const type = $item.data('type');
const idx = parseInt($item.data('idx'));
const binId = $item.data('bin-id');
self.zoomToMapItem(type, idx, binId);
});
// Map & Import
$(document).on('click', '#tp-import', () => $('#tp-file-input').click());
$(document).on('change', '#tp-file-input', function (e) {
const reader = new FileReader();
reader.onload = (ev) => {
const imp = JSON.parse(ev.target.result);
if (imp.trips) {
const defaults = {
activeTripIndex: 0,
minimized: false,
trips: [],
orsKey: self.data.orsKey || ''
};
self.data = $.extend({}, defaults, imp);
}
else if (imp.days) {
self.data.trips.push(imp);
}
self.migrateData();
self.saveAndRefresh();
};
reader.readAsText(e.target.files[0]);
});
$(document).on('click', '#tp-btn-route', () => {
$('#tp-ors-key').val(self.data.orsKey || '');
$('#tp-route-overlay').css('display', 'flex');
});
$(document).on('click', '#tp-close-route', () => $('#tp-route-overlay').hide());
$(document).on('click', '#tp-run-route', () => {
const key = $('#tp-ors-key').val().trim();
const profile = $('#tp-route-profile').val();
if (!key) return alert("API Key is required.");
self.data.orsKey = key;
self.save();
$('#tp-route-overlay').hide();
self.calculateRoutes(profile);
});
$(document).on('click', '.tp-section-title', function (e) {
if ($(e.target).hasClass('tp-btn-move') || $(e.target).hasClass('tp-btn-edit') || $(e.target).hasClass('tp-remove')) return;
const $moveBtn = $(this).find('.tp-btn-move');
const type = $moveBtn.data('move-type');
if (type === 'bucket') {
const bucketId = $moveBtn.data('bucket-id');
self.highlightDay(bucketId, 'bucket');
} else if (type === 'day') {
const idx = $moveBtn.data('day-idx');
if (idx !== undefined) self.highlightDay(parseInt(idx), 'day');
}
});
},
initMap: function () {
if ($('#tp-map-container').length === 0) {
// Initial placement on body, hidden
$('body').append(`
<div id="tp-map-container" style="display:none">
<div id="tp-map-canvas"></div>
</div>
`);
}
if (!this.map) {
this.map = L.map('tp-map-canvas').setView([20, 0], 2); // Default whole-world-ish view
L.tileLayer('https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png').addTo(this.map);
this.map.on('click', () => this.highlightDay(null));
this.routeLayer = L.featureGroup().addTo(this.map);
this.markerLayer = L.featureGroup().addTo(this.map);
if (this.cachedRoutes) {
Object.keys(this.cachedRoutes).forEach(dIdx => {
this.drawRouteLayer(parseInt(dIdx), this.cachedRoutes[dIdx]);
});
}
}
},
// toggleMap removed as per request - map is now persistent in full mode.
/**
* Lazy-loads an image from Wikidata based on QID
*/
loadWikidataImage: function ($container) {
const qid = $container.data('qid');
// Don't fetch if already loaded
if ($container.find('img').length || $container.data('loading')) return;
$container.data('loading', true);
const wdApiUrl = `https://www.wikidata.org/w/api.php?action=wbgetclaims&entity=${qid}&property=P18&format=json&origin=*`;
$.getJSON(wdApiUrl).done(function (data) {
try {
// Dig into Wikidata response for the filename
const claims = data.claims.P18;
if (claims && claims[0].mainsnak.datavalue.value) {
const filename = claims[0].mainsnak.datavalue.value;
// Thumb URL (200px) and Full URL (Original)
const baseUrl = `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(filename)}`;
const thumbUrl = `${baseUrl}?width=200`;
const $img = $('<img>').attr('src', thumbUrl).css({
maxWidth: '100%', maxHeight: '100%', display: 'none', cursor: 'zoom-in'
});
// Wrap in a link to the full-size image
const $link = $('<a>')
.attr({ href: baseUrl, target: '_blank', title: 'View full size' })
.append($img);
$img.on('load', function () {
$container.empty().append($link);
$img.fadeIn();
});
} else {
$container.html('<small style="color:#999">No image available</small>');
}
} catch (e) {
$container.hide();
}
}).fail(function () {
$container.hide();
});
},
/**
* Parses a coordinate string into decimal degrees.
* Supports decimal format and Degrees, Minutes, Seconds (DMS) format.
* @param {string|number} input
* @returns {number} Decimal degrees or NaN
*/
parseCoordinate: function (input) {
if (typeof input === 'number') return input;
if (typeof input !== 'string') return NaN;
let str = input.trim();
if (!str) return NaN;
// 1. Try simple decimal (with optional hemisphere)
// Matches: 48.8566, -48.8566, 48.8566 N, S 48.8566
const decimalMatch = str.match(/^([NSEW])?\s*(-?\d+(?:\.\d+)?)\s*([NSEW])?$/i);
if (decimalMatch) {
let val = parseFloat(decimalMatch[2]);
const h = (decimalMatch[1] || decimalMatch[3] || '').toUpperCase();
if (h === 'S' || h === 'W') val = -Math.abs(val);
if (h === 'N' || h === 'E') val = Math.abs(val);
return val;
}
// 2. Try DMS format
// Matches: 48° 51' 24" N, 48°51′24″S, 48 51 24 N, N 48 51 24, etc.
const dmsMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2})['′\s]+(\d{1,2}(?:\.\d+)?)["″\s]+([NSEW])?$/i);
if (dmsMatch) {
const deg = parseFloat(dmsMatch[2]);
const min = parseFloat(dmsMatch[3]);
const sec = parseFloat(dmsMatch[4]);
const h = (dmsMatch[1] || dmsMatch[5] || '').toUpperCase();
let val = deg + min / 60 + sec / 3600;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 3. Try DM format (no seconds)
const dmMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2}(?:\.\d+)?)['′\s]+([NSEW])?$/i);
if (dmMatch) {
const deg = parseFloat(dmMatch[2]);
const min = parseFloat(dmMatch[3]);
const h = (dmMatch[1] || dmMatch[4] || '').toUpperCase();
let val = deg + min / 60;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 4. Try D [symbols] H
const dSymMatch = str.match(/^([NSEW])?\s*(\d{1,3}(?:\.\d+)?)[°\s]+([NSEW])?$/i);
if (dSymMatch) {
const deg = parseFloat(dSymMatch[2]);
const h = (dSymMatch[1] || dSymMatch[3] || '').toUpperCase();
let val = deg;
if (h === 'S' || h === 'W') val = -val;
return val;
}
return parseFloat(str);
},
updateMapMarkers: function (shouldFitBounds) {
if (!this.markerLayer || !window.L) return;
this.markerLayer.clearLayers();
const trip = this.getActiveTrip();
const bounds = [];
const thiss = this;
const add = (item, color, label, binIdOrIdx, itemIdx, type) => {
if (!item.lat || !item.lon) return;
const icon = L.divIcon({
className: '', // Clear default class to avoid side-effects
html: `<div style="
background: ${color};
color: white;
width: 24px; height: 24px;
border: 2px solid white;
border-radius: 50%;
text-align: center;
line-height: 20px;
font-family: sans-serif;
font-weight: bold;
font-size: 11px;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
box-sizing: border-box;
">${label}</div>`,
iconSize: [24, 24],
iconAnchor: [12, 12], // Center the icon
popupAnchor: [0, -12]
});
// 1. Create Marker
const m = L.marker([item.lat, item.lon], { icon: icon });
m.tpBinId = binIdOrIdx;
m.tpIdx = itemIdx;
m.tpType = type;
m.on('click', (e) => {
// Prevent map background click from firing
L.DomEvent.stopPropagation(e);
this.highlightDay(binIdOrIdx, type);
this.highlightListItem(type, itemIdx, binIdOrIdx);
});
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
// 2. Build Link URL
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
// 3. Prepare Popup HTML (with placeholder for image)
let popupHtml = `<div style="text-align:center">
<b style="font-size:1.1em"><a href="${url}" target="_blank">${safeTitle}</a></b>
${safeNote ? `<br><span style="font-size:0.9em; color:#555">${safeNote}</span>` : ''}
</div>`;
if (item.wikidata) {
popupHtml += `
<div class="wd-img" data-qid="${item.wikidata}" style="min-width:200px; min-height:100px; background:#f0f0f0; margin-top:8px; display:flex; align-items:center; justify-content:center; border-radius:4px;">
<small>Loading Image...</small>
</div>`
}
m.bindPopup(popupHtml);
// 4. Fetch Image on Click (Lazy Load)
if (item.wikidata) {
m.on('popupopen', function (e) {
thiss.loadWikidataImage($(e.popup.getElement()).find('.wd-img'));
});
}
m.addTo(this.markerLayer);
bounds.push([item.lat, item.lon]);
};
trip.buckets.forEach((b) => {
b.items.forEach((item, idx) => {
const label = b.icon || "B";
add(item, "#777", label, b.id, idx, 'bucket');
});
});
// Days: Label is the day number (index + 1)
trip.days.forEach((d, dayIdx) => {
d.items.forEach((item, itemIdx) => {
add(item, this.colors[dayIdx % this.colors.length], itemIdx + 1, dayIdx, itemIdx, 'day');
});
});
if (shouldFitBounds && bounds.length) {
this.map.fitBounds(bounds, { padding: [50, 50] });
}
},
drawRouteLayer: function (dIdx, geojson) {
if (!this.routeLayer || !window.L) return;
const color = this.colors[dIdx % this.colors.length];
const routeGroup = L.geoJSON(geojson, {
style: { color: color, weight: 5, opacity: 0.7 },
onEachFeature: (feature, layer) => {
layer.on('click', (e) => {
L.DomEvent.stopPropagation(e);
this.highlightDay(dIdx);
});
}
});
routeGroup.tpBinId = dIdx;
routeGroup.tpType = 'day';
routeGroup.tpDayIdx = dIdx;
routeGroup.addTo(this.routeLayer);
},
saveAndRefresh: function () {
// Capture scroll position
const $body = $('.tp-body');
const scrollTop = $body.length ? $body.scrollTop() : 0;
this.save();
this.drawUI();
// Restore scroll position
$('.tp-body').scrollTop(scrollTop);
},
createNewTrip: function (n) {
this.data.trips.push({
name: n,
startDate: new Date().toISOString().split('T')[0],
length: 3,
buckets: [
{ id: 'backlog', name: 'Backlog', icon: '📦', items: [] }
],
days: [{ items: [] }, { items: [] }, { items: [] }]
});
this.save();
},
makeListingsDraggable: function () {
const thiss = this;
const pageName = mw.config.get('wgPageName');
const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
//$('.vcard, .listing-metadata, .mw-kartographer-maplink').each(function () {
$('.vcard').each(function () {
//console.log($(this));
const $l = $(this);
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
if (lat && lon) {
const wdId = $l.find('[id]').filter(function () {
return /^Q\d+$/.test(this.id);
}).attr('id') || "";
const title = $l.find('.fn, .listing-name').first().text().trim() || $l.text().trim();
$l.attr('draggable', 'true').addClass('listing-draggable-proxy');
$l.on('dragstart', (e) => {
const data = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName
};
const json = JSON.stringify(data);
e.originalEvent.dataTransfer.setData('application/json', json);
e.originalEvent.dataTransfer.setData('text/plain', json);
});
if (isTouch && $l.find('.tp-mobile-add').length === 0) {
const $btn = $('<span class="tp-mobile-add">+ Trip</span>');
$btn.on('click', (e) => {
e.preventDefault();
e.stopPropagation(); // Stop Wikivoyage from opening the map/listing details
const item = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName,
note: ""
};
const trip = thiss.getActiveTrip();
const backlogBucket = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
backlogBucket.items.push(item);
thiss.saveAndRefresh();
mw.notify(`Added "${title}" to Trip Backlog`);
});
// Insert button next to the Listing Name
const $nameTarget = $l.find('.listing-name, .fn').first();
if ($nameTarget.length) {
$nameTarget.after($btn);
} else {
$l.prepend($btn);
}
}
}
});
},
calculateRoutes: function (profile) {
const trip = this.getActiveTrip();
// UI Cleanup
$('.tp-route-stats').remove();
$('.tp-item').removeClass('tp-item-error').find('.tp-error-msg').remove();
if (this.routeLayer) this.routeLayer.clearLayers();
this.cachedRoutes = {}; // Clear old cache
mw.notify("Calculating continuous routes...");
// Track the end of the previous leg to link days together
let previousEndItem = null;
const promises = trip.days.map((day, dIdx) => {
// 1. Identify valid items in current day
// We preserve original indices for DOM injection later
const currentDayItems = day.items
.map((item, idx) => Object.assign({}, item, { day: dIdx, idx: idx }))
.filter(i => i.lat && i.lon);
// 2. Construct the routing batch for this day
// Start with the last point of the previous day (if exists) to form the bridge
let routePoints = [];
if (previousEndItem) {
routePoints.push(previousEndItem);
}
routePoints = routePoints.concat(currentDayItems);
// Update the tracker: The last item of this day becomes the start for the next non-empty day
if (currentDayItems.length > 0) {
previousEndItem = currentDayItems[currentDayItems.length - 1];
}
// 3. Check if we have enough points to form a line
if (routePoints.length < 2) {
return Promise.resolve();
}
// 4. API Request
const coords = routePoints.map(i => [i.lon, i.lat]);
return $.ajax({
method: "POST",
url: `https://api.openrouteservice.org/v2/directions/${profile}/geojson`,
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ coordinates: coords })
}).then((resp) => {
this.cachedRoutes[dIdx] = resp;
// Draw Line (Colored by the Current Day)
if (this.routeLayer && window.L) {
this.drawRouteLayer(dIdx, resp);
}
// Inject Stats
const segments = resp.features[0].properties.segments;
segments.forEach((seg, sIdx) => {
// Map the segment back to our batch items
const startItem = routePoints[sIdx];
const endItem = routePoints[sIdx + 1];
const dist = seg.distance > 1000 ? (seg.distance / 1000).toFixed(1) + " km" : Math.round(seg.distance) + " m";
const time = seg.duration > 3600
? Math.floor(seg.duration / 3600) + "h " + Math.round((seg.duration % 3600) / 60) + "m"
: Math.round(seg.duration / 60) + " min";
const html = `<div class="tp-route-stats">⬇️ ${dist} / ${time} ⬇️</div>`;
if (startItem.day === endItem.day) {
// Intra-day travel: Inject between items
$(`.tp-day-bin[data-day-idx="${startItem.day}"] .tp-item[data-idx="${startItem.idx}"]`).after(html);
} else {
// Inter-day travel: Inject at the bottom of the previous day's bin
// This visually represents "Travel after finishing Day X, before Day Y"
$(`.tp-bin[data-day-idx="${startItem.day}"]`).append(html);
}
});
}).catch(err => {
console.error(`Routing Error (Day ${dIdx + 1}):`, err);
let msg = "Routing failed.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Try to extract coordinate index from message like "...coordinate 3: ..."
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
const item = routePoints[coordIdx];
if (item) {
const $itemEl = $(`.tp-day-bin[data-day-idx="${item.day}"] .tp-item[data-idx="${item.idx}"]`);
$itemEl.addClass('tp-item-error');
if ($itemEl.find('.tp-error-msg').length === 0) {
$itemEl.find('div:first').append(`<div class="tp-error-msg">⚠️ Point not routable</div>`);
}
msg = `Point "${item.title}" is not routable. Try moving it or removing it.`;
}
}
}
} catch (e) { console.error("Error parsing response", e); }
}
mw.notify(msg, { type: 'error' });
});
});
Promise.all(promises).then(() => {
// Route calculation complete
});
},
optimizeDay: function (dayIdx, profile) {
const day = this.getActiveTrip().days[dayIdx];
const items = day.items;
if (items.length < 3) return mw.notify("Need at least 3 items to optimize.");
if (!this.data.orsKey) return alert("API Key missing.");
// 1. Prepare Payload
// Fixed Start: The first item in the list
const startItem = items[0];
// Jobs: All subsequent items
const jobs = items.slice(1).map((item, index) => ({
id: index + 1, // Use original index as ID (offset by 1 because we sliced)
location: [item.lon, item.lat],
service: 300 // Assume 5 min stop per POI (optional, helps calc ETA)
}));
// Vehicle: Starts at item[0]
const vehicles = [{
id: 1,
profile: profile,
start: [startItem.lon, startItem.lat],
// For a round-trip, add: end: [startItem.lon, startItem.lat]
}];
mw.notify("Optimizing schedule...");
$.ajax({
method: "POST",
url: "https://api.openrouteservice.org/optimization",
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ jobs: jobs, vehicles: vehicles })
}).done((resp) => {
const steps = resp.routes[0].steps;
// 2. Reconstruct Order
// Start with the fixed first item
const newOrder = [startItem];
// Append items in the order returned by API
steps.forEach(step => {
if (step.type === 'job') {
// step.id corresponds to the index in the original 'items' array
newOrder.push(items[step.id]);
}
});
// Check if all items were visited (API might skip unreachable ones)
if (newOrder.length !== items.length) {
alert("Warning: Some locations were unreachable and removed from the optimized list.");
}
// 3. Save
day.items = newOrder;
this.saveAndRefresh();
mw.notify("Optimization Complete!");
}).fail((err) => {
console.error(err);
let msg = "Optimization failed. Check API Key or constraints.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Similar coordinate matching for optimization errors
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
// In optimizeDay, coordinte 0 is startItem, others are jobs
const item = (coordIdx === 0) ? startItem : items[coordIdx];
if (item) {
$(`.tp-day-bin[data-day-idx="${dayIdx}"] .tp-item[data-idx="${(coordIdx === 0) ? 0 : coordIdx}"]`).addClass('tp-item-error');
msg = `Point "${item.title}" is not routable.`;
}
}
}
} catch (e) { }
}
alert(msg);
});
},
zoomToMapItem: function (type, idx, binIdOrIdx) {
if (!this.map || !this.markerLayer) return;
let targetMarker = null;
this.markerLayer.eachLayer((layer) => {
if (layer.tpType === type && layer.tpBinId === binIdOrIdx && layer.tpIdx === idx) {
targetMarker = layer;
}
});
if (targetMarker) {
const currentZoom = this.map.getZoom();
const targetZoom = Math.max(15, currentZoom);
this.map.setView(targetMarker.getLatLng(), targetZoom);
targetMarker.openPopup();
}
},
highlightListItem: function (type, idx, binIdOrIdx) {
let $targetItem;
if (type === 'bucket') {
$targetItem = $(`.tp-bucket-bin[data-bucket-id="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
} else {
$targetItem = $(`.tp-day-bin[data-day-idx="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
}
if ($targetItem.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetItem.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 30
}, 300);
$targetItem.css({
'transition': 'background 0.3s, border-color 0.3s',
'background': '#fff9c4',
'border-color': '#fbc02d'
});
setTimeout(() => {
$targetItem.css({
'transition': 'background 0.8s, border-color 0.8s',
'background': '',
'border-color': ''
});
setTimeout(() => {
$targetItem.css('transition', '');
}, 800);
}, 1500);
}
},
highlightDay: function (targetIdx, type = 'day') {
if (!this.map) return;
const setOpacity = (layer) => {
let isMatch;
if (targetIdx === null) {
isMatch = true;
} else if (type === 'bucket') {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'bucket');
} else {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'day');
}
const op = isMatch ? 1 : 0.2;
const fillOp = isMatch ? 0.9 : 0.2;
if (layer.setOpacity) {
layer.setOpacity(op);
if (isMatch) layer.setZIndexOffset(1000); else layer.setZIndexOffset(0);
} else if (layer.setStyle) {
layer.setStyle({ opacity: op, fillOpacity: fillOp });
if (isMatch && layer.bringToFront) layer.bringToFront();
}
};
if (this.markerLayer) this.markerLayer.eachLayer(setOpacity);
if (this.routeLayer) this.routeLayer.eachLayer(setOpacity);
$('.tp-section-title').css({ 'background': '', 'transition': '' });
if (targetIdx === null) return;
let $targetHeader;
if (type === 'bucket') {
$targetHeader = $(`.tp-bucket-bin[data-bucket-id="${targetIdx}"]`).prev('.tp-section-title');
} else {
$targetHeader = $(`.tp-day-bin[data-day-idx="${targetIdx}"]`).prev('.tp-section-title');
}
if ($targetHeader.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetHeader.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 10
}, 300);
$targetHeader.css({
'background': '#fff9c4',
'transition': 'background 0.5s'
});
setTimeout(() => {
$targetHeader.css('background', '');
}, 1500);
}
},
fetchWikidata: function (wdId, sourcePage, onDone) {
const lang = mw.config.get('wgContentLanguage') || 'en';
return $.ajax({
url: 'https://www.wikidata.org/w/api.php',
data: {
action: 'wbgetentities',
ids: wdId,
props: 'labels|claims',
languages: lang,
format: 'json',
origin: '*'
},
dataType: 'json'
}).then((data) => {
const entity = data.entities ? data.entities[wdId] : null;
if (!entity || entity.missing) throw new Error("Wikidata item not found.");
// 1. Extract Title (Localized label -> First label -> Fallback)
let title = sourcePage ? sourcePage.replace(/_/g, ' ') : wdId;
if (entity.labels && entity.labels[lang]) {
title = entity.labels[lang].value;
} else {
const keys = Object.keys(entity.labels || {});
if (keys.length > 0) title = entity.labels[keys[0]].value;
}
// 2. Extract Coordinates (P625)
let lat = 0, lon = 0;
const p625 = entity.claims && entity.claims.P625;
if (p625 && p625[0].mainsnak.datavalue) {
lat = p625[0].mainsnak.datavalue.value.latitude;
lon = p625[0].mainsnak.datavalue.value.longitude;
}
onDone({ title, lat, lon, wikidata: wdId, sourcePage: sourcePage || "", note: "" });
});
},
};
function createLauncherIcon(onClickHandler) {
// 1. Prevent Duplicates
if ($('.tp-launcher-icon').length) return;
// 2. Create Icon Element factory
const iconFactory = () => $('<a>')
.addClass('tp-launcher-icon')
.attr('href', '#')
.attr('title', 'Open Trip Planner')
.text('🎒')
.css({
'cursor': 'pointer',
'font-size': '1.2em', 'text-decoration': 'none',
'filter': 'grayscale(0.8) contrast(1) brightness(1.4)'
})
.on('click', function (e) {
e.preventDefault();
onClickHandler(e, $(this));
});
// 4. Insert into DOM (Mobile vs Desktop)
if (mw.config.get('skin') === 'minerva') {
const $icon = iconFactory().css({ 'font-size': '1.5em', 'margin': '0 12px', 'display': 'flex', 'align-items': 'center' });
if ($('#pt-notifications-alert').length == 0) {
// Mobile
$("#page-actions-overflow").before($("<li id=\"tp-launcher-li\" class=\"page-actions-menu__list-item\"></li>").append($icon))
} else {
$('#pt-notifications-alert').parent().before($icon);
}
} else {
$('#pt-notifications-alert').before(iconFactory());
const $sticky = $('.vector-sticky-header-icons');
if ($sticky.length) {
$sticky.prepend(iconFactory().css('margin-right', '10px'));
}
}
}
// lightweight bootstrap
$(function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
// Auto-load in full mode
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
TripPlanner.init();
});
} else {
// Create the initial "Lazy" icon for widget mode
createLauncherIcon(function (e, $btn) {
// Visual feedback
$btn.text('⏳').css('cursor', 'wait');
// Load dependencies on demand
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
// Remove the bootstrap icon/wrapper
// (TripPlanner.drawUI will handle creating the actual widget UI)
$('#tp-launcher-li').remove();
$('.tp-launcher-icon').remove();
// Initialize App
TripPlanner.init();
});
});
}
});
}(mediaWiki, jQuery));
mtt3roj35xd7ohvd3q0nv73jl2lhwkm
255285
255272
2026-07-05T01:21:53Z
Luxbane
30785
255285
javascript
text/javascript
/**
* Wikivoyage Trip Planner Gadget
* ==============================
* A client-side tool for planning trips using Wikivoyage listings.
* Allows users to drag listings from articles into custom buckets or days,
* organize them, view them on a map, and calculate/optimize routes.
*
* CORE FEATURES:
* ------------------
* 1. UI Modes: Dual-mode application:
* - Mini Widget Mode: A floating, minimizable widget suitable for reading articles.
* - Full View Mode: A split-screen full-page interface with a persistent map,
* routing, and bucket controls.
* 2. Data Source & Drag-and-Drop:
* - Drag-and-drop POIs between day/bucket bins.
* - Parses data-lat, data-lon, and wikidata attributes from vcards.
* - Allows wikidata and ListingBrowser as sources too
* 3. Multi-Tab Synchronization:
* - Uses BroadcastChannel to sync trip plans in real-time across all open tabs.
* - Protects local tab UI states (minimized/expanded) during synchronization events.
* 4. Persistence: Dual-mode storage:
* - Anonymous: Uses browser LocalStorage.
* - Logged-in: Uses MediaWiki User Options API ('userjs-wv-trip-planner-*').
* - Auto-merge: Merges local data into account data upon login.
* 5. Mapping: Interactive markers (colored by day) with popup image loading from Wikidata.
* 6. Routing: Integrated with OpenRouteService (ORS) API.
* - Calculates travel time/distance between POIs.
* - Optimizes day itinerary (TSP) using ORS Optimization API.
* - Draws colored route polylines on the map.
* 7. I/O: Import/Export support for JSON, GPX, WikiText ({{listing}}), and GeoJSON.
*
* EXTERNAL SERVICES:
* ------------------
* 1. OpenRouteService (api.openrouteservice.org): Used for routing and optimization.
* Requires a user-provided API Key (stored in settings).
* 2. Wikidata API: Used to fetch thumbnail images for map popups.
* 3. Wikimedia Maps: Tile server for the Leaflet map.
*
* CODE STRUCTURE (Singleton 'TripPlanner'):
* -----------------------------------------
* - Config:
* - storageKey/optionKey: Persistence identifiers.
* - colors: Palette for different days.
*
* - Lifecycle:
* - init(): Entry point after the launcher icon is clicked or auto-run in Full Mode.
* - load()/save(): Handles LocalStorage vs API serialization logic.
*
* - UI Generation:
* - injectStyles(): CSS definitions (Widget, Overlays, Map, Split-Screen).
* - drawUI(): Renders the main widget container and sets up layout modes.
* - renderBins(): Renders the list of items (Custom Buckets + Days).
* - toggleMap(): Lazy-loads Leaflet libraries and renders map container.
*
* - Logic & Handlers:
* - setupListeners(): Central event delegation (Clicks, Drag&Drop, Changes).
* - calculateRoutes(): Orchestrates ORS API calls for routing.
* - optimizeDay(): Orchestrates ORS API calls for ordering.
* - exportData(): Generates file blobs for download.
*
* - Map Helpers:
* - updateMapMarkers(): Draws L.marker/L.divIcon based on current data.
* - highlightDay(): Manages opacity/visibility of specific day layers.
*
* DEPENDENCIES:
* -------------
* - MediaWiki Modules: 'mediawiki.util', 'mediawiki.api', 'mediawiki.user', 'mediawiki.notification'.
* - OOJS UI: 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'.
* - Kartographer: 'ext.kartographer.box' for Leaflet (L) access.
* - jQuery ($).
*/
(function (mw, $) {
'use strict';
if (mw.config.get('wgAction') !== 'view') return;
let BucketEditDialog;
function initOOUI() {
if (BucketEditDialog) return;
BucketEditDialog = function (config) {
BucketEditDialog.super.call(this, config);
};
OO.inheritClass(BucketEditDialog, OO.ui.ProcessDialog);
BucketEditDialog.static.name = 'bucketEditDialog';
BucketEditDialog.static.title = 'Edit Bucket';
BucketEditDialog.static.actions = [
{ action: 'save', label: 'Save', flags: ['primary', 'progressive'] },
{ label: 'Cancel', flags: 'safe' }
];
BucketEditDialog.prototype.initialize = function () {
BucketEditDialog.super.prototype.initialize.call(this);
this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
this.nameInput = new OO.ui.TextInputWidget({
placeholder: 'Enter bucket name (e.g. food, sleep)'
});
this.nameField = new OO.ui.FieldLayout(this.nameInput, {
label: 'Bucket Name',
align: 'top'
});
this.customIconInput = new OO.ui.TextInputWidget({
maxLength: 2
});
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
const buttonItems = presetIcons.map(function (icon) {
return new OO.ui.ButtonOptionWidget({
data: icon,
label: icon,
title: icon
});
});
this.presetSelect = new OO.ui.ButtonSelectWidget({
items: buttonItems
});
const thiss = this;
this.presetSelect.on('select', function (item) {
if (item) {
thiss.customIconInput.setValue(item.getData());
}
});
this.customIconInput.on('change', function (value) {
if (presetIcons.indexOf(value) === -1) {
thiss.presetSelect.selectItem(null);
} else {
const opt = thiss.presetSelect.findItemFromData(value);
if (opt) {
thiss.presetSelect.selectItem(opt);
}
}
});
this.nameInput.on('change', function (value) {
thiss.actions.setAbilities({ save: !!value.trim() });
});
this.presetField = new OO.ui.FieldLayout(this.presetSelect, {
label: 'Escoge un ícono predefinido',
align: 'top'
});
this.customIconField = new OO.ui.FieldLayout(this.customIconInput, {
label: 'Ícono (emoji or caracter)',
align: 'top'
});
this.fieldset = new OO.ui.FieldsetLayout();
this.fieldset.addItems([this.nameField, this.presetField, this.customIconField]);
this.content.$element.append(this.fieldset.$element);
this.$body.append(this.content.$element);
};
BucketEditDialog.prototype.getSetupProcess = function (data) {
data = data || {};
return BucketEditDialog.super.prototype.getSetupProcess.call(this, data)
.next(function () {
this.title.setLabel(data.title || 'Carpeta de edición');
this.nameInput.setValue(data.name || '');
this.customIconInput.setValue(data.icon || '🗂️');
this.actions.setAbilities({ save: !!(data.name || '').trim() });
const val = data.icon || '🗂️';
const presetIcons = ['🍴', '🏨', '📷', '🛍️', '📦', '🗺️', '🚶', '📍', '☕', '🍺', '⛺', '🏛️', '🎡', '🛒', '💳', '🌲'];
if (presetIcons.indexOf(val) !== -1) {
const opt = this.presetSelect.findItemFromData(val);
if (opt) {
this.presetSelect.selectItem(opt);
}
} else {
this.presetSelect.selectItem(null);
}
this.onSave = data.onSave;
}, this);
};
BucketEditDialog.prototype.getActionProcess = function (action) {
if (action === 'save') {
const name = this.nameInput.getValue().trim();
const icon = this.customIconInput.getValue().trim();
if (!name) {
return new OO.ui.Process(function () {
alert('Ingresa un nombre para la carpeta.');
});
}
const thiss = this;
return new OO.ui.Process(function () {
if (thiss.onSave) {
thiss.onSave(name, icon || '🗂️');
}
thiss.close({ action: action });
});
}
return BucketEditDialog.super.prototype.getActionProcess.call(this, action);
};
}
const TripPlanner = {
storageKey: 'wv-trip-planner',
optionKey: 'userjs-wv-trip-planner',
saveTimer: null,
syncTimer: null,
map: null,
markerLayer: null,
localTripIndex: null, // Isolated tab-local trip selection
data: { activeTripIndex: 0, minimized: false, trips: [] },
colors: ['#d33', '#36c', '#2a7b39', '#f60', '#72309d', '#e2127a', '#00af89'],
init: function () {
if ($('.vcard').length === 0 && $('.listing').length > 0) {
console.warn("TripPlanner: no se encontró la clase vcard, es posible que los listados no se puedan arrastrar.");
}
this.load();
if (this.data.trips.length === 0) this.createNewTrip("Mi primer viaje");
this.data.closed = false;
this.data.minimized = false;
this.cachedRoutes = {}
this.injectStyles();
this.initMap(); // Ensure map container and Leaflet exist
this.setupListeners();
this.makeListingsDraggable();
this.drawUI();
this.syncChannel = window.BroadcastChannel ? new BroadcastChannel('wv-trip-planner-sync') : null;
if (this.syncChannel) {
this.syncChannel.onmessage = (msg) => {
if (msg.data.type === 'sync') {
// Preserve local UI state flags
const wasClosed = this.data.closed;
const wasMinimized = this.data.minimized;
this.data = msg.data.data;
this.data.closed = wasClosed;
this.data.minimized = wasMinimized;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.renderTripOptions();
this.renderBins();
this.updateMapMarkers();
// Sync topbar inputs without full redraw
const trip = this.getActiveTrip();
$('#tp-rename-input').val(trip.name);
$('#tp-start-date').val(trip.startDate);
$('#tp-length').val(trip.length);
} else {
this.drawUI();
}
}
};
}
},
load: function () {
const defaults = { activeTripIndex: 0, minimized: false, trips: [], orsKey: '' };
// 1. Read Local Storage (Used for Anon, or for merging after login)
const localStr = localStorage.getItem(this.storageKey);
let localData = null;
if (localStr) {
try {
localData = $.extend({}, defaults, JSON.parse(localStr));
} catch (e) {
console.error("Local load error", e);
}
}
if (mw.user.isAnon()) {
// --- CASE 1: Anonymous User -> Use Local Storage ---
if (localData) this.data = localData;
} else {
// --- CASE 2: Logged In -> Use Account Options ---
const remoteStr = mw.user.options.get(this.optionKey);
let remoteData = {
activeTripIndex: 0, minimized: false, trips: []
};
if (remoteStr) {
try {
$.extend(remoteData, JSON.parse(remoteStr));
} catch (e) { console.error("Remote load error", e); }
}
// --- MERGE LOGIC: If local data exists, merge it into account and clear local ---
if (localData && localData.trips && localData.trips.length > 0) {
// Avoid merging empty default trips if possible
const validLocalTrips = localData.trips.filter(t => {
const hasItemsInBuckets = t.buckets ? t.buckets.some(b => b.items.length > 0) : (t.backlog && t.backlog.length > 0);
return hasItemsInBuckets || t.days.some(d => d.items.length > 0) || t.name !== "Mi primer viaje";
});
if (validLocalTrips.length > 0) {
remoteData.trips = remoteData.trips.concat(validLocalTrips);
// Trigger immediate save to server to persist the merge
this.saveDataToApi(remoteData);
}
// Clear local storage so we don't merge again next reload
localStorage.removeItem(this.storageKey);
}
this.data = remoteData;
if (!this.data.closed)
this.data.closed = false;
}
this.migrateData();
},
migrateData: function () {
if (!this.data || !this.data.trips) return;
this.data.trips.forEach(trip => {
if (!trip.buckets) {
trip.buckets = [
{ id: "backlog", name: "Reservas", icon: "📦", items: trip.backlog || [] }
];
}
delete trip.backlog;
// Ensure every bucket has an id, name, icon, items
trip.buckets.forEach(b => {
if (!b.id) b.id = 'bucket_' + Math.random().toString(36).substr(2, 9);
if (!b.icon) b.icon = '📦';
if (!b.items) b.items = [];
});
});
},
save: function () {
const dataToSave = $.extend(true, {}, this.data);
// cleanup non-persistent flags
delete dataToSave.closed;
delete dataToSave.minimized;
if (dataToSave.trips) {
dataToSave.trips.forEach(trip => {
delete trip.backlog;
});
}
// 1. Sync other tabs (100ms delay)
this.broadcastSync(dataToSave);
if (mw.user.isAnon()) {
// Anon: Save directly to LocalStorage
localStorage.setItem(this.storageKey, JSON.stringify(dataToSave));
} else {
// Logged In: Save to API (Debounced 2s)
clearTimeout(this.saveTimer);
this.saveTimer = setTimeout(() => {
this.saveDataToApi(dataToSave);
}, 2000);
}
},
broadcastSync: function (data) {
if (!this.syncChannel) return;
clearTimeout(this.syncTimer);
this.syncTimer = setTimeout(() => {
this.syncChannel.postMessage({ type: 'sync', data: data });
}, 100);
},
saveDataToApi: function (dataToSave) {
new mw.Api().saveOption(this.optionKey, JSON.stringify(dataToSave))
.fail(function (code, data) { console.error("TripPlanner Sync Error", code, data); });
},
getActiveTrip: function () {
const idx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
return this.data.trips[idx] || this.data.trips[0];
},
injectStyles: function () {
mw.util.addCSS(`
/* --- DESKTOP / DEFAULT STYLES --- */
#tp-widget {
position: fixed; bottom: 10px; right: 10px;
width: 360px;
max-width: 95vw;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #a2a9b1; border-radius: 8px;
z-index: 2000; box-shadow: 0 4px 15px rgba(0,0,0,0.3);
font-family: sans-serif; display: flex; flex-direction: column;
box-sizing: border-box;
}
#tp-widget * { box-sizing: border-box; }
.tp-header { background: #36c; color: white; padding: 10px; border-radius: 8px 8px 0 0; cursor: pointer; display: flex; justify-content: space-between; align-items: center; }
.tp-content { position: relative; display: flex; flex-direction: column; height: 100%; }
.tp-settings {
padding: 8px;
border-bottom: 1px solid var(--border-color-subtle, #eee);
background: var(--background-color-interactive-subtle, #f8f9fa);
font-size: 0.85em;
}
.tp-settings-row { display: flex; gap: 5px; margin-bottom: 5px; align-items: center; }
.tp-body { padding: 10px; max-height: 400px; overflow-y: auto; background: var(--background-color-base, #fff); flex-grow: 1; }
.tp-section-title { font-size: 0.75em; font-weight: bold; color: var(--color-subtle, #72777d); text-transform: uppercase; margin: 12px 0 5px; display: flex; justify-content: space-between; }
.tp-bin { border: 1px solid #c8ccd1; border-radius: 4px; padding: 8px; margin-bottom: 10px; background: var(--background-color-interactive-subtle, #fdfdfd); min-height: 35px; }
.tp-bin.drag-over { background: var(--background-color-progressive-subtle, #eaf3ff); border: 2px solid #36c; }
.tp-item {
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border: 1px solid #eaecf0; padding: 6px; margin: 4px 0; font-size: 0.85em; display: flex; justify-content: space-between; cursor: grab; align-items: center; box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.tp-item:hover { border-color: var(--border-color-progressive, #36c); }
.tp-controls {
display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 4px; padding: 8px; border-top: 1px solid #eee;
background: var(--background-color-base, #fff);
}
/* Overlays */
#tp-menu-overlay, #tp-edit-form, #tp-settings-overlay, #tp-route-overlay {
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
z-index: 110;
display: none; flex-direction: column; padding: 15px; border-radius: 0 0 8px 8px;
}
.tp-menu-btn {
display: block; width: 100%; text-align: left; padding: 8px; border: 1px solid #ccc;
background: var(--background-color-base, #fff);
color: var(--color-base, #202122); margin-bottom: 5px; cursor: pointer; border-radius: 4px; font-size: 0.85em;
}
.tp-menu-btn:hover { background: var(--background-color-progressive-subtle, #f0f4ff); border-color: #36c; color: #36c; }
.tp-form-row { margin-bottom: 8px; display: flex; flex-direction: column; font-size: 0.8em; }
.tp-form-row input, .tp-form-row textarea {
padding: 4px;
border: 1px solid var(--border-color-subtle, #ccc);
background: var(--background-color-base, #fff);
color: var(--color-base, #202122);
border-radius: 3px;
}
/* Map & Helpers */
#tp-map-container { position: fixed; top: 60px; left: 60px; right: 420px; bottom: 60px; background: var(--background-color-base, white); border: 2px solid #36c; border-radius: 8px; z-index: 1999; display: none; box-shadow: 0 0 20px rgba(0,0,0,0.4); }
#tp-map-canvas { width: 100%; height: 100%; }
.tp-btn-move, .tp-btn-edit { cursor: pointer; color: var(--color-progressive, #36c); font-size: 10px; border: 1px solid #36c; padding: 1px 4px; border-radius: 3px; }
.tp-remove { color: var(--color-destructive, #d33); cursor: pointer; font-weight: bold; padding: 0 5px; }
.listing-draggable-proxy { cursor: move !important; }
.tp-in-trip::before { content: "✅ "; }
.tp-route-stats {
font-size: 10px;
color: var(--color-subtle, #555);
background: var(--background-color-neutral-subtle, #f0f0f0);
text-align: center; padding: 2px; margin: 2px 10px; border-radius: 4px; border: 1px dashed #ccc;
}
.tp-item-error { border: 2px solid #d33 !important; background: #fff1f0 !important; }
.tp-error-msg { font-size: 0.8em; color: #d33; font-style: italic; margin-top: 2px; }
.tp-setting-block { margin-bottom: 12px; }
.tp-setting-block label { display: block; font-weight: bold; font-size: 0.8em; color: var(--color-subtle, #555); margin-bottom: 3px; }
.tp-setting-block input { width: 100%; padding: 5px; border: 1px solid #ccc; border-radius: 4px; }
.tp-divider { border-bottom: 1px solid var(--border-color-subtle, #eee); margin: 10px 0; }
#tp-minimized-icon {
position: fixed; bottom: 20px; right: 20px;
width: 48px; height: 48px;
background: #36c; color: white;
border-radius: 50%;
text-align: center; line-height: 48px; font-size: 24px;
box-shadow: 0 4px 12px rgba(0,0,0,0.4);
cursor: pointer; z-index: 2000;
transition: transform 0.1s;
user-select: none;
}
#tp-minimized-icon:hover { transform: scale(1.1); background: #2a5ab0; }
#tp-widget .mw-ui-button { font-size: 0.8em; font-weight: bold; padding: 4px 8px; min-height: 24px; line-height: 1.4; width: 100%; }
#tp-new-trip, #tp-open-settings { padding: 3px 8px; min-width: auto; width: auto !important; }
/* MOBILE / TOUCHSCREEN OPTIMIZATIONS */
@media (max-width: 1200px) and (pointer: coarse) {
/*#tp-widget {
width: 100% !important;
left: 0 !important; right: 0 !important;
bottom: 0 !important;
border-radius: 8px 8px 0 0 !important;
max-height: 80vh;
transition: transform 0.3s;
z-index: 2000;
box-shadow: 0 -2px 10px rgba(0,0,0,0.2) !important;
}
#tp-body {
max-height: 15em;
} */
/* 2. FULLSCREEN MAP MODE */
/* Hide widget when map is open to give full screen to map */
/* body.tp-mobile-map-open #tp-widget {
display: none !important;
} */
/* Map covers 100% of viewport */
body.tp-mobile-map-open #tp-map-container {
display: block !important;
position: fixed !important;
top: 0 !important; left: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important;
border-radius: 0 !important;
z-index: 2001 !important; /* Above everything */
}
/* Large, Touch-Friendly Close Button */
body.tp-mobile-map-open #tp-map-hide {
display: block !important;
top: 15px !important;
right: 15px !important;
background: white !important;
color: #333 !important;
padding: 10px 20px !important; /* Larger touch target */
border-radius: 4px !important;
box-shadow: 0 2px 8px rgba(0,0,0,0.3) !important;
font-weight: bold !important;
font-size: 16px !important;
border: 1px solid #ccc !important;
}
/* 3. Mobile "Tap to Add" Button */
.tp-mobile-add {
display: inline-block;
padding: 6px 12px;
background: #eaf3ff;
color: #36c;
border: 1px solid #36c;
border-radius: 16px;
margin: 4px 0 4px 8px;
font-weight: bold;
cursor: pointer;
font-size: 0.9em;
white-space: nowrap;
}
.tp-mobile-add:active { background: #36c; color: white; }
}
/* --- FULL MODE / SPLIT SCREEN STYLES --- */
.tp-full-app {
display: flex; flex-direction: column;
height: 80vh; min-height: 600px;
border: 1px solid #a2a9b1; border-radius: 8px; overflow: hidden;
background: var(--background-color-base, #fff); color: var(--color-base, #202122);
font-family: sans-serif;
}
.tp-full-app * { box-sizing: border-box; }
.tp-full-topbar {
display: flex; gap: 10px; align-items: center; padding: 10px 15px;
background: #f8f9fa; border-bottom: 1px solid #eee; flex-wrap: wrap;
}
.tp-full-topbar .tp-setting-block { margin-bottom: 0; display: flex; align-items: center; gap: 5px; }
.tp-full-topbar .tp-setting-block label { margin-bottom: 0; }
.tp-full-split {
display: flex; flex-grow: 1; overflow: hidden; position: relative;
}
.tp-full-sidebar {
flex-shrink: 0; max-width: 360px;
overflow-y: auto; padding: 10px;
border-right: 1px solid #eee;
background: var(--background-color-base, #fff);
}
@media (max-width: 720px) {
.tp-full-app {
height: auto;
min-height: auto;
}
.tp-full-split {
flex-direction: column;
overflow: visible;
}
.tp-full-sidebar {
max-width: 100%;
height: 350px;
border-right: none;
border-bottom: 1px solid #eee;
}
.tp-full-main {
height: 80vh;
min-height: 500px;
flex-grow: 1;
position: relative;
}
}
.tp-full-main {
flex-grow: 1; position: relative;
}
.tp-full-main #tp-map-container {
/* Override fixed positioning when inside full mode */
position: absolute !important; top: 0 !important; left: 0 !important;
right: 0 !important; bottom: 0 !important;
width: 100% !important; height: 100% !important;
border: none !important; border-radius: 0 !important; box-shadow: none !important;
z-index: 10 !important; display: block !important;
}
.tp-full-main #tp-map-hide {
display: none !important; /* Hide map close button in full mode */
}
`);
},
drawUI: function () {
const isFullMode = $('#trip-planner-app').length > 0;
// 1. Handle "Closed" state (Launcher in user menu)
if (this.data.closed && !isFullMode) {
$('#tp-widget, #tp-minimized-icon').remove();
$('#tp-map-container').hide().detach().appendTo('body');
this.drawLauncher();
return;
} else {
$('.tp-launcher-icon, #tp-launcher-li').remove();
$('#tp-launcher').remove();
}
// 2. Handle "Minimized" state (Floating Icon)
if (this.data.minimized && !isFullMode) {
$('#tp-widget').remove();
$('#tp-map-container').hide().detach().appendTo('body');
$('body').append(`<div id="tp-minimized-icon" title="Expandir planificador de viajes">🎒</div>`);
return;
}
// 3. Handle "Open" state
$('#tp-widget, #tp-minimized-icon').remove();
// Detach map container before resetting app
const $mapContainer = $('#tp-map-container').detach();
if (isFullMode) {
$('#trip-planner-app').empty();
}
const trip = this.getActiveTrip();
if (this.lastActiveTrip && this.lastActiveTrip !== trip) {
if (this.routeLayer) {
this.routeLayer.clearLayers();
}
this.cachedRoutes = {};
$('.tp-route-stats').remove();
}
this.lastActiveTrip = trip;
let dayOptions = "";
trip.days.forEach((d, i) => {
dayOptions += `<option value="${i}">Día ${i + 1}</option>`;
});
const safeName = mw.html.escape(trip.name);
const safeKey = mw.html.escape(this.data.orsKey || '');
const helpUrl = mw.util.getUrl('Wikiviajes:Planificador_de_viajes');
const fullModeUrl = mw.util.getUrl('Planificador de viajes');
let $widget;
if (isFullMode) {
$widget = $(`
<div class="tp-full-app">
<div class="tp-full-topbar">
<div class="tp-setting-block" style="margin-right:15px">
<label>Trip:</label>
<select id="tp-select-trip" style="padding:4px; max-width:150px; border:1px solid #ccc; border-radius:4px;"></select>
<button id="tp-new-trip" class="mw-ui-button" title="Nuevo viaje" style="padding:3px 8px; min-width:auto">+</button>
</div>
<div class="tp-setting-block" style="flex-grow:1; flex-basis: 250px">
<label>Nombre:</label>
<input type="text" id="tp-rename-input" value="${safeName}">
</div>
<div class="tp-setting-block">
<label>Start:</label>
<input type="date" id="tp-start-date" value="${trip.startDate}" style="width:130px">
</div>
<div class="tp-setting-block" style="margin-right:15px">
<label>Days:</label>
<input type="number" id="tp-length" value="${trip.length}" min="1" style="width:60px">
</div>
<div>
<button id="tp-btn-route" class="mw-ui-button">🚗 Ruta</button>
<button id="tp-btn-export" class="mw-ui-button">💾 Guardando...</button>
<button id="tp-import" class="mw-ui-button">📂 Cargar</button>
<button id="tp-del-trip" class="mw-ui-button mw-ui-destructive mw-ui-quiet" title="Eliminar viaje" style="padding:4px 8px; min-width:auto; margin-left:auto;">🗑️</button>
</div>
</div>
<div class="tp-full-split">
<div class="tp-full-sidebar tp-body" style="max-height:none">
<div class="tp-section-title" style="border-bottom: 1px solid #ccc; padding-bottom: 4px; margin-bottom: 10px;">
<span>🗂️ Carpetas</span>
<div>
<span class="tp-btn-edit" id="tp-add-bucket" title="Add custom bucket">+ Bucket</span>
</div>
</div>
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-full-main" id="tp-map-container-wrapper">
</div>
</div>
<div id="tp-menu-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-menu-title">Menú</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancelar</button>
</div>
<div id="tp-edit-form" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b id="tp-form-title">Modificar entrada</b>
<div class="tp-form-row"><label>Título</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Latitud</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Longitud</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="e.g. Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Obtener título y coordenadas">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Nota</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Fuente</label><input type="text" id="f-source" placeholder="ejemplo Caracas"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Guardar</button>
<button class="mw-ui-button" id="f-cancel">Cancelar</button>
</div>
</div>
<div id="tp-route-overlay" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--background-color-base, #fff); z-index: 110; display: none; flex-direction: column; padding: 15px;">
<b style="margin-bottom:10px; display:block">Calculadora de ruta</b>
<div class="tp-setting-block">
<label>ORS API Key <a href="https://openrouteservice.org/dev/#/signup" target="_blank" style="font-weight:normal; font-size:0.9em">(Obtener clave gratuita)</a></label>
<input type="text" id="tp-ors-key" placeholder="Ingresa la clave aquí..." value="${safeKey}">
</div>
<div class="tp-setting-block">
<label>Modo de viaje</label>
<div style="display:flex; gap:5px">
<select id="tp-route-profile" style="flex: 1; padding:5px; border:1px solid #ccc; border-radius:4px">
<option value="foot-walking">🚶 Caminar</option>
<option value="driving-car">🚗 Manejar automovil</option>
</select>
<button id="tp-run-route" class="mw-ui-button mw-ui-progressive" style="flex:1">Calcular ruta</button>
</div>
</div>
<div class="tp-divider"></div>
<div class="tp-setting-block">
<label>Optimizar orden del día</label>
<div style="display:flex; gap:5px">
<select id="tp-opt-day" style="flex:1; padding:5px; border:1px solid #ccc; border-radius:4px">
${dayOptions}
</select>
<button id="tp-run-opt" class="mw-ui-button" style="flex:1">Optimizar</button>
</div>
<div style="font-size:0.75em; color:#666; margin-top:2px">Mantiene el primer item, reorganiza el resto</div>
</div>
<button id="tp-close-route" class="mw-ui-button" style="margin-top:auto; width:100%">Cerrar</button>
</div>
</div>
`);
$('#trip-planner-app').append($widget);
// Move map container into its Full Mode wrapper
$mapContainer.appendTo($widget.find('#tp-map-container-wrapper')).show();
// Refresh map layout immediately as it might have been moved/resized
if (this.map) {
setTimeout(() => {
this.map.invalidateSize();
this.updateMapMarkers(true); // pass true to fit bounds
}, 200); // slightly longer timeout to ensure DOM catch-up
}
} else {
$widget = $(`
<div id="tp-widget">
<div class="tp-header">
<span id="tp-toggle" style="flex-grow:1">🎒 Planificador de viajes</span>
<span>
<a href="${helpUrl}" target="_blank" style="color:white; text-decoration:none; font-weight:bold; cursor:pointer;" title="Ayuda / Documentación">?</a>
<span id="tp-toggle-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Minimizar icono">-</span>
<span id="tp-close-btn" style="cursor:pointer; margin-left:12px; font-weight:bold" title="Cerrar">✕</span>
</span>
</div>
<div class="tp-content" style="display: block; position:relative">
<div id="tp-menu-overlay">
<b id="tp-menu-title">Menú</b>
<div id="tp-menu-content" style="margin-top:10px; flex-grow:1; overflow-y:auto"></div>
<button class="mw-ui-button mw-ui-quiet" id="tp-menu-close">Cancelar</button>
</div>
<div id="tp-edit-form">
<b id="tp-form-title">Editar entrada</b>
<div class="tp-form-row"><label>Título</label><input type="text" id="f-title"></div>
<div class="tp-form-row"><label>Latitud</label><input type="text" id="f-lat"></div>
<div class="tp-form-row"><label>Longitud</label><input type="text" id="f-lon"></div>
<div class="tp-form-row">
<label>Wikidata</label>
<div style="display:flex; gap:5px">
<input type="text" id="f-wikidata" style="flex-grow:1" placeholder="ejemplo Q42">
<button id="f-fetch-wd" class="mw-ui-button" style="min-width:auto; padding:0 8px" title="Obtener título y coordenadas">⬆️</button>
</div>
</div>
<div class="tp-form-row"><label>Nota</label><textarea id="f-note"></textarea></div>
<div class="tp-form-row"><label>Fuente</label><input type="text" id="f-source" placeholder="ejemplo Caracas"></div>
<div style="display:flex; gap:5px">
<button class="mw-ui-button mw-ui-progressive" id="f-save">Guardar</button>
<button class="mw-ui-button" id="f-cancel">Cancelar</button>
</div>
</div>
<div class="tp-settings">
<div class="tp-settings-row">
<select id="tp-select-trip" style="flex-grow:1"></select>
</div>
</div>
<div class="tp-body">
<div id="tp-buckets-container"></div>
<div id="tp-days-container"></div>
</div>
<div class="tp-controls" style="grid-template-columns: 1fr;">
<a href="${fullModeUrl}" class="mw-ui-button mw-ui-progressive" style="text-align:center; text-decoration:none; display:block">🗺️ Abrir completamente el planificador de viajes</a>
</div>
</div>
<input type="file" id="tp-file-input" style="display:none" accept=".json">
</div>
`);
$('body').append($widget);
// Keep map detached/hidden in Widget Mode
$mapContainer.hide().appendTo('body');
}
if ($('#tp-file-input').length === 0) {
$('body').append('<input type="file" id="tp-file-input" style="display:none" accept=".json">');
}
this.renderTripOptions();
this.renderBins();
if (!isFullMode) {
$('body').removeClass('tp-mobile-map-open');
}
if (isFullMode && this.map) {
this.updateMapMarkers();
}
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updateWidgetButtonsVisibility: function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) {
// Hide day action buttons that are injected constantly in renderBins
$('#tp-widget .tp-btn-move').hide();
$('#tp-widget .tp-edit-bucket').hide();
$('#tp-widget .tp-remove-bucket').hide();
$('#tp-widget .tp-add-custom-btn').hide();
}
},
drawLauncher: function () {
createLauncherIcon(() => {
this.data.closed = false;
this.saveAndRefresh();
});
},
renderTripOptions: function () {
const $select = $('#tp-select-trip').empty();
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
this.data.trips.forEach((t, i) => $select.append($('<option>', { value: i, text: t.name, selected: i === currentIdx })));
},
renderBins: function () {
const isFullMode = $('#trip-planner-app').length > 0;
const trip = this.getActiveTrip();
// Render all buckets
const $bucketsContainer = $('#tp-buckets-container').empty();
trip.buckets.forEach(b => {
const isBacklog = b.id === 'backlog';
const $bucketBlock = $(`
<div class="tp-section-title tp-bucket-header" data-bucket-id="${b.id}">
<span class="tp-bucket-title-text" style="cursor: pointer;" title="Haz clic para resaltar en el mapa, doble clic para editar/cambiar el nombre.">${b.icon} ${b.name}</span>
<div>
${isFullMode ? `
<span class="tp-btn-edit tp-add-custom-btn" data-bucket-id="${b.id}">+ POI</span>
<span class="tp-btn-move" data-move-type="bucket" data-bucket-id="${b.id}">Mover</span>
<span class="tp-btn-edit tp-edit-bucket" data-bucket-id="${b.id}" title="Editar/renombrar carpeta">✏️</span>
${!isBacklog ? `<span class="tp-remove tp-remove-bucket" data-bucket-id="${b.id}" title="Eliminar carpeta" style="font-weight:bold; margin-left:5px">×</span>` : ''}
` : `
<span class="tp-btn-edit tp-add-article-btn" data-bucket-id="${b.id}" title="Añadir guía actual como destino">+ Guía</span>
`}
</div>
</div>
<div class="tp-bin tp-bucket-bin" data-type="bucket" data-bucket-id="${b.id}"></div>
`);
b.items.forEach((item, idx) => {
$bucketBlock.filter('.tp-bucket-bin').append(this.createItemHTML(item, 'bucket', idx, b.id));
});
$bucketsContainer.append($bucketBlock);
});
// Render days
const $daysContainer = $('#tp-days-container').empty();
trip.days.forEach((day, dIdx) => {
const dayDate = new Date(trip.startDate);
dayDate.setDate(dayDate.getDate() + dIdx);
const $dayBlock = $(`
<div class="tp-section-title" style="color:${this.colors[dIdx % this.colors.length]}">
Day ${dIdx + 1} (${dayDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric' })})
${isFullMode ? `<span class="tp-btn-move" data-move-type="day" data-day-idx="${dIdx}">Mover</span>` : ''}
</div>
<div class="tp-bin tp-day-bin" data-type="day" data-day-idx="${dIdx}"></div>
`);
day.items.forEach((item, iIdx) => {
$dayBlock.filter('.tp-day-bin').append(this.createItemHTML(item, 'day', iIdx, dIdx));
});
$daysContainer.append($dayBlock);
});
if (isFullMode)
this.updateMapMarkers();
this.updatePageIndicators();
this.updateWidgetButtonsVisibility();
},
updatePageIndicators: function () {
const thiss = this;
const trip = this.getActiveTrip();
const allItems = [...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)];
// Create Sets for fast lookup (Wikidata ID or Lat,Lon string)
const wdSet = new Set(allItems.map(i => i.wikidata).filter(Boolean));
const locSet = new Set(allItems.map(i => i.lat + "," + i.lon));
$('.vcard').each(function () {
const $l = $(this);
// Extract same data as draggable logic
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
const wdId = $l.find('[id]').filter(function () { return /^Q\d+$/.test(this.id); }).attr('id');
// Check if this listing is in our data
const isPresent = (wdId && wdSet.has(wdId)) ||
(lat && lon && locSet.has(thiss.parseCoordinate(lat) + "," + thiss.parseCoordinate(lon)));
if (isPresent) $l.addClass('tp-in-trip');
else $l.removeClass('tp-in-trip');
});
},
createItemHTML: function (item, type, idx, binIdOrIdx) {
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
const orderHtml = (type === 'day')
? `<span style="color:#555; margin-right:6px; min-width:15px;">${idx + 1}.</span>`
: '';
return $(`
<div class="tp-item" draggable="true" data-type="${type}" data-idx="${idx}" data-bin-id="${binIdOrIdx}">
${orderHtml}
<div style="display:flex; flex-direction:column; overflow:hidden; flex-grow:1; margin-right:5px">
<span style="overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:bold" title="${safeTitle}">${safeTitle}</span>
${safeNote ? `<span style="font-size:0.75em; color:#666; overflow:hidden; text-overflow:ellipsis; white-space:nowrap">${safeNote}</span>` : ''}
</div>
<span style="display:flex; align-items:center; flex-shrink:0">
<span class="tp-btn-edit item-edit-trigger" style="border:none; padding:0 3px; font-size:1.1em">✏️</span>
${item.sourcePage ? `<a href="${url}" target="_blank" style="text-decoration:none; margin:0 3px">🔗</a>` : ''}
<span class="tp-remove">×</span>
</span>
</div>
`);
},
showMenu: function (title, options) {
$('#tp-menu-title').text(title);
const $cont = $('#tp-menu-content').empty();
options.forEach(opt => {
if (opt.header) {
$cont.append(`
<div style="
font-weight: bold;
color: #555;
margin: 12px 0 4px 0;
border-bottom: 1px solid #eee;
padding-bottom: 2px;
font-size: 0.9em;
">${mw.html.escape(opt.header)}</div>
`);
return;
}
// Standard Buttons
const $btn = $(`<button class="tp-menu-btn">${opt.label}</button>`);
if (opt.disabled) {
$btn.prop('disabled', true).css({ opacity: 0.6, cursor: 'not-allowed', background: '#f8f8f8', color: '#888' });
if (opt.helpText) {
$btn.append(`<div style="font-size:0.8em; font-style:italic; margin-top:2px">${opt.helpText}</div>`);
}
} else {
$btn.on('click', () => { opt.action(); $('#tp-menu-overlay').hide(); });
}
$cont.append($btn);
});
$('#tp-menu-overlay').css('display', 'flex');
},
exportData: function (format) {
const trip = this.getActiveTrip();
let content = "", mime = "text/plain", ext = "txt";
switch (format) {
case 'trip':
content = JSON.stringify(trip, null, 2);
mime = "application/json";
ext = "json";
break;
case 'all':
const cleanData = {
trips: this.data.trips
};
content = JSON.stringify(cleanData, null, 2);
mime = "application/json";
ext = "json";
break;
case 'gpx':
content = `<?xml version="1.0" encoding="UTF-8"?><gpx version="1.1" creator="WVPlanner">`;
[...trip.buckets.flatMap(b => b.items), ...trip.days.flatMap(d => d.items)].forEach(i => { if (i.lat) content += `<wpt lat="${i.lat}" lon="${i.lon}"><name>${i.title}</name></wpt>`; });
content += `</gpx>`;
mime = "application/gpx+xml";
ext = "gpx";
break;
case 'wiki':
trip.days.forEach((d, idx) => {
content += `\n=== Day ${idx + 1} ===\n`;
d.items.forEach(i => content += `* {{listing|name=${i.title}|lat=${i.lat}|long=${i.lon}|wikidata=${i.wikidata || ''}|content=${i.note || ''}}}\n`);
});
break;
case 'geojson-full':
var fc = { type: "FeatureCollection", features: [] };
// 1. Flatten all items (Buckets + all Days)
var allItems = trip.buckets.flatMap(b => b.items).concat(trip.days.reduce(function (acc, d) {
return acc.concat(d.items);
}, []));
// 2. Add Points (Listings)
allItems.forEach(function (i) {
if (i.lat && i.lon) {
fc.features.push({
type: "Feature",
geometry: { type: "Point", coordinates: [i.lon, i.lat] },
properties: {
name: i.title,
note: i.note || "",
wikidata: i.wikidata,
day: i.day !== undefined ? i.day + 1 : 'bucket'
}
});
}
});
// 3. Add Lines (Routes) from Leaflet Layer using concat
if (this.routeLayer && window.L) {
var routes = this.routeLayer.toGeoJSON();
if (routes && routes.features) {
fc.features = fc.features.concat(routes.features);
}
}
content = JSON.stringify(fc, null, 2);
mime = "application/geo+json";
ext = "geojson";
break;
}
const blob = new Blob([content], { type: mime });
const a = document.createElement('a'); a.href = URL.createObjectURL(blob);
a.download = `${trip.name.replace(/\s/g, '_')}.${ext}`; a.click();
},
setupListeners: function () {
const self = this;
const thiss = this;
$(document).on('click', '#tp-minimized-icon', function () {
self.data.minimized = false;
self.saveAndRefresh();
});
// Settings Overlay Toggles
$(document).on('click', '#tp-open-settings', () => $('#tp-settings-overlay').css('display', 'flex'));
$(document).on('click', '#tp-close-settings', () => {
$('#tp-settings-overlay').hide();
self.saveAndRefresh(); // Ensure changes (like rename) reflect in the main UI immediately
});
// NEW: Rename Logic
$(document).on('change', '#tp-rename-input', function () {
self.getActiveTrip().name = $(this).val();
self.save(); // Just save, don't redraw whole UI yet (wait for Close)
});
// Move Trip Logic
$(document).on('click', '.tp-btn-move', function () {
const moveType = $(this).data('move-type'); // 'bucket' or 'day'
const bucketId = $(this).data('bucket-id'); // if bucket
const sourceDayIdx = $(this).data('day-idx') !== undefined ? parseInt($(this).data('day-idx')) : -1;
const currentTripIdx = self.data.activeTripIndex;
const currentTrip = self.getActiveTrip();
let menuOptions = [];
// Helper to perform the move
const performMove = (targetTrip, targetType, targetBinIdOrIdx) => {
let items;
// Cut
if (moveType === 'bucket') {
const bucket = currentTrip.buckets.find(b => b.id === bucketId);
items = bucket ? bucket.items.splice(0) : [];
} else {
items = currentTrip.days[sourceDayIdx].items.splice(0);
}
// Paste
if (targetType === 'bucket') {
const targetBucket = targetTrip.buckets.find(b => b.id === targetBinIdOrIdx);
if (targetBucket) targetBucket.items.push(...items);
} else {
targetTrip.days[targetBinIdOrIdx].items.push(...items);
}
self.saveAndRefresh();
};
// Helper to add options for a specific trip
const addTripOptions = (trip, isCurrent) => {
let addedHeader = false;
const ensureHeader = () => {
if (!addedHeader) {
menuOptions.push({ header: isCurrent ? "Current Trip" : trip.name });
addedHeader = true;
}
};
// 1. Bucket Options
trip.buckets.forEach(b => {
// Show if: It's another trip OR (It's current trip AND we aren't already in this specific bucket)
if (!isCurrent || moveType !== 'bucket' || b.id !== bucketId) {
ensureHeader();
menuOptions.push({
label: `${b.icon} ${b.name}`,
action: () => performMove(trip, 'bucket', b.id)
});
}
});
// 2. Day Options
trip.days.forEach((day, dIdx) => {
// Show if: It's another trip OR (It's current trip AND we aren't in this specific day)
if (!isCurrent || (moveType !== 'day' || dIdx !== sourceDayIdx)) {
ensureHeader();
menuOptions.push({
label: `➡ Day ${dIdx + 1}`,
action: () => performMove(trip, 'day', dIdx)
});
}
});
};
// A. Process Current Trip First
addTripOptions(currentTrip, true);
// B. Process Other Trips
self.data.trips.forEach((trip, tIdx) => {
if (tIdx === currentTripIdx) return;
addTripOptions(trip, false);
});
if (menuOptions.length === 0) {
alert("No destinations available.");
} else {
const title = (moveType === 'bucket') ? `Mover items de la carpeta:` : `Mover día ${sourceDayIdx + 1} Items hacia:`;
self.showMenu(title, menuOptions);
}
});
// Save Menu Logic
$(document).on('click', '#tp-btn-export', () => {
const hasRoutes = self.routeLayer && window.L && self.routeLayer.getLayers().length > 0;
self.showMenu("Exportar formato:", [
{ label: "Viaje actual (JSON)", action: () => self.exportData('trip') },
{ label: "Respaldo de toda la data (JSON)", action: () => self.exportData('all') },
{ label: "Archivo GPS (GPX)", action: () => self.exportData('gpx') },
{ label: "Texto de Wikiviajes (WikiTexto)", action: () => self.exportData('wiki') },
{
label: "Viaje + Rutas (GeoJSON)",
action: () => self.exportData('geojson-full'),
disabled: !hasRoutes,
helpText: !hasRoutes ? "(Calcula las rutas primero antes de activar)" : ""
}
]);
});
$(document).on('click', '#tp-menu-close', () => $('#tp-menu-overlay').hide());
// Add / Edit Forms
$(document).on('click', '#tp-add-article, .tp-add-article-btn', function () {
const bucketId = $(this).data('bucket-id') || 'backlog';
const pageName = mw.config.get('wgPageName');
const wdId = mw.config.get('wgWikibaseItemId');
if (!wdId) return alert("Esta página no tiene item de Wikidata.");
self.fetchWikidata(wdId, pageName, (item) => {
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId) || trip.buckets[0];
if (bucket) {
bucket.items.push(item);
self.saveAndRefresh();
mw.notify(`Artículo añadido: ${item.title}`);
}
}).fail(() => alert("No se pudo obtener los datos de dicho artículo."));
});
$(document).on('click', '#f-fetch-wd', function () {
const id = $('#f-wikidata').val().trim().toUpperCase();
if (!/^Q\d+$/.test(id)) {
return;
}
const $btn = $(this);
const originalText = $btn.text();
$btn.text('⏳').prop('disabled', true);
self.fetchWikidata(id, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
})
.fail(err => alert(err.message || "No se pudo obtener datos."))
.always(function () {
$btn.text(originalText).prop('disabled', false);
});
});
let editingRef = null;
$(document).on('click', '#tp-add-custom, .tp-add-custom-btn, .item-edit-trigger', function () {
const isNew = $(this).attr('id') === 'tp-add-custom' || $(this).hasClass('tp-add-custom-btn');
if (isNew) {
const bucketId = $(this).data('bucket-id') || 'backlog';
editingRef = { type: 'bucket', idx: -1, binId: bucketId };
} else {
const p = $(this).closest('.tp-item');
editingRef = { type: p.data('type'), idx: p.data('idx'), binId: p.data('bin-id') };
}
const item = isNew ?
{ title: "", lat: "", lon: "", note: "", sourcePage: "" } :
(editingRef.type === 'bucket' ?
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] :
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx]
);
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val(item.note || "");
$('#f-source').val(item.sourcePage || "");
$('#tp-edit-form').css('display', 'flex');
});
$(document).on('click', '#tp-add-bucket', () => {
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Añadir carpeta adicional',
name: '',
icon: '🗂️',
onSave: function (name, icon) {
const trip = self.getActiveTrip();
const id = 'bucket_' + Math.random().toString(36).substr(2, 9);
trip.buckets.push({
id: id,
name: name,
icon: icon,
items: []
});
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-edit-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
const trip = self.getActiveTrip();
const bucket = trip.buckets.find(b => b.id === bucketId);
if (!bucket) return;
initOOUI();
if (!TripPlanner.windowManager) {
TripPlanner.windowManager = new OO.ui.WindowManager();
$('body').append(TripPlanner.windowManager.$element);
TripPlanner.bucketEditDialog = new BucketEditDialog({
size: 'medium'
});
TripPlanner.windowManager.addWindows([TripPlanner.bucketEditDialog]);
}
TripPlanner.windowManager.openWindow(TripPlanner.bucketEditDialog, {
title: 'Editar carpeta: ' + bucket.name,
name: bucket.name,
icon: bucket.icon,
onSave: function (name, icon) {
bucket.name = name;
bucket.icon = icon;
self.saveAndRefresh();
}
});
});
$(document).on('click', '.tp-remove-bucket', function (e) {
e.stopPropagation();
const bucketId = $(this).data('bucket-id');
if (bucketId === 'backlog') {
alert("La carpeta por defecto no puede ser eliminada.");
return;
}
const trip = self.getActiveTrip();
const bucketIdx = trip.buckets.findIndex(b => b.id === bucketId);
if (bucketIdx === -1) return;
const bucket = trip.buckets[bucketIdx];
if (bucket.items.length > 0) {
if (confirm(`La carpeta "${bucket.name}" contiene un total de ${bucket.items.length} item(s). ¿Moverlos al respaldo?`)) {
const backlog = trip.buckets.find(b => b.id === 'backlog');
if (backlog) backlog.items.push(...bucket.items);
} else if (!confirm("¿Está seguro de que desea eliminar esta carpeta y TODOS sus elementos de forma permanente?")) {
return;
}
}
trip.buckets.splice(bucketIdx, 1);
self.saveAndRefresh();
});
$(document).on('click', '#f-save', () => {
const item = {
title: $('#f-title').val(),
lat: self.parseCoordinate($('#f-lat').val()),
lon: self.parseCoordinate($('#f-lon').val()),
note: $('#f-note').val(),
wikidata: $('#f-wikidata').val(),
sourcePage: $('#f-source').val().trim()
};
if (editingRef.idx === -1) {
const list = (editingRef.type === 'bucket')
? self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items
: self.getActiveTrip().days[parseInt(editingRef.binId)].items;
if (editingRef.insertIdx !== undefined && editingRef.insertIdx !== -1) {
list.splice(editingRef.insertIdx, 0, item);
} else {
list.push(item);
}
} else if (editingRef.type === 'bucket') {
self.getActiveTrip().buckets.find(b => b.id === editingRef.binId).items[editingRef.idx] = item;
} else {
self.getActiveTrip().days[parseInt(editingRef.binId)].items[editingRef.idx] = item;
}
$('#tp-edit-form').hide(); self.saveAndRefresh();
});
$(document).on('click', '#f-cancel', () => $('#tp-edit-form').hide());
// Widget Basics
$(document).on('click', '#tp-close-btn', function (e) {
e.stopPropagation(); // Prevent triggering the header toggle
self.data.closed = true;
self.saveAndRefresh();
});
$(document).on('click', '#tp-toggle-btn', function (e) {
e.stopPropagation();
self.data.minimized = true;
self.saveAndRefresh();
});
$(document).on('change', '#tp-select-trip', (e) => {
const newIdx = parseInt($(e.target).val());
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
this.drawUI();
} else {
this.data.activeTripIndex = newIdx;
this.saveAndRefresh();
}
});
$(document).on('click', '#tp-new-trip', () => {
const n = prompt("¿Nombre del viaje?");
if (n) {
self.createNewTrip(n);
const newIdx = self.data.trips.length - 1;
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
this.localTripIndex = newIdx;
} else {
this.data.activeTripIndex = newIdx;
}
self.saveAndRefresh();
}
});
// Delete Trip Logic
$(document).on('click', '#tp-del-trip', () => {
const currentIdx = (this.localTripIndex !== null) ? this.localTripIndex : this.data.activeTripIndex;
if (this.data.trips.length > 1 && confirm("¿Estás seguro de que quieres eliminar este viaje de forma permanente?")) {
this.data.trips.splice(currentIdx, 1);
this.data.activeTripIndex = 0;
this.localTripIndex = 0;
self.migrateData();
this.saveAndRefresh();
} else if (this.data.trips.length <= 1) {
alert("No puedes eliminar el único viaje restante.");
}
});
$(document).on('change', '#tp-length', (e) => {
const trip = self.getActiveTrip();
const n = Math.max(1, parseInt($(e.target).val()));
if (n < trip.days.length) {
const backlog = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
trip.days.splice(n).forEach(d => backlog.items.push(...d.items));
} else {
while (trip.days.length < n)
trip.days.push({ items: [] });
}
trip.length = n;
self.saveAndRefresh();
});
$(document).on('change', '#tp-start-date', function (e) {
self.getActiveTrip().startDate = $(this).val();
self.saveAndRefresh();
});
$(document).on('click', '.tp-remove', function () {
const p = $(this).closest('.tp-item');
const trip = self.getActiveTrip();
const binType = p.data('type');
const binId = p.data('bin-id');
const idx = p.data('idx');
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
if (bucket) bucket.items.splice(idx, 1);
} else {
trip.days[parseInt(binId)].items.splice(idx, 1);
}
self.saveAndRefresh();
});
$(document).on('click', '#tp-run-opt', () => {
const dayIdx = parseInt($('#tp-opt-day').val());
const profile = $('#tp-route-profile').val(); // Get selected profile
self.optimizeDay(dayIdx, profile);
$('#tp-route-overlay').hide();
});
// D&D
$(document).on('dragenter', '.tp-bin', function (e) { $(this).addClass('drag-over'); });
$(document).on('dragleave', '.tp-bin', function (e) { $(this).removeClass('drag-over'); });
$(document).on('dragover', '.tp-bin', (e) => e.preventDefault());
$(document).on('drop', '.tp-bin', function (e) {
e.preventDefault();
e.stopPropagation();
$(this).removeClass('drag-over');
const self = thiss;
$('.tp-route-stats').remove();
if (self.routeLayer) self.routeLayer.clearLayers();
self.cachedRoutes = {};
const trip = self.getActiveTrip();
const transfer = e.originalEvent.dataTransfer;
let isPoiDrop = false;
let jsonData = transfer.getData('application/json') || transfer.getData('text/plain');
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (item.title && item.lat) {
isPoiDrop = true;
}
} catch (err) { }
}
if (!isPoiDrop) {
const htmlData = transfer.getData('text/html');
const $html = htmlData ? $(htmlData) : $();
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const isWdDrop = rawText && /wikidata\.org/i.test(rawText);
if (!$m.length && !isWdDrop) {
mw.notify("Para arrastrar y soltar elementos, primero debe abrirse el widget Planificador de viajes en la página de origen.", { type: 'warn' });
}
}
const binType = $(this).data('type'); // 'bucket' or 'day'
const binId = $(this).data('bucket-id'); // for buckets
const dayIdx = $(this).data('day-idx'); // for days
const targetList = (binType === 'bucket')
? trip.buckets.find(b => b.id === binId).items
: trip.days[parseInt(dayIdx)].items;
if (jsonData) {
try {
const item = JSON.parse(jsonData);
if (!item.title || !item.lat) throw "not a POI";
// 1. HANDLE REMOVAL FROM SOURCE
if (item._srcType !== undefined && !e.ctrlKey && !e.shiftKey) {
const srcTrip = self.data.trips[item._srcTripIdx];
if (srcTrip) {
if (item._srcType === 'bucket') {
const srcBucket = srcTrip.buckets.find(b => b.id === item._srcBinId);
if (srcBucket) srcBucket.items.splice(item._srcIdx, 1);
} else {
srcTrip.days[parseInt(item._srcBinId)].items.splice(item._srcIdx, 1);
}
}
// Clean up metadata
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
} else if (item._srcType !== undefined) {
// Duplication mode
delete item._srcType;
delete item._srcIdx;
delete item._srcBinId;
delete item._srcTripIdx;
}
// 2. HANDLE INSERTION
const $targetItem = $(e.target).closest('.tp-item');
if ($targetItem.length && $targetItem.data('idx') !== undefined) {
targetList.splice($targetItem.data('idx'), 0, item);
} else {
targetList.push(item);
}
self.saveAndRefresh();
return;
} catch (e) { /* not JSON listing, continue */ }
}
// .marker from ListingBrowser
const htmlData = transfer.getData('text/html');
if (htmlData) {
const $html = $(htmlData);
const $m = $html.hasClass('marker') ? $html : $html.find('.marker').first();
var pageName = '';
const href = $html.attr('href');
const match = href.match(/.*\/wiki\/(.+)#(Q\d+)/);
const match2 = href.match(/.*\/wiki\/(.+)/);
if (match) {
pageName = decodeURIComponent(match[1]);
} else if (match2) {
pageName = decodeURIComponent(match2[1]);
} else {
pageName = href;
}
if ($m.length && ($m.attr('marker-lat') || $m.attr('marker-wikidata'))) {
targetList.push({
title: $m.attr('marker-name') || $m.text().trim(),
lat: self.parseCoordinate($m.attr('marker-lat')),
lon: self.parseCoordinate($m.attr('marker-long')),
wikidata: $m.attr('marker-wikidata'),
sourcePage: pageName,
note: ""
});
self.saveAndRefresh();
return;
}
}
// Wikidata URL Drop
const rawText = transfer.getData('text/plain') || transfer.getData('URIList');
const wdUrlMatch = rawText ? rawText.match(/wikidata\.org\/.*?(Q\d+)/i) : null;
if (wdUrlMatch) {
const wdId = wdUrlMatch[1];
const $bin = $(this);
const binType = $bin.data('type');
const binId = $bin.data('bucket-id');
const dayIdx = $bin.data('day-idx');
const $targetItem = $(e.target).closest('.tp-item');
const insertIdx = ($targetItem.length && $targetItem.data('idx') !== undefined) ? parseInt($targetItem.data('idx')) : -1;
mw.notify(`Fetching Wikidata item ${wdId}...`);
self.fetchWikidata(wdId, null, (item) => {
$('#f-title').val(item.title);
$('#f-lat').val(item.lat);
$('#f-lon').val(item.lon);
$('#f-wikidata').val(item.wikidata);
$('#f-note').val("");
$('#f-source').val("");
editingRef = {
type: binType,
idx: -1,
binId: binType === 'bucket' ? binId : parseInt(dayIdx),
insertIdx: insertIdx
};
$('#tp-edit-form').css('display', 'flex');
}).fail(() => {
mw.notify(`No se pudo obtener el elemento de Wikidata. ${wdId}`, { type: 'error' });
});
return;
}
// Article[/Subarticle]#Qid
if (rawText && rawText.includes('#Q')) {
const match = rawText.match(/.*\/wiki\/(.+)#(Q\d+)/);
if (match) {
const pageName = decodeURIComponent(match[1]);
const wdId = match[2];
self.fetchWikidata(wdId, pageName, (item) => {
targetList.push(item);
self.saveAndRefresh();
}).fail(() => mw.notify("No se pudo analizar el enlace.", { type: 'error' }));
return;
}
}
});
$(document).on('dragstart', '.tp-item', function (e) {
const p = $(this);
const trip = self.getActiveTrip();
let item;
const binType = p.data('type'); // 'bucket' or 'day'
const binId = p.data('bin-id'); // bucket.id or dayIdx
if (binType === 'bucket') {
const bucket = trip.buckets.find(b => b.id === binId);
item = bucket ? bucket.items[p.data('idx')] : null;
} else {
item = trip.days[parseInt(binId)].items[p.data('idx')];
}
if (!item) return;
// Add source metadata
const payload = Object.assign({}, item, {
_srcTripIdx: (self.localTripIndex !== null) ? self.localTripIndex : self.data.activeTripIndex,
_srcType: binType,
_srcIdx: p.data('idx'),
_srcBinId: binId
});
e.originalEvent.dataTransfer.setData('application/json', JSON.stringify(payload));
});
$(document).on('click', '.tp-item', function (e) {
// Ignore clicks on action buttons/links
if ($(e.target).closest('.tp-btn-edit, .tp-remove, a').length) {
return;
}
const $item = $(this);
const isFullMode = $('#trip-planner-app').length > 0;
if (!isFullMode) return;
const type = $item.data('type');
const idx = parseInt($item.data('idx'));
const binId = $item.data('bin-id');
self.zoomToMapItem(type, idx, binId);
});
// Map & Import
$(document).on('click', '#tp-import', () => $('#tp-file-input').click());
$(document).on('change', '#tp-file-input', function (e) {
const reader = new FileReader();
reader.onload = (ev) => {
const imp = JSON.parse(ev.target.result);
if (imp.trips) {
const defaults = {
activeTripIndex: 0,
minimized: false,
trips: [],
orsKey: self.data.orsKey || ''
};
self.data = $.extend({}, defaults, imp);
}
else if (imp.days) {
self.data.trips.push(imp);
}
self.migrateData();
self.saveAndRefresh();
};
reader.readAsText(e.target.files[0]);
});
$(document).on('click', '#tp-btn-route', () => {
$('#tp-ors-key').val(self.data.orsKey || '');
$('#tp-route-overlay').css('display', 'flex');
});
$(document).on('click', '#tp-close-route', () => $('#tp-route-overlay').hide());
$(document).on('click', '#tp-run-route', () => {
const key = $('#tp-ors-key').val().trim();
const profile = $('#tp-route-profile').val();
if (!key) return alert("API Key is required.");
self.data.orsKey = key;
self.save();
$('#tp-route-overlay').hide();
self.calculateRoutes(profile);
});
$(document).on('click', '.tp-section-title', function (e) {
if ($(e.target).hasClass('tp-btn-move') || $(e.target).hasClass('tp-btn-edit') || $(e.target).hasClass('tp-remove')) return;
const $moveBtn = $(this).find('.tp-btn-move');
const type = $moveBtn.data('move-type');
if (type === 'bucket') {
const bucketId = $moveBtn.data('bucket-id');
self.highlightDay(bucketId, 'bucket');
} else if (type === 'day') {
const idx = $moveBtn.data('day-idx');
if (idx !== undefined) self.highlightDay(parseInt(idx), 'day');
}
});
},
initMap: function () {
if ($('#tp-map-container').length === 0) {
// Initial placement on body, hidden
$('body').append(`
<div id="tp-map-container" style="display:none">
<div id="tp-map-canvas"></div>
</div>
`);
}
if (!this.map) {
this.map = L.map('tp-map-canvas').setView([20, 0], 2); // Default whole-world-ish view
L.tileLayer('https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png').addTo(this.map);
this.map.on('click', () => this.highlightDay(null));
this.routeLayer = L.featureGroup().addTo(this.map);
this.markerLayer = L.featureGroup().addTo(this.map);
if (this.cachedRoutes) {
Object.keys(this.cachedRoutes).forEach(dIdx => {
this.drawRouteLayer(parseInt(dIdx), this.cachedRoutes[dIdx]);
});
}
}
},
// toggleMap removed as per request - map is now persistent in full mode.
/**
* Lazy-loads an image from Wikidata based on QID
*/
loadWikidataImage: function ($container) {
const qid = $container.data('qid');
// Don't fetch if already loaded
if ($container.find('img').length || $container.data('loading')) return;
$container.data('loading', true);
const wdApiUrl = `https://www.wikidata.org/w/api.php?action=wbgetclaims&entity=${qid}&property=P18&format=json&origin=*`;
$.getJSON(wdApiUrl).done(function (data) {
try {
// Dig into Wikidata response for the filename
const claims = data.claims.P18;
if (claims && claims[0].mainsnak.datavalue.value) {
const filename = claims[0].mainsnak.datavalue.value;
// Thumb URL (200px) and Full URL (Original)
const baseUrl = `https://commons.wikimedia.org/wiki/Special:FilePath/${encodeURIComponent(filename)}`;
const thumbUrl = `${baseUrl}?width=200`;
const $img = $('<img>').attr('src', thumbUrl).css({
maxWidth: '100%', maxHeight: '100%', display: 'none', cursor: 'zoom-in'
});
// Wrap in a link to the full-size image
const $link = $('<a>')
.attr({ href: baseUrl, target: '_blank', title: 'View full size' })
.append($img);
$img.on('load', function () {
$container.empty().append($link);
$img.fadeIn();
});
} else {
$container.html('<small style="color:#999">No image available</small>');
}
} catch (e) {
$container.hide();
}
}).fail(function () {
$container.hide();
});
},
/**
* Parses a coordinate string into decimal degrees.
* Supports decimal format and Degrees, Minutes, Seconds (DMS) format.
* @param {string|number} input
* @returns {number} Decimal degrees or NaN
*/
parseCoordinate: function (input) {
if (typeof input === 'number') return input;
if (typeof input !== 'string') return NaN;
let str = input.trim();
if (!str) return NaN;
// 1. Try simple decimal (with optional hemisphere)
// Matches: 48.8566, -48.8566, 48.8566 N, S 48.8566
const decimalMatch = str.match(/^([NSEW])?\s*(-?\d+(?:\.\d+)?)\s*([NSEW])?$/i);
if (decimalMatch) {
let val = parseFloat(decimalMatch[2]);
const h = (decimalMatch[1] || decimalMatch[3] || '').toUpperCase();
if (h === 'S' || h === 'W') val = -Math.abs(val);
if (h === 'N' || h === 'E') val = Math.abs(val);
return val;
}
// 2. Try DMS format
// Matches: 48° 51' 24" N, 48°51′24″S, 48 51 24 N, N 48 51 24, etc.
const dmsMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2})['′\s]+(\d{1,2}(?:\.\d+)?)["″\s]+([NSEW])?$/i);
if (dmsMatch) {
const deg = parseFloat(dmsMatch[2]);
const min = parseFloat(dmsMatch[3]);
const sec = parseFloat(dmsMatch[4]);
const h = (dmsMatch[1] || dmsMatch[5] || '').toUpperCase();
let val = deg + min / 60 + sec / 3600;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 3. Try DM format (no seconds)
const dmMatch = str.match(/^([NSEW])?\s*(\d{1,3})[°\s]+(\d{1,2}(?:\.\d+)?)['′\s]+([NSEW])?$/i);
if (dmMatch) {
const deg = parseFloat(dmMatch[2]);
const min = parseFloat(dmMatch[3]);
const h = (dmMatch[1] || dmMatch[4] || '').toUpperCase();
let val = deg + min / 60;
if (h === 'S' || h === 'W') val = -val;
return val;
}
// 4. Try D [symbols] H
const dSymMatch = str.match(/^([NSEW])?\s*(\d{1,3}(?:\.\d+)?)[°\s]+([NSEW])?$/i);
if (dSymMatch) {
const deg = parseFloat(dSymMatch[2]);
const h = (dSymMatch[1] || dSymMatch[3] || '').toUpperCase();
let val = deg;
if (h === 'S' || h === 'W') val = -val;
return val;
}
return parseFloat(str);
},
updateMapMarkers: function (shouldFitBounds) {
if (!this.markerLayer || !window.L) return;
this.markerLayer.clearLayers();
const trip = this.getActiveTrip();
const bounds = [];
const thiss = this;
const add = (item, color, label, binIdOrIdx, itemIdx, type) => {
if (!item.lat || !item.lon) return;
const icon = L.divIcon({
className: '', // Clear default class to avoid side-effects
html: `<div style="
background: ${color};
color: white;
width: 24px; height: 24px;
border: 2px solid white;
border-radius: 50%;
text-align: center;
line-height: 20px;
font-family: sans-serif;
font-weight: bold;
font-size: 11px;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
box-sizing: border-box;
">${label}</div>`,
iconSize: [24, 24],
iconAnchor: [12, 12], // Center the icon
popupAnchor: [0, -12]
});
// 1. Create Marker
const m = L.marker([item.lat, item.lon], { icon: icon });
m.tpBinId = binIdOrIdx;
m.tpIdx = itemIdx;
m.tpType = type;
m.on('click', (e) => {
// Prevent map background click from firing
L.DomEvent.stopPropagation(e);
this.highlightDay(binIdOrIdx, type);
this.highlightListItem(type, itemIdx, binIdOrIdx);
});
const safeTitle = mw.html.escape(item.title);
const safeNote = item.note ? mw.html.escape(item.note) : '';
// 2. Build Link URL
const url = item.sourcePage ? mw.util.getUrl(item.sourcePage) + (item.wikidata ? '#' + item.wikidata : '') : '#';
// 3. Prepare Popup HTML (with placeholder for image)
let popupHtml = `<div style="text-align:center">
<b style="font-size:1.1em"><a href="${url}" target="_blank">${safeTitle}</a></b>
${safeNote ? `<br><span style="font-size:0.9em; color:#555">${safeNote}</span>` : ''}
</div>`;
if (item.wikidata) {
popupHtml += `
<div class="wd-img" data-qid="${item.wikidata}" style="min-width:200px; min-height:100px; background:#f0f0f0; margin-top:8px; display:flex; align-items:center; justify-content:center; border-radius:4px;">
<small>Loading Image...</small>
</div>`
}
m.bindPopup(popupHtml);
// 4. Fetch Image on Click (Lazy Load)
if (item.wikidata) {
m.on('popupopen', function (e) {
thiss.loadWikidataImage($(e.popup.getElement()).find('.wd-img'));
});
}
m.addTo(this.markerLayer);
bounds.push([item.lat, item.lon]);
};
trip.buckets.forEach((b) => {
b.items.forEach((item, idx) => {
const label = b.icon || "B";
add(item, "#777", label, b.id, idx, 'bucket');
});
});
// Days: Label is the day number (index + 1)
trip.days.forEach((d, dayIdx) => {
d.items.forEach((item, itemIdx) => {
add(item, this.colors[dayIdx % this.colors.length], itemIdx + 1, dayIdx, itemIdx, 'day');
});
});
if (shouldFitBounds && bounds.length) {
this.map.fitBounds(bounds, { padding: [50, 50] });
}
},
drawRouteLayer: function (dIdx, geojson) {
if (!this.routeLayer || !window.L) return;
const color = this.colors[dIdx % this.colors.length];
const routeGroup = L.geoJSON(geojson, {
style: { color: color, weight: 5, opacity: 0.7 },
onEachFeature: (feature, layer) => {
layer.on('click', (e) => {
L.DomEvent.stopPropagation(e);
this.highlightDay(dIdx);
});
}
});
routeGroup.tpBinId = dIdx;
routeGroup.tpType = 'day';
routeGroup.tpDayIdx = dIdx;
routeGroup.addTo(this.routeLayer);
},
saveAndRefresh: function () {
// Capture scroll position
const $body = $('.tp-body');
const scrollTop = $body.length ? $body.scrollTop() : 0;
this.save();
this.drawUI();
// Restore scroll position
$('.tp-body').scrollTop(scrollTop);
},
createNewTrip: function (n) {
this.data.trips.push({
name: n,
startDate: new Date().toISOString().split('T')[0],
length: 3,
buckets: [
{ id: 'backlog', name: 'Backlog', icon: '📦', items: [] }
],
days: [{ items: [] }, { items: [] }, { items: [] }]
});
this.save();
},
makeListingsDraggable: function () {
const thiss = this;
const pageName = mw.config.get('wgPageName');
const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
//$('.vcard, .listing-metadata, .mw-kartographer-maplink').each(function () {
$('.vcard').each(function () {
//console.log($(this));
const $l = $(this);
const lat = $l.attr('data-lat') || $l.find('[data-lat]').attr('data-lat');
const lon = $l.attr('data-lon') || $l.find('[data-lon]').attr('data-lon');
if (lat && lon) {
const wdId = $l.find('[id]').filter(function () {
return /^Q\d+$/.test(this.id);
}).attr('id') || "";
const title = $l.find('.fn, .listing-name').first().text().trim() || $l.text().trim();
$l.attr('draggable', 'true').addClass('listing-draggable-proxy');
$l.on('dragstart', (e) => {
const data = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName
};
const json = JSON.stringify(data);
e.originalEvent.dataTransfer.setData('application/json', json);
e.originalEvent.dataTransfer.setData('text/plain', json);
});
if (isTouch && $l.find('.tp-mobile-add').length === 0) {
const $btn = $('<span class="tp-mobile-add">+ Trip</span>');
$btn.on('click', (e) => {
e.preventDefault();
e.stopPropagation(); // Stop Wikivoyage from opening the map/listing details
const item = {
title: title,
lat: thiss.parseCoordinate(lat),
lon: thiss.parseCoordinate(lon),
wikidata: wdId,
sourcePage: pageName,
note: ""
};
const trip = thiss.getActiveTrip();
const backlogBucket = trip.buckets.find(b => b.id === 'backlog') || trip.buckets[0];
backlogBucket.items.push(item);
thiss.saveAndRefresh();
mw.notify(`Added "${title}" to Trip Backlog`);
});
// Insert button next to the Listing Name
const $nameTarget = $l.find('.listing-name, .fn').first();
if ($nameTarget.length) {
$nameTarget.after($btn);
} else {
$l.prepend($btn);
}
}
}
});
},
calculateRoutes: function (profile) {
const trip = this.getActiveTrip();
// UI Cleanup
$('.tp-route-stats').remove();
$('.tp-item').removeClass('tp-item-error').find('.tp-error-msg').remove();
if (this.routeLayer) this.routeLayer.clearLayers();
this.cachedRoutes = {}; // Clear old cache
mw.notify("Calculating continuous routes...");
// Track the end of the previous leg to link days together
let previousEndItem = null;
const promises = trip.days.map((day, dIdx) => {
// 1. Identify valid items in current day
// We preserve original indices for DOM injection later
const currentDayItems = day.items
.map((item, idx) => Object.assign({}, item, { day: dIdx, idx: idx }))
.filter(i => i.lat && i.lon);
// 2. Construct the routing batch for this day
// Start with the last point of the previous day (if exists) to form the bridge
let routePoints = [];
if (previousEndItem) {
routePoints.push(previousEndItem);
}
routePoints = routePoints.concat(currentDayItems);
// Update the tracker: The last item of this day becomes the start for the next non-empty day
if (currentDayItems.length > 0) {
previousEndItem = currentDayItems[currentDayItems.length - 1];
}
// 3. Check if we have enough points to form a line
if (routePoints.length < 2) {
return Promise.resolve();
}
// 4. API Request
const coords = routePoints.map(i => [i.lon, i.lat]);
return $.ajax({
method: "POST",
url: `https://api.openrouteservice.org/v2/directions/${profile}/geojson`,
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ coordinates: coords })
}).then((resp) => {
this.cachedRoutes[dIdx] = resp;
// Draw Line (Colored by the Current Day)
if (this.routeLayer && window.L) {
this.drawRouteLayer(dIdx, resp);
}
// Inject Stats
const segments = resp.features[0].properties.segments;
segments.forEach((seg, sIdx) => {
// Map the segment back to our batch items
const startItem = routePoints[sIdx];
const endItem = routePoints[sIdx + 1];
const dist = seg.distance > 1000 ? (seg.distance / 1000).toFixed(1) + " km" : Math.round(seg.distance) + " m";
const time = seg.duration > 3600
? Math.floor(seg.duration / 3600) + "h " + Math.round((seg.duration % 3600) / 60) + "m"
: Math.round(seg.duration / 60) + " min";
const html = `<div class="tp-route-stats">⬇️ ${dist} / ${time} ⬇️</div>`;
if (startItem.day === endItem.day) {
// Intra-day travel: Inject between items
$(`.tp-day-bin[data-day-idx="${startItem.day}"] .tp-item[data-idx="${startItem.idx}"]`).after(html);
} else {
// Inter-day travel: Inject at the bottom of the previous day's bin
// This visually represents "Travel after finishing Day X, before Day Y"
$(`.tp-bin[data-day-idx="${startItem.day}"]`).append(html);
}
});
}).catch(err => {
console.error(`Routing Error (Day ${dIdx + 1}):`, err);
let msg = "Routing failed.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Try to extract coordinate index from message like "...coordinate 3: ..."
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
const item = routePoints[coordIdx];
if (item) {
const $itemEl = $(`.tp-day-bin[data-day-idx="${item.day}"] .tp-item[data-idx="${item.idx}"]`);
$itemEl.addClass('tp-item-error');
if ($itemEl.find('.tp-error-msg').length === 0) {
$itemEl.find('div:first').append(`<div class="tp-error-msg">⚠️ Point not routable</div>`);
}
msg = `Point "${item.title}" is not routable. Try moving it or removing it.`;
}
}
}
} catch (e) { console.error("Error parsing response", e); }
}
mw.notify(msg, { type: 'error' });
});
});
Promise.all(promises).then(() => {
// Route calculation complete
});
},
optimizeDay: function (dayIdx, profile) {
const day = this.getActiveTrip().days[dayIdx];
const items = day.items;
if (items.length < 3) return mw.notify("Need at least 3 items to optimize.");
if (!this.data.orsKey) return alert("API Key missing.");
// 1. Prepare Payload
// Fixed Start: The first item in the list
const startItem = items[0];
// Jobs: All subsequent items
const jobs = items.slice(1).map((item, index) => ({
id: index + 1, // Use original index as ID (offset by 1 because we sliced)
location: [item.lon, item.lat],
service: 300 // Assume 5 min stop per POI (optional, helps calc ETA)
}));
// Vehicle: Starts at item[0]
const vehicles = [{
id: 1,
profile: profile,
start: [startItem.lon, startItem.lat],
// For a round-trip, add: end: [startItem.lon, startItem.lat]
}];
mw.notify("Optimizing schedule...");
$.ajax({
method: "POST",
url: "https://api.openrouteservice.org/optimization",
contentType: "application/json",
headers: { "Authorization": this.data.orsKey },
data: JSON.stringify({ jobs: jobs, vehicles: vehicles })
}).done((resp) => {
const steps = resp.routes[0].steps;
// 2. Reconstruct Order
// Start with the fixed first item
const newOrder = [startItem];
// Append items in the order returned by API
steps.forEach(step => {
if (step.type === 'job') {
// step.id corresponds to the index in the original 'items' array
newOrder.push(items[step.id]);
}
});
// Check if all items were visited (API might skip unreachable ones)
if (newOrder.length !== items.length) {
alert("Warning: Some locations were unreachable and removed from the optimized list.");
}
// 3. Save
day.items = newOrder;
this.saveAndRefresh();
mw.notify("Optimization Complete!");
}).fail((err) => {
console.error(err);
let msg = "Optimization failed. Check API Key or constraints.";
if (err.responseText) {
try {
const errorData = JSON.parse(err.responseText);
if (errorData.error && errorData.error.message) {
msg = errorData.error.message;
// Similar coordinate matching for optimization errors
const match = msg.match(/coordinate (\d+):/i);
if (match) {
const coordIdx = parseInt(match[1]);
// In optimizeDay, coordinte 0 is startItem, others are jobs
const item = (coordIdx === 0) ? startItem : items[coordIdx];
if (item) {
$(`.tp-day-bin[data-day-idx="${dayIdx}"] .tp-item[data-idx="${(coordIdx === 0) ? 0 : coordIdx}"]`).addClass('tp-item-error');
msg = `Point "${item.title}" is not routable.`;
}
}
}
} catch (e) { }
}
alert(msg);
});
},
zoomToMapItem: function (type, idx, binIdOrIdx) {
if (!this.map || !this.markerLayer) return;
let targetMarker = null;
this.markerLayer.eachLayer((layer) => {
if (layer.tpType === type && layer.tpBinId === binIdOrIdx && layer.tpIdx === idx) {
targetMarker = layer;
}
});
if (targetMarker) {
const currentZoom = this.map.getZoom();
const targetZoom = Math.max(15, currentZoom);
this.map.setView(targetMarker.getLatLng(), targetZoom);
targetMarker.openPopup();
}
},
highlightListItem: function (type, idx, binIdOrIdx) {
let $targetItem;
if (type === 'bucket') {
$targetItem = $(`.tp-bucket-bin[data-bucket-id="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
} else {
$targetItem = $(`.tp-day-bin[data-day-idx="${binIdOrIdx}"] .tp-item[data-idx="${idx}"]`);
}
if ($targetItem.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetItem.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 30
}, 300);
$targetItem.css({
'transition': 'background 0.3s, border-color 0.3s',
'background': '#fff9c4',
'border-color': '#fbc02d'
});
setTimeout(() => {
$targetItem.css({
'transition': 'background 0.8s, border-color 0.8s',
'background': '',
'border-color': ''
});
setTimeout(() => {
$targetItem.css('transition', '');
}, 800);
}, 1500);
}
},
highlightDay: function (targetIdx, type = 'day') {
if (!this.map) return;
const setOpacity = (layer) => {
let isMatch;
if (targetIdx === null) {
isMatch = true;
} else if (type === 'bucket') {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'bucket');
} else {
isMatch = (layer.tpBinId === targetIdx && layer.tpType === 'day');
}
const op = isMatch ? 1 : 0.2;
const fillOp = isMatch ? 0.9 : 0.2;
if (layer.setOpacity) {
layer.setOpacity(op);
if (isMatch) layer.setZIndexOffset(1000); else layer.setZIndexOffset(0);
} else if (layer.setStyle) {
layer.setStyle({ opacity: op, fillOpacity: fillOp });
if (isMatch && layer.bringToFront) layer.bringToFront();
}
};
if (this.markerLayer) this.markerLayer.eachLayer(setOpacity);
if (this.routeLayer) this.routeLayer.eachLayer(setOpacity);
$('.tp-section-title').css({ 'background': '', 'transition': '' });
if (targetIdx === null) return;
let $targetHeader;
if (type === 'bucket') {
$targetHeader = $(`.tp-bucket-bin[data-bucket-id="${targetIdx}"]`).prev('.tp-section-title');
} else {
$targetHeader = $(`.tp-day-bin[data-day-idx="${targetIdx}"]`).prev('.tp-section-title');
}
if ($targetHeader.length && $('.tp-body').length) {
const $container = $('.tp-body');
const scrollTop = $targetHeader.offset().top - $container.offset().top + $container.scrollTop();
$container.stop().animate({
scrollTop: scrollTop - 10
}, 300);
$targetHeader.css({
'background': '#fff9c4',
'transition': 'background 0.5s'
});
setTimeout(() => {
$targetHeader.css('background', '');
}, 1500);
}
},
fetchWikidata: function (wdId, sourcePage, onDone) {
const lang = mw.config.get('wgContentLanguage') || 'en';
return $.ajax({
url: 'https://www.wikidata.org/w/api.php',
data: {
action: 'wbgetentities',
ids: wdId,
props: 'labels|claims',
languages: lang,
format: 'json',
origin: '*'
},
dataType: 'json'
}).then((data) => {
const entity = data.entities ? data.entities[wdId] : null;
if (!entity || entity.missing) throw new Error("Wikidata item not found.");
// 1. Extract Title (Localized label -> First label -> Fallback)
let title = sourcePage ? sourcePage.replace(/_/g, ' ') : wdId;
if (entity.labels && entity.labels[lang]) {
title = entity.labels[lang].value;
} else {
const keys = Object.keys(entity.labels || {});
if (keys.length > 0) title = entity.labels[keys[0]].value;
}
// 2. Extract Coordinates (P625)
let lat = 0, lon = 0;
const p625 = entity.claims && entity.claims.P625;
if (p625 && p625[0].mainsnak.datavalue) {
lat = p625[0].mainsnak.datavalue.value.latitude;
lon = p625[0].mainsnak.datavalue.value.longitude;
}
onDone({ title, lat, lon, wikidata: wdId, sourcePage: sourcePage || "", note: "" });
});
},
};
function createLauncherIcon(onClickHandler) {
// 1. Prevent Duplicates
if ($('.tp-launcher-icon').length) return;
// 2. Create Icon Element factory
const iconFactory = () => $('<a>')
.addClass('tp-launcher-icon')
.attr('href', '#')
.attr('title', 'Open Trip Planner')
.text('🎒')
.css({
'cursor': 'pointer',
'font-size': '1.2em', 'text-decoration': 'none',
'filter': 'grayscale(0.8) contrast(1) brightness(1.4)'
})
.on('click', function (e) {
e.preventDefault();
onClickHandler(e, $(this));
});
// 4. Insert into DOM (Mobile vs Desktop)
if (mw.config.get('skin') === 'minerva') {
const $icon = iconFactory().css({ 'font-size': '1.5em', 'margin': '0 12px', 'display': 'flex', 'align-items': 'center' });
if ($('#pt-notifications-alert').length == 0) {
// Mobile
$("#page-actions-overflow").before($("<li id=\"tp-launcher-li\" class=\"page-actions-menu__list-item\"></li>").append($icon))
} else {
$('#pt-notifications-alert').parent().before($icon);
}
} else {
$('#pt-notifications-alert').before(iconFactory());
const $sticky = $('.vector-sticky-header-icons');
if ($sticky.length) {
$sticky.prepend(iconFactory().css('margin-right', '10px'));
}
}
}
// lightweight bootstrap
$(function () {
const isFullMode = $('#trip-planner-app').length > 0;
if (isFullMode) {
// Auto-load in full mode
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
TripPlanner.init();
});
} else {
// Create the initial "Lazy" icon for widget mode
createLauncherIcon(function (e, $btn) {
// Visual feedback
$btn.text('⏳').css('cursor', 'wait');
// Load dependencies on demand
mw.loader.using([
'mediawiki.util', 'mediawiki.api',
'mediawiki.user', 'mediawiki.notification',
'ext.kartographer.box', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'
]).then(() => {
// Remove the bootstrap icon/wrapper
// (TripPlanner.drawUI will handle creating the actual widget UI)
$('#tp-launcher-li').remove();
$('.tp-launcher-icon').remove();
// Initialize App
TripPlanner.init();
});
});
}
});
}(mediaWiki, jQuery));
0b1sgzp7kmvcopgpf8g0ajjs2m0mehf
Discusión:Países de la A a la Z
1
18666
255271
255239
2026-07-05T00:14:51Z
Luxbane
30785
Deshecha la [[Especial:Diff/255239|edición 255239]] de [[Especial:Contribuciones/~2026-37916-93|~2026-37916-93]] ([[Usuario Discusión:~2026-37916-93|disc.]])
255271
wikitext
text/x-wiki
== Alemania? ==
¿Por qué no está Alemania en la lista? [[Especial:Contribuciones/~2026-37559-06|~2026-37559-06]] ([[Usuario discusión:~2026-37559-06|discusión]]) 18:20 30 jun 2026 (UTC)
:Lo puedes añadir tú [[Usuario:Luxbane|Luxbane]] ([[Usuario discusión:Luxbane|discusión]]) 00:35 3 jul 2026 (UTC)
s7advl3s07q8biemixwy5vmw3sk38pb
MediaWiki:Gadget-TripPlanner
8
18669
255263
2026-07-04T23:29:21Z
Bromoxido
21781
Página creada con «''[[Wikiviajes:Planificador de viajes|Planificador de viajes]]'': Herramienta que permite arrastrar y soltar listados de Wikiviajes en un itinerario personalizado, visualizarlos en un mapa y calcular rutas. '''(predeterminado)'''»
255263
wikitext
text/x-wiki
''[[Wikiviajes:Planificador de viajes|Planificador de viajes]]'': Herramienta que permite arrastrar y soltar listados de Wikiviajes en un itinerario personalizado, visualizarlos en un mapa y calcular rutas. '''(predeterminado)'''
o936g36km8b8i8uxocq5jeztx21rrx4
MediaWiki:Gadget-TravelTracker
8
18670
255264
2026-07-04T23:29:31Z
Bromoxido
21781
Página creada con «''[[Wikiviajes:Rastreador de viajes|Rastreador de viajes]]'': Agrega una lista interactiva de países a [[Special:MyPage/Visitados|tu subpágina de usuario]] para generar un mapa de viaje personalizado. '''(predeterminado)'''»
255264
wikitext
text/x-wiki
''[[Wikiviajes:Rastreador de viajes|Rastreador de viajes]]'': Agrega una lista interactiva de países a [[Special:MyPage/Visitados|tu subpágina de usuario]] para generar un mapa de viaje personalizado. '''(predeterminado)'''
3cvyw2p4oseulfu9l8li6i3o3cnu4u4
MediaWiki:Gadget-TravelTracker.js
8
18671
255265
2026-07-04T23:32:17Z
Bromoxido
21781
Página creada con «(function(mw, $) { var userName = mw.config.get('wgUserName'); function injectHeaderLink() { if (userName === null) return; mw.loader.using(['mediawiki.util']).then(function() { mw.util.addPortletLink( 'p-personal', mw.util.getUrl('User:' + userName + '/Visited'), 'My Travel Map', 'pt-travelmap', 'View or update your travel map', null,…»
255265
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('User:' + userName + '/Visited'),
'My Travel Map',
'pt-travelmap',
'View or update your travel map',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visited$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Module:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "Africa", "as": "Asia", "eu": "Europe",
"na": "North America", "oc": "Oceania", "sa": "South America", "an": "Southern Ocean and Antarctica"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>Welcome to your Travel Tracker!</strong><br>' +
'Select the countries/territories you have visited below to generate your personalised map. Make sure to hit the "publish changes" button to generate and publish your map.<br>' +
'<i>By clicking the "Publish changes" button, you agree to the Terms of use, and you irrevocably agree to release your contribution under the CC-BY-SA 3.0 License. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Due to limitations with the <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer extension</a>, ' +
'you may need to give this page a hard refresh and/or <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">clear your cache</a> ' +
'if you have a large number of mapshapes. ' +
'<br>Additionally, by clicking the "Publish changes" button, you agree to the Terms of use, and you irrevocably agree to release your contribution under the CC-BY-SA 3.0 License.' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikivoyage:Travel_Tracker') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">travel map</a>';
$counterText.html('Update your ' + linkHtml + ' – ' + count + ' countries/territories visited');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Other territories";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publish changes</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Saving...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Updating' : 'Creating') + ' travel map via [[Wikivoyage:Travel Tracker|TravelTracker gadget]]'
}).done(function() {
$('#save-status').text('Success! Reloading...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
6bvay251nxinjqfjdyzodjo8b37332z
255274
255265
2026-07-05T00:25:31Z
Bromoxido
21781
Bromoxido trasladó la página [[MediaWiki:Gadget-TravelTracker.js]] a [[Usuario:Luxbane/Gadget-TravelTracker.js]]: Traslado para traducción.
255265
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('User:' + userName + '/Visited'),
'My Travel Map',
'pt-travelmap',
'View or update your travel map',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visited$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Module:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "Africa", "as": "Asia", "eu": "Europe",
"na": "North America", "oc": "Oceania", "sa": "South America", "an": "Southern Ocean and Antarctica"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>Welcome to your Travel Tracker!</strong><br>' +
'Select the countries/territories you have visited below to generate your personalised map. Make sure to hit the "publish changes" button to generate and publish your map.<br>' +
'<i>By clicking the "Publish changes" button, you agree to the Terms of use, and you irrevocably agree to release your contribution under the CC-BY-SA 3.0 License. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Due to limitations with the <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer extension</a>, ' +
'you may need to give this page a hard refresh and/or <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">clear your cache</a> ' +
'if you have a large number of mapshapes. ' +
'<br>Additionally, by clicking the "Publish changes" button, you agree to the Terms of use, and you irrevocably agree to release your contribution under the CC-BY-SA 3.0 License.' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikivoyage:Travel_Tracker') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">travel map</a>';
$counterText.html('Update your ' + linkHtml + ' – ' + count + ' countries/territories visited');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Other territories";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publish changes</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Saving...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Updating' : 'Creating') + ' travel map via [[Wikivoyage:Travel Tracker|TravelTracker gadget]]'
}).done(function() {
$('#save-status').text('Success! Reloading...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
6bvay251nxinjqfjdyzodjo8b37332z
255279
255274
2026-07-05T00:59:31Z
Luxbane
30785
255279
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza ' + linkHtml + ' – ' + count + ' los países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publish changes</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Saving...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
feochu1r42mf39mth1wo14ejr28qeco
255280
255279
2026-07-05T01:01:24Z
Bromoxido
21781
Bromoxido trasladó la página [[Usuario:Luxbane/Gadget-TravelTracker.js]] a [[MediaWiki:Gadget-TravelTracker.js]] sobre una redirección y sin dejar una redirección: Ya fueron traducidas las variables
255279
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza ' + linkHtml + ' – ' + count + ' los países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publish changes</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Saving...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
feochu1r42mf39mth1wo14ejr28qeco
255281
255280
2026-07-05T01:04:47Z
Bromoxido
21781
255281
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza ' + linkHtml + ' – ' + count + ' los países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Saving...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
3tqt3e2eeldyuf5qtdq783t7k528gjc
255284
255281
2026-07-05T01:18:18Z
Bromoxido
21781
255284
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza ' + linkHtml + ' – ' + count + ' los países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
kga5q34b7rvewjo82cvy60ag7i04e94
255288
255284
2026-07-05T01:42:13Z
Bromoxido
21781
255288
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + 'países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
3af2fk86cgic3mth474nmu7qvf88p9b
255291
255288
2026-07-05T01:45:33Z
Bromoxido
21781
255291
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + ' países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
nrwrcpbct1cm4rocbknn8gn29qa14i0
255292
255291
2026-07-05T01:47:22Z
Bromoxido
21781
255292
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + 'países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
3af2fk86cgic3mth474nmu7qvf88p9b
255293
255292
2026-07-05T01:48:48Z
Bromoxido
21781
255293
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + ' países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
nrwrcpbct1cm4rocbknn8gn29qa14i0
255294
255293
2026-07-05T01:54:56Z
Bromoxido
21781
255294
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + 'países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
kdjztvhdfa4b84qg0mek2lre3leiwsv
255295
255294
2026-07-05T01:56:35Z
Bromoxido
21781
255295
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + 'países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
32lwx4caf7woqpf0ansxuwgky2r8oyn
255296
255295
2026-07-05T01:58:24Z
Bromoxido
21781
255296
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + ' países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
nrwrcpbct1cm4rocbknn8gn29qa14i0
255297
255296
2026-07-05T01:58:57Z
Bromoxido
21781
255297
javascript
text/javascript
(function(mw, $) {
var userName = mw.config.get('wgUserName');
function injectHeaderLink() {
if (userName === null) return;
mw.loader.using(['mediawiki.util']).then(function() {
mw.util.addPortletLink(
'p-personal',
mw.util.getUrl('Usuario:' + userName + '/Visitados'),
'Mi mapa de viaje',
'pt-travelmap',
'Observa o actualiza tu mapa de viaje',
null,
'#pt-preferences'
);
mw.util.addCSS(`.mw-ui-icon-vector-gadget-pt-travelmap { /* todo*/ }` );
});
}
injectHeaderLink();
var pageName = mw.config.get('wgPageName');
if (mw.config.get('wgNamespaceNumber') !== 2 || !mw.config.get('wgTitle').match(/\/Visitados$/)) return;
mw.loader.using(['mediawiki.api', 'mediawiki.util']).done(function() {
var api = new mw.Api();
var dataModule = 'Módulo:Countries.json';
var isExists = mw.config.get('wgArticleId') > 0;
var continentNames = {
"af": "África", "as": "Asia", "eu": "Europa",
"na": "América del Norte", "oc": "Oceanía", "sa": "América del Sur", "an": "Océano Austral y Antártida"
};
if (!isExists) {
var $contentArea = $('#mw-content-text');
if ($contentArea.length) {
$contentArea.empty().append(
'<div class="mw-message-box mw-message-box-notice" style="border-radius: 8px; border-left-width: 5px;">' +
'<strong>¡Bienvenido a tu rastreador de viajes!</strong><br>' +
'Selecciona a continuación los países/territorios que has visitado para generar tu mapa personalizado. No olvides pulsar el botón "Publicar cambios" para generar y publicar tu mapa.<br>' +
'<i>Al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente publicar su contribución bajo la Licencia CC-BY-SA 4.0.. </i>' +
'</div>' +
'<div id="visited-tool-placeholder"></div>'
);
}
}
api.get({
action: 'query', prop: 'revisions', titles: [pageName, dataModule],
rvprop: 'content', formatversion: 2
}).done(function(res) {
var pages = res.query.pages;
var pageData = pages.find(p => p.title.replace(/ /g, '_') === pageName);
var moduleData = pages.find(p => p.title === dataModule);
if (!moduleData || !moduleData.revisions) return;
var countries = JSON.parse(moduleData.revisions[0].content);
var content = (pageData && pageData.revisions) ? pageData.revisions[0].content : '';
var match = content.match(/{{VisitedMap\|([^}]*)}}/);
var savedQids = match ? match[1].split(',').map(s => s.trim()) : [];
startBuilding(countries, savedQids);
});
function startBuilding(countries, savedQids) {
var $placeholder = $('#visited-tool-placeholder');
if (!$placeholder.length) {
setTimeout(function() { startBuilding(countries, savedQids); }, 200);
return;
}
buildUI($placeholder, countries, savedQids);
}
function buildUI($placeholder, countries, savedQids) {
var $statsBar = $('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; padding: 15px 20px; margin: 20px 0; display: flex; justify-content: space-between; align-items: center; font-family: sans-serif;"></div>');
var $labelContainer = $('<div style="display: flex; flex-direction: column; gap: 4px;"></div>');
var $counterText = $('<span style="font-size: 1.1em; font-weight: 600; color: var(--color-emphasized, #202122);"></span>');
var $noticeText = $('<div style="font-size: 0.85em; color: var(--color-subtle, #54595d); line-height: 1.4;">' +
'Debido a limitaciones con la extensión <a href="https://www.mediawiki.org/wiki/Extension:Kartographer" target="_blank">Kartographer</a>, ' +
'quizá necesites recargar la página y/o <a href="' + mw.util.getUrl(pageName, {action: 'purge'}) + '">limpiar tu caché</a> ' +
'si tienes un gran número de formas de mapas. ' +
'<br>Además, al hacer clic en el botón "Publicar cambios", acepta los Términos de uso y acepta irrevocablemente liberar su contribución bajo la Licencia CC-BY-SA 3.0..' +
'</div>');
$labelContainer.append($counterText, $noticeText);
$statsBar.append($labelContainer);
$placeholder.empty().append($statsBar);
var updateCounter = function() {
var count = $('#visited-tool-placeholder input:checked').length;
var linkHtml = '<a href="' + mw.util.getUrl('Wikiviajes:Rastreador_de_viajes') + '" class="tracker-project-link" style="color: inherit; text-decoration: none;">mapa de viajes</a>';
$counterText.html('Actualiza el ' + linkHtml + ' – ' + count + 'países/territorios visitados');
};
mw.util.addCSS('.tracker-project-link:hover { text-decoration: underline !important; }');
var grouped = {};
countries.forEach(function(c) {
var cont = c.c || "ot";
if (!grouped[cont]) grouped[cont] = [];
grouped[cont].push(c);
});
var sortedCodes = Object.keys(grouped).sort(function(a, b) {
return (continentNames[a] || a).localeCompare(continentNames[b] || b);
});
sortedCodes.forEach(function(code) {
var name = continentNames[code] || "Otros territorios";
var $section = $('<div class="continent-card" style="margin-bottom: 25px; background: var(--background-color-base, #fff); border: 1px solid var(--border-color-base, #eaecf0); border-radius: 8px; overflow: hidden;">');
$section.append('<div style="background: var(--background-color-neutral-subtle, #f8f9fa); padding: 10px 15px; font-weight: bold; border-bottom: 1px solid var(--border-color-base, #eaecf0); color: var(--color-subtle, #54595d);">' + name + '</div>');
var $list = $('<div style="column-count: 4; column-gap: 20px; padding: 15px;">');
grouped[code].sort((a, b) => a.n.localeCompare(b.n)).forEach(function(c) {
var isChecked = savedQids.indexOf(c.q) !== -1 ? 'checked' : '';
var $item = $('<div style="transition: background 0.2s; border-radius: 4px; padding: 4px 8px; break-inside: avoid;">' +
'<label style="display: flex; align-items: center; cursor: pointer; font-size: 0.9em; font-family: sans-serif; color: var(--color-base, #202122);">' +
'<input type="checkbox" value="' + c.q + '" ' + isChecked + ' style="margin-right: 8px; cursor: pointer;"> ' + c.n + '</label></div>');
$item.find('input').on('change', updateCounter);
$item.hover(function() { $(this).css('background', 'var(--background-color-progressive-subtle, #f0f4ff)'); }, function() { $(this).css('background', 'transparent'); });
$list.append($item);
});
$section.append($list);
$placeholder.append($section);
});
var $saveBtn = $('<button id="save-visited">Publicar cambios</button>').css({
'background-color': 'var(--background-color-progressive, #36c)', 'color': '#fff', 'border': 'none', 'border-radius': '4px',
'padding': '10px 24px', 'font-size': '1em', 'font-weight': '600', 'font-family': 'sans-serif',
'cursor': 'pointer', 'transition': 'background 0.2s', 'box-shadow': '0 2px 4px rgba(0,0,0,0.1)',
'flex-shrink': '0', 'margin-left': '20px'
});
$statsBar.append($saveBtn);
$placeholder.append('<div id="save-status" style="text-align: right; margin-top: 5px; font-size: 0.85em; font-weight: bold; min-height: 1.2em; font-family: sans-serif;"></div>');
updateCounter();
$saveBtn.on('mouseenter', function() { $(this).css('background-color', 'var(--background-color-progressive--hover, #447ff5)'); });
$saveBtn.on('mouseleave', function() { $(this).css('background-color', 'var(--background-color-progressive, #36c)'); });
$saveBtn.on('click', function(e) {
e.preventDefault();
var selected = [];
$('#visited-tool-placeholder input:checked').each(function() { selected.push($(this).val()); });
var $btn = $(this);
$btn.addClass('mw-ui-disabled').css('background-color', 'var(--background-color-disabled, #a2a9b1)').text('Guardando...');
api.postWithToken('csrf', {
action: 'edit', title: pageName, text: '{{VisitedMap|' + selected.join(',') + '}}',
summary: (isExists ? 'Actualizando' : 'Creando') + ' mapa de viajes a través del [[Wikivoyage:Travel Tracker|rastreador de viajes]]'
}).done(function() {
$('#save-status').text('¡Éxito! Recargando...').css('color', 'var(--color-success, #00af89)');
setTimeout(function() { location.reload(); }, 800);
});
});
}
});
})(mediaWiki, jQuery);
3af2fk86cgic3mth474nmu7qvf88p9b
Plantilla:VisitedMap
10
18672
255267
2026-07-04T23:39:15Z
Bromoxido
21781
Página creada con «{{#invoke:VisitedMap|render|{{{1|}}}}} <div id="visited-tool-placeholder" style="margin-top: 20px;"> <p style="font-style: italic; color: #666;"></p> </div>»
255267
wikitext
text/x-wiki
{{#invoke:VisitedMap|render|{{{1|}}}}}
<div id="visited-tool-placeholder" style="margin-top: 20px;">
<p style="font-style: italic; color: #666;"></p>
</div>
h8v05giz4hhuiuihi1hvykwianrno4w
255287
255267
2026-07-05T01:39:33Z
Luxbane
30785
255287
wikitext
text/x-wiki
<noinclude>{{Plantilla con Lua}}</noinclude>
{{#invoke:VisitedMap|render|{{{1|}}}}}
<div id="visited-tool-placeholder" style="margin-top: 20px;">
<p style="font-style: italic; color: #666;"></p>
</div>
8mjkm2e9wpgstk649g31yw2wuj5jjhp
255289
255287
2026-07-05T01:44:26Z
Bromoxido
21781
Protegió «[[Plantilla:VisitedMap]]» ([Editar=Solo usuarios autoconfirmados] (indefinido) [Trasladar=Solo usuarios autoconfirmados] (indefinido))
255287
wikitext
text/x-wiki
<noinclude>{{Plantilla con Lua}}</noinclude>
{{#invoke:VisitedMap|render|{{{1|}}}}}
<div id="visited-tool-placeholder" style="margin-top: 20px;">
<p style="font-style: italic; color: #666;"></p>
</div>
8mjkm2e9wpgstk649g31yw2wuj5jjhp
Módulo:VisitedMap
828
18673
255268
2026-07-04T23:40:11Z
Bromoxido
21781
Página creada con «local p = {} function p.render(frame) local qids_str = frame.args[1] or "" local map_params = { latitude = "15", longitude = "13.5", zoom = "2", width = "100%", height = "500", align = "center" } if qids_str == "" or qids_str == nil then return frame:extensionTag('mapframe', '', map_params) end local qids = {} for qid in string.gmatch(qids_str, '([^,]+)') do table.insert(qid…»
255268
Scribunto
text/plain
local p = {}
function p.render(frame)
local qids_str = frame.args[1] or ""
local map_params = {
latitude = "15",
longitude = "13.5",
zoom = "2",
width = "100%",
height = "500",
align = "center"
}
if qids_str == "" or qids_str == nil then
return frame:extensionTag('mapframe', '', map_params)
end
local qids = {}
for qid in string.gmatch(qids_str, '([^,]+)') do
table.insert(qids, mw.text.trim(qid))
end
local shapes = {}
local chunk_size = 20
for i = 1, #qids, chunk_size do
local chunk = {}
for j = i, math.min(i + chunk_size - 1, #qids) do
table.insert(chunk, qids[j])
end
table.insert(shapes, {
type = "ExternalData",
service = "geoshape",
ids = table.concat(chunk, ","),
properties = {
fill = "#3366cc",
["fill-opacity"] = 0.5,
stroke = "#ffffff",
["stroke-width"] = 1,
}
})
end
return frame:extensionTag('mapframe', mw.text.jsonEncode(shapes), map_params)
end
return p
ce4x9ahfb4ocl9d7252777uxjb2uxsp
255290
255268
2026-07-05T01:44:37Z
Bromoxido
21781
Protegió «[[Módulo:VisitedMap]]» ([Editar=Solo usuarios autoconfirmados] (indefinido) [Trasladar=Solo usuarios autoconfirmados] (indefinido))
255268
Scribunto
text/plain
local p = {}
function p.render(frame)
local qids_str = frame.args[1] or ""
local map_params = {
latitude = "15",
longitude = "13.5",
zoom = "2",
width = "100%",
height = "500",
align = "center"
}
if qids_str == "" or qids_str == nil then
return frame:extensionTag('mapframe', '', map_params)
end
local qids = {}
for qid in string.gmatch(qids_str, '([^,]+)') do
table.insert(qids, mw.text.trim(qid))
end
local shapes = {}
local chunk_size = 20
for i = 1, #qids, chunk_size do
local chunk = {}
for j = i, math.min(i + chunk_size - 1, #qids) do
table.insert(chunk, qids[j])
end
table.insert(shapes, {
type = "ExternalData",
service = "geoshape",
ids = table.concat(chunk, ","),
properties = {
fill = "#3366cc",
["fill-opacity"] = 0.5,
stroke = "#ffffff",
["stroke-width"] = 1,
}
})
end
return frame:extensionTag('mapframe', mw.text.jsonEncode(shapes), map_params)
end
return p
ce4x9ahfb4ocl9d7252777uxjb2uxsp
MediaWiki:Gadget-TripPlanner.js
8
18674
255273
2026-07-05T00:23:58Z
Bromoxido
21781
Bromoxido trasladó la página [[MediaWiki:Gadget-TripPlanner.js]] a [[Usuario:Luxbane/Gadget-TripPlanner.js]]: Trasladado para traducción.
255273
javascript
text/javascript
/* #REDIRECT */mw.loader.load("//es.wikivoyage.org/w/index.php?title=Usuario:Luxbane/Gadget-TripPlanner.js&action=raw&ctype=text/javascript");
lh7pr429be4vu3ytnnjik04za2cme17
Usuario:Bromoxido/Visitados
2
18676
255282
2026-07-05T01:06:52Z
Bromoxido
21781
Creando mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]
255282
wikitext
text/x-wiki
{{VisitedMap|Q739,Q736,Q717}}
5ujd2zoloq0h8k5x8lbtgahyqz2e2d8
255283
255282
2026-07-05T01:17:07Z
Bromoxido
21781
Actualizando mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]
255283
wikitext
text/x-wiki
{{VisitedMap|Q717}}
6dwdu6z62i98792p17ewz4m5hb1w9iw
Usuario:Luxbane/Visitados
2
18677
255286
2026-07-05T01:23:49Z
Luxbane
30785
Creando mapa de viajes a través del accesorio [[Wikivoyage:Travel Tracker|rastreador de viajes]]
255286
wikitext
text/x-wiki
{{VisitedMap|Q739,Q736,Q419,Q717,Q43,Q183}}
jy0bj772l8h6sjkjuy8gsevolkcombi
Skopie
0
18678
255299
2026-07-05T02:43:33Z
Bromoxido
21781
Comenzando transcripción y traducción del artículo basado en el artículo de Wikiviajes en Inglés.
255299
wikitext
text/x-wiki
{{pagebanner|SKPbanner.jpg|caption=A street in the Old Town}}
{{endesarrollo|Bromoxido}}
'''Skopie''' (en macedonio: Скопје; en albanés: ''Shkup''; en turco: ''Üsküp'') es la capital y la ciudad más grande de la República de [[Macedonia del Norte]]. Skopie es una ciudad de múltiples culturas y con una historia de muchos siglos. Los diversos grupos que han controlado la ciudad a lo largo de su historia han dejado cada uno de ellos vestigios visibles de su dominio: múltiples yacimientos arqueológicos de la época dardana y romana salpican la ciudad; en las afueras se pueden encontrar iglesias y monasterios de la época bizantina y del Imperio serbio; una gran riqueza de patrimonio otomano llena la '''Stara Čaršija'''; los bloques de apartamentos comunistas y otras estructuras de estilo soviético recuerdan la era yugoslava; y el partido gobernante actual está construyendo innumerables edificios de estilo neoclásico historicista en '''Centar'''. Todo esto se une para formar una ciudad bastante interesante.
La ubicación de Skopie a orillas del Vardar y sus afluentes cercanos, en medio de imponentes montañas, la convierte también en un lugar de hermosos paisajes. El pico más alto del monte Vodno, de 1.070 m (3.500 pies), coronado por la Cruz del Milenio, es visible desde toda la ciudad y constituye un importante destino recreativo. El río Treska atraviesa las montañas del suroeste de Skopie, formando el impresionante paisaje del Cañón de Matka.
== Distritos ==
{{Regionlist
| regionmapatexto=Los distritos de Skopie
| regionmapasize=400px
| region1nombre=Centar
| region1descripcion=El centro neurálgico de la capital de Macedonia del Norte. Centar alberga numerosas atracciones culturales, así como el Parlamento y el Gobierno de Macedonia del Norte. En la década de 2010 sufrió muchos cambios visibles y polémicos.
| region2nombre=Stara Čaršija
| region2descripcion=El centro histórico de Skopie, un testimonio bien conservado de los cinco siglos de dominio otomano en Macedonia. Alberga una fortaleza, innumerables mezquitas, baños turcos, caravasares (posadas), mercados, una torre del reloj y algunas iglesias.
| region3nombre=Karpoš
| region3descripcion=Karpoš es un barrio urbano contiguo al centro de Skopie que alberga importantes lugares de interés, como la montaña Vodno y el zoológico de Skopie.
| region4nombre=Afueras de Skopie
| region4descripcion=Skopie abarca una amplia zona, tanto dentro de los límites de la ciudad como en la región de Skopie en general; esta zona cuenta con numerosos lugares de interés repartidos por toda ella
| region5nombre=Cañón de Matka
| region5descripcion=El Cañón de Matka es una de las atracciones más populares del país, donde se encuentran iglesias medievales entre los acantilados rocosos del cañón
}}
== Comprender ==
[[Image:Skopie-pano.JPG|350px|thumb|Panorama de la ciudad de Skopie, con el monte Vodno al fondo]]
En la región de '''Povardarie''', Skopie es el centro financiero y político de Macedonia del Norte y, con diferencia, su ciudad más grande. La población de la ciudad ronda los 800 000 habitantes; sin embargo, según datos no oficiales, durante los días laborables puede llegar a superar el millón, lo que representa más de la mitad de la población del país. Skopie, la ciudad más diversa del país, alberga a muchas etnias; además de la mayoría macedonia, muchos albaneses, turcos, romaníes, serbios, bosnios y otros consideran a Skopie su hogar.
El 26 de julio de 1963 es una de las fechas más trágicas en la historia de Skopie. Un terremoto sacudió la ciudad a las 05:17. El 75 % de los edificios de la ciudad desapareció en solo unos segundos. A partir de entonces, comenzó el gran proyecto de reconstrucción, con el objetivo de convertir a Skopie en la ciudad modelo del mundo socialista. El plan fue diseñado por el arquitecto japonés Kenzo Tange, quien también diseñó la nueva estación de tren. El plan nunca se llevó a cabo en su totalidad. Se han iniciado muchos proyectos de reconstrucción. Se están reconstruyendo algunas torres de la Fortaleza de Kale y la antigua catedral, y el antiguo teatro también se encuentra en proceso de reconstrucción. Skopie es una mezcla ecléctica de cultura cristiana e islámica, en la que ambas compiten por hacerse notar. Sin embargo, esta mezcla cultural también ha dado lugar a una sociedad animada y variada. En verano, por las mañanas, se puede ver a la gente jugando ajedrez en los numerosos cafés y espacios verdes. Por la noche, Skopie cobra vida cuando los lugareños cenan en los cafés antes de dirigirse a los bares y clubes de música en vivo, la mayoría de los cuales permanecen abiertos hasta la 01:00 o más tarde.
===Historia===
Además de ser la capital de Macedonia del Norte, Skopie siempre ha sido un centro de poder codiciado desde hace mucho tiempo por diversos imperios y ocupado por una larga lista de ellos, como lo demuestran las numerosas iglesias y monasterios bizantinos que rodean la ciudad, así como algunos yacimientos romanos, como Scupi y el acueducto de Skopie. La ciudad, fundada por los peónios en el siglo III a. C. con el nombre de «Skupi», era muy apreciada por su ubicación estratégica, en un largo valle entre dos colinas, a orillas del río Vardar, una ruta comercial vital. Bajo el dominio romano, Skopie se convirtió en el centro administrativo de la provincia de Dardania. El prestigio de la ciudad creció cuando la Iglesia Ortodoxa la convirtió en sede episcopal durante los primeros tiempos del Imperio bizantino. La llegada de tribus eslavas migrantes procedentes de los Cárpatos en el siglo VI d. C. cambió el nombre de la ciudad, y la composición de su población fue asimilada por los recién llegados eslavos. A lo largo de los siglos bizantinos restantes, Skopie siguió siendo un importante centro mercantil, gracias a su ubicación en la encrucijada de las rutas comerciales y de comunicación de los Balcanes. Era famosa por su vida urbana y su fortaleza, y se la conocía por tener la iglesia más hermosa de la región. En el siglo XIV, Skopie se convirtió en la capital del Imperio de [[Serbia]], que era uno de los países más grandes y poderosos de Europa en esa época. Sin embargo, quienes dejaron la huella más profunda en Skopie fueron los otomanos. A finales del siglo XIV, Skopie y toda Macedonia cayeron bajo el dominio de los turcos otomanos, quienes gobernaron Macedonia durante más de seiscientos años y construyeron un gran número de mezquitas y otros edificios. En los siglos siguientes, el aspecto de la ciudad cambió con la construcción de numerosas mezquitas, baños turcos, puentes y otros edificios que daban testimonio de la nueva influencia oriental. Hoy en día, el legado otomano sigue siendo muy visible en la arquitectura de Skopie y en su pequeña minoría islámica. Después de que Macedonia del Norte se liberara de los turcos a principios del siglo XX, pasó a formar parte del Reino de [[Serbia]], y luego se convirtió en una república de la Federación Yugoslava, con Skopie como capital. En esa época, la próspera ciudad contaba con numerosos edificios neoclásicos ornamentados, dispuestos armoniosamente en un estilo más o menos centroeuropeo. Sin embargo, en 1963 un desastroso terremoto arrasó gran parte del majestuoso casco antiguo, y Skopie renació con el estilo imaginativo y futurista que estaba de moda en ese momento. Hoy en día, Skopie es una ciudad moderna y el principal centro político, económico, educativo y cultural de Macedonia del Norte.
{{climate chart
| Skopie, Macedonia
| 0 | 7 | 27.0
| 1 | 9 | 31.0
| 3 | 14 | 32.0
| 6 | 19 | 30.0
| 11 | 24 | 29.0
| 13 | 28 | 22.0
| 15 | 32 | 15.0
| 15 | 32 | 12.0
| 12 | 27 | 18.0
| 9 | 21 | 30.0
| 4 | 14 | 36.0
| 1 | 8 | 41.0
|float = right
|clear = none
|source= Meteoblue}}
== Llegar ==
azwn0su6tgdq9ueo8c04mtfwzxo8p0p