diff --git a/ext/src/_locales/es/messages.json b/ext/src/_locales/es/messages.json
new file mode 100644
index 0000000..89dcab7
--- /dev/null
+++ b/ext/src/_locales/es/messages.json
@@ -0,0 +1,298 @@
+{
+ "extensionName": {
+ "message": "EXTENSION_NAME"
+ , "description": "Name of the extension and the native receiver selector window title."
+ }
+ , "extensionDescription": {
+ "message": "Habilita el soporte de Chromecast para transmitir aplicaciones web (como Netflix y BBC iPlayer), video HTML5 y enviar pantalla/pestañas."
+ , "description": "Description of the extension shown in the add-ons manager."
+ }
+
+
+ , "popupMediaTypeApp": {
+ "message": "la aplicación de este sitio"
+ , "description": "Receiver selector media type text for current site's sender application."
+ }
+ , "popupMediaTypeTab": {
+ "message": "Pestaña"
+ , "description": "Receiver selector media type text for current tab."
+ }
+ , "popupMediaTypeScreen": {
+ "message": "Pantalla"
+ , "description": "Receiver selector media type text for screen."
+ }
+ , "popupMediaTypeFile": {
+ "message": "Examinar..."
+ , "description": "Receiver selector media type text for opening a file selector dialog."
+ }
+
+ , "popupMediaSelectCastLabel": {
+ "message": "Transmitir"
+ , "description": "(Cast) to:"
+ }
+ , "popupMediaSelectToLabel": {
+ "message": "a:"
+ , "description": "Cast (to:)"
+ }
+ , "popupCastButtonTitle": {
+ "message": "Transmitir"
+ , "description": "Button text for each receiver entry in the receiver selector."
+ }
+ , "popupCastingButtonTitle": {
+ "message": "Transmitiendo$ellipsis$"
+ , "description": "Button text while establishing a session in the receiver selector. Ellipsis cycles (. → .. → ...) as loading indicator."
+ , "placeholders": {
+ "ellipsis": {
+ "content": "$1"
+ , "example": "..."
+ }
+ }
+ }
+
+
+ , "contextCast": {
+ "message": "Transmitir a..."
+ , "description": "Main context menu item title. Ellipsis indicates additional information required as it triggers opening of receiver selector."
+ }
+
+ , "contextAddToWhitelist": {
+ "message": "Añadir a la lista blanca"
+ , "description": "Top-level whitelist context menu item title."
+ }
+ , "contextAddToWhitelistRecommended": {
+ "message": "Añadir $matchPattern$ (Recomendado)"
+ , "description": "Context menu item title for recomended match pattern."
+ , "placeholders": {
+ "matchPattern": {
+ "content": "$1"
+ , "example": "https://example.com/*"
+ }
+ }
+ }
+ , "contextAddToWhitelistAdvancedAdd": {
+ "message": "Añadir $matchPattern$"
+ , "description": "Context menu item title for all other match patterns."
+ , "placeholders": {
+ "matchPattern": {
+ "content": "$1"
+ , "example": "*://*.example.com/*"
+ }
+ }
+ }
+
+
+ , "optionsBridgeLoading": {
+ "message": "Cargando información de la aplicación puente..."
+ , "description": "Loading placeholder text for bridge section on options page."
+ }
+ , "optionsBridgeFoundStatusTitle": {
+ "message": "Aplicación puente encontrada"
+ , "description": "Bridge OK status title text."
+ }
+ , "optionsBridgeIssueStatusTitle": {
+ "message": "Problema con aplicación puente"
+ , "description": "Bridge error status title text."
+ }
+ , "optionsBridgeNotFoundStatusTitle": {
+ "message": "Aplicación puente no encontrada"
+ , "description": "Bridge missing status title text."
+ }
+ , "optionsBridgeNotFoundStatusText": {
+ "message": "Intente descargar e instalar la última versión."
+ , "description": "Bridge not found additional description text"
+ }
+
+ , "optionsBridgeStatsName": {
+ "message": "Nombre:"
+ , "description": "Bridge stats name row title."
+ }
+ , "optionsBridgeStatsVersion": {
+ "message": "Versión:"
+ , "description": "Bridge stats version row title."
+ }
+ , "optionsBridgeStatsExpectedVersion": {
+ "message": "Versión esperada:"
+ , "description": "Bridge stats expected version row title."
+ }
+ , "optionsBridgeStatsCompatibility": {
+ "message": "Compatibilidad:"
+ , "description": "Bridge stats compatibility row title."
+ }
+ , "optionsBridgeStatsRecommendedAction": {
+ "message": "Acción recomendada:"
+ , "description": "Bridge stats recommended action row title."
+ }
+ , "optionsBridgeCompatible": {
+ "message": "COMPATIBLE"
+ , "description": "Compatibility status is definitely compatible."
+ }
+ , "optionsBridgeLikelyCompatible": {
+ "message": "PROBABLEMENTE COMPATIBLE"
+ , "description": "Compatibility status is probably compatible."
+ }
+ , "optionsBridgeIncompatible": {
+ "message": "INCOMPATIBLE"
+ , "description": "Compatibility status is definitely incompatible."
+ }
+ , "optionsBridgeOlderAction": {
+ "message": "Versión de la aplicación puente inferior a la esperada, intente actualizarla a la última versión."
+ , "description": "Recommended action for when the installed bridge version is older than the installed extension version."
+ }
+ , "optionsBridgeNewerAction": {
+ "message": "Versión de la aplicación puente superior a la esperada, intente actualizar la extensión a la última versión."
+ , "description": "Recommended action for when the installed bridge version is newer than the installed extension version."
+ }
+ , "optionsBridgeNoAction": {
+ "message": "No se requieren acciones."
+ , "description": "Recommended action for when both bridge and extension versions are compatible or likely compatible."
+ }
+ , "optionsBridgeUpdateCheck": {
+ "message": "Buscar actualizaciones"
+ , "description": "Update check button title."
+ }
+ , "optionsBridgeUpdateChecking": {
+ "message": "Buscando actualizaciones para Updates$ellipsis$"
+ , "description": "Update check button title while in progress. Ellipsis cycles (. → .. → ...) as loading indicator."
+ , "placeholders": {
+ "ellipsis": {
+ "content": "$1"
+ , "example": ".."
+ }
+ }
+ }
+ , "optionsBridgeUpdateStatusNoUpdates": {
+ "message": "No hay actualizaciones disponibles"
+ , "description": "Update status if no updates are found."
+ }
+ , "optionsBridgeUpdateStatusError": {
+ "message": "Error al buscar actualizaciones"
+ , "description": "Update status if an error was encountered checking for updates."
+ }
+ , "optionsBridgeUpdateAvailable": {
+ "message": "Hay una actualización disponible:"
+ , "description": "Update status if an update was found."
+ }
+ , "optionsBridgeUpdate": {
+ "message": "Actualizar ahora..."
+ , "description": "Update now button title. Ellipsis indicates additional information as it triggers an update window popup."
+ }
+
+ , "optionsMediaCategoryName": {
+ "message": "Transmisión de contenidos"
+ , "description": "Options page media casting category title."
+ }
+ , "optionsMediaCategoryDescription": {
+ "message": "Transmisión de video/audio HTML5."
+ , "description": "Options page media casting category description."
+ }
+ , "optionsMediaEnabled": {
+ "message": "Activar transmisión de contenidos"
+ , "description": "Media casting enabled checkbox label."
+ }
+ , "optionsMediaSyncElement": {
+ "message": "Sincronizar estado del receptor con el contenido"
+ , "description": "Media casting sync checkbox label."
+ }
+ , "optionsMediaStopOnUnload": {
+ "message": "Detener reproducción del receptor al cerrar la página"
+ , "description": "Media stop on unload checkbox label."
+ }
+
+ , "optionsLocalMediaCategoryName": {
+ "message": "Transmisión de contenidos locales"
+ , "description": "Options page local media category title."
+ }
+ , "optionsLocalMediaCategoryDescription": {
+ "message": "Servidor HTTP iniciado por la aplicación puente para transmitir archivos de medios locales al receptor."
+ , "description": "Options page local media category description."
+ }
+ , "optionsLocalMediaEnabled": {
+ "message": "Activar transmisión de medios locales"
+ , "description": "Local media enabled checkbox label."
+ }
+ , "optionsLocalMediaServerPort": {
+ "message": "Puerto del servidor HTTP:"
+ , "description": "HTTP server port input label."
+ }
+
+ , "optionsUserAgentWhitelistCategoryName": {
+ "message": "Lista blanca de agentes de usuario"
+ , "description": "Options page whitelist category title."
+ }
+ , "optionsUserAgentWhitelistCategoryDescription": {
+ "message": "Sitios en los cuales reemplazar el agente de usuario con una versión de Chrome para compatibilidad. Deben ser patrones de coincidencia válidos."
+ , "description": "Options page whitelist category description."
+ }
+ , "optionsUserAgentWhitelistEnabled": {
+ "message": "Activar lista blanca de sitios"
+ , "description": "Whitelist enabled checkbox label."
+ }
+ , "optionsUserAgentWhitelistContent": {
+ "message": "Patrones de coincidencia (uno por línea):"
+ , "description": "Match patterns editor widget label."
+ }
+ , "optionsUserAgentWhitelistBasicView": {
+ "message": "Vista básica"
+ , "description": "Switch to basic view button title."
+ }
+ , "optionsUserAgentWhitelistRawView": {
+ "message": "Vista en bruto"
+ , "description": "Switch to raw view button title."
+ }
+ , "optionsUserAgentWhitelistSaveRaw": {
+ "message": "Guardar archivo en bruto"
+ , "description": "Save raw view edits button title."
+ }
+ , "optionsUserAgentWhitelistAddItem": {
+ "message": "Añadir elemento"
+ , "description": "Add new whitelist item button title."
+ }
+ , "optionsUserAgentWhitelistEditItem": {
+ "message": "Editar"
+ , "description": "Edit whitelist item button title. Displayed on each item."
+ }
+ , "optionsUserAgentWhitelistRemoveItem": {
+ "message": "Eliminar"
+ , "description": "Remove whitelist item button title. Displayed on each item."
+ }
+ , "optionsUserAgentWhitelistInvalidMatchPattern": {
+ "message": "Patrón de coincidencia $matchPattern$ inválido"
+ , "description": "Error displayed by input indicating an invalid match pattern."
+ , "placeholders": {
+ "matchPattern": {
+ "content": "$1"
+ , "example": "http://example"
+ }
+ }
+ }
+
+ , "optionsMirroringCategoryName": {
+ "message": "Enviar pantalla"
+ , "description": "Options page mirroring category name."
+ }
+ , "optionsMirroringCategoryDescription": {
+ "message": "Envío de pantalla/pestaña a la aplicación receptora de Chromecast."
+ , "description": "Options page mirroring category description."
+ }
+ , "optionsMirroringEnabled": {
+ "message": "Activar envío de pantalla"
+ , "description": "Mirroring enabled checkbox label."
+ }
+ , "optionsMirroringAppId": {
+ "message": "ID de aplicación receptora:"
+ , "description": "Mirroring app ID input label."
+ }
+
+ , "optionsReset": {
+ "message": "Restaurar predeterminados"
+ , "description": "Restore default options button label."
+ }
+ , "optionsSave": {
+ "message": "Guardar"
+ , "description": "Save options button label."
+ }
+ , "optionsSaved": {
+ "message": "¡Guardado!"
+ , "description": "Status text displayed by save button once options have been successfully saved."
+ }
+}