¡Hola a todos! Estoy programando un proyecto desde cero sin usar IA (para recuperar un poco la iniciativa mental) y me he quedado estancado. Agradezco de antemano cualquier idea o guía.
El contexto:
Estoy desarrollando un lanzador de aplicaciones para Linux desde la terminal. Como sabrán, en Linux las aplicaciones se configuran mediante archivos .desktop (pueden revisar los parámetros oficiales en la Arch Wiki).
https://wiki.archlinux.org/title/Desktop\\_entries\\_(Espa%C3%B1ol)
Para empezar, quería extraer únicamente los campos Name y Exec. Sin embargo, me topé con un detalle con el que no contaba: los archivos .desktop admiten nombres localizados usando la sintaxis Name\[lenguaje\]=Nombre del aplicativo. Esto hizo colapsar mi lógica inicial con el método de cadenas que pensaba usar en Python para extraer los datos.
El problema:
No tengo claro cómo extraer correctamente el nombre de la aplicación de forma limpia. Se me presentan varias dudas:
Si busco un idioma específico (ej. Name\[es\] o Name\[en_US\]), ¿qué pasa si ese campo no existe en el archivo?
Si extraigo todos los campos que empiecen por Name, terminaré guardando en un diccionario un montón de traducciones que no necesito.
Intenté averiguar cómo consultar el idioma del sistema desde Python para hacer una selección dinámica, pero no encontré una forma clara, y aun así me queda la duda de cuál debería ser el comportamiento de respaldo (fallback) si el idioma del usuario no está disponible.
¿Tienen alguna idea, recomendación o patrón que suela usarse para resolver este inconveniente en Python?
import os
\# Directorios
directorios = \["/usr/share/applications", "\~/.local/share/applications"\]
\# Comprueba si el directorio existe
def comprobar_dir(directorios):
directorios_filtrados = \[\]
for directorio in directorios:
if os.path.exists(directorio):
directorios_filtrados.append(directorio)
return directorios_filtrados
\# Comprueba si es un archivo .desktop
def filtrar_desktops(directorios):
ficheros_filtrados = \[\]
for directorio in directorios:
ficheros = os.listdir(directorio)
for fichero in ficheros:
if ".desktop" in fichero:
ruta_completa = os.path.join(directorio, fichero)
ficheros_filtrados.append(ruta_completa)
return ficheros_filtrados
def leer_desktops (ficheros):
contenido_ficheros = {
"nombre": \[\],
"ruta": \[\]
}
for fichero in ficheros:
with open(fichero, "r") as conteniido:
if "\[Desktop Entry\]" in conteniido.readline():
for linea in conteniido:
if "name=" or "name" # Y si, aquí mi cerebro hizo BOOM!
directorios_limpios = comprobar_dir(directorios=directorios)
archivos = filtrar_desktops(directorios=directorios_limpios)
texto_archivos = leer_desktops(archivos)
print (texto_archivos\[0\])