diff --git a/docs/source/build_guide.rst b/docs/source/build_guide.rst index 956f82c2b..ee6b239fe 100644 --- a/docs/source/build_guide.rst +++ b/docs/source/build_guide.rst @@ -200,7 +200,37 @@ After you have all the pins soldrerd, it's a good time to insert the SD card and .. image:: images/build_guide/ui_module_18.jpeg -There you go! The PiFinder hat is fully assembled and you can move on to printing your parts or :ref:`final assembly` +There you go! The PiFinder hat is fully assembled and you can move on to configuring the software, to :ref:`printing your parts` or :ref:`user_guide: final assembly` + +Test & Software Setup +========================= + +Now is the right time to provide power to the Pi and check if everything is alright and configure PiFinder's Access Point and WiFi networks you want to connect to. Note that you can do this also after the assembly, but it is easier and safer to do it now, when all ports of the Raspberry Pi are accessible (in case something goes wrong and you're not able to connect to the PiFinder) and it is easier to exchange a LED, if necessary. + +.. note:: + Set the PiFinder on the desk and leave it sitting there, until the menu displays. The motion detector (IMU) needs to calibrate itself and it is not able to do so if you move it around. If you hold it in your hand, then the next test may fail. + +If the PiFinder is powered up, the screen should display the main menu. If it does not, please check the soldering of the components and the connections to the Raspberry Pi. You may have to reflow the solder joints. + +Once the menu displays correctly, move to Tools > Status. This displays the current status of the PiFinder. You should see the following: + +.. image:: images/build_guide/status.png + :target: images/build_guide/status.png + :alt: Status of PiFinder on first power up. + +The IMU displays "static" or "moving" and the GPS displays 0/0 or N/0 where N is a small number. + +WiFi configurations +----------------------- + +Now insert a network cable into the Raspberry Pi and connect it to your router. The PiFinder will use DHCP to configure its network. Then use an internet browser on your regular computer and enter ``pifinder.local`` in the address bar. This opens up the PiFinder web interface. If this does not work, you can also try to enter the IP address of the Raspberry Pi (you can find it in your router). + +.. warning:: + If you do not attach a network cable now, you have to do the configuration later on. If you access the PiFinder in its default configuration, any passwords you enter will be transferred in clear over the air. + +Now using the web interface, configure your PiFinder's Access Point and add any additional WiFis that the PiFinder is going to connect to. This is described at :ref:`user_guide:WiFi`. Note that the default password is ``solveit``. As part of the configuration, your PiFinder will reboot. + +Once you have configured the Access Point and WiFi networks, you can display the network's QR code in "Start" > "Connect WiFi", now scan the code with your phone or tablet to connect to the PiFinder's Access Point. Open up a browser and enter ``pifinder.local`` in the address bar. This opens up the PiFinder web interface. If this works, congrats! You have successfully configured PiFinder's Access Point and WiFis! Configurations Overview ======================== diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst index cd5994f69..a84a41acd 100644 --- a/docs/source/quick_start.rst +++ b/docs/source/quick_start.rst @@ -486,6 +486,21 @@ be in your eyepiece! The numbers displayed will shift a bit and become brighter indicating a 100% reliable position. +Checklist: Observation Session +------------------------------------- + +These are the things, you need to do to start an observation session with the PiFinder: + +- Ensure the PiFinder is securely mounted and perpendicular to the ground +- Check that the internal battery is charged or an external power source is connected +- Make sure the lens cap is off +- Verify the PiFinder has a clear view of the sky and is focused. Use "Start" > "Focus" to check the focus +- Put a bright star star at the center of your eyepiece and align PiFinder to it, using "Start" > "Align" +- Confirm you have a GPS lock and local time or select your observation location from your list of saved locations, using "Start" > "Location&Time" +- Optionally connect your smartphone or tablet to the PiFinder (WiFi) network and use the webserver to control it. +- Optionally startup SkySafari and send targets to the PiFinder + + Shutting down the PiFinder --------------------------- diff --git a/docs/source/user_guide.rst b/docs/source/user_guide.rst index 462934189..8e18835d4 100644 --- a/docs/source/user_guide.rst +++ b/docs/source/user_guide.rst @@ -508,17 +508,23 @@ wireless access point for other devices to connect to via the Access Point (AP) :ref:`user_guide:Web Interface` or the :ref:`user_guide:status screen` to switch between these two modes and to see which mode is currently active. -Using the PiFinder in Access Point mode creates a network called PiFinderAP with no password to allow -easy connection of phones, tablets and other devices in the field. +Using the PiFinder in Access Point mode creates a network called PiFinder-12345, where 12345 will be 5 random characters, +that are determined at first startup of the PiFinder (this avoids collisions on star parties). +Open the "Start" > "Connect WiFi" menu on the PiFinder, this displays a QR code, that you can use to connect to the +PiFinder's network. This network will be encrypted using WPA2. Using **SQUARE** button, you can switch to +display the AP name and password. You can also use the Quick Menu to switch the display or switch the WiFi Mode. To use the Client mode, you'll need to add information about the WiFi network you'd like the PiFinder to connect to using the Web Interface as described in :ref:`user_guide:connecting to a new wifi network` +In order to configure the WiFi's name, password and encryption, you can use the PiFinder's web interface, +see :ref:`user_guide:Web Interface` for more details. + PiFinder address ----------------- -In most cases, you can use the name ``pifinder.local`` to connect to the PiFinder. On older computers -or those that don't support zeroconf networking, you can use the IP address provides on the :ref:`Global +Once you are connected to the same WiFi, in most cases, you can use the name ``pifinder.local`` to connect to the PiFinder. On older computers +or those that don't support zeroconf networking, you can use the IP address provided on the :ref:`Global Options` screen to connect. You can connect to the PiFinder via: @@ -538,12 +544,13 @@ The PiFinder provides an easy to use web interface which allows you to: * Backup and restore your observing logs, settings and other data * View and download your logged observations -To access the web interface for the first time, make sure the PiFinder is in Access Point mode (see :ref:`user_guide:settings menu`). This is the default for new PiFinders to make first time set up easier. Using a phone, tablet or computer, connect to the PiFinder's wireless network called PiFinderAP. It's an open network with no password required. Once connected, open your web browser and visit: -``http://pifinder.local`` +To access the web interface for the first time, make sure the PiFinder is in Access Point mode (see :ref:`user_guide:settings menu`). +This is the default for new PiFinders to make first time set up easier. Use the "Start" > "Connect WiFi" display, to connect your phone or tablet. +Once connected, open your web browser and visit: ``http://pifinder.local`` .. note:: - If you are connected to the PiFinderAP network and can't load the PiFinder web interface using + If you are connected to the PiFinder-12345 network and can't load the PiFinder web interface using http://pifinder.local try http://10.10.10.1 as some systems may not support the network features required to resolve local computer names @@ -565,12 +572,12 @@ the Tools option in the web interface. Connecting to a new WiFi network --------------------------------- -The default behavior of the PiFinder is to generate it's own WiFi network call ``PiFinderAP`` that you can connect to +The default behavior of the PiFinder is to generate it's own WiFi network call ``PiFinder-12345`` that you can connect to and configure additional networks. To get the PiFinder to connect to an existing WiFi network with Internet access you can follow the steps below: 1) Make sure the PiFinder is in Access Point mode -2) Connect your phone, tablet, or computer to the PiFinder's wifi network called PiFinderAP +2) Connect your phone, tablet, or computer to the PiFinder's wifi network called similar to PiFinder-12345, see "Start" > "Connect WiFi" for connection infos. 3) Visit http://pifinder.local using your web browser 4) Click the 'Network' link in the top bar, or if you have a smaller screen, click the three stacked horizontal lines in the upper-right corner to access the menu and choose 'Network' from there. .. image:: images/user_guide/pf_web_net0.png @@ -586,6 +593,22 @@ can follow the steps below: To add more WiFi networks for the PiFinder to look for, navigate to the Network Setup page of the :ref:`user_guide:web interface` and click the + button near the list of WiFi networks and repeat the steps above. +Reset Access Point +-------------------------------------- + +.. stop:: + Only do this if you're not able to connect to the PiFinder's access point using the QR code from "Start" > "Connect WiFi", or you can't display it. + +If you can't connect to the PiFinder's access point using the QR code from "Start" > "Connect WiFi", or this doesn't display, you can login into the PiFinder using SSH, if you have a network cable connected. If this does not work, you can plug-in a monitor cable and a keyboard and directly login to the Raspberry Pi. The default username and password are ``pifinder`` and ``solveit``. You may have to open up the PiFinder to have access to the mentioned ports. + +1. Login into PiFinder as described above. You should be in the home directory. Check with ``pwd``, it should display ``/home/pifinder``. If not, execute ``cd``. +2. Copy over the default configuration file for hostapd into it's default location: ``sudo cp pi_config_files/hostapd-open.conf /etc/hostapd/hostapd.conf``. +3. Then check, if PiFinder is in "Client" or "Access Point" mode. Execute ``cat wifi_status.txt``. This should display either "AP" or "Client" +4. If it says "client", execute ``sudo switch-ap.sh``. +5. Now reboot the PiFinder with ``sudo reboot``. + +After the reboot, PiFinder presents with an open Access Point with-out encryption. + SkySafari =================== @@ -604,8 +627,11 @@ Shared Data Access In the course of using the PiFinder several data files are created that may be of interest. These are available via a SMB (samba) network share called ``//pifinder.local/shared``. Accessing this will depend on your -OS, but the PiFinder should be visible in a network browser provided. There is no password requirement, -just connect as ``guest`` with no password provided. +OS, but the PiFinder should be visible in a network browser provided. On Windows, open up file explorer and enter +``\\pifinder.local\shared`` in the address bar. On Mac, open Finder and select Go > Connect to Server and enter +``smb://pifinder.local/shared``. On Linux, you can use the file manager or command line to access the share. + +There is no password requirement, just connect as ``guest`` with no password provided. Once connected, you'll see: diff --git a/help/object_details/2.xcf b/help/object_details/2.xcf new file mode 100644 index 000000000..b59101e95 Binary files /dev/null and b/help/object_details/2.xcf differ diff --git a/help/wifi_connect/1.png b/help/wifi_connect/1.png new file mode 100644 index 000000000..c2cb7d293 Binary files /dev/null and b/help/wifi_connect/1.png differ diff --git a/help/wifi_connect/1.xcf b/help/wifi_connect/1.xcf new file mode 100644 index 000000000..5f4cc96a9 Binary files /dev/null and b/help/wifi_connect/1.xcf differ diff --git a/help/wifi_connect/2.png b/help/wifi_connect/2.png new file mode 100644 index 000000000..f6dc56ca4 Binary files /dev/null and b/help/wifi_connect/2.png differ diff --git a/help/wifi_connect/2.xcf b/help/wifi_connect/2.xcf new file mode 100644 index 000000000..ac8a68ff6 Binary files /dev/null and b/help/wifi_connect/2.xcf differ diff --git a/help/wifi_connect/3.png b/help/wifi_connect/3.png new file mode 100644 index 000000000..6f69a2abd Binary files /dev/null and b/help/wifi_connect/3.png differ diff --git a/help/wifi_connect/3.xcf b/help/wifi_connect/3.xcf new file mode 100644 index 000000000..9ca3a0f3f Binary files /dev/null and b/help/wifi_connect/3.xcf differ diff --git a/pi_config_files/hostapd.conf b/pi_config_files/hostapd.conf index afdb52179..85d42457b 100644 --- a/pi_config_files/hostapd.conf +++ b/pi_config_files/hostapd.conf @@ -1,6 +1,6 @@ country_code=US interface=wlan0 -ssid=PiFinderAP +ssid=PiFinder-CHANGEME hw_mode=g channel=7 macaddr_acl=0 diff --git a/python/PiFinder/main.py b/python/PiFinder/main.py index 4eb25d7fc..690d0f4d1 100644 --- a/python/PiFinder/main.py +++ b/python/PiFinder/main.py @@ -274,6 +274,9 @@ def main( os_detail, platform, arch = utils.get_os_info() logger.info("PiFinder running on %s, %s, %s", os_detail, platform, arch) + sys_utils = utils.get_sys_utils() + sys_utils.Network.configure_accesspoint() + # init UI Modes command_queues = { "camera": camera_command_queue, diff --git a/python/PiFinder/server.py b/python/PiFinder/server.py index 83047dd50..07b042098 100644 --- a/python/PiFinder/server.py +++ b/python/PiFinder/server.py @@ -198,13 +198,15 @@ def advanced(): @app.route("/network") @auth_required - def network_page(): + def network_page(err_pwd="", err_country=""): show_new_form = request.query.add_new or 0 return template( "network", net=self.network, show_new_form=show_new_form, + err_pwd=err_pwd, + err_country=err_country, ) @app.route("/gps") @@ -418,10 +420,39 @@ def network_delete(network_id): def network_update(): wifi_mode = request.forms.get("wifi_mode") ap_name = request.forms.get("ap_name") + ap_passwd = request.forms.get("ap_passwd") + wifi_country = request.forms.get("wifi_country") host_name = request.forms.get("host_name") + error_triggered = False + err_pwd = "" + if self.network.is_ap_open(): + ap_encrypt = request.forms.get("ap_encrypt") + if ap_encrypt == "1": + try: + self.network.enable_encryption() + self.network.set_ap_pwd(ap_passwd) + except Exception as e: + err_pwd = "Invalid password: " + e.args[0] + error_triggered = True + else: + try: + self.network.set_ap_pwd(ap_passwd) + except Exception as e: + err_pwd = "Invalid password: " + e.args[0] + error_triggered = True + + err_country = "" + if wifi_country not in self.network.COUNTRY_CODES: + err_country = "Invalid country code" + error_triggered = True + + if error_triggered: + return network_page(err_pwd=err_pwd, err_country=err_country) + self.network.set_wifi_mode(wifi_mode) self.network.set_ap_name(ap_name) + self.network.set_ap_wifi_country(wifi_country) self.network.set_host_name(host_name) return template("restart") @@ -969,6 +1000,7 @@ def time_lock(time=datetime.now()): ) except (PermissionError, OSError): logger.info("Web Interface on port 8080") + debug() run( app, host="0.0.0.0", diff --git a/python/PiFinder/sys_utils.py b/python/PiFinder/sys_utils.py index 7eddbc496..6d632f711 100644 --- a/python/PiFinder/sys_utils.py +++ b/python/PiFinder/sys_utils.py @@ -1,5 +1,7 @@ import glob import re +import random +import string from typing import Dict, Any import sh @@ -10,6 +12,7 @@ import logging BACKUP_PATH = "/home/pifinder/PiFinder_data/PiFinder_backup.zip" +NO_PASSWORD_DEFINED = "" logger = logging.getLogger("SysUtils") @@ -21,10 +24,99 @@ class Network: def __init__(self): self.wifi_txt = f"{utils.pifinder_dir}/wifi_status.txt" - with open(self.wifi_txt, "r") as wifi_f: - self._wifi_mode = wifi_f.read() + self._wifi_mode = Network.get_wifi_mode() self.populate_wifi_networks() + self.populate_wifi_countries() + + @staticmethod + def get_wifi_mode(): + with open(f"{utils.pifinder_dir}/wifi_status.txt", "r") as wifi_f: + return wifi_f.read() + + @staticmethod + def configure_accesspoint(restart_hostapd=True) -> None: + """Add WPA2 encryption, if not already enabled. + + Tasks: + 0) If passphrase is already in hostapd.conf, do not change it (this ignores the case where the ap_name contains ENCRYPTME) + 1) if SSID in current config contains CHANGEME, create a random SSID of the from PiFinder-XYZAB, XYZAB 5 random chars (see below) and use that. + 2) If SSID in current config contains ENCRYPTME, add encryption to hostapd.conf, generate a 20 character random password + (20 chars in 5 groups of random chars, separeted by '-', see below) + + where 'random char' means a randomly selected character out of the set of 0-9, a-z and A-Z. + """ + action_needed = False + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("ssid="): + if "ENCRYPTME" in line or "CHANGEME" in line: + action_needed = True + if not action_needed: + return + + logger.info("SYSUTILS: Configuring WIFI Access Point definition.") + + passphrase_detected = False + ssid_changed = False + encryption_needed = False + with open("/tmp/hostapd.conf", "w") as new_conf: + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("ssid=") and "ENCRYPTME" in line: + encryption_needed = True + logger.info("SYS-Network: Encryption needed.") + if line.startswith("ssid=") and "CHANGEME" in line: + ap_rnd = Network._generate_random_chars(5) + line = f"ssid=PiFinder-{ap_rnd}\n" + ssid_changed = True + logger.warning( + f"SYS-Network: Changing SSID to 'PiFinder-{ap_rnd}'" + ) + if line.startswith("wpa_passphrase="): + logger.info("SYS-Network: Passphrase detected.") + passphrase_detected = True + new_conf.write(line) + # consumed all lines, so: + # Backup and move new file into place, restart service. + logger.warning("Network: Changing configuration for hostapd") + sh.sudo("cp", "/etc/hostapd/hostapd.conf", "/etc/hostapd/hostapd.conf.bck") + sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") + + if encryption_needed and not passphrase_detected: # must be outside + Network.enable_encryption() + + # If we are enabling encryption or changed SSID, restart hostapd, if in AP mode + if ( + not (passphrase_detected and encryption_needed) or ssid_changed + ) and restart_hostapd: + Network.force_restart_hostapd() + + @staticmethod + def enable_encryption() -> None: + """Enable WPA2 encryption in hostapd.conf. + Note: Caller is responsible to restart hostapd if needed. + """ + with open("/tmp/hostapd.conf", "w") as new_conf: + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + new_conf.write(line) + logger.warning("SYS-Network: Enabling WPA2 with PSK") + # Add encrpytion directives + pwd = Network._generate_random_chars(20, "-", 5) + new_conf.write("wpa=2\n") + new_conf.write("wpa_key_mgmt=WPA-PSK\n") + new_conf.write(f"wpa_passphrase={pwd}\n") + new_conf.write("rsn_pairwise=CCMP\n") + logger.warning("Network: Enabling encryption in hostapd") + sh.sudo("cp", "/etc/hostapd/hostapd.conf", "/etc/hostapd/hostapd.conf.bck2") + sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") + + @staticmethod + def force_restart_hostapd() -> None: + if Network.get_wifi_mode() == "AP": + logger.warning("Network: Restarting hostapd") + sh.sudo("systemctl", "restart", "hostapd") def populate_wifi_networks(self) -> None: wpa_supplicant_path = "/etc/wpa_supplicant/wpa_supplicant.conf" @@ -38,6 +130,52 @@ def populate_wifi_networks(self) -> None: self._wifi_networks = Network._parse_wpa_supplicant(contents) + def populate_wifi_countries(self) -> None: + """ + Read country codes from iso3166.tabs + """ + try: + with open("/usr/share/zoneinfo/iso3166.tab", "r") as iso_countries: + lines = iso_countries.readlines() + lines = [ + line + for line in lines + if not line.startswith("#") and line != "\n" and line != "\t\n" + ] + self.COUNTRY_CODES = [line.split("\t")[0] for line in lines] + logger.debug(f"Country Codes: {self.COUNTRY_CODES}") + # print(self.COUNTRY_CODES) + except IOError: + logger.error("Error reading /usr/share/zoneinfo/iso3166.tab", exc_info=True) + self.COUNTRY_CODES = [ + "US", + "CA", + "GB", + "DE", + "FR", + "IT", + "ES", + "NL", + "JP", + "CN", + ] + logger.error(f"Using default country codes: {self.COUNTRY_CODES}") + + @staticmethod + def _generate_random_chars(length: int, ch: str = "", group: int = -1) -> str: + """Generate a string using random characters from the set of 0-9,a-z and A-Z""" + rndstr = "".join( + [ + random.SystemRandom().choice(string.ascii_letters + string.digits) + for _ in range(length) + ] + ) + if ch != "" and group > 0: + rndstr = ch.join( + [rndstr[i : i + group] for i in range(0, len(rndstr), group)] + ) + return rndstr + @staticmethod def _parse_wpa_supplicant(contents: list[str]) -> list: """ @@ -126,6 +264,41 @@ def add_wifi_network(self, ssid, key_mgmt, psk=None): # Restart the supplicant wpa_cli("reconfigure") + def get_ap_pwd(self): + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("wpa_passphrase="): + return line[15:-1] + return NO_PASSWORD_DEFINED + + def set_ap_pwd(self, ap_pwd): + """Set Access Point password. + + If the password is the same as the current password, nothing is done. + + It is the responsiblity of the caller to ensure that this method is only called when AP enryption is already is enabled! + + This method throws an ValueError of the password is < 8 or > 63 characters long. + """ + current_pwd = self.get_ap_pwd() + if ap_pwd == current_pwd: + return + + # Check password length + if len(ap_pwd) < 8: + raise ValueError("Password must be at least 8 characters long") + if len(ap_pwd) > 63: + raise ValueError("Password must be at most 63 characters long") + + # Change password + with open("/tmp/hostapd.conf", "w") as new_conf: + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("wpa_passphrase="): + line = f"wpa_passphrase={ap_pwd}\n" + new_conf.write(line) + sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") + def get_ap_name(self): with open("/etc/hostapd/hostapd.conf", "r") as conf: for line in conf: @@ -144,9 +317,46 @@ def set_ap_name(self, ap_name): new_conf.write(line) sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") + def get_ap_wifi_country(self): + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("country_code="): + return line[13:-1] + return "US" + + def set_ap_wifi_country(self, country_code): + country_changed = False + with open("/tmp/hostapd.conf", "w") as new_conf: + no_country = True + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("country_code="): + line = f"country_code={country_code}\n" + no_country = False + country_changed = True + new_conf.write(line) + if no_country: + new_conf.write(f"country_code={country_code}\n") + if country_changed: + try: + sh.sudo("raspi-config", "nonint", "do_wifi_country", country_code) + sh.sudo("cp", "/tmp/hostapd.conf", "/etc/hostapd/hostapd.conf") + except: + logger.warning( + f"SYS: Failed to set wifi country code to {country_code}" + ) + raise + def get_host_name(self): return socket.gethostname() + def is_ap_open(self): + with open("/etc/hostapd/hostapd.conf", "r") as conf: + for line in conf: + if line.startswith("wpa="): + return False + return True + def get_connected_ssid(self) -> str: """ Returns the SSID of the connected wifi network or @@ -322,3 +532,8 @@ def switch_cam_imx296() -> None: def switch_cam_imx462() -> None: logger.info("SYS: Switching cam to imx462") sh.sudo("python", "-m", "PiFinder.switch_camera", "imx462") + + +if __name__ == "__main__": + # This is for testing purposes only + Network.configure_accesspoint() diff --git a/python/PiFinder/sys_utils_fake.py b/python/PiFinder/sys_utils_fake.py index efe6f1405..b7728f2fb 100644 --- a/python/PiFinder/sys_utils_fake.py +++ b/python/PiFinder/sys_utils_fake.py @@ -12,6 +12,14 @@ class Network: """ def __init__(self): + self.COUNTRY_CODES = ["US", "BE", "DE"] + + @staticmethod + def configure_accesspoint() -> None: + pass + + @staticmethod + def enable_encryption() -> None: pass def populate_wifi_networks(self): @@ -35,12 +43,28 @@ def add_wifi_network(self, ssid, key_mgmt, psk=None): """ pass + def get_ap_pwd(self): + # Return an example password, e.g. to test the password display. + return "UNKN8-01234-abcde-testpw" + + def set_ap_pwd(self, ap_pwd): + pass + def get_ap_name(self): return "UNKN" def set_ap_name(self, ap_name): pass + def get_ap_wifi_country(self): + return "UNKN" + + def set_ap_wifi_country(self, ap_wifi_country): + pass + + def is_ap_open(self): + return False # i.e. encrypted = Not ( Is AP encrypted? ) + def get_host_name(self): return socket.gethostname() @@ -49,7 +73,7 @@ def get_connected_ssid(self): Returns the SSID of the connected wifi network or None if not connected or in AP mode """ - return "UNKN" + return "UNKN SSID" def set_host_name(self, hostname): if hostname == self.get_host_name(): diff --git a/python/PiFinder/ui/menu_structure.py b/python/PiFinder/ui/menu_structure.py index ccd0b75b5..6d3c51173 100644 --- a/python/PiFinder/ui/menu_structure.py +++ b/python/PiFinder/ui/menu_structure.py @@ -12,6 +12,7 @@ from PiFinder.ui.preview import UIPreview from PiFinder.ui.equipment import UIEquipment from PiFinder.ui.location_list import UILocationList +from PiFinder.ui.wifi_password import UIWiFiPassword import PiFinder.ui.callbacks as callbacks @@ -52,6 +53,7 @@ def _(key: str) -> Any: "name": _("GPS Status"), "class": UIGPSStatus, }, + {"name": _("Connect WiFi"), "class": UIWiFiPassword}, ], }, { @@ -837,6 +839,7 @@ def _(key: str) -> Any: { "name": _("WiFi Mode"), "class": UITextMenu, + "label": "wifi_mode", "select": "single", "value_callback": callbacks.get_wifi_mode, "items": [ diff --git a/python/PiFinder/ui/wifi_password.py b/python/PiFinder/ui/wifi_password.py new file mode 100644 index 000000000..a2a6732dd --- /dev/null +++ b/python/PiFinder/ui/wifi_password.py @@ -0,0 +1,307 @@ +import logging +import qrcode +import math +from typing import Any, TYPE_CHECKING + +from PiFinder import state_utils +from PiFinder.ui.base import UIModule +from PiFinder.utils import get_sys_utils +from PiFinder.ui.marking_menus import MarkingMenuOption, MarkingMenu +# from PiFinder.sys_utils import Network + +if TYPE_CHECKING: + + def _(a) -> Any: + return a + + +logger = logging.getLogger("WiFiPassword") + +# Constants for Display Modes +DM_QR = 0 # Display QR code for scanning with smartphone or tablet. +DM_PLAIN_PWD = 1 # Display plain password +DM_CLIENT = 2 +DM_LAST = DM_PLAIN_PWD + + +class UIWiFiPassword(UIModule): + """ + UI for displaying the Access Point name and password. + """ + + __help_name__ = "wifi_connect" + __title__ = "WIFI" + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + + self.network = get_sys_utils().Network() + self._update_info() + + self.qr_image = None + + if self.ap_mode == "Client": + self.wifi_display_mode = DM_CLIENT + self.marking_menu = MarkingMenu( + left=MarkingMenuOption(), + right=MarkingMenuOption(), + down=MarkingMenuOption( + label=_("mode"), menu_jump="wifi_mode" + ), # TRANSLATORS: Jump to WiFi mode selection from context menu + ) + else: + # Default to QR code display + self.wifi_display_mode = DM_QR + # self.wifi_display_mode = DM_PLAIN_PWD + + self.marking_menu = MarkingMenu( + left=MarkingMenuOption( + label=_("QR"), + callback=self.mm_display_qr, + enabled=True, # TRANSLATORS: Switch to QR code WiFi display in context menu + ), + right=MarkingMenuOption( + label=_("Passwd"), + callback=self.mm_display_pwd, + enabled=True, # TRANSLATORS: Switch to WiFi plain password display in context menu + ), + down=MarkingMenuOption(label="mode", menu_jump="wifi_mode"), + ) + + def mm_display_qr(self, marking_menu, menu_item): + """ + Marking menu option to display the QR code + """ + self.wifi_display_mode = DM_QR + self._update_info() + self.update() + # logger.debug(f"Marking menu: {self.marking_menu}") + return True + + def mm_display_pwd(self, marking_menu, menu_item): + """ + Marking menu option to display the plain password + """ + self.wifi_display_mode = DM_PLAIN_PWD + self._update_info() + self.update() + # logger.debug(f"Marking menu: {self.marking_menu}") + return True + + def _update_info(self): + self.ap_mode = self.network.wifi_mode() + self.ap_name = self.network.get_ap_name() + self.ap_open = self.network.is_ap_open() + self.ap_pwd = self.network.get_ap_pwd() + self.connected_ssid = self.network.get_connected_ssid() + if self.ap_mode == "Client": + self.wifi_qr = None + else: + if self.ap_open: + self.wifi_qr = self._generate_wifi_qrcode(self.ap_name, "0", "nopass") + else: + self.wifi_qr = self._generate_wifi_qrcode( + self.ap_name, self.ap_pwd, "WPA" + ) + self.wifi_qr_scaled = False + + def cycle_display_mode(self): + """ + Cycle through available display modes + for a module. Invoked when the square + key is pressed + """ + if self.ap_mode == "Client": + # Do not cycle in client mode + return + + self.wifi_display_mode = ( + self.wifi_display_mode + 1 if self.wifi_display_mode < DM_LAST else 0 + ) + self._update_info() + self.update() + + def _generate_wifi_qrcode( + self, ssid: str, password: str, security_type: str + ) -> qrcode.image.base.BaseImage: + wifi_data = f"WIFI:S:{ssid};T:{security_type};P:{password};H:false;" + # logger.debug(f"WIFI Data: '{wifi_data}'") # Do NOT log password + + qr = qrcode.QRCode( + version=1, # 21x21 matrix + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, # Size of a box of the QR code (scaling it down later gives better results) + border=1, + ) + qr.add_data(wifi_data) + qr.make(fit=True) + + qr_code_image = qr.make_image( + # fill_color="red", back_color="black" + fill_color="red", + back_color="black", + ) + # logger.warning(f"Generating WiFi QR Code: {qr_code_image.size[0]}, {qr_code_image.size[1]}") + # qr_code_image.save("WiFi_QR_code.png", "PNG") + + return qr_code_image + + def update(self, force=False): + state_utils.sleep_for_framerate(self.shared_state) + self.clear_screen() + draw_pos = self.display_class.titlebar_height + 2 + + if self.wifi_display_mode == DM_PLAIN_PWD: + self._display_plain_pwd(draw_pos) + elif self.wifi_display_mode == DM_QR: + self._display_wifi_qr(draw_pos) + elif self.wifi_display_mode == DM_CLIENT: + self._display_client_ssid(draw_pos) + + return self.screen_update() + + def _display_client_ssid(self, draw_pos: int) -> int: + self.draw.text( + (0, draw_pos), + _("Client mode!"), + font=self.fonts.base.font, + fill=self.colors.get(255), + ) + draw_pos += 20 + self.draw.text( + (0, draw_pos), + _("Connected to:"), + font=self.fonts.base.font, + fill=self.colors.get(255), + ) + draw_pos += 10 + self.draw.text( + (0, draw_pos), + self.connected_ssid, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + draw_pos += 16 + return draw_pos + + def _display_wifi_qr(self, draw_pos: int) -> int: + draw_pos = self.display_class.titlebar_height + 2 + if self.ap_mode == "Client": + # Mode + self.draw.text( + (0, draw_pos), + _("Client mode!"), + font=self.fonts.base.font, + fill=self.colors.get(255), + ) + draw_pos += 16 + return draw_pos + + draw_pos = self._show_ssid(draw_pos, True) + + if not self.wifi_qr_scaled: + (width, height) = self.wifi_qr.size + (target_width, target_height) = self.screen.size + target_height -= draw_pos + scale = min(target_width / width, target_height / height) + self.wifi_qr = self.wifi_qr.resize( + (math.floor(width * scale), math.floor(height * scale)), 1 + ) # Do antialiasing using LANCZOS (Can't find the constant) + self.wifi_qr_scaled = True + # logger.warning(f"WiFi QR Code scaled size: {math.floor(width*scale)}^²") + # self.wifi_qr.save("WiFi_QR_Code_scaled.png", "PNG") + + self.screen.paste(self.wifi_qr, (0, draw_pos)) + return draw_pos + + def _display_plain_pwd(self, draw_pos: int) -> None: + if self.ap_mode == "Client": + # Mode + self.draw.text( + (0, draw_pos), + _("Note: {wifi_mode} mode!").format(wifi_mode=self.ap_mode), + font=self.fonts.base.font, + fill=self.colors.get(255), + ) + draw_pos += 16 + elif self.ap_mode == "AP" or self.ap_mode == "UNKN": + pass + else: + raise Exception(f"unexpected wifi mode: {self.ap_mode}") + + draw_pos = self._show_ssid(draw_pos) + # Password + self.draw.text( + (0, draw_pos), + _("Password:"), + font=self.fonts.base.font, + fill=self.colors.get(128), + ) + draw_pos += 16 + dx = 8 # size of character + dy = 16 # line height + brk = 16 # max number of characters in line + x = 0 # draw position + i = 0 # character count in line + for ch in self.ap_pwd: + if ch.isdigit(): + self.draw.text( + (x, draw_pos), + ch, + font=self.fonts.bold.font, + fill=self.colors.get(128), + ) + elif ch.islower(): + self.draw.text( + (x, draw_pos), + ch, + font=self.fonts.bold.font, + fill=self.colors.get(225), + ) + elif ch.isupper(): + self.draw.text( + (x, draw_pos), + ch, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + else: + self.draw.text( + (x, draw_pos), + ch, + font=self.fonts.bold.font, + fill=self.colors.get(100), + ) + + x += dx + i += 1 + if i >= brk: + i = 0 + x = 0 + draw_pos += dy + + def _show_ssid(self, draw_pos, truncate=False): + self.draw.text( + (0, draw_pos), + _("SSID:"), + font=self.fonts.base.font, + fill=self.colors.get(128), + ) + + # logger.debug(f"_show_ssid: {draw_pos}, {truncate}") + x_pos = 30 + + # If SSID is too long, display on separate line. + if not truncate: + if len(self.ap_name) > 14: + draw_pos += 10 + x_pos = 0 + + self.draw.text( + (x_pos, draw_pos), + self.ap_name, + font=self.fonts.bold.font, + fill=self.colors.get(255), + ) + draw_pos += 16 + return draw_pos diff --git a/python/locale/de/LC_MESSAGES/messages.mo b/python/locale/de/LC_MESSAGES/messages.mo index 20202bfff..5587ab5a7 100644 Binary files a/python/locale/de/LC_MESSAGES/messages.mo and b/python/locale/de/LC_MESSAGES/messages.mo differ diff --git a/python/locale/de/LC_MESSAGES/messages.po b/python/locale/de/LC_MESSAGES/messages.po index 468e642a0..9b00aa3b2 100644 --- a/python/locale/de/LC_MESSAGES/messages.po +++ b/python/locale/de/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-05-04 15:37+0200\n" +"POT-Creation-Date: 2025-05-05 08:21+0200\n" "PO-Revision-Date: 2025-01-12 18:13+0100\n" "Last-Translator: Jens Scheidtmann\n" "Language: de_DE\n" @@ -22,27 +22,27 @@ msgstr "" msgid "No Image" msgstr "Kein Bild" -#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:362 +#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:367 msgid "Galaxy" msgstr "Galaxie" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:366 +#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:371 msgid "Open Cluster" msgstr "Offene Haufen" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:374 +#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:379 msgid "Globular" msgstr "Kugelhaufen" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:378 +#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:383 msgid "Nebula" msgstr "Nebel" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:386 +#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:391 msgid "Dark Nebula" msgstr "Dunkelnebel" @@ -57,12 +57,12 @@ msgid "Cluster + Neb" msgstr "Off. Haufen/Nebel" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:406 +#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:411 msgid "Asterism" msgstr "Asterismen" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:402 +#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:407 msgid "Knot" msgstr "Knoten" @@ -77,7 +77,7 @@ msgid "Double star" msgstr "Dp. Stern" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:390 +#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:395 msgid "Star" msgstr "Stern" @@ -87,12 +87,12 @@ msgid "Unkn" msgstr "Unbkt" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:410 +#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:415 msgid "Planet" msgstr "Planet" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:414 +#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:419 msgid "Comet" msgstr "Komet" @@ -113,11 +113,11 @@ msgstr "keine Anz." msgid "No Solve Yet" msgstr "kein Platesolve" -#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:461 +#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:462 msgid "Aligning..." msgstr "Justage..." -#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:469 +#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:470 msgid "Aligned!" msgstr "Justiert!" @@ -129,7 +129,7 @@ msgstr "Justage abgebrochen" msgid "Filters Reset" msgstr "Filterreset" -#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:949 +#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:980 msgid "Test Mode" msgstr "Test Modus" @@ -158,7 +158,7 @@ msgstr "WLAN Client" msgid "Time: {time}" msgstr "Zeit: {time}" -#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:526 +#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:531 msgid "Settings" msgstr "Einstellungen" @@ -266,8 +266,8 @@ msgstr "schnellen GPS Fix" msgid "Lock Type:" msgstr "Fix-Typ:" -#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:426 -#: PiFinder/ui/menu_structure.py:458 +#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:431 +#: PiFinder/ui/menu_structure.py:463 msgid "None" msgstr "Nix" @@ -382,481 +382,485 @@ msgstr "Okular" msgid "Telescope" msgstr "Teleskop" -#: PiFinder/ui/menu_structure.py:23 +#: PiFinder/ui/menu_structure.py:24 msgid "Language: de" msgstr "Sprache: Deutsch" -#: PiFinder/ui/menu_structure.py:24 +#: PiFinder/ui/menu_structure.py:25 msgid "Language: en" msgstr "Sprache: Englisch" -#: PiFinder/ui/menu_structure.py:25 +#: PiFinder/ui/menu_structure.py:26 msgid "Language: es" msgstr "Sprache: Spanisch" -#: PiFinder/ui/menu_structure.py:26 +#: PiFinder/ui/menu_structure.py:27 msgid "Language: fr" msgstr "Sprache: Französisch" -#: PiFinder/ui/menu_structure.py:37 +#: PiFinder/ui/menu_structure.py:38 msgid "Start" msgstr "Start" -#: PiFinder/ui/menu_structure.py:42 +#: PiFinder/ui/menu_structure.py:43 msgid "Focus" msgstr "Fokus" -#: PiFinder/ui/menu_structure.py:46 +#: PiFinder/ui/menu_structure.py:47 msgid "Align" msgstr "Justieren" -#: PiFinder/ui/menu_structure.py:52 PiFinder/ui/menu_structure.py:932 +#: PiFinder/ui/menu_structure.py:53 PiFinder/ui/menu_structure.py:963 msgid "GPS Status" msgstr "GPS Status" -#: PiFinder/ui/menu_structure.py:58 +#: PiFinder/ui/menu_structure.py:57 +msgid "Connect WiFi" +msgstr "Verbinde WLAN" + +#: PiFinder/ui/menu_structure.py:63 msgid "Chart" msgstr "Karte" -#: PiFinder/ui/menu_structure.py:64 +#: PiFinder/ui/menu_structure.py:69 msgid "Objects" msgstr "Objekte" -#: PiFinder/ui/menu_structure.py:69 +#: PiFinder/ui/menu_structure.py:74 msgid "All Filtered" msgstr "Gefilt. Obj" -#: PiFinder/ui/menu_structure.py:74 +#: PiFinder/ui/menu_structure.py:79 msgid "By Catalog" msgstr "nach Katalog" -#: PiFinder/ui/menu_structure.py:79 PiFinder/ui/menu_structure.py:254 +#: PiFinder/ui/menu_structure.py:84 PiFinder/ui/menu_structure.py:259 msgid "Planets" msgstr "Planeten" -#: PiFinder/ui/menu_structure.py:85 PiFinder/ui/menu_structure.py:156 -#: PiFinder/ui/menu_structure.py:258 PiFinder/ui/menu_structure.py:308 +#: PiFinder/ui/menu_structure.py:90 PiFinder/ui/menu_structure.py:161 +#: PiFinder/ui/menu_structure.py:263 PiFinder/ui/menu_structure.py:313 msgid "NGC" msgstr "NGC" -#: PiFinder/ui/menu_structure.py:91 PiFinder/ui/menu_structure.py:150 -#: PiFinder/ui/menu_structure.py:262 PiFinder/ui/menu_structure.py:304 +#: PiFinder/ui/menu_structure.py:96 PiFinder/ui/menu_structure.py:155 +#: PiFinder/ui/menu_structure.py:267 PiFinder/ui/menu_structure.py:309 msgid "Messier" msgstr "Messier" -#: PiFinder/ui/menu_structure.py:97 PiFinder/ui/menu_structure.py:266 +#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:271 msgid "DSO..." msgstr "DSO..." -#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:272 +#: PiFinder/ui/menu_structure.py:107 PiFinder/ui/menu_structure.py:277 msgid "Abell Pn" msgstr "Abell PN" -#: PiFinder/ui/menu_structure.py:108 PiFinder/ui/menu_structure.py:276 +#: PiFinder/ui/menu_structure.py:113 PiFinder/ui/menu_structure.py:281 msgid "Arp Galaxies" msgstr "Arp Galaxien" -#: PiFinder/ui/menu_structure.py:114 PiFinder/ui/menu_structure.py:280 +#: PiFinder/ui/menu_structure.py:119 PiFinder/ui/menu_structure.py:285 msgid "Barnard" msgstr "Barnard" -#: PiFinder/ui/menu_structure.py:120 PiFinder/ui/menu_structure.py:284 +#: PiFinder/ui/menu_structure.py:125 PiFinder/ui/menu_structure.py:289 msgid "Caldwell" msgstr "Caldwell" -#: PiFinder/ui/menu_structure.py:126 PiFinder/ui/menu_structure.py:288 +#: PiFinder/ui/menu_structure.py:131 PiFinder/ui/menu_structure.py:293 msgid "Collinder" msgstr "Collinger" -#: PiFinder/ui/menu_structure.py:132 PiFinder/ui/menu_structure.py:292 +#: PiFinder/ui/menu_structure.py:137 PiFinder/ui/menu_structure.py:297 msgid "E.G. Globs" msgstr "E.G. Globs" -#: PiFinder/ui/menu_structure.py:138 PiFinder/ui/menu_structure.py:296 +#: PiFinder/ui/menu_structure.py:143 PiFinder/ui/menu_structure.py:301 msgid "Herschel 400" msgstr "Herschel 400" -#: PiFinder/ui/menu_structure.py:144 PiFinder/ui/menu_structure.py:300 +#: PiFinder/ui/menu_structure.py:149 PiFinder/ui/menu_structure.py:305 msgid "IC" msgstr "IC" -#: PiFinder/ui/menu_structure.py:162 PiFinder/ui/menu_structure.py:312 +#: PiFinder/ui/menu_structure.py:167 PiFinder/ui/menu_structure.py:317 msgid "Sharpless" msgstr "Sharpless" -#: PiFinder/ui/menu_structure.py:168 PiFinder/ui/menu_structure.py:316 +#: PiFinder/ui/menu_structure.py:173 PiFinder/ui/menu_structure.py:321 msgid "TAAS 200" msgstr "TAAS 200" -#: PiFinder/ui/menu_structure.py:176 PiFinder/ui/menu_structure.py:322 +#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:327 msgid "Stars..." msgstr "Sterne..." -#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:328 +#: PiFinder/ui/menu_structure.py:186 PiFinder/ui/menu_structure.py:333 msgid "Bright Named" msgstr "Bright-Star" -#: PiFinder/ui/menu_structure.py:187 PiFinder/ui/menu_structure.py:332 +#: PiFinder/ui/menu_structure.py:192 PiFinder/ui/menu_structure.py:337 msgid "SAC Doubles" msgstr "SAC Doppel" -#: PiFinder/ui/menu_structure.py:193 PiFinder/ui/menu_structure.py:336 +#: PiFinder/ui/menu_structure.py:198 PiFinder/ui/menu_structure.py:341 msgid "SAC Asterisms" msgstr "SAC Asterismen" -#: PiFinder/ui/menu_structure.py:199 PiFinder/ui/menu_structure.py:340 +#: PiFinder/ui/menu_structure.py:204 PiFinder/ui/menu_structure.py:345 msgid "SAC Red Stars" msgstr "SAC Rote Riesen" -#: PiFinder/ui/menu_structure.py:205 PiFinder/ui/menu_structure.py:344 +#: PiFinder/ui/menu_structure.py:210 PiFinder/ui/menu_structure.py:349 msgid "RASC Doubles" msgstr "RASC Doppel" -#: PiFinder/ui/menu_structure.py:211 PiFinder/ui/menu_structure.py:348 +#: PiFinder/ui/menu_structure.py:216 PiFinder/ui/menu_structure.py:353 msgid "TLK 90 Variables" msgstr "TLK 90 Variable" -#: PiFinder/ui/menu_structure.py:221 +#: PiFinder/ui/menu_structure.py:226 msgid "Recent" msgstr "Letzte..." -#: PiFinder/ui/menu_structure.py:227 +#: PiFinder/ui/menu_structure.py:232 msgid "Name Search" msgstr "Namenssuche" -#: PiFinder/ui/menu_structure.py:233 PiFinder/ui/object_list.py:136 +#: PiFinder/ui/menu_structure.py:238 PiFinder/ui/object_list.py:136 msgid "Filter" msgstr "Filter" -#: PiFinder/ui/menu_structure.py:239 +#: PiFinder/ui/menu_structure.py:244 msgid "Reset All" msgstr "Zurücksetzen" -#: PiFinder/ui/menu_structure.py:243 PiFinder/ui/menu_structure.py:973 +#: PiFinder/ui/menu_structure.py:248 PiFinder/ui/menu_structure.py:1004 msgid "Confirm" msgstr "Bestätigen" -#: PiFinder/ui/menu_structure.py:244 PiFinder/ui/menu_structure.py:976 +#: PiFinder/ui/menu_structure.py:249 PiFinder/ui/menu_structure.py:1007 #: PiFinder/ui/software.py:204 msgid "Cancel" msgstr "Abbrechen" -#: PiFinder/ui/menu_structure.py:248 +#: PiFinder/ui/menu_structure.py:253 msgid "Catalogs" msgstr "Kataloge" -#: PiFinder/ui/menu_structure.py:356 +#: PiFinder/ui/menu_structure.py:361 msgid "Type" msgstr "Typ" -#: PiFinder/ui/menu_structure.py:370 +#: PiFinder/ui/menu_structure.py:375 msgid "Cluster/Neb" msgstr "Off. Haufen/Nebel" -#: PiFinder/ui/menu_structure.py:382 +#: PiFinder/ui/menu_structure.py:387 msgid "P. Nebula" msgstr "Plan. Nebel" -#: PiFinder/ui/menu_structure.py:394 +#: PiFinder/ui/menu_structure.py:399 msgid "Double Str" msgstr "Dp. Stern" -#: PiFinder/ui/menu_structure.py:398 +#: PiFinder/ui/menu_structure.py:403 msgid "Triple Str" msgstr "Dreif. Strn" -#: PiFinder/ui/menu_structure.py:420 +#: PiFinder/ui/menu_structure.py:425 msgid "Altitude" msgstr "Höhe" -#: PiFinder/ui/menu_structure.py:452 +#: PiFinder/ui/menu_structure.py:457 msgid "Magnitude" msgstr "Magnitude" -#: PiFinder/ui/menu_structure.py:504 PiFinder/ui/menu_structure.py:514 +#: PiFinder/ui/menu_structure.py:509 PiFinder/ui/menu_structure.py:519 msgid "Observed" msgstr "beobachtet" -#: PiFinder/ui/menu_structure.py:510 +#: PiFinder/ui/menu_structure.py:515 msgid "Any" msgstr "Alle" -#: PiFinder/ui/menu_structure.py:518 +#: PiFinder/ui/menu_structure.py:523 msgid "Not Observed" msgstr "nicht beobachtet" -#: PiFinder/ui/menu_structure.py:531 +#: PiFinder/ui/menu_structure.py:536 msgid "User Pref..." msgstr "Nutzer..." -#: PiFinder/ui/menu_structure.py:536 +#: PiFinder/ui/menu_structure.py:541 msgid "Key Bright" msgstr "Tasten Helligkeit" -#: PiFinder/ui/menu_structure.py:576 +#: PiFinder/ui/menu_structure.py:581 msgid "Sleep Time" msgstr "Ruhezustand" -#: PiFinder/ui/menu_structure.py:582 PiFinder/ui/menu_structure.py:614 -#: PiFinder/ui/menu_structure.py:638 PiFinder/ui/menu_structure.py:687 -#: PiFinder/ui/menu_structure.py:711 PiFinder/ui/menu_structure.py:735 -#: PiFinder/ui/menu_structure.py:759 PiFinder/ui/preview.py:62 +#: PiFinder/ui/menu_structure.py:587 PiFinder/ui/menu_structure.py:619 +#: PiFinder/ui/menu_structure.py:643 PiFinder/ui/menu_structure.py:717 +#: PiFinder/ui/menu_structure.py:741 PiFinder/ui/menu_structure.py:765 +#: PiFinder/ui/menu_structure.py:789 PiFinder/ui/preview.py:62 #: PiFinder/ui/preview.py:79 msgid "Off" msgstr "Aus" -#: PiFinder/ui/menu_structure.py:608 +#: PiFinder/ui/menu_structure.py:613 msgid "Menu Anim" msgstr "Menu Animation" -#: PiFinder/ui/menu_structure.py:618 PiFinder/ui/menu_structure.py:642 +#: PiFinder/ui/menu_structure.py:623 PiFinder/ui/menu_structure.py:647 msgid "Fast" msgstr "Schnell" -#: PiFinder/ui/menu_structure.py:622 PiFinder/ui/menu_structure.py:646 -#: PiFinder/ui/menu_structure.py:695 PiFinder/ui/menu_structure.py:719 -#: PiFinder/ui/menu_structure.py:743 PiFinder/ui/preview.py:67 +#: PiFinder/ui/menu_structure.py:627 PiFinder/ui/menu_structure.py:651 +#: PiFinder/ui/menu_structure.py:725 PiFinder/ui/menu_structure.py:749 +#: PiFinder/ui/menu_structure.py:773 PiFinder/ui/preview.py:67 msgid "Medium" msgstr "Mittel" -#: PiFinder/ui/menu_structure.py:626 PiFinder/ui/menu_structure.py:650 +#: PiFinder/ui/menu_structure.py:631 PiFinder/ui/menu_structure.py:655 msgid "Slow" msgstr "Langsam" -#: PiFinder/ui/menu_structure.py:632 +#: PiFinder/ui/menu_structure.py:637 msgid "Scroll Speed" msgstr "Scrollgeschwindigkeit" -#: PiFinder/ui/menu_structure.py:656 +#: PiFinder/ui/menu_structure.py:661 msgid "Az Arrows" msgstr "Az Pfeile" -#: PiFinder/ui/menu_structure.py:663 +#: PiFinder/ui/menu_structure.py:668 msgid "Default" msgstr "Standard" -#: PiFinder/ui/menu_structure.py:667 +#: PiFinder/ui/menu_structure.py:672 msgid "Reverse" msgstr "Umgekehrt" -#: PiFinder/ui/menu_structure.py:675 +#: PiFinder/ui/menu_structure.py:678 +msgid "Language" +msgstr "Sprache" + +#: PiFinder/ui/menu_structure.py:685 +msgid "English" +msgstr "Englisch" + +#: PiFinder/ui/menu_structure.py:689 +msgid "German" +msgstr "Deutsch" + +#: PiFinder/ui/menu_structure.py:693 +msgid "French" +msgstr "Französisch" + +#: PiFinder/ui/menu_structure.py:697 +msgid "Spanish" +msgstr "Spanisch" + +#: PiFinder/ui/menu_structure.py:705 msgid "Chart..." msgstr "Karte..." -#: PiFinder/ui/menu_structure.py:681 +#: PiFinder/ui/menu_structure.py:711 msgid "Reticle" msgstr "Fadenkreuz" -#: PiFinder/ui/menu_structure.py:691 PiFinder/ui/menu_structure.py:715 -#: PiFinder/ui/menu_structure.py:739 PiFinder/ui/preview.py:72 +#: PiFinder/ui/menu_structure.py:721 PiFinder/ui/menu_structure.py:745 +#: PiFinder/ui/menu_structure.py:769 PiFinder/ui/preview.py:72 msgid "Low" msgstr "Niedrig" -#: PiFinder/ui/menu_structure.py:699 PiFinder/ui/menu_structure.py:723 -#: PiFinder/ui/menu_structure.py:747 PiFinder/ui/preview.py:64 +#: PiFinder/ui/menu_structure.py:729 PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:777 PiFinder/ui/preview.py:64 msgid "High" msgstr "Hoch" -#: PiFinder/ui/menu_structure.py:705 +#: PiFinder/ui/menu_structure.py:735 msgid "Constellation" msgstr "Sternbilder" -#: PiFinder/ui/menu_structure.py:729 +#: PiFinder/ui/menu_structure.py:759 msgid "DSO Display" msgstr "DSO Anzeige" -#: PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:783 msgid "RA/DEC Disp." msgstr "RA/DEC Anzeige" -#: PiFinder/ui/menu_structure.py:763 +#: PiFinder/ui/menu_structure.py:793 msgid "HH:MM" msgstr "HH:MM" -#: PiFinder/ui/menu_structure.py:767 +#: PiFinder/ui/menu_structure.py:797 msgid "Degrees" msgstr "Grad" -#: PiFinder/ui/menu_structure.py:775 +#: PiFinder/ui/menu_structure.py:805 msgid "Camera Exp" msgstr "Belichtungsz." -#: PiFinder/ui/menu_structure.py:783 +#: PiFinder/ui/menu_structure.py:813 msgid "0.025s" msgstr "0,025s" -#: PiFinder/ui/menu_structure.py:787 +#: PiFinder/ui/menu_structure.py:817 msgid "0.05s" msgstr "0,05s" -#: PiFinder/ui/menu_structure.py:791 +#: PiFinder/ui/menu_structure.py:821 msgid "0.1s" msgstr "0,1s" -#: PiFinder/ui/menu_structure.py:795 +#: PiFinder/ui/menu_structure.py:825 msgid "0.2s" msgstr "0,2s" -#: PiFinder/ui/menu_structure.py:799 +#: PiFinder/ui/menu_structure.py:829 msgid "0.4s" msgstr "0.4s" -#: PiFinder/ui/menu_structure.py:803 +#: PiFinder/ui/menu_structure.py:833 msgid "0.8s" msgstr "0.8s" -#: PiFinder/ui/menu_structure.py:807 +#: PiFinder/ui/menu_structure.py:837 msgid "1s" msgstr "1s" -#: PiFinder/ui/menu_structure.py:813 +#: PiFinder/ui/menu_structure.py:843 msgid "WiFi Mode" msgstr "WLAN" -#: PiFinder/ui/menu_structure.py:819 +#: PiFinder/ui/menu_structure.py:850 msgid "Client Mode" msgstr "client mode sein" -#: PiFinder/ui/menu_structure.py:824 +#: PiFinder/ui/menu_structure.py:855 msgid "AP Mode" msgstr "Access Point" -#: PiFinder/ui/menu_structure.py:831 +#: PiFinder/ui/menu_structure.py:862 msgid "PiFinder Type" msgstr "PiFinder Art" -#: PiFinder/ui/menu_structure.py:838 +#: PiFinder/ui/menu_structure.py:869 msgid "Left" msgstr "Links" -#: PiFinder/ui/menu_structure.py:842 +#: PiFinder/ui/menu_structure.py:873 msgid "Right" msgstr "Rechts" -#: PiFinder/ui/menu_structure.py:846 +#: PiFinder/ui/menu_structure.py:877 msgid "Straight" msgstr "Gerade" -#: PiFinder/ui/menu_structure.py:850 +#: PiFinder/ui/menu_structure.py:881 msgid "Flat v3" msgstr "Flach v3" -#: PiFinder/ui/menu_structure.py:854 +#: PiFinder/ui/menu_structure.py:885 msgid "Flat v2" msgstr "Flach v2" -#: PiFinder/ui/menu_structure.py:860 +#: PiFinder/ui/menu_structure.py:891 msgid "Mount Type" msgstr "Montierungsart" -#: PiFinder/ui/menu_structure.py:867 +#: PiFinder/ui/menu_structure.py:898 msgid "Alt/Az" msgstr "Azimutal" -#: PiFinder/ui/menu_structure.py:871 +#: PiFinder/ui/menu_structure.py:902 msgid "Equitorial" msgstr "Parallaktisch" -#: PiFinder/ui/menu_structure.py:877 +#: PiFinder/ui/menu_structure.py:908 msgid "Camera Type" msgstr "Typ Kamera" -#: PiFinder/ui/menu_structure.py:883 +#: PiFinder/ui/menu_structure.py:914 msgid "v2 - imx477" msgstr "v2 - imx477" -#: PiFinder/ui/menu_structure.py:888 +#: PiFinder/ui/menu_structure.py:919 msgid "v3 - imx296" msgstr "v3 - imx296" -#: PiFinder/ui/menu_structure.py:893 +#: PiFinder/ui/menu_structure.py:924 msgid "v3 - imx462" msgstr "v3 - imx462" -#: PiFinder/ui/menu_structure.py:900 +#: PiFinder/ui/menu_structure.py:931 msgid "GPS Type" msgstr "GPS Typ" -#: PiFinder/ui/menu_structure.py:908 +#: PiFinder/ui/menu_structure.py:939 msgid "UBlox" msgstr "Ublox" -#: PiFinder/ui/menu_structure.py:912 +#: PiFinder/ui/menu_structure.py:943 msgid "GPSD (generic)" msgstr "GPSD (generisch)" -#: PiFinder/ui/menu_structure.py:920 +#: PiFinder/ui/menu_structure.py:951 msgid "Tools" msgstr "Werkzeuge" -#: PiFinder/ui/menu_structure.py:924 +#: PiFinder/ui/menu_structure.py:955 msgid "Status" msgstr "Status" -#: PiFinder/ui/menu_structure.py:925 +#: PiFinder/ui/menu_structure.py:956 msgid "Equipment" msgstr "Ausrüstung" -#: PiFinder/ui/menu_structure.py:927 +#: PiFinder/ui/menu_structure.py:958 msgid "Place & Time" msgstr "Ort & Zeit" -#: PiFinder/ui/menu_structure.py:936 +#: PiFinder/ui/menu_structure.py:967 msgid "Set Location" msgstr "Ort setzen" -#: PiFinder/ui/menu_structure.py:940 +#: PiFinder/ui/menu_structure.py:971 msgid "Set Time" msgstr "Zeit setzen" -#: PiFinder/ui/menu_structure.py:944 +#: PiFinder/ui/menu_structure.py:975 msgid "Reset" msgstr "Reset" -#: PiFinder/ui/menu_structure.py:947 +#: PiFinder/ui/menu_structure.py:978 msgid "Console" msgstr "Konsole" -#: PiFinder/ui/menu_structure.py:948 +#: PiFinder/ui/menu_structure.py:979 msgid "Software Upd" msgstr "Update Softw" -#: PiFinder/ui/menu_structure.py:951 +#: PiFinder/ui/menu_structure.py:982 msgid "Power" msgstr "Ein/Aus" -#: PiFinder/ui/menu_structure.py:957 +#: PiFinder/ui/menu_structure.py:988 msgid "Shutdown" msgstr "Ausschalten" -#: PiFinder/ui/menu_structure.py:967 +#: PiFinder/ui/menu_structure.py:998 msgid "Restart" msgstr "Neu starten" -#: PiFinder/ui/menu_structure.py:982 +#: PiFinder/ui/menu_structure.py:1013 msgid "Experimental" msgstr "Experimentell" -#: PiFinder/ui/menu_structure.py:987 -msgid "Language" -msgstr "Sprache" - -#: PiFinder/ui/menu_structure.py:994 -msgid "English" -msgstr "Englisch" - -#: PiFinder/ui/menu_structure.py:998 -msgid "German" -msgstr "Deutsch" - -#: PiFinder/ui/menu_structure.py:1002 -msgid "French" -msgstr "Französisch" - -#: PiFinder/ui/menu_structure.py:1006 -msgid "Spanish" -msgstr "Spanisch" - #: PiFinder/ui/object_details.py:61 PiFinder/ui/object_details.py:66 msgid "ALIGN" msgstr "JUSTAGE" @@ -878,39 +882,39 @@ msgstr "Gr:{obj_mag}" msgid "Sz:{size}" msgstr "D:{size}" -#: PiFinder/ui/object_details.py:207 +#: PiFinder/ui/object_details.py:208 msgid "  Not Logged" msgstr "  Nicht geloggt" -#: PiFinder/ui/object_details.py:209 +#: PiFinder/ui/object_details.py:210 msgid "  {logs} Logs" msgstr "  {logs} Logs" -#: PiFinder/ui/object_details.py:244 +#: PiFinder/ui/object_details.py:245 msgid "No solve" msgstr "Bisher keine" -#: PiFinder/ui/object_details.py:250 +#: PiFinder/ui/object_details.py:251 msgid "yet{elipsis}" msgstr "Lösung{elipsis}" -#: PiFinder/ui/object_details.py:264 +#: PiFinder/ui/object_details.py:265 msgid "Searching" msgstr "Suche" -#: PiFinder/ui/object_details.py:270 +#: PiFinder/ui/object_details.py:271 msgid "for GPS{elipsis}" msgstr "nach Satelliten{elipsis}" -#: PiFinder/ui/object_details.py:284 +#: PiFinder/ui/object_details.py:285 msgid "Calculating" msgstr "berechne..." -#: PiFinder/ui/object_details.py:471 +#: PiFinder/ui/object_details.py:472 msgid "Too Far" msgstr "zu weit" -#: PiFinder/ui/object_details.py:496 +#: PiFinder/ui/object_details.py:497 msgid "LOG" msgstr "Loggen" @@ -1091,6 +1095,35 @@ msgstr " Fertig" msgid "󰍴 Delete/Previous" msgstr "󰍴 Löschen/Zurück" -#~ msgid "HELP" -#~ msgstr "HILFE" +#: PiFinder/ui/wifi_password.py:41 +msgid "mode" +msgstr "Modus" + +#: PiFinder/ui/wifi_password.py:50 +msgid "QR" +msgstr "QR" + +#: PiFinder/ui/wifi_password.py:53 +msgid "Passwd" +msgstr "Passw." + +#: PiFinder/ui/wifi_password.py:153 PiFinder/ui/wifi_password.py:180 +msgid "Client mode!" +msgstr "Client-Modus!" + +#: PiFinder/ui/wifi_password.py:160 +msgid "Connected to:" +msgstr "Verbunden mit:" + +#: PiFinder/ui/wifi_password.py:209 +msgid "Note: {wifi_mode} mode!" +msgstr "WLAN Mode: {wifi_mode}" + +#: PiFinder/ui/wifi_password.py:223 +msgid "Password:" +msgstr "Passwort:" + +#: PiFinder/ui/wifi_password.py:273 +msgid "SSID:" +msgstr "SSID:" diff --git a/python/locale/es/LC_MESSAGES/messages.mo b/python/locale/es/LC_MESSAGES/messages.mo index 106fef2de..7e5d94c70 100644 Binary files a/python/locale/es/LC_MESSAGES/messages.mo and b/python/locale/es/LC_MESSAGES/messages.mo differ diff --git a/python/locale/es/LC_MESSAGES/messages.po b/python/locale/es/LC_MESSAGES/messages.po index 355debabe..f15eac01a 100644 --- a/python/locale/es/LC_MESSAGES/messages.po +++ b/python/locale/es/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-05-04 15:37+0200\n" +"POT-Creation-Date: 2025-05-05 08:21+0200\n" "PO-Revision-Date: 2025-01-22 17:58+0100\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -22,27 +22,27 @@ msgstr "" msgid "No Image" msgstr "" -#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:362 +#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:367 msgid "Galaxy" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:366 +#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:371 msgid "Open Cluster" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:374 +#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:379 msgid "Globular" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:378 +#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:383 msgid "Nebula" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:386 +#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:391 msgid "Dark Nebula" msgstr "" @@ -57,12 +57,12 @@ msgid "Cluster + Neb" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:406 +#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:411 msgid "Asterism" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:402 +#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:407 msgid "Knot" msgstr "" @@ -77,7 +77,7 @@ msgid "Double star" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:390 +#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:395 msgid "Star" msgstr "" @@ -87,12 +87,12 @@ msgid "Unkn" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:410 +#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:415 msgid "Planet" msgstr "" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:414 +#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:419 msgid "Comet" msgstr "" @@ -113,11 +113,11 @@ msgstr "" msgid "No Solve Yet" msgstr "" -#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:461 +#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:462 msgid "Aligning..." msgstr "" -#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:469 +#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:470 msgid "Aligned!" msgstr "" @@ -129,7 +129,7 @@ msgstr "" msgid "Filters Reset" msgstr "" -#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:949 +#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:980 msgid "Test Mode" msgstr "" @@ -158,7 +158,7 @@ msgstr "" msgid "Time: {time}" msgstr "" -#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:526 +#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:531 msgid "Settings" msgstr "" @@ -266,8 +266,8 @@ msgstr "" msgid "Lock Type:" msgstr "" -#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:426 -#: PiFinder/ui/menu_structure.py:458 +#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:431 +#: PiFinder/ui/menu_structure.py:463 msgid "None" msgstr "" @@ -382,481 +382,485 @@ msgstr "" msgid "Telescope" msgstr "" -#: PiFinder/ui/menu_structure.py:23 +#: PiFinder/ui/menu_structure.py:24 msgid "Language: de" msgstr "" -#: PiFinder/ui/menu_structure.py:24 +#: PiFinder/ui/menu_structure.py:25 msgid "Language: en" msgstr "" -#: PiFinder/ui/menu_structure.py:25 +#: PiFinder/ui/menu_structure.py:26 msgid "Language: es" msgstr "" -#: PiFinder/ui/menu_structure.py:26 +#: PiFinder/ui/menu_structure.py:27 msgid "Language: fr" msgstr "" -#: PiFinder/ui/menu_structure.py:37 +#: PiFinder/ui/menu_structure.py:38 msgid "Start" msgstr "" -#: PiFinder/ui/menu_structure.py:42 +#: PiFinder/ui/menu_structure.py:43 msgid "Focus" msgstr "" -#: PiFinder/ui/menu_structure.py:46 +#: PiFinder/ui/menu_structure.py:47 msgid "Align" msgstr "" -#: PiFinder/ui/menu_structure.py:52 PiFinder/ui/menu_structure.py:932 +#: PiFinder/ui/menu_structure.py:53 PiFinder/ui/menu_structure.py:963 msgid "GPS Status" msgstr "" -#: PiFinder/ui/menu_structure.py:58 +#: PiFinder/ui/menu_structure.py:57 +msgid "Connect WiFi" +msgstr "" + +#: PiFinder/ui/menu_structure.py:63 msgid "Chart" msgstr "" -#: PiFinder/ui/menu_structure.py:64 +#: PiFinder/ui/menu_structure.py:69 msgid "Objects" msgstr "" -#: PiFinder/ui/menu_structure.py:69 +#: PiFinder/ui/menu_structure.py:74 msgid "All Filtered" msgstr "" -#: PiFinder/ui/menu_structure.py:74 +#: PiFinder/ui/menu_structure.py:79 msgid "By Catalog" msgstr "" -#: PiFinder/ui/menu_structure.py:79 PiFinder/ui/menu_structure.py:254 +#: PiFinder/ui/menu_structure.py:84 PiFinder/ui/menu_structure.py:259 msgid "Planets" msgstr "" -#: PiFinder/ui/menu_structure.py:85 PiFinder/ui/menu_structure.py:156 -#: PiFinder/ui/menu_structure.py:258 PiFinder/ui/menu_structure.py:308 +#: PiFinder/ui/menu_structure.py:90 PiFinder/ui/menu_structure.py:161 +#: PiFinder/ui/menu_structure.py:263 PiFinder/ui/menu_structure.py:313 msgid "NGC" msgstr "" -#: PiFinder/ui/menu_structure.py:91 PiFinder/ui/menu_structure.py:150 -#: PiFinder/ui/menu_structure.py:262 PiFinder/ui/menu_structure.py:304 +#: PiFinder/ui/menu_structure.py:96 PiFinder/ui/menu_structure.py:155 +#: PiFinder/ui/menu_structure.py:267 PiFinder/ui/menu_structure.py:309 msgid "Messier" msgstr "" -#: PiFinder/ui/menu_structure.py:97 PiFinder/ui/menu_structure.py:266 +#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:271 msgid "DSO..." msgstr "" -#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:272 +#: PiFinder/ui/menu_structure.py:107 PiFinder/ui/menu_structure.py:277 msgid "Abell Pn" msgstr "" -#: PiFinder/ui/menu_structure.py:108 PiFinder/ui/menu_structure.py:276 +#: PiFinder/ui/menu_structure.py:113 PiFinder/ui/menu_structure.py:281 msgid "Arp Galaxies" msgstr "" -#: PiFinder/ui/menu_structure.py:114 PiFinder/ui/menu_structure.py:280 +#: PiFinder/ui/menu_structure.py:119 PiFinder/ui/menu_structure.py:285 msgid "Barnard" msgstr "" -#: PiFinder/ui/menu_structure.py:120 PiFinder/ui/menu_structure.py:284 +#: PiFinder/ui/menu_structure.py:125 PiFinder/ui/menu_structure.py:289 msgid "Caldwell" msgstr "" -#: PiFinder/ui/menu_structure.py:126 PiFinder/ui/menu_structure.py:288 +#: PiFinder/ui/menu_structure.py:131 PiFinder/ui/menu_structure.py:293 msgid "Collinder" msgstr "" -#: PiFinder/ui/menu_structure.py:132 PiFinder/ui/menu_structure.py:292 +#: PiFinder/ui/menu_structure.py:137 PiFinder/ui/menu_structure.py:297 msgid "E.G. Globs" msgstr "" -#: PiFinder/ui/menu_structure.py:138 PiFinder/ui/menu_structure.py:296 +#: PiFinder/ui/menu_structure.py:143 PiFinder/ui/menu_structure.py:301 msgid "Herschel 400" msgstr "" -#: PiFinder/ui/menu_structure.py:144 PiFinder/ui/menu_structure.py:300 +#: PiFinder/ui/menu_structure.py:149 PiFinder/ui/menu_structure.py:305 msgid "IC" msgstr "" -#: PiFinder/ui/menu_structure.py:162 PiFinder/ui/menu_structure.py:312 +#: PiFinder/ui/menu_structure.py:167 PiFinder/ui/menu_structure.py:317 msgid "Sharpless" msgstr "" -#: PiFinder/ui/menu_structure.py:168 PiFinder/ui/menu_structure.py:316 +#: PiFinder/ui/menu_structure.py:173 PiFinder/ui/menu_structure.py:321 msgid "TAAS 200" msgstr "" -#: PiFinder/ui/menu_structure.py:176 PiFinder/ui/menu_structure.py:322 +#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:327 msgid "Stars..." msgstr "" -#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:328 +#: PiFinder/ui/menu_structure.py:186 PiFinder/ui/menu_structure.py:333 msgid "Bright Named" msgstr "" -#: PiFinder/ui/menu_structure.py:187 PiFinder/ui/menu_structure.py:332 +#: PiFinder/ui/menu_structure.py:192 PiFinder/ui/menu_structure.py:337 msgid "SAC Doubles" msgstr "" -#: PiFinder/ui/menu_structure.py:193 PiFinder/ui/menu_structure.py:336 +#: PiFinder/ui/menu_structure.py:198 PiFinder/ui/menu_structure.py:341 msgid "SAC Asterisms" msgstr "" -#: PiFinder/ui/menu_structure.py:199 PiFinder/ui/menu_structure.py:340 +#: PiFinder/ui/menu_structure.py:204 PiFinder/ui/menu_structure.py:345 msgid "SAC Red Stars" msgstr "" -#: PiFinder/ui/menu_structure.py:205 PiFinder/ui/menu_structure.py:344 +#: PiFinder/ui/menu_structure.py:210 PiFinder/ui/menu_structure.py:349 msgid "RASC Doubles" msgstr "" -#: PiFinder/ui/menu_structure.py:211 PiFinder/ui/menu_structure.py:348 +#: PiFinder/ui/menu_structure.py:216 PiFinder/ui/menu_structure.py:353 msgid "TLK 90 Variables" msgstr "" -#: PiFinder/ui/menu_structure.py:221 +#: PiFinder/ui/menu_structure.py:226 msgid "Recent" msgstr "" -#: PiFinder/ui/menu_structure.py:227 +#: PiFinder/ui/menu_structure.py:232 msgid "Name Search" msgstr "" -#: PiFinder/ui/menu_structure.py:233 PiFinder/ui/object_list.py:136 +#: PiFinder/ui/menu_structure.py:238 PiFinder/ui/object_list.py:136 msgid "Filter" msgstr "" -#: PiFinder/ui/menu_structure.py:239 +#: PiFinder/ui/menu_structure.py:244 msgid "Reset All" msgstr "" -#: PiFinder/ui/menu_structure.py:243 PiFinder/ui/menu_structure.py:973 +#: PiFinder/ui/menu_structure.py:248 PiFinder/ui/menu_structure.py:1004 msgid "Confirm" msgstr "" -#: PiFinder/ui/menu_structure.py:244 PiFinder/ui/menu_structure.py:976 +#: PiFinder/ui/menu_structure.py:249 PiFinder/ui/menu_structure.py:1007 #: PiFinder/ui/software.py:204 msgid "Cancel" msgstr "" -#: PiFinder/ui/menu_structure.py:248 +#: PiFinder/ui/menu_structure.py:253 msgid "Catalogs" msgstr "" -#: PiFinder/ui/menu_structure.py:356 +#: PiFinder/ui/menu_structure.py:361 msgid "Type" msgstr "" -#: PiFinder/ui/menu_structure.py:370 +#: PiFinder/ui/menu_structure.py:375 msgid "Cluster/Neb" msgstr "" -#: PiFinder/ui/menu_structure.py:382 +#: PiFinder/ui/menu_structure.py:387 msgid "P. Nebula" msgstr "" -#: PiFinder/ui/menu_structure.py:394 +#: PiFinder/ui/menu_structure.py:399 msgid "Double Str" msgstr "" -#: PiFinder/ui/menu_structure.py:398 +#: PiFinder/ui/menu_structure.py:403 msgid "Triple Str" msgstr "" -#: PiFinder/ui/menu_structure.py:420 +#: PiFinder/ui/menu_structure.py:425 msgid "Altitude" msgstr "" -#: PiFinder/ui/menu_structure.py:452 +#: PiFinder/ui/menu_structure.py:457 msgid "Magnitude" msgstr "" -#: PiFinder/ui/menu_structure.py:504 PiFinder/ui/menu_structure.py:514 +#: PiFinder/ui/menu_structure.py:509 PiFinder/ui/menu_structure.py:519 msgid "Observed" msgstr "" -#: PiFinder/ui/menu_structure.py:510 +#: PiFinder/ui/menu_structure.py:515 msgid "Any" msgstr "" -#: PiFinder/ui/menu_structure.py:518 +#: PiFinder/ui/menu_structure.py:523 msgid "Not Observed" msgstr "" -#: PiFinder/ui/menu_structure.py:531 +#: PiFinder/ui/menu_structure.py:536 msgid "User Pref..." msgstr "" -#: PiFinder/ui/menu_structure.py:536 +#: PiFinder/ui/menu_structure.py:541 msgid "Key Bright" msgstr "" -#: PiFinder/ui/menu_structure.py:576 +#: PiFinder/ui/menu_structure.py:581 msgid "Sleep Time" msgstr "" -#: PiFinder/ui/menu_structure.py:582 PiFinder/ui/menu_structure.py:614 -#: PiFinder/ui/menu_structure.py:638 PiFinder/ui/menu_structure.py:687 -#: PiFinder/ui/menu_structure.py:711 PiFinder/ui/menu_structure.py:735 -#: PiFinder/ui/menu_structure.py:759 PiFinder/ui/preview.py:62 +#: PiFinder/ui/menu_structure.py:587 PiFinder/ui/menu_structure.py:619 +#: PiFinder/ui/menu_structure.py:643 PiFinder/ui/menu_structure.py:717 +#: PiFinder/ui/menu_structure.py:741 PiFinder/ui/menu_structure.py:765 +#: PiFinder/ui/menu_structure.py:789 PiFinder/ui/preview.py:62 #: PiFinder/ui/preview.py:79 msgid "Off" msgstr "" -#: PiFinder/ui/menu_structure.py:608 +#: PiFinder/ui/menu_structure.py:613 msgid "Menu Anim" msgstr "" -#: PiFinder/ui/menu_structure.py:618 PiFinder/ui/menu_structure.py:642 +#: PiFinder/ui/menu_structure.py:623 PiFinder/ui/menu_structure.py:647 msgid "Fast" msgstr "" -#: PiFinder/ui/menu_structure.py:622 PiFinder/ui/menu_structure.py:646 -#: PiFinder/ui/menu_structure.py:695 PiFinder/ui/menu_structure.py:719 -#: PiFinder/ui/menu_structure.py:743 PiFinder/ui/preview.py:67 +#: PiFinder/ui/menu_structure.py:627 PiFinder/ui/menu_structure.py:651 +#: PiFinder/ui/menu_structure.py:725 PiFinder/ui/menu_structure.py:749 +#: PiFinder/ui/menu_structure.py:773 PiFinder/ui/preview.py:67 msgid "Medium" msgstr "" -#: PiFinder/ui/menu_structure.py:626 PiFinder/ui/menu_structure.py:650 +#: PiFinder/ui/menu_structure.py:631 PiFinder/ui/menu_structure.py:655 msgid "Slow" msgstr "" -#: PiFinder/ui/menu_structure.py:632 +#: PiFinder/ui/menu_structure.py:637 msgid "Scroll Speed" msgstr "" -#: PiFinder/ui/menu_structure.py:656 +#: PiFinder/ui/menu_structure.py:661 msgid "Az Arrows" msgstr "" -#: PiFinder/ui/menu_structure.py:663 +#: PiFinder/ui/menu_structure.py:668 msgid "Default" msgstr "" -#: PiFinder/ui/menu_structure.py:667 +#: PiFinder/ui/menu_structure.py:672 msgid "Reverse" msgstr "" -#: PiFinder/ui/menu_structure.py:675 +#: PiFinder/ui/menu_structure.py:678 +msgid "Language" +msgstr "" + +#: PiFinder/ui/menu_structure.py:685 +msgid "English" +msgstr "" + +#: PiFinder/ui/menu_structure.py:689 +msgid "German" +msgstr "" + +#: PiFinder/ui/menu_structure.py:693 +msgid "French" +msgstr "" + +#: PiFinder/ui/menu_structure.py:697 +msgid "Spanish" +msgstr "" + +#: PiFinder/ui/menu_structure.py:705 msgid "Chart..." msgstr "" -#: PiFinder/ui/menu_structure.py:681 +#: PiFinder/ui/menu_structure.py:711 msgid "Reticle" msgstr "" -#: PiFinder/ui/menu_structure.py:691 PiFinder/ui/menu_structure.py:715 -#: PiFinder/ui/menu_structure.py:739 PiFinder/ui/preview.py:72 +#: PiFinder/ui/menu_structure.py:721 PiFinder/ui/menu_structure.py:745 +#: PiFinder/ui/menu_structure.py:769 PiFinder/ui/preview.py:72 msgid "Low" msgstr "" -#: PiFinder/ui/menu_structure.py:699 PiFinder/ui/menu_structure.py:723 -#: PiFinder/ui/menu_structure.py:747 PiFinder/ui/preview.py:64 +#: PiFinder/ui/menu_structure.py:729 PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:777 PiFinder/ui/preview.py:64 msgid "High" msgstr "" -#: PiFinder/ui/menu_structure.py:705 +#: PiFinder/ui/menu_structure.py:735 msgid "Constellation" msgstr "" -#: PiFinder/ui/menu_structure.py:729 +#: PiFinder/ui/menu_structure.py:759 msgid "DSO Display" msgstr "" -#: PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:783 msgid "RA/DEC Disp." msgstr "" -#: PiFinder/ui/menu_structure.py:763 +#: PiFinder/ui/menu_structure.py:793 msgid "HH:MM" msgstr "" -#: PiFinder/ui/menu_structure.py:767 +#: PiFinder/ui/menu_structure.py:797 msgid "Degrees" msgstr "" -#: PiFinder/ui/menu_structure.py:775 +#: PiFinder/ui/menu_structure.py:805 msgid "Camera Exp" msgstr "" -#: PiFinder/ui/menu_structure.py:783 +#: PiFinder/ui/menu_structure.py:813 msgid "0.025s" msgstr "" -#: PiFinder/ui/menu_structure.py:787 +#: PiFinder/ui/menu_structure.py:817 msgid "0.05s" msgstr "" -#: PiFinder/ui/menu_structure.py:791 +#: PiFinder/ui/menu_structure.py:821 msgid "0.1s" msgstr "" -#: PiFinder/ui/menu_structure.py:795 +#: PiFinder/ui/menu_structure.py:825 msgid "0.2s" msgstr "" -#: PiFinder/ui/menu_structure.py:799 +#: PiFinder/ui/menu_structure.py:829 msgid "0.4s" msgstr "" -#: PiFinder/ui/menu_structure.py:803 +#: PiFinder/ui/menu_structure.py:833 msgid "0.8s" msgstr "" -#: PiFinder/ui/menu_structure.py:807 +#: PiFinder/ui/menu_structure.py:837 msgid "1s" msgstr "" -#: PiFinder/ui/menu_structure.py:813 +#: PiFinder/ui/menu_structure.py:843 msgid "WiFi Mode" msgstr "" -#: PiFinder/ui/menu_structure.py:819 +#: PiFinder/ui/menu_structure.py:850 msgid "Client Mode" msgstr "" -#: PiFinder/ui/menu_structure.py:824 +#: PiFinder/ui/menu_structure.py:855 msgid "AP Mode" msgstr "" -#: PiFinder/ui/menu_structure.py:831 +#: PiFinder/ui/menu_structure.py:862 msgid "PiFinder Type" msgstr "" -#: PiFinder/ui/menu_structure.py:838 +#: PiFinder/ui/menu_structure.py:869 msgid "Left" msgstr "" -#: PiFinder/ui/menu_structure.py:842 +#: PiFinder/ui/menu_structure.py:873 msgid "Right" msgstr "" -#: PiFinder/ui/menu_structure.py:846 +#: PiFinder/ui/menu_structure.py:877 msgid "Straight" msgstr "" -#: PiFinder/ui/menu_structure.py:850 +#: PiFinder/ui/menu_structure.py:881 msgid "Flat v3" msgstr "" -#: PiFinder/ui/menu_structure.py:854 +#: PiFinder/ui/menu_structure.py:885 msgid "Flat v2" msgstr "" -#: PiFinder/ui/menu_structure.py:860 +#: PiFinder/ui/menu_structure.py:891 msgid "Mount Type" msgstr "" -#: PiFinder/ui/menu_structure.py:867 +#: PiFinder/ui/menu_structure.py:898 msgid "Alt/Az" msgstr "" -#: PiFinder/ui/menu_structure.py:871 +#: PiFinder/ui/menu_structure.py:902 msgid "Equitorial" msgstr "" -#: PiFinder/ui/menu_structure.py:877 +#: PiFinder/ui/menu_structure.py:908 msgid "Camera Type" msgstr "" -#: PiFinder/ui/menu_structure.py:883 +#: PiFinder/ui/menu_structure.py:914 msgid "v2 - imx477" msgstr "" -#: PiFinder/ui/menu_structure.py:888 +#: PiFinder/ui/menu_structure.py:919 msgid "v3 - imx296" msgstr "" -#: PiFinder/ui/menu_structure.py:893 +#: PiFinder/ui/menu_structure.py:924 msgid "v3 - imx462" msgstr "" -#: PiFinder/ui/menu_structure.py:900 +#: PiFinder/ui/menu_structure.py:931 msgid "GPS Type" msgstr "" -#: PiFinder/ui/menu_structure.py:908 +#: PiFinder/ui/menu_structure.py:939 msgid "UBlox" msgstr "" -#: PiFinder/ui/menu_structure.py:912 +#: PiFinder/ui/menu_structure.py:943 msgid "GPSD (generic)" msgstr "" -#: PiFinder/ui/menu_structure.py:920 +#: PiFinder/ui/menu_structure.py:951 msgid "Tools" msgstr "" -#: PiFinder/ui/menu_structure.py:924 +#: PiFinder/ui/menu_structure.py:955 msgid "Status" msgstr "" -#: PiFinder/ui/menu_structure.py:925 +#: PiFinder/ui/menu_structure.py:956 msgid "Equipment" msgstr "" -#: PiFinder/ui/menu_structure.py:927 +#: PiFinder/ui/menu_structure.py:958 msgid "Place & Time" msgstr "" -#: PiFinder/ui/menu_structure.py:936 +#: PiFinder/ui/menu_structure.py:967 msgid "Set Location" msgstr "" -#: PiFinder/ui/menu_structure.py:940 +#: PiFinder/ui/menu_structure.py:971 msgid "Set Time" msgstr "" -#: PiFinder/ui/menu_structure.py:944 +#: PiFinder/ui/menu_structure.py:975 msgid "Reset" msgstr "" -#: PiFinder/ui/menu_structure.py:947 +#: PiFinder/ui/menu_structure.py:978 msgid "Console" msgstr "" -#: PiFinder/ui/menu_structure.py:948 +#: PiFinder/ui/menu_structure.py:979 msgid "Software Upd" msgstr "" -#: PiFinder/ui/menu_structure.py:951 +#: PiFinder/ui/menu_structure.py:982 msgid "Power" msgstr "" -#: PiFinder/ui/menu_structure.py:957 +#: PiFinder/ui/menu_structure.py:988 msgid "Shutdown" msgstr "" -#: PiFinder/ui/menu_structure.py:967 +#: PiFinder/ui/menu_structure.py:998 msgid "Restart" msgstr "" -#: PiFinder/ui/menu_structure.py:982 +#: PiFinder/ui/menu_structure.py:1013 msgid "Experimental" msgstr "" -#: PiFinder/ui/menu_structure.py:987 -msgid "Language" -msgstr "" - -#: PiFinder/ui/menu_structure.py:994 -msgid "English" -msgstr "" - -#: PiFinder/ui/menu_structure.py:998 -msgid "German" -msgstr "" - -#: PiFinder/ui/menu_structure.py:1002 -msgid "French" -msgstr "" - -#: PiFinder/ui/menu_structure.py:1006 -msgid "Spanish" -msgstr "" - #: PiFinder/ui/object_details.py:61 PiFinder/ui/object_details.py:66 msgid "ALIGN" msgstr "" @@ -878,39 +882,39 @@ msgstr "" msgid "Sz:{size}" msgstr "" -#: PiFinder/ui/object_details.py:207 +#: PiFinder/ui/object_details.py:208 msgid "  Not Logged" msgstr "" -#: PiFinder/ui/object_details.py:209 +#: PiFinder/ui/object_details.py:210 msgid "  {logs} Logs" msgstr "" -#: PiFinder/ui/object_details.py:244 +#: PiFinder/ui/object_details.py:245 msgid "No solve" msgstr "" -#: PiFinder/ui/object_details.py:250 +#: PiFinder/ui/object_details.py:251 msgid "yet{elipsis}" msgstr "" -#: PiFinder/ui/object_details.py:264 +#: PiFinder/ui/object_details.py:265 msgid "Searching" msgstr "" -#: PiFinder/ui/object_details.py:270 +#: PiFinder/ui/object_details.py:271 msgid "for GPS{elipsis}" msgstr "" -#: PiFinder/ui/object_details.py:284 +#: PiFinder/ui/object_details.py:285 msgid "Calculating" msgstr "" -#: PiFinder/ui/object_details.py:471 +#: PiFinder/ui/object_details.py:472 msgid "Too Far" msgstr "" -#: PiFinder/ui/object_details.py:496 +#: PiFinder/ui/object_details.py:497 msgid "LOG" msgstr "" @@ -1089,6 +1093,38 @@ msgstr "" msgid "󰍴 Delete/Previous" msgstr "" +#: PiFinder/ui/wifi_password.py:41 +msgid "mode" +msgstr "" + +#: PiFinder/ui/wifi_password.py:50 +msgid "QR" +msgstr "" + +#: PiFinder/ui/wifi_password.py:53 +msgid "Passwd" +msgstr "" + +#: PiFinder/ui/wifi_password.py:153 PiFinder/ui/wifi_password.py:180 +msgid "Client mode!" +msgstr "" + +#: PiFinder/ui/wifi_password.py:160 +msgid "Connected to:" +msgstr "" + +#: PiFinder/ui/wifi_password.py:209 +msgid "Note: {wifi_mode} mode!" +msgstr "" + +#: PiFinder/ui/wifi_password.py:223 +msgid "Password:" +msgstr "" + +#: PiFinder/ui/wifi_password.py:273 +msgid "SSID:" +msgstr "" + #~ msgid "Language: englisch" #~ msgstr "" @@ -1470,3 +1506,6 @@ msgstr "" #~ msgid "HELP" #~ msgstr "" +#~ msgid "Client Mode!" +#~ msgstr "" + diff --git a/python/locale/fr/LC_MESSAGES/messages.mo b/python/locale/fr/LC_MESSAGES/messages.mo index 4e1446049..9b4868f61 100644 Binary files a/python/locale/fr/LC_MESSAGES/messages.mo and b/python/locale/fr/LC_MESSAGES/messages.mo differ diff --git a/python/locale/fr/LC_MESSAGES/messages.po b/python/locale/fr/LC_MESSAGES/messages.po index 5d1c63b6e..e4bc61a94 100644 --- a/python/locale/fr/LC_MESSAGES/messages.po +++ b/python/locale/fr/LC_MESSAGES/messages.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2025-05-04 15:37+0200\n" +"POT-Creation-Date: 2025-05-05 08:21+0200\n" "PO-Revision-Date: 2025-01-12 18:13+0100\n" "Last-Translator: xxxxxx \n" "Language: fr_FR\n" @@ -21,27 +21,27 @@ msgstr "" msgid "No Image" msgstr "" -#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:362 +#: PiFinder/obj_types.py:7 PiFinder/ui/menu_structure.py:367 msgid "Galaxy" msgstr "Galaxie" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:366 +#: PiFinder/obj_types.py:8 PiFinder/ui/menu_structure.py:371 msgid "Open Cluster" msgstr "Amas Ouvert" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:374 +#: PiFinder/obj_types.py:9 PiFinder/ui/menu_structure.py:379 msgid "Globular" msgstr "Amas Globulaire" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:378 +#: PiFinder/obj_types.py:10 PiFinder/ui/menu_structure.py:383 msgid "Nebula" msgstr "Nébuleuse" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:386 +#: PiFinder/obj_types.py:11 PiFinder/ui/menu_structure.py:391 #, fuzzy msgid "Dark Nebula" msgstr "Nébuleuse obscure" @@ -59,12 +59,12 @@ msgid "Cluster + Neb" msgstr "Amas Ouvert" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:406 +#: PiFinder/obj_types.py:14 PiFinder/ui/menu_structure.py:411 msgid "Asterism" msgstr "Asterisme" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:402 +#: PiFinder/obj_types.py:15 PiFinder/ui/menu_structure.py:407 msgid "Knot" msgstr "Knot" @@ -81,7 +81,7 @@ msgid "Double star" msgstr "Etoile Double" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:390 +#: PiFinder/obj_types.py:18 PiFinder/ui/menu_structure.py:395 #, fuzzy msgid "Star" msgstr "Etoile" @@ -92,12 +92,12 @@ msgid "Unkn" msgstr "Inconnu" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:410 +#: PiFinder/obj_types.py:20 PiFinder/ui/menu_structure.py:415 msgid "Planet" msgstr "Planète" #. TRANSLATORS: Object type -#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:414 +#: PiFinder/obj_types.py:21 PiFinder/ui/menu_structure.py:419 #, fuzzy msgid "Comet" msgstr "Comètes" @@ -119,12 +119,12 @@ msgstr "Pas d'astrométrie" msgid "No Solve Yet" msgstr "Pas d'astrometrie" -#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:461 +#: PiFinder/ui/align.py:397 PiFinder/ui/object_details.py:462 #, fuzzy msgid "Aligning..." msgstr "Alignement..." -#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:469 +#: PiFinder/ui/align.py:405 PiFinder/ui/object_details.py:470 #, fuzzy msgid "Aligned!" msgstr "Alignement" @@ -137,7 +137,7 @@ msgstr "Erreur d'alignement" msgid "Filters Reset" msgstr "RàZ filtres" -#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:949 +#: PiFinder/ui/callbacks.py:63 PiFinder/ui/menu_structure.py:980 #, fuzzy msgid "Test Mode" msgstr "Mode client" @@ -167,7 +167,7 @@ msgstr "Wifi vers Client" msgid "Time: {time}" msgstr "Temps: {time}" -#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:526 +#: PiFinder/ui/chart.py:40 PiFinder/ui/menu_structure.py:531 msgid "Settings" msgstr "Réglages" @@ -281,8 +281,8 @@ msgstr "" msgid "Lock Type:" msgstr "Type de Monture" -#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:426 -#: PiFinder/ui/menu_structure.py:458 +#: PiFinder/ui/gpsstatus.py:213 PiFinder/ui/menu_structure.py:431 +#: PiFinder/ui/menu_structure.py:463 msgid "None" msgstr "Aucun" @@ -406,503 +406,507 @@ msgstr "Oculaire" msgid "Telescope" msgstr "Telescope..." -#: PiFinder/ui/menu_structure.py:23 +#: PiFinder/ui/menu_structure.py:24 #, fuzzy msgid "Language: de" msgstr "Langage: Allemand" -#: PiFinder/ui/menu_structure.py:24 +#: PiFinder/ui/menu_structure.py:25 #, fuzzy msgid "Language: en" msgstr "Langage: Anglais" -#: PiFinder/ui/menu_structure.py:25 +#: PiFinder/ui/menu_structure.py:26 #, fuzzy msgid "Language: es" msgstr "Langage: Espagnol" -#: PiFinder/ui/menu_structure.py:26 +#: PiFinder/ui/menu_structure.py:27 #, fuzzy msgid "Language: fr" msgstr "Langage: Français" -#: PiFinder/ui/menu_structure.py:37 +#: PiFinder/ui/menu_structure.py:38 #, fuzzy msgid "Start" msgstr "Etoile" -#: PiFinder/ui/menu_structure.py:42 +#: PiFinder/ui/menu_structure.py:43 msgid "Focus" msgstr "Mise au point" -#: PiFinder/ui/menu_structure.py:46 +#: PiFinder/ui/menu_structure.py:47 #, fuzzy msgid "Align" msgstr "Alignement" -#: PiFinder/ui/menu_structure.py:52 PiFinder/ui/menu_structure.py:932 +#: PiFinder/ui/menu_structure.py:53 PiFinder/ui/menu_structure.py:963 msgid "GPS Status" msgstr "Status du GPS" -#: PiFinder/ui/menu_structure.py:58 +#: PiFinder/ui/menu_structure.py:57 +msgid "Connect WiFi" +msgstr "" + +#: PiFinder/ui/menu_structure.py:63 msgid "Chart" msgstr "Cartes" -#: PiFinder/ui/menu_structure.py:64 +#: PiFinder/ui/menu_structure.py:69 msgid "Objects" msgstr "Objets" -#: PiFinder/ui/menu_structure.py:69 +#: PiFinder/ui/menu_structure.py:74 msgid "All Filtered" msgstr "Tous filtres" -#: PiFinder/ui/menu_structure.py:74 +#: PiFinder/ui/menu_structure.py:79 msgid "By Catalog" msgstr "Par catalogue" -#: PiFinder/ui/menu_structure.py:79 PiFinder/ui/menu_structure.py:254 +#: PiFinder/ui/menu_structure.py:84 PiFinder/ui/menu_structure.py:259 msgid "Planets" msgstr "Planètes" -#: PiFinder/ui/menu_structure.py:85 PiFinder/ui/menu_structure.py:156 -#: PiFinder/ui/menu_structure.py:258 PiFinder/ui/menu_structure.py:308 +#: PiFinder/ui/menu_structure.py:90 PiFinder/ui/menu_structure.py:161 +#: PiFinder/ui/menu_structure.py:263 PiFinder/ui/menu_structure.py:313 msgid "NGC" msgstr "NGC" -#: PiFinder/ui/menu_structure.py:91 PiFinder/ui/menu_structure.py:150 -#: PiFinder/ui/menu_structure.py:262 PiFinder/ui/menu_structure.py:304 +#: PiFinder/ui/menu_structure.py:96 PiFinder/ui/menu_structure.py:155 +#: PiFinder/ui/menu_structure.py:267 PiFinder/ui/menu_structure.py:309 msgid "Messier" msgstr "Messier" -#: PiFinder/ui/menu_structure.py:97 PiFinder/ui/menu_structure.py:266 +#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:271 msgid "DSO..." msgstr "DSO..." -#: PiFinder/ui/menu_structure.py:102 PiFinder/ui/menu_structure.py:272 +#: PiFinder/ui/menu_structure.py:107 PiFinder/ui/menu_structure.py:277 msgid "Abell Pn" msgstr "Abell Pn" -#: PiFinder/ui/menu_structure.py:108 PiFinder/ui/menu_structure.py:276 +#: PiFinder/ui/menu_structure.py:113 PiFinder/ui/menu_structure.py:281 msgid "Arp Galaxies" msgstr "Arp Galaxies" -#: PiFinder/ui/menu_structure.py:114 PiFinder/ui/menu_structure.py:280 +#: PiFinder/ui/menu_structure.py:119 PiFinder/ui/menu_structure.py:285 msgid "Barnard" msgstr "Barnard" -#: PiFinder/ui/menu_structure.py:120 PiFinder/ui/menu_structure.py:284 +#: PiFinder/ui/menu_structure.py:125 PiFinder/ui/menu_structure.py:289 msgid "Caldwell" msgstr "Caldwell" -#: PiFinder/ui/menu_structure.py:126 PiFinder/ui/menu_structure.py:288 +#: PiFinder/ui/menu_structure.py:131 PiFinder/ui/menu_structure.py:293 msgid "Collinder" msgstr "Collinder" -#: PiFinder/ui/menu_structure.py:132 PiFinder/ui/menu_structure.py:292 +#: PiFinder/ui/menu_structure.py:137 PiFinder/ui/menu_structure.py:297 msgid "E.G. Globs" msgstr "E.G. Globs" -#: PiFinder/ui/menu_structure.py:138 PiFinder/ui/menu_structure.py:296 +#: PiFinder/ui/menu_structure.py:143 PiFinder/ui/menu_structure.py:301 msgid "Herschel 400" msgstr "Herschel 400" -#: PiFinder/ui/menu_structure.py:144 PiFinder/ui/menu_structure.py:300 +#: PiFinder/ui/menu_structure.py:149 PiFinder/ui/menu_structure.py:305 msgid "IC" msgstr "IC" -#: PiFinder/ui/menu_structure.py:162 PiFinder/ui/menu_structure.py:312 +#: PiFinder/ui/menu_structure.py:167 PiFinder/ui/menu_structure.py:317 msgid "Sharpless" msgstr "Sharpless" -#: PiFinder/ui/menu_structure.py:168 PiFinder/ui/menu_structure.py:316 +#: PiFinder/ui/menu_structure.py:173 PiFinder/ui/menu_structure.py:321 msgid "TAAS 200" msgstr "TAAS 200" -#: PiFinder/ui/menu_structure.py:176 PiFinder/ui/menu_structure.py:322 +#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:327 msgid "Stars..." msgstr "Etoiles" -#: PiFinder/ui/menu_structure.py:181 PiFinder/ui/menu_structure.py:328 +#: PiFinder/ui/menu_structure.py:186 PiFinder/ui/menu_structure.py:333 msgid "Bright Named" msgstr "Brillantes" -#: PiFinder/ui/menu_structure.py:187 PiFinder/ui/menu_structure.py:332 +#: PiFinder/ui/menu_structure.py:192 PiFinder/ui/menu_structure.py:337 msgid "SAC Doubles" msgstr "SAC Doubles" -#: PiFinder/ui/menu_structure.py:193 PiFinder/ui/menu_structure.py:336 +#: PiFinder/ui/menu_structure.py:198 PiFinder/ui/menu_structure.py:341 msgid "SAC Asterisms" msgstr "SAC Asterismes" -#: PiFinder/ui/menu_structure.py:199 PiFinder/ui/menu_structure.py:340 +#: PiFinder/ui/menu_structure.py:204 PiFinder/ui/menu_structure.py:345 msgid "SAC Red Stars" msgstr "SAC Etoiles Rouges" -#: PiFinder/ui/menu_structure.py:205 PiFinder/ui/menu_structure.py:344 +#: PiFinder/ui/menu_structure.py:210 PiFinder/ui/menu_structure.py:349 msgid "RASC Doubles" msgstr "RASC Doubles" -#: PiFinder/ui/menu_structure.py:211 PiFinder/ui/menu_structure.py:348 +#: PiFinder/ui/menu_structure.py:216 PiFinder/ui/menu_structure.py:353 msgid "TLK 90 Variables" msgstr "TLK 90 Variables" -#: PiFinder/ui/menu_structure.py:221 +#: PiFinder/ui/menu_structure.py:226 msgid "Recent" msgstr "Récent" -#: PiFinder/ui/menu_structure.py:227 +#: PiFinder/ui/menu_structure.py:232 msgid "Name Search" msgstr "Rech. par Nom" -#: PiFinder/ui/menu_structure.py:233 PiFinder/ui/object_list.py:136 +#: PiFinder/ui/menu_structure.py:238 PiFinder/ui/object_list.py:136 msgid "Filter" msgstr "Filtre" -#: PiFinder/ui/menu_structure.py:239 +#: PiFinder/ui/menu_structure.py:244 msgid "Reset All" msgstr "RàZ tout" -#: PiFinder/ui/menu_structure.py:243 PiFinder/ui/menu_structure.py:973 +#: PiFinder/ui/menu_structure.py:248 PiFinder/ui/menu_structure.py:1004 msgid "Confirm" msgstr "Confirmation" -#: PiFinder/ui/menu_structure.py:244 PiFinder/ui/menu_structure.py:976 +#: PiFinder/ui/menu_structure.py:249 PiFinder/ui/menu_structure.py:1007 #: PiFinder/ui/software.py:204 msgid "Cancel" msgstr "Abandon" -#: PiFinder/ui/menu_structure.py:248 +#: PiFinder/ui/menu_structure.py:253 msgid "Catalogs" msgstr "Catalogues" -#: PiFinder/ui/menu_structure.py:356 +#: PiFinder/ui/menu_structure.py:361 msgid "Type" msgstr "Type" -#: PiFinder/ui/menu_structure.py:370 +#: PiFinder/ui/menu_structure.py:375 #, fuzzy msgid "Cluster/Neb" msgstr "Amas Ouvert" -#: PiFinder/ui/menu_structure.py:382 +#: PiFinder/ui/menu_structure.py:387 msgid "P. Nebula" msgstr "Nébuleuse Planétaire" -#: PiFinder/ui/menu_structure.py:394 +#: PiFinder/ui/menu_structure.py:399 msgid "Double Str" msgstr "Etoile Double" -#: PiFinder/ui/menu_structure.py:398 +#: PiFinder/ui/menu_structure.py:403 #, fuzzy msgid "Triple Str" msgstr "Etoile Double" -#: PiFinder/ui/menu_structure.py:420 +#: PiFinder/ui/menu_structure.py:425 msgid "Altitude" msgstr "Altitude" -#: PiFinder/ui/menu_structure.py:452 +#: PiFinder/ui/menu_structure.py:457 msgid "Magnitude" msgstr "Magnitude" -#: PiFinder/ui/menu_structure.py:504 PiFinder/ui/menu_structure.py:514 +#: PiFinder/ui/menu_structure.py:509 PiFinder/ui/menu_structure.py:519 msgid "Observed" msgstr "Observé" -#: PiFinder/ui/menu_structure.py:510 +#: PiFinder/ui/menu_structure.py:515 msgid "Any" msgstr "Tous" -#: PiFinder/ui/menu_structure.py:518 +#: PiFinder/ui/menu_structure.py:523 msgid "Not Observed" msgstr "Non Observé" -#: PiFinder/ui/menu_structure.py:531 +#: PiFinder/ui/menu_structure.py:536 msgid "User Pref..." msgstr "Pref. Utilisateur" -#: PiFinder/ui/menu_structure.py:536 +#: PiFinder/ui/menu_structure.py:541 msgid "Key Bright" msgstr "Brillance Touche" -#: PiFinder/ui/menu_structure.py:576 +#: PiFinder/ui/menu_structure.py:581 msgid "Sleep Time" msgstr "Mise en Sommeil" -#: PiFinder/ui/menu_structure.py:582 PiFinder/ui/menu_structure.py:614 -#: PiFinder/ui/menu_structure.py:638 PiFinder/ui/menu_structure.py:687 -#: PiFinder/ui/menu_structure.py:711 PiFinder/ui/menu_structure.py:735 -#: PiFinder/ui/menu_structure.py:759 PiFinder/ui/preview.py:62 +#: PiFinder/ui/menu_structure.py:587 PiFinder/ui/menu_structure.py:619 +#: PiFinder/ui/menu_structure.py:643 PiFinder/ui/menu_structure.py:717 +#: PiFinder/ui/menu_structure.py:741 PiFinder/ui/menu_structure.py:765 +#: PiFinder/ui/menu_structure.py:789 PiFinder/ui/preview.py:62 #: PiFinder/ui/preview.py:79 msgid "Off" msgstr "Arret" -#: PiFinder/ui/menu_structure.py:608 +#: PiFinder/ui/menu_structure.py:613 msgid "Menu Anim" msgstr "Anim. Menu" -#: PiFinder/ui/menu_structure.py:618 PiFinder/ui/menu_structure.py:642 +#: PiFinder/ui/menu_structure.py:623 PiFinder/ui/menu_structure.py:647 msgid "Fast" msgstr "Rapide" -#: PiFinder/ui/menu_structure.py:622 PiFinder/ui/menu_structure.py:646 -#: PiFinder/ui/menu_structure.py:695 PiFinder/ui/menu_structure.py:719 -#: PiFinder/ui/menu_structure.py:743 PiFinder/ui/preview.py:67 +#: PiFinder/ui/menu_structure.py:627 PiFinder/ui/menu_structure.py:651 +#: PiFinder/ui/menu_structure.py:725 PiFinder/ui/menu_structure.py:749 +#: PiFinder/ui/menu_structure.py:773 PiFinder/ui/preview.py:67 msgid "Medium" msgstr "Moyen" -#: PiFinder/ui/menu_structure.py:626 PiFinder/ui/menu_structure.py:650 +#: PiFinder/ui/menu_structure.py:631 PiFinder/ui/menu_structure.py:655 msgid "Slow" msgstr "Lent" -#: PiFinder/ui/menu_structure.py:632 +#: PiFinder/ui/menu_structure.py:637 msgid "Scroll Speed" msgstr "Vitesse défilement" -#: PiFinder/ui/menu_structure.py:656 +#: PiFinder/ui/menu_structure.py:661 msgid "Az Arrows" msgstr "Fleches AZ" -#: PiFinder/ui/menu_structure.py:663 +#: PiFinder/ui/menu_structure.py:668 msgid "Default" msgstr "Par défaut" -#: PiFinder/ui/menu_structure.py:667 +#: PiFinder/ui/menu_structure.py:672 msgid "Reverse" msgstr "A l'envers" -#: PiFinder/ui/menu_structure.py:675 +#: PiFinder/ui/menu_structure.py:678 +#, fuzzy +msgid "Language" +msgstr "Langage" + +#: PiFinder/ui/menu_structure.py:685 +#, fuzzy +msgid "English" +msgstr "Anglais" + +#: PiFinder/ui/menu_structure.py:689 +#, fuzzy +msgid "German" +msgstr "Allemand" + +#: PiFinder/ui/menu_structure.py:693 +#, fuzzy +msgid "French" +msgstr "Français" + +#: PiFinder/ui/menu_structure.py:697 +#, fuzzy +msgid "Spanish" +msgstr "Espagnol" + +#: PiFinder/ui/menu_structure.py:705 msgid "Chart..." msgstr "Carte..." -#: PiFinder/ui/menu_structure.py:681 +#: PiFinder/ui/menu_structure.py:711 msgid "Reticle" msgstr "Réticule" -#: PiFinder/ui/menu_structure.py:691 PiFinder/ui/menu_structure.py:715 -#: PiFinder/ui/menu_structure.py:739 PiFinder/ui/preview.py:72 +#: PiFinder/ui/menu_structure.py:721 PiFinder/ui/menu_structure.py:745 +#: PiFinder/ui/menu_structure.py:769 PiFinder/ui/preview.py:72 msgid "Low" msgstr "Bas" -#: PiFinder/ui/menu_structure.py:699 PiFinder/ui/menu_structure.py:723 -#: PiFinder/ui/menu_structure.py:747 PiFinder/ui/preview.py:64 +#: PiFinder/ui/menu_structure.py:729 PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:777 PiFinder/ui/preview.py:64 msgid "High" msgstr "Haut" -#: PiFinder/ui/menu_structure.py:705 +#: PiFinder/ui/menu_structure.py:735 msgid "Constellation" msgstr "Constéllation" -#: PiFinder/ui/menu_structure.py:729 +#: PiFinder/ui/menu_structure.py:759 msgid "DSO Display" msgstr "Affichage DSO" -#: PiFinder/ui/menu_structure.py:753 +#: PiFinder/ui/menu_structure.py:783 msgid "RA/DEC Disp." msgstr "Affichage AD/DEC" -#: PiFinder/ui/menu_structure.py:763 +#: PiFinder/ui/menu_structure.py:793 msgid "HH:MM" msgstr "HH:MM" -#: PiFinder/ui/menu_structure.py:767 +#: PiFinder/ui/menu_structure.py:797 msgid "Degrees" msgstr "Degrés" -#: PiFinder/ui/menu_structure.py:775 +#: PiFinder/ui/menu_structure.py:805 msgid "Camera Exp" msgstr "Expo. Caméra" -#: PiFinder/ui/menu_structure.py:783 +#: PiFinder/ui/menu_structure.py:813 msgid "0.025s" msgstr "0.025s" -#: PiFinder/ui/menu_structure.py:787 +#: PiFinder/ui/menu_structure.py:817 msgid "0.05s" msgstr "0.05s" -#: PiFinder/ui/menu_structure.py:791 +#: PiFinder/ui/menu_structure.py:821 msgid "0.1s" msgstr "0.1s" -#: PiFinder/ui/menu_structure.py:795 +#: PiFinder/ui/menu_structure.py:825 msgid "0.2s" msgstr "0.2s" -#: PiFinder/ui/menu_structure.py:799 +#: PiFinder/ui/menu_structure.py:829 msgid "0.4s" msgstr "0.4s" -#: PiFinder/ui/menu_structure.py:803 +#: PiFinder/ui/menu_structure.py:833 msgid "0.8s" msgstr "0.8s" -#: PiFinder/ui/menu_structure.py:807 +#: PiFinder/ui/menu_structure.py:837 msgid "1s" msgstr "1s" -#: PiFinder/ui/menu_structure.py:813 +#: PiFinder/ui/menu_structure.py:843 msgid "WiFi Mode" msgstr "Mode Wifi" -#: PiFinder/ui/menu_structure.py:819 +#: PiFinder/ui/menu_structure.py:850 #, fuzzy msgid "Client Mode" msgstr "Mode client" -#: PiFinder/ui/menu_structure.py:824 +#: PiFinder/ui/menu_structure.py:855 #, fuzzy msgid "AP Mode" msgstr "Mode Wifi" -#: PiFinder/ui/menu_structure.py:831 +#: PiFinder/ui/menu_structure.py:862 msgid "PiFinder Type" msgstr "Type de PiFinder" -#: PiFinder/ui/menu_structure.py:838 +#: PiFinder/ui/menu_structure.py:869 msgid "Left" msgstr "Gauche" -#: PiFinder/ui/menu_structure.py:842 +#: PiFinder/ui/menu_structure.py:873 msgid "Right" msgstr "Droit" -#: PiFinder/ui/menu_structure.py:846 +#: PiFinder/ui/menu_structure.py:877 msgid "Straight" msgstr "Face" -#: PiFinder/ui/menu_structure.py:850 +#: PiFinder/ui/menu_structure.py:881 msgid "Flat v3" msgstr "Plat v3" -#: PiFinder/ui/menu_structure.py:854 +#: PiFinder/ui/menu_structure.py:885 msgid "Flat v2" msgstr "Plat v2" -#: PiFinder/ui/menu_structure.py:860 +#: PiFinder/ui/menu_structure.py:891 msgid "Mount Type" msgstr "Type de Monture" -#: PiFinder/ui/menu_structure.py:867 +#: PiFinder/ui/menu_structure.py:898 msgid "Alt/Az" msgstr "Alt/Az" -#: PiFinder/ui/menu_structure.py:871 +#: PiFinder/ui/menu_structure.py:902 msgid "Equitorial" msgstr "Equatoriale" -#: PiFinder/ui/menu_structure.py:877 +#: PiFinder/ui/menu_structure.py:908 msgid "Camera Type" msgstr "Type Caméra" -#: PiFinder/ui/menu_structure.py:883 +#: PiFinder/ui/menu_structure.py:914 msgid "v2 - imx477" msgstr "v2 - imx477" -#: PiFinder/ui/menu_structure.py:888 +#: PiFinder/ui/menu_structure.py:919 msgid "v3 - imx296" msgstr "v3 - imx296" -#: PiFinder/ui/menu_structure.py:893 +#: PiFinder/ui/menu_structure.py:924 #, fuzzy msgid "v3 - imx462" msgstr "v3 - imx462" -#: PiFinder/ui/menu_structure.py:900 +#: PiFinder/ui/menu_structure.py:931 #, fuzzy msgid "GPS Type" msgstr "Type de GPS" -#: PiFinder/ui/menu_structure.py:908 +#: PiFinder/ui/menu_structure.py:939 msgid "UBlox" msgstr "UBlox" -#: PiFinder/ui/menu_structure.py:912 +#: PiFinder/ui/menu_structure.py:943 msgid "GPSD (generic)" msgstr "GPSD (generique)" -#: PiFinder/ui/menu_structure.py:920 +#: PiFinder/ui/menu_structure.py:951 msgid "Tools" msgstr "Outils" -#: PiFinder/ui/menu_structure.py:924 +#: PiFinder/ui/menu_structure.py:955 #, fuzzy msgid "Status" msgstr "Redémarrage" -#: PiFinder/ui/menu_structure.py:925 +#: PiFinder/ui/menu_structure.py:956 msgid "Equipment" msgstr "Equipment" -#: PiFinder/ui/menu_structure.py:927 +#: PiFinder/ui/menu_structure.py:958 #, fuzzy msgid "Place & Time" msgstr "Mise en Sommeil" -#: PiFinder/ui/menu_structure.py:936 +#: PiFinder/ui/menu_structure.py:967 #, fuzzy msgid "Set Location" msgstr "Réglages" -#: PiFinder/ui/menu_structure.py:940 +#: PiFinder/ui/menu_structure.py:971 #, fuzzy msgid "Set Time" msgstr "Mise en Sommeil" -#: PiFinder/ui/menu_structure.py:944 +#: PiFinder/ui/menu_structure.py:975 #, fuzzy msgid "Reset" msgstr "Récent" -#: PiFinder/ui/menu_structure.py:947 +#: PiFinder/ui/menu_structure.py:978 msgid "Console" msgstr "Console" -#: PiFinder/ui/menu_structure.py:948 +#: PiFinder/ui/menu_structure.py:979 msgid "Software Upd" msgstr "Mise à jour" -#: PiFinder/ui/menu_structure.py:951 +#: PiFinder/ui/menu_structure.py:982 msgid "Power" msgstr "Allumage" -#: PiFinder/ui/menu_structure.py:957 +#: PiFinder/ui/menu_structure.py:988 msgid "Shutdown" msgstr "Arrêt" -#: PiFinder/ui/menu_structure.py:967 +#: PiFinder/ui/menu_structure.py:998 msgid "Restart" msgstr "Redémarrage" -#: PiFinder/ui/menu_structure.py:982 +#: PiFinder/ui/menu_structure.py:1013 msgid "Experimental" msgstr "Expèrimental" -#: PiFinder/ui/menu_structure.py:987 -#, fuzzy -msgid "Language" -msgstr "Langage" - -#: PiFinder/ui/menu_structure.py:994 -#, fuzzy -msgid "English" -msgstr "Anglais" - -#: PiFinder/ui/menu_structure.py:998 -#, fuzzy -msgid "German" -msgstr "Allemand" - -#: PiFinder/ui/menu_structure.py:1002 -#, fuzzy -msgid "French" -msgstr "Français" - -#: PiFinder/ui/menu_structure.py:1006 -#, fuzzy -msgid "Spanish" -msgstr "Espagnol" - #: PiFinder/ui/object_details.py:61 PiFinder/ui/object_details.py:66 #, fuzzy msgid "ALIGN" @@ -927,42 +931,42 @@ msgstr "" msgid "Sz:{size}" msgstr "" -#: PiFinder/ui/object_details.py:207 +#: PiFinder/ui/object_details.py:208 #, fuzzy msgid "  Not Logged" msgstr "Connecté" -#: PiFinder/ui/object_details.py:209 +#: PiFinder/ui/object_details.py:210 msgid "  {logs} Logs" msgstr "" -#: PiFinder/ui/object_details.py:244 +#: PiFinder/ui/object_details.py:245 #, fuzzy msgid "No solve" msgstr "Pas d'astrometrie" -#: PiFinder/ui/object_details.py:250 +#: PiFinder/ui/object_details.py:251 msgid "yet{elipsis}" msgstr "" -#: PiFinder/ui/object_details.py:264 +#: PiFinder/ui/object_details.py:265 #, fuzzy msgid "Searching" msgstr "Seeing" -#: PiFinder/ui/object_details.py:270 +#: PiFinder/ui/object_details.py:271 msgid "for GPS{elipsis}" msgstr "" -#: PiFinder/ui/object_details.py:284 +#: PiFinder/ui/object_details.py:285 msgid "Calculating" msgstr "Calcul en cours" -#: PiFinder/ui/object_details.py:471 +#: PiFinder/ui/object_details.py:472 msgid "Too Far" msgstr "Trop loin" -#: PiFinder/ui/object_details.py:496 +#: PiFinder/ui/object_details.py:497 #, fuzzy msgid "LOG" msgstr "Bas" @@ -1159,6 +1163,40 @@ msgstr "" msgid "󰍴 Delete/Previous" msgstr "" +#: PiFinder/ui/wifi_password.py:41 +#, fuzzy +msgid "mode" +msgstr "Mode Wifi" + +#: PiFinder/ui/wifi_password.py:50 +msgid "QR" +msgstr "" + +#: PiFinder/ui/wifi_password.py:53 +msgid "Passwd" +msgstr "" + +#: PiFinder/ui/wifi_password.py:153 PiFinder/ui/wifi_password.py:180 +#, fuzzy +msgid "Client mode!" +msgstr "Mode client" + +#: PiFinder/ui/wifi_password.py:160 +msgid "Connected to:" +msgstr "" + +#: PiFinder/ui/wifi_password.py:209 +msgid "Note: {wifi_mode} mode!" +msgstr "" + +#: PiFinder/ui/wifi_password.py:223 +msgid "Password:" +msgstr "" + +#: PiFinder/ui/wifi_password.py:273 +msgid "SSID:" +msgstr "" + #~ msgid "Language: Spanish" #~ msgstr "Langage: Espagnol" @@ -1513,3 +1551,6 @@ msgstr "" #~ msgid "HELP" #~ msgstr "" +#~ msgid "Client Mode!" +#~ msgstr "Mode client" + diff --git a/python/requirements.txt b/python/requirements.txt index 8607c6b63..aa2dc743e 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -24,3 +24,4 @@ timezonefinder==6.1.9 tqdm==4.65.0 protobuf==4.25.2 aiofiles==24.1.0 +qrcode==8.1 \ No newline at end of file diff --git a/python/requirements_dev.txt b/python/requirements_dev.txt index 3006e5831..0942d533b 100644 --- a/python/requirements_dev.txt +++ b/python/requirements_dev.txt @@ -7,4 +7,5 @@ mypy==1.10.0 pytest==8.2.2 pygame==2.6.0 pre-commit==3.7.1 -Babel==2.16.0 \ No newline at end of file +types-qrcode>=8.1.0 +Babel==2.16.0 diff --git a/python/tests/test_sys_utils.py b/python/tests/test_sys_utils.py index 6115dc881..9d7abfb24 100644 --- a/python/tests/test_sys_utils.py +++ b/python/tests/test_sys_utils.py @@ -67,6 +67,16 @@ def test_wpa_supplicant_parsing(): result = sys_utils.Network._parse_wpa_supplicant(wpa_list) assert result[1]["psk"] == "1234@===!!!" + @pytest.mark.unit + def test_generate_five(): + five = sys_utils.Network._generate_random_chars(5) + assert len(five) == 5, "length wrong" + + twenty = sys_utils.Network._generate_random_chars(20, "-", 5) + assert len(twenty) == 23, "length wrong" + assert twenty[5] == "-", "no '-' after first group" + assert twenty[12] == "-", "no '-' after second group" + assert twenty[17] == "-", "no '-' aftger thrid group" except ImportError: pass diff --git a/python/views/network.tpl b/python/views/network.tpl index f5f9f2a27..ddaafc3fe 100644 --- a/python/views/network.tpl +++ b/python/views/network.tpl @@ -27,7 +27,31 @@
- + +
+
+ % if net.is_ap_open(): +
+
+ +
+
+ %end +
+
+ + +

{{err_pwd}}

+
+
+
+
+ + +

{{err_country}}