;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2013-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015, 2016 Alex Kost <alezost@gmail.com>
;;; Copyright © 2015, 2016, 2020 Mark H Weaver <mhw@netris.org>
;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
;;; Copyright © 2016, 2017 Leo Famulari <leo@famulari.name>
;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019 John Soo <jsoo1@asu.edu>
;;; Copyright © 2019, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
;;; Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re>
;;; Copyright © 2021 qblade <qblade@protonmail.com>
;;; Copyright © 2021 Hui Lu <luhuins@163.com>
;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 muradm <mail@muradm.net>
;;; Copyright © 2022 Guillaume Le Vaillant <glv@posteo.net>
;;; Copyright © 2022 Justin Veilleux <terramorpha@cock.li>
;;; Copyright © 2022 ( <paren@disroot.org>
;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu services base)
  #:use-module (guix store)
  #:use-module (guix deprecation)
  #:autoload   (guix diagnostics) (warning formatted-message &fix-hint)
  #:autoload   (guix i18n) (G_)
  #:use-module (guix combinators)
  #:use-module (gnu services)
  #:use-module (gnu services admin)
  #:use-module (gnu services shepherd)
  #:use-module (gnu services sysctl)
  #:use-module (gnu system pam)
  #:use-module (gnu system shadow)                ; 'user-account', etc.
  #:use-module (gnu system uuid)
  #:use-module (gnu system file-systems)          ; 'file-system', etc.
  #:use-module (gnu system keyboard)
  #:use-module (gnu system mapped-devices)
  #:use-module ((gnu system linux-initrd)
                #:select (file-system-packages))
  #:use-module (gnu packages admin)
  #:use-module ((gnu packages linux)
                #:select (alsa-utils btrfs-progs crda eudev
                          e2fsprogs f2fs-tools fuse gpm kbd lvm2 rng-tools
                          util-linux xfsprogs))
  #:use-module (gnu packages bash)
  #:use-module ((gnu packages base)
                #:select (coreutils glibc glibc/hurd
                          glibc-utf8-locales
                          libc-utf8-locales-for-target
                          make-glibc-utf8-locales
                          tar canonical-package))
  #:use-module ((gnu packages compression) #:select (gzip))
  #:use-module (gnu packages fonts)
  #:autoload   (gnu packages guile-xyz) (guile-netlink)
  #:autoload   (gnu packages hurd) (hurd)
  #:use-module (gnu packages package-management)
  #:use-module ((gnu packages gnupg) #:select (guile-gcrypt))
  #:use-module ((gnu packages disk)
                #:select (dosfstools))
  #:use-module ((gnu packages file-systems)
                #:select (bcachefs-tools exfat-utils jfsutils zfs))
  #:use-module (gnu packages fonts)
  #:use-module (gnu packages terminals)
  #:use-module ((gnu packages wm) #:select (sway))
  #:use-module ((gnu build file-systems)
                #:select (mount-flags->bit-mask
                          swap-space->flags-bit-mask))
  #:autoload   (guix channels) (%default-channels channel->code)
  #:use-module (guix gexp)
  #:use-module ((guix packages) #:select (package-version))
  #:use-module (guix records)
  #:use-module (guix modules)
  #:use-module (guix pki)
  #:use-module ((guix self) #:select (make-config.scm))
  #:use-module (guix diagnostics)
  #:use-module (guix i18n)
  #:autoload   (guix utils) (target-hurd?)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module (ice-9 match)
  #:use-module (ice-9 format)
  #:re-export (user-processes-service-type        ;backwards compatibility
               %default-substitute-urls)
  #:export (fstab-service-type
            root-file-system-service
            file-system-service-type
            file-system-utilities
            swap-service
            host-name-service  ; deprecated
            host-name-service-type
            %default-console-font
            console-font-service-type
            console-font-service
            virtual-terminal-service-type

            host
            host?
            host-address
            host-canonical-name
            host-aliases
            hosts-service-type

            static-networking
            static-networking?
            static-networking-addresses
            static-networking-links
            static-networking-routes
            static-networking-requirement

            network-address
            network-address?
            network-address-device
            network-address-value
            network-address-ipv6?

            network-link
            network-link?
            network-link-name
            network-link-type
            network-link-arguments

            network-route
            network-route?
            network-route-destination
            network-route-source
            network-route-device
            network-route-ipv6?
            network-route-gateway

            static-networking-service
            static-networking-service-type

            %loopback-static-networking
            %qemu-static-networking

            udev-configuration
            udev-configuration?
            udev-configuration-rules
            udev-configuration-hardware
            udev-service-type
            udev-service  ; deprecated
            udev-rule
            udev-hardware
            file->udev-rule
            file->udev-hardware
            udev-rules-service
            udev-hardware-service

            login-configuration
            login-configuration?
            login-service-type
            login-service  ; deprecated

            agetty-configuration
            agetty-configuration?
            agetty-service  ; deprecated
            agetty-service-type

            mingetty-configuration
            mingetty-configuration-tty
            mingetty-configuration-auto-login
            mingetty-configuration-login-program
            mingetty-configuration-login-pause?
            mingetty-configuration-clear-on-logout?
            mingetty-configuration-mingetty
            mingetty-configuration?
            mingetty-service  ; deprecated
            mingetty-service-type

            %nscd-default-caches
            %nscd-default-configuration  ; deprecated

            nscd-configuration
            nscd-configuration?

            nscd-cache
            nscd-cache?

            nscd-service-type
            nscd-service  ; deprecated

            syslog-configuration
            syslog-configuration?
            syslog-service  ; deprecated
            syslog-service-type
            %default-syslog.conf

            %default-authorized-guix-keys
            guix-configuration
            guix-configuration?

            guix-configuration-guix
            guix-configuration-build-group
            guix-configuration-build-accounts
            guix-configuration-build-machines
            guix-configuration-authorize-key?
            guix-configuration-authorized-keys
            guix-configuration-use-substitutes?
            guix-configuration-substitute-urls
            guix-configuration-generate-substitute-key?
            guix-configuration-channels
            guix-configuration-extra-options
            guix-configuration-log-file
            guix-configuration-environment

            guix-extension
            guix-extension?
            guix-extension-authorized-keys
            guix-extension-substitute-urls
            guix-extension-chroot-directories

            guix-service-type
            guix-publish-configuration
            guix-publish-configuration?
            guix-publish-configuration-guix
            guix-publish-configuration-port
            guix-publish-configuration-host
            guix-publish-configuration-compression
            guix-publish-configuration-nar-path
            guix-publish-configuration-cache
            guix-publish-configuration-ttl
            guix-publish-configuration-negative-ttl
            guix-publish-service-type

            gpm-configuration
            gpm-configuration?
            gpm-service-type

            urandom-seed-service-type

            rngd-configuration
            rngd-configuration?
            rngd-service-type
            rngd-service  ; deprecated

            kmscon-configuration
            kmscon-configuration?
            kmscon-service-type

            pam-limits-service-type
            pam-limits-service  ; deprecated

            greetd-service-type
            greetd-configuration
            greetd-terminal-configuration
            greetd-agreety-session
            greetd-wlgreet-session
            greetd-wlgreet-sway-session

            %base-services))

;;; Commentary:
;;;
;;; Base system services---i.e., services that 99% of the users will want to
;;; use.
;;;
;;; Code:



;;;
;;; File systems.
;;;

(define (file-system->fstab-entry file-system)
  "Return a @file{/etc/fstab} entry for @var{file-system}."
  (string-append (match (file-system-device file-system)
                   ((? file-system-label? label)
                    (string-append "LABEL="
                                   (file-system-label->string label)))
                   ((? uuid? uuid)
                    (string-append "UUID=" (uuid->string uuid)))
                   ((? string? device)
                    device))
                 "\t"
                 (file-system-mount-point file-system) "\t"
                 (file-system-type file-system) "\t"
                 (or (file-system-options file-system) "defaults") "\t"

                 ;; XXX: Omit the 'fs_freq' and 'fs_passno' fields because we
                 ;; don't have anything sensible to put in there.
                 ))

(define (file-systems->fstab file-systems)
  "Return a @file{/etc} entry for an @file{fstab} describing
@var{file-systems}."
  `(("fstab" ,(plain-file "fstab"
                          (string-append
                           "\
# This file was generated from your Guix configuration.  Any changes
# will be lost upon reboot or reconfiguration.\n\n"
                           (string-join (map file-system->fstab-entry
                                             file-systems)
                                        "\n")
                           "\n")))))

(define fstab-service-type
  ;; The /etc/fstab service.
  (service-type (name 'fstab)
                (extensions
                 (list (service-extension etc-service-type
                                          file-systems->fstab)))
                (compose concatenate)
                (extend append)
                (description
                 "Populate the @file{/etc/fstab} based on the given file
system objects.")))

(define %root-file-system-shepherd-service
  (shepherd-service
   (documentation "Take care of the root file system.")
   (provision '(root-file-system))
   (start #~(const #t))
   (stop #~(lambda _
             ;; Return #f if successfully stopped.
             (sync)

             (let ((null (%make-void-port "w")))
               ;; Redirect the default output ports.
               (set-current-output-port null)
               (set-current-error-port null)

               ;; Close /dev/console.
               (for-each close-fdes '(0 1 2))

               ;; At this point, there should be no open files left so the
               ;; root file system can be re-mounted read-only.
               (let loop ((n 10))
                 (unless (catch 'system-error
                           (lambda ()
                             (mount #f "/" #f
                                    (logior MS_REMOUNT MS_RDONLY)
                                    #:update-mtab? #f)
                             #t)
                           (const #f))
                   (unless (zero? n)
                     ;; Yield to the other fibers.  That gives logging fibers
                     ;; an opportunity to close log files so the 'mount' call
                     ;; doesn't fail with EBUSY.
                     ((@ (fibers) sleep) 1)
                     (loop (- n 1)))))

               #f)))
   (respawn? #f)))

(define root-file-system-service-type
  (shepherd-service-type 'root-file-system
                         (const %root-file-system-shepherd-service)
                         (description "Take care of syncing the root file
system and of remounting it read-only when the system shuts down.")))

(define (root-file-system-service)
  "Return a service whose sole purpose is to re-mount read-only the root file
system upon shutdown (aka. cleanly \"umounting\" root.)

This service must be the root of the service dependency graph so that its
'stop' action is invoked when shepherd is the only process left."
  (service root-file-system-service-type #f))

(define (file-system->shepherd-service-name file-system)
  "Return the symbol that denotes the service mounting and unmounting
FILE-SYSTEM."
  (symbol-append 'file-system-
                 (string->symbol (file-system-mount-point file-system))))

(define (mapped-device->shepherd-service-name md)
  "Return the symbol that denotes the shepherd service of MD, a <mapped-device>."
  (symbol-append 'device-mapping-
                 (string->symbol (string-join
                                  (mapped-device-targets md) "-"))))

(define dependency->shepherd-service-name
  (match-lambda
    ((? mapped-device? md)
     (mapped-device->shepherd-service-name md))
    ((? file-system? fs)
     (file-system->shepherd-service-name fs))))

(define (file-system-shepherd-service file-system)
  "Return the shepherd service for @var{file-system}, or @code{#f} if
@var{file-system} is not auto-mounted or doesn't have its mount point created
upon boot."
  (let ((target  (file-system-mount-point file-system))
        (create? (file-system-create-mount-point? file-system))
        (mount?  (file-system-mount? file-system))
        (dependencies (file-system-dependencies file-system))
        (requirements (file-system-shepherd-requirements file-system))
        (packages (file-system-packages (list file-system))))
    (and (or mount? create?)
         (with-imported-modules (source-module-closure
                                 '((gnu build file-systems)))
           (shepherd-service
            (provision (list (file-system->shepherd-service-name file-system)))
            (requirement `(root-file-system
                           udev
                           ,@(map dependency->shepherd-service-name dependencies)
                           ,@requirements))
            (documentation "Check, mount, and unmount the given file system.")
            (start #~(lambda args
                       #$(if create?
                             #~(mkdir-p #$target)
                             #t)

                       #$(if mount?
                             #~(let (($PATH (getenv "PATH")))
                                 ;; Make sure fsck.ext2 & co. can be found.
                                 (dynamic-wind
                                   (lambda ()
                                     ;; Don’t display the PATH settings.
                                     (with-output-to-port (%make-void-port "w")
                                       (lambda ()
                                         (set-path-environment-variable "PATH"
                                                                        '("bin" "sbin")
                                                                        '#$packages))))
                                   (lambda ()
                                     (mount-file-system
                                      (spec->file-system
                                       '#$(file-system->spec file-system))
                                      #:root "/"))
                                   (lambda ()
                                     (setenv "PATH" $PATH))))
                             #t)
                       #t))
            (stop #~(lambda args
                      ;; Normally there are no processes left at this point, so
                      ;; TARGET can be safely unmounted.

                      ;; Make sure PID 1 doesn't keep TARGET busy.
                      (chdir "/")

                      #$(if (file-system-mount-may-fail? file-system)
                            #~(catch 'system-error
                                (lambda () (umount #$target))
                                (const #f))
                            #~(umount #$target))
                      #f))

            ;; We need additional modules.
            (modules `(((gnu build file-systems)
                        #:select (mount-file-system))
                       (gnu system file-systems)
                       ,@%default-modules)))))))

(define (file-system-shepherd-services file-systems)
  "Return the list of Shepherd services for FILE-SYSTEMS."
  (let* ((file-systems (filter (lambda (x)
                                 (or (file-system-mount? x)
                                     (file-system-create-mount-point? x)))
                               file-systems)))

    (define sink
      (shepherd-service
       (provision '(file-systems))
       (requirement (cons* 'root-file-system 'user-file-systems
                           (map file-system->shepherd-service-name
                                ;; Do not require file systems with Shepherd
                                ;; requirements to provision
                                ;; 'file-systems. Many Shepherd services
                                ;; require 'file-systems, so we would likely
                                ;; deadlock.
                                (filter (lambda (file-system)
                                          (null? (file-system-shepherd-requirements file-system)))
                                        file-systems))))
       (documentation "Target for all the initially-mounted file systems")
       (start #~(const #t))
       (stop #~(const #f))))

    (define known-mount-points
      (map file-system-mount-point file-systems))

    (define user-unmount
      (shepherd-service
       (documentation "Unmount manually-mounted file systems.")
       (provision '(user-file-systems))
       (start #~(const #t))
       (stop #~(lambda args
                 (define (known? mount-point)
                   (member mount-point
                           (cons* "/proc" "/sys" '#$known-mount-points)))

                 ;; Make sure we don't keep the user's mount points busy.
                 (chdir "/")

                 (for-each (lambda (mount-point)
                             (format #t "unmounting '~a'...~%" mount-point)
                             (catch 'system-error
                               (lambda ()
                                 (umount mount-point))
                               (lambda args
                                 (let ((errno (system-error-errno args)))
                                   (format #t "failed to unmount '~a': ~a~%"
                                           mount-point (strerror errno))))))
                           (filter (negate known?) (mount-points)))
                 #f))))

    (cons* sink user-unmount
           (map file-system-shepherd-service file-systems))))

(define (file-system-fstab-entries file-systems)
  "Return the subset of @var{file-systems} that should have an entry in
@file{/etc/fstab}."
  ;; /etc/fstab is about telling fsck(8), mount(8), and umount(8) about
  ;; relevant file systems they'll have to deal with.  That excludes "pseudo"
  ;; file systems.
  ;;
  ;; In particular, things like GIO (part of GLib) use it to determine the set
  ;; of mounts, which is then used by graphical file managers and desktop
  ;; environments to display "volume" icons.  Thus, we really need to exclude
  ;; those pseudo file systems from the list.
  (remove (lambda (file-system)
            (or (member (file-system-type file-system)
                        %pseudo-file-system-types)
                (memq 'bind-mount (file-system-flags file-system))))
          file-systems))

(define (file-system-type->utilities type)
  "Return the package providing the utilities for file system TYPE, #f
otherwise."
  (assoc-ref
   `(("bcachefs" . ,bcachefs-tools)
     ("btrfs" . ,btrfs-progs)
     ("exfat" . ,exfat-utils)
     ("ext2" . ,e2fsprogs)
     ("ext3" . ,e2fsprogs)
     ("ext4" . ,e2fsprogs)
     ("fat" . ,dosfstools)
     ("f2fs" . ,f2fs-tools)
     ("jfs" . ,jfsutils)
     ("vfat" . ,dosfstools)
     ("xfs" . ,xfsprogs)
     ("zfs" . ,zfs))
   type))

(define (file-system-utilities file-systems)
  "Return a list of packages containing file system utilities for
FILE-SYSTEMS."
  (filter-map (lambda (file-system)
                (file-system-type->utilities (file-system-type file-system)))
              file-systems))

(define file-system-service-type
  (service-type (name 'file-systems)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          file-system-shepherd-services)
                       (service-extension fstab-service-type
                                          file-system-fstab-entries)
                       (service-extension profile-service-type
                                          file-system-utilities)

                       ;; Have 'user-processes' depend on 'file-systems'.
                       (service-extension user-processes-service-type
                                          (const '(file-systems)))))
                (compose concatenate)
                (extend append)
                (description
                 "Provide Shepherd services to mount and unmount the given
file systems, as well as corresponding @file{/etc/fstab} entries.")))



;;;
;;; Preserve entropy to seed /dev/urandom on boot.
;;;

(define %random-seed-file
  "/var/lib/random-seed")

(define (urandom-seed-shepherd-service _)
  "Return a shepherd service for the /dev/urandom seed."
  (list (shepherd-service
         (documentation "Preserve entropy across reboots for /dev/urandom.")
         (provision '(urandom-seed))

         ;; Depend on udev so that /dev/hwrng is available.
         (requirement '(file-systems udev))

         (start #~(lambda _
                    ;; On boot, write random seed into /dev/urandom.
                    (when (file-exists? #$%random-seed-file)
                      (call-with-input-file #$%random-seed-file
                        (lambda (seed)
                          (call-with-output-file "/dev/urandom"
                            (lambda (urandom)
                              (dump-port seed urandom)

                              ;; Writing SEED to URANDOM isn't enough: we must
                              ;; also tell the kernel to account for these
                              ;; extra bits of entropy.
                              (let ((bits (* 8 (stat:size (stat seed)))))
                                (add-to-entropy-count urandom bits)))))))

                    ;; Try writing from /dev/hwrng into /dev/urandom.
                    ;; It seems that the file /dev/hwrng always exists, even
                    ;; when there is no hardware random number generator
                    ;; available. So, we handle a failed read or any other error
                    ;; reported by the operating system.
                    (let ((buf (catch 'system-error
                                 (lambda ()
                                   (call-with-input-file "/dev/hwrng"
                                     (lambda (hwrng)
                                       (get-bytevector-n hwrng 512))))
                                 ;; Silence is golden...
                                 (const #f))))
                      (when buf
                        (call-with-output-file "/dev/urandom"
                          (lambda (urandom)
                            (put-bytevector urandom buf)
                            (let ((bits (* 8 (bytevector-length buf))))
                              (add-to-entropy-count urandom bits))))))

                    ;; Immediately refresh the seed in case the system doesn't
                    ;; shut down cleanly.
                    (call-with-input-file "/dev/urandom"
                      (lambda (urandom)
                        (let ((previous-umask (umask #o077))
                              (buf (make-bytevector 512)))
                          (mkdir-p (dirname #$%random-seed-file))
                          (get-bytevector-n! urandom buf 0 512)
                          (call-with-output-file #$%random-seed-file
                            (lambda (seed)
                              (put-bytevector seed buf)))
                          (umask previous-umask))))
                    #t))
         (stop #~(lambda _
                   ;; During shutdown, write from /dev/urandom into random seed.
                   (let ((buf (make-bytevector 512)))
                     (call-with-input-file "/dev/urandom"
                       (lambda (urandom)
                         (let ((previous-umask (umask #o077)))
                           (get-bytevector-n! urandom buf 0 512)
                           (mkdir-p (dirname #$%random-seed-file))
                           (call-with-output-file #$%random-seed-file
                             (lambda (seed)
                               (put-bytevector seed buf)))
                           (umask previous-umask))
                         #t)))))
         (modules `((rnrs bytevectors)
                    (rnrs io ports)
                    ,@%default-modules)))))

(define urandom-seed-service-type
  (service-type (name 'urandom-seed)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          urandom-seed-shepherd-service)

                       ;; Have 'user-processes' depend on 'urandom-seed'.
                       ;; This ensures that user processes and daemons don't
                       ;; start until we have seeded the PRNG.
                       (service-extension user-processes-service-type
                                          (const '(urandom-seed)))))
                (default-value #f)
                (description
                 "Seed the @file{/dev/urandom} pseudo-random number
generator (RNG) with the value recorded when the system was last shut
down.")))


;;;
;;; Add hardware random number generator to entropy pool.
;;;

(define-record-type* <rngd-configuration>
  rngd-configuration make-rngd-configuration
  rngd-configuration?
  (rng-tools rngd-configuration-rng-tools         ;file-like
             (default rng-tools))
  (device    rngd-configuration-device            ;string
             (default "/dev/hwrng")))

(define rngd-service-type
  (shepherd-service-type
    'rngd
    (lambda (config)
      (define rng-tools (rngd-configuration-rng-tools config))
      (define device (rngd-configuration-device config))

      (define rngd-command
        (list (file-append rng-tools "/sbin/rngd")
              "-f" "-r" device))

      (shepherd-service
        (documentation "Add TRNG to entropy pool.")
        (requirement '(udev))
        (provision '(trng))
        (start #~(make-forkexec-constructor '#$rngd-command))
        (stop #~(make-kill-destructor))))
    (rngd-configuration)
    (description "Run the @command{rngd} random number generation daemon to
supply entropy to the kernel's pool.")))

(define-deprecated (rngd-service #:key (rng-tools rng-tools)
                                 (device "/dev/hwrng"))
  rngd-service-type
  "Return a service that runs the @command{rngd} program from @var{rng-tools}
to add @var{device} to the kernel's entropy pool.  The service will fail if
@var{device} does not exist."
  (service rngd-service-type
           (rngd-configuration
            (rng-tools rng-tools)
            (device device))))

;;;
;;; /etc/hosts
;;;

(eval-when (expand load eval)
  (define (valid-name? name)
    "Return true if @var{name} is likely to be a valid host name."
    (false-if-exception (not (string-any char-set:whitespace name)))))

(define-compile-time-procedure (assert-valid-name (name valid-name?))
  "Ensure @var{name} is likely to be a valid host name."
  ;; TODO: RFC compliant implementation.
  (unless (valid-name? name)
    (raise
     (make-compound-condition
      (formatted-message (G_ "host name '~a' contains invalid characters")
                         name)
      (condition (&error-location
                  (location
                   (source-properties->location procedure-call-location)))))))
  name)

(define-record-type* <host> %host
  ;; XXX: Using the record type constructor becomes tiresome when
  ;; there's multiple records to make.
  make-host host?
  (address        host-address)
  (canonical-name host-canonical-name
                  (sanitize assert-valid-name))
  (aliases        host-aliases
                  (default '())
                  (sanitize (cut map assert-valid-name <>))))

(define* (host address canonical-name #:optional (aliases '()))
  "Return a new record for the host at @var{address} with the given
@var{canonical-name} and possibly @var{aliases}.

@var{address} must be a string denoting a valid IPv4 or IPv6 address, and
@var{canonical-name} and the strings listed in @var{aliases} must be valid
host names."
  (%host
   (address address)
   (canonical-name canonical-name)
   (aliases aliases)))

(define hosts-service-type
  ;; Extend etc-service-type with a entry for @file{/etc/hosts}.
  (let* ((serialize-host-record
          (lambda (record)
            (match-record record <host> (address canonical-name aliases)
              (format #f "~a~/~a~{~^~/~a~}~%" address canonical-name aliases))))
         (host-etc-service
          (lambda (lst)
            `(("hosts" ,(plain-file "hosts"
                                    (format #f "~{~a~}"
                                            (map serialize-host-record
                                                 lst))))))))
    (service-type
     (name 'etc-hosts)
     (extensions
      (list
       (service-extension etc-service-type
                          host-etc-service)))
     (compose concatenate)
     (extend append)
     (description "Populate the @file{/etc/hosts} file."))))


;;;
;;; Console & co.
;;;

(define host-name-service-type
  (shepherd-service-type
   'host-name
   (lambda (name)
     (shepherd-service
      (documentation "Initialize the machine's host name.")
      (provision '(host-name))
      (start #~(lambda _
                 (sethostname #$name)))
      (one-shot? #t)))
   (description "Initialize the machine's host name.")))

(define-deprecated (host-name-service name)
  host-name-service-type
  "Return a service that sets the host name to @var{name}."
  (service host-name-service-type name))

(define virtual-terminal-service-type
  ;; Ensure that virtual terminals run in UTF-8 mode.  This is the case by
  ;; default with recent Linux kernels, but this service allows us to ensure
  ;; this.  This service must start before any 'term-' service so that newly
  ;; created terminals inherit this property.  See
  ;; <https://bugs.gnu.org/30505> for a discussion.
  (shepherd-service-type
   'virtual-terminal
   (lambda (utf8?)
     (let ((knob "/sys/module/vt/parameters/default_utf8"))
       (shepherd-service
        (documentation "Set virtual terminals in UTF-8 module.")
        (provision '(virtual-terminal))
        (requirement '(root-file-system))
        (start #~(lambda _
                   ;; In containers /sys is read-only so don't insist on
                   ;; writing to this file.
                   (unless (= 1 (call-with-input-file #$knob read))
                     (call-with-output-file #$knob
                       (lambda (port)
                         (display 1 port))))
                   #t))
        (stop #~(const #f)))))
   #t                                             ;default to UTF-8
   (description "Ensure the Linux virtual terminals run in UTF-8 mode.")))

(define %default-console-font
  ;; Note: the 'font-gnu-unifont' package cannot be cross-compiled (yet), but
  ;; its "psf" output is the same whether it's built natively or not, hence
  ;; 'ungexp-native'.
  #~(string-append #+font-gnu-unifont:psf
                   "/share/consolefonts/Unifont-APL8x16.psf.gz"))

(define (console-font-shepherd-services tty+font)
  "Return a list of Shepherd services for each pair in TTY+FONT."
  (map (match-lambda
         ((tty . font)
          (let ((device (string-append "/dev/" tty)))
            (shepherd-service
             (documentation "Load a Unicode console font.")
             (provision (list (symbol-append 'console-font-
                                             (string->symbol tty))))

             ;; Start after mingetty has been started on TTY, otherwise the settings
             ;; are ignored.
             (requirement (list (symbol-append 'term-
                                               (string->symbol tty))))

             (start #~(lambda _
                        ;; It could be that mingetty is not fully ready yet,
                        ;; which we check by calling 'ttyname'.
                        (let loop ((i 10))
                          (unless (or (zero? i)
                                      (call-with-input-file #$device
                                        (lambda (port)
                                          (false-if-exception (ttyname port)))))
                            (usleep 500)
                            (loop (- i 1))))

                        ;; Assume the VT is already in UTF-8 mode, thanks to
                        ;; the 'virtual-terminal' service.
                        ;;
                        ;; 'setfont' returns EX_OSERR (71) when an
                        ;; KDFONTOP ioctl fails, for example.  Like
                        ;; systemd's vconsole support, let's not treat
                        ;; this as an error.
                        (case (status:exit-val
                               (system* #$(file-append kbd "/bin/setfont")
                                        "-C" #$device #$font))
                          ((0 71) #t)
                          (else #f))))
             (stop #~(const #f))
             (respawn? #f)))))
       tty+font))

(define console-font-service-type
  (service-type (name 'console-fonts)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          console-font-shepherd-services)))
                (compose concatenate)
                (extend append)
                (description
                 "Install the given fonts on the specified ttys (fonts are per
virtual console on GNU/Linux).  The value of this service is a list of
tty/font pairs.  The font can be the name of a font provided by the @code{kbd}
package or any valid argument to @command{setfont}, as in this example:

@example
`((\"tty1\" . \"LatGrkCyr-8x16\")
  (\"tty2\" . ,(file-append
                 font-tamzen
                 \"/share/kbd/consolefonts/TamzenForPowerline10x20.psf\"))
  (\"tty3\" . ,(file-append
                 font-terminus
                 \"/share/consolefonts/ter-132n\"))) ; for HDPI
@end example\n")))

(define %default-motd
  (plain-file "motd" "This is the GNU operating system, welcome!\n\n"))

(define-record-type* <login-configuration>
  login-configuration make-login-configuration
  login-configuration?
  (motd                   login-configuration-motd     ;file-like
                          (default %default-motd))
  ;; Allow empty passwords by default so that first-time users can log in when
  ;; the 'root' account has just been created.
  (allow-empty-passwords? login-configuration-allow-empty-passwords?
                          (default #t)))               ;Boolean

(define (login-pam-service config)
  "Return the list of PAM service needed for CONF."
  ;; Let 'login' be known to PAM.
  (list (unix-pam-service "login"
                          #:login-uid? #t
                          #:allow-empty-passwords?
                          (login-configuration-allow-empty-passwords? config)
                          #:motd
                          (login-configuration-motd config))))

(define login-service-type
  (service-type (name 'login)
                (extensions (list (service-extension pam-root-service-type
                                                     login-pam-service)))
                (default-value (login-configuration))
                (description
                 "Provide a console log-in service as specified by its
configuration value, a @code{login-configuration} object.")))

(define-deprecated (login-service #:optional (config (login-configuration)))
  login-service-type
  "Return a service configure login according to @var{config}, which specifies
the message of the day, among other things."
  (service login-service-type config))

(define-record-type* <agetty-configuration>
  agetty-configuration make-agetty-configuration
  agetty-configuration?
  (agetty           agetty-configuration-agetty   ;file-like
                    (default util-linux))
  (tty              agetty-configuration-tty)     ;string | #f
  (term             agetty-term                   ;string | #f
                    (default #f))
  (baud-rate        agetty-baud-rate              ;string | #f
                    (default #f))
  (auto-login       agetty-auto-login             ;list of strings | #f
                    (default #f))
  (login-program    agetty-login-program          ;gexp
                    (default (file-append shadow "/bin/login")))
  (login-pause?     agetty-login-pause?           ;Boolean
                    (default #f))
  (eight-bits?      agetty-eight-bits?            ;Boolean
                    (default #f))
  (no-reset?        agetty-no-reset?              ;Boolean
                    (default #f))
  (remote?          agetty-remote?                ;Boolean
                    (default #f))
  (flow-control?    agetty-flow-control?          ;Boolean
                    (default #f))
  (host             agetty-host                   ;string | #f
                    (default #f))
  (no-issue?        agetty-no-issue?              ;Boolean
                    (default #f))
  (init-string      agetty-init-string            ;string | #f
                    (default #f))
  (no-clear?        agetty-no-clear?              ;Boolean
                    (default #f))
  (local-line       agetty-local-line             ;always | never | auto
                    (default #f))
  (extract-baud?    agetty-extract-baud?          ;Boolean
                    (default #f))
  (skip-login?      agetty-skip-login?            ;Boolean
                    (default #f))
  (no-newline?      agetty-no-newline?            ;Boolean
                    (default #f))
  (login-options    agetty-login-options          ;string | #f
                    (default #f))
  (chroot           agetty-chroot                 ;string | #f
                    (default #f))
  (hangup?          agetty-hangup?                ;Boolean
                    (default #f))
  (keep-baud?       agetty-keep-baud?             ;Boolean
                    (default #f))
  (timeout          agetty-timeout                ;integer | #f
                    (default #f))
  (detect-case?     agetty-detect-case?           ;Boolean
                    (default #f))
  (wait-cr?         agetty-wait-cr?               ;Boolean
                    (default #f))
  (no-hints?        agetty-no-hints?              ;Boolean
                    (default #f))
  (no-hostname?     agetty-no-hostname?           ;Boolean
                    (default #f))
  (long-hostname?   agetty-long-hostname?         ;Boolean
                    (default #f))
  (erase-characters agetty-erase-characters       ;string | #f
                    (default #f))
  (kill-characters  agetty-kill-characters        ;string | #f
                    (default #f))
  (chdir            agetty-chdir                  ;string | #f
                    (default #f))
  (delay            agetty-delay                  ;integer | #f
                    (default #f))
  (nice             agetty-nice                   ;integer | #f
                    (default #f))
  ;; "Escape hatch" for passing arbitrary command-line arguments.
  (extra-options    agetty-extra-options          ;list of strings
                    (default '()))
  (shepherd-requirement agetty-shepherd-requirement  ;list of SHEPHERD requirements
                    (default '()))
;;; XXX Unimplemented for now!
;;; (issue-file     agetty-issue-file             ;file-like
;;;                 (default #f))
  )

(define (default-serial-port)
  "Return a gexp that determines a reasonable default serial port
to use as the tty.  This is primarily useful for headless systems."
  (with-imported-modules (source-module-closure
                          '((gnu build linux-boot))) ;for 'find-long-options'
    #~(begin
        ;; console=device,options
        ;; device: can be tty0, ttyS0, lp0, ttyUSB0 (serial).
        ;; options: BBBBPNF. P n|o|e, N number of bits,
        ;; F flow control (r RTS)
        (let* ((not-comma (char-set-complement (char-set #\,)))
               (command (linux-command-line))
               (agetty-specs (find-long-options "agetty.tty" command))
               (console-specs (filter (lambda (spec)
                                        (and (string-prefix? "tty" spec)
                                             (not (or
                                                   (string-prefix? "tty0" spec)
                                                   (string-prefix? "tty1" spec)
                                                   (string-prefix? "tty2" spec)
                                                   (string-prefix? "tty3" spec)
                                                   (string-prefix? "tty4" spec)
                                                   (string-prefix? "tty5" spec)
                                                   (string-prefix? "tty6" spec)
                                                   (string-prefix? "tty7" spec)
                                                   (string-prefix? "tty8" spec)
                                                   (string-prefix? "tty9" spec)))))
                                      (find-long-options "console" command)))
               (specs (append agetty-specs console-specs)))
          (match specs
            (() #f)
            ((spec _ ...)
             ;; Extract device name from first spec.
             (match (string-tokenize spec not-comma)
               ((device-name _ ...)
                device-name))))))))

(define (agetty-shepherd-service config)
  (match-record config <agetty-configuration>
    (agetty tty term baud-rate auto-login
            login-program login-pause? eight-bits? no-reset? remote? flow-control?
            host no-issue? init-string no-clear? local-line extract-baud?
            skip-login? no-newline? login-options chroot hangup? keep-baud? timeout
            detect-case? wait-cr? no-hints? no-hostname? long-hostname?
            erase-characters kill-characters chdir delay nice extra-options
            shepherd-requirement)
    (list
     (shepherd-service
      (documentation "Run agetty on a tty.")
      (provision (list (symbol-append 'term- (string->symbol (or tty "console")))))

      ;; Since the login prompt shows the host name, wait for the 'host-name'
      ;; service to be done.  Also wait for udev essentially so that the tty
      ;; text is not lost in the middle of kernel messages (see also
      ;; mingetty-shepherd-service).
      (requirement (cons* 'user-processes 'host-name 'udev
                          shepherd-requirement))

      (modules '((ice-9 match) (gnu build linux-boot)))
      (start
       (with-imported-modules  (source-module-closure
                                '((gnu build linux-boot)))
         #~(lambda args
             (let ((defaulted-tty #$(or tty (default-serial-port))))
               (apply
                (if defaulted-tty
                    (make-forkexec-constructor
                     (list #$(file-append util-linux "/sbin/agetty")
                           #$@extra-options
                           #$@(if eight-bits?
                                  #~("--8bits")
                                  #~())
                           #$@(if no-reset?
                                  #~("--noreset")
                                  #~())
                           #$@(if remote?
                                  #~("--remote")
                                  #~())
                           #$@(if flow-control?
                                  #~("--flow-control")
                                  #~())
                           #$@(if host
                                  #~("--host" #$host)
                                  #~())
                           #$@(if no-issue?
                                  #~("--noissue")
                                  #~())
                           #$@(if init-string
                                  #~("--init-string" #$init-string)
                                  #~())
                           #$@(if no-clear?
                                  #~("--noclear")
                                  #~())
;;; FIXME This doesn't work as expected. According to agetty(8), if this option
;;; is not passed, then the default is 'auto'. However, in my tests, when that
;;; option is selected, agetty never presents the login prompt, and the
;;; term-ttyS0 service respawns every few seconds.
                           #$@(if local-line
                                  #~(#$(match local-line
                                         ('auto "--local-line=auto")
                                         ('always "--local-line=always")
                                         ('never "-local-line=never")))
                                  #~())
                           #$@(if tty
                                  #~()
                                  #~("--keep-baud"))
                           #$@(if extract-baud?
                                  #~("--extract-baud")
                                  #~())
                           #$@(if skip-login?
                                  #~("--skip-login")
                                  #~())
                           #$@(if no-newline?
                                  #~("--nonewline")
                                  #~())
                           #$@(if login-options
                                  #~("--login-options" #$login-options)
                                  #~())
                           #$@(if chroot
                                  #~("--chroot" #$chroot)
                                  #~())
                           #$@(if hangup?
                                  #~("--hangup")
                                  #~())
                           #$@(if keep-baud?
                                  #~("--keep-baud")
                                  #~())
                           #$@(if timeout
                                  #~("--timeout" #$(number->string timeout))
                                  #~())
                           #$@(if detect-case?
                                  #~("--detect-case")
                                  #~())
                           #$@(if wait-cr?
                                  #~("--wait-cr")
                                  #~())
                           #$@(if no-hints?
                                  #~("--nohints?")
                                  #~())
                           #$@(if no-hostname?
                                  #~("--nohostname")
                                  #~())
                           #$@(if long-hostname?
                                  #~("--long-hostname")
                                  #~())
                           #$@(if erase-characters
                                  #~("--erase-chars" #$erase-characters)
                                  #~())
                           #$@(if kill-characters
                                  #~("--kill-chars" #$kill-characters)
                                  #~())
                           #$@(if chdir
                                  #~("--chdir" #$chdir)
                                  #~())
                           #$@(if delay
                                  #~("--delay" #$(number->string delay))
                                  #~())
                           #$@(if nice
                                  #~("--nice" #$(number->string nice))
                                  #~())
                           #$@(if auto-login
                                  (list "--autologin" auto-login)
                                  '())
                           #$@(if login-program
                                  #~("--login-program" #$login-program)
                                  #~())
                           #$@(if login-pause?
                                  #~("--login-pause")
                                  #~())
                           defaulted-tty
                           #$@(if baud-rate
                                  #~(#$baud-rate)
                                  #~())
                           #$@(if term
                                  #~(#$term)
                                  #~())))
                    #$(if tty
                          #~(const #f)         ;always fail to start
                          #~(lambda _          ;succeed, but don't do anything
                              (format #t "~a: \
no serial port console requested; doing nothing~%"
                                      '#$(car provision))
                              'idle)))
                args)))))
      (stop #~(let ((stop (make-kill-destructor)))
                (lambda (running)
                  (if (eq? 'idle running)
                      #f
                      (stop running)))))))))

(define agetty-service-type
  (service-type (name 'agetty)
                (extensions (list (service-extension shepherd-root-service-type
                                                     agetty-shepherd-service)))
                (description
                 "Provide console login using the @command{agetty}
program.")))

(define-deprecated (agetty-service config)
  agetty-service-type
  "Return a service to run agetty according to @var{config}, which specifies
the tty to run, among other things."
  (service agetty-service-type config))

(define-record-type* <mingetty-configuration>
  mingetty-configuration make-mingetty-configuration
  mingetty-configuration?
  (mingetty         mingetty-configuration-mingetty ;file-like
                    (default mingetty))
  (tty              mingetty-configuration-tty)     ;string
  (auto-login       mingetty-auto-login             ;string | #f
                    (default #f))
  (login-program    mingetty-login-program          ;gexp
                    (default #f))
  (login-pause?     mingetty-login-pause?           ;Boolean
                    (default #f))
  (clear-on-logout? mingetty-clear-on-logout?       ;Boolean
                    (default #t)))

(define (mingetty-shepherd-service config)
  (match-record config <mingetty-configuration>
    (mingetty tty auto-login login-program
              login-pause? clear-on-logout?)
    (list
     (shepherd-service
      (documentation "Run mingetty on an tty.")
      (provision (list (symbol-append 'term- (string->symbol tty))))

      ;; Since the login prompt shows the host name, wait for the 'host-name'
      ;; service to be done.  Also wait for udev essentially so that the tty
      ;; text is not lost in the middle of kernel messages (XXX).
      (requirement '(user-processes host-name udev virtual-terminal))

      (start  #~(make-forkexec-constructor
                 (list #$(file-append mingetty "/sbin/mingetty")

                       ;; Avoiding 'vhangup' allows us to avoid 'setfont'
                       ;; errors down the path where various ioctls get
                       ;; EIO--see 'hung_up_tty_ioctl' in driver/tty/tty_io.c
                       ;; in Linux.
                       "--nohangup" #$tty

                       #$@(if clear-on-logout?
                              #~()
                              #~("--noclear"))
                       #$@(if auto-login
                              #~("--autologin" #$auto-login)
                              #~())
                       #$@(if login-program
                              #~("--loginprog" #$login-program)
                              #~())
                       #$@(if login-pause?
                              #~("--loginpause")
                              #~()))))
      (stop   #~(make-kill-destructor))))))

(define mingetty-service-type
  (service-type (name 'mingetty)
                (extensions (list (service-extension shepherd-root-service-type
                                                     mingetty-shepherd-service)))
                (description
                 "Provide console login using the @command{mingetty}
program.")))

(define-deprecated (mingetty-service config)
  mingetty-service-type
  "Return a service to run mingetty according to @var{config}, which specifies
the tty to run, among other things."
  (service mingetty-service-type config))

(define-record-type* <nscd-configuration> nscd-configuration
  make-nscd-configuration
  nscd-configuration?
  (log-file    nscd-configuration-log-file        ;string
               (default #f))
  (debug-level nscd-debug-level                   ;integer
               (default 0))
  ;; TODO: See nscd.conf in glibc for other options to add.
  (caches     nscd-configuration-caches           ;list of <nscd-cache>
              (default %nscd-default-caches))
  (name-services nscd-configuration-name-services ;list of file-like
                 (default '()))
  (glibc      nscd-configuration-glibc            ;file-like
              (default (let-system (system target)
                         ;; Unless we're cross-compiling, arrange to use nscd
                         ;; from 'glibc-final' instead of pulling in a second
                         ;; glibc copy.
                         (if target
                             glibc
                             (canonical-package glibc))))))

(define-record-type* <nscd-cache> nscd-cache make-nscd-cache
  nscd-cache?
  (database              nscd-cache-database)              ;symbol
  (positive-time-to-live nscd-cache-positive-time-to-live) ;integer
  (negative-time-to-live nscd-cache-negative-time-to-live
                         (default 20))             ;integer
  (suggested-size        nscd-cache-suggested-size ;integer ("default module
                                                   ;of hash table")
                         (default 211))
  (check-files?          nscd-cache-check-files?  ;Boolean
                         (default #t))
  (persistent?           nscd-cache-persistent?   ;Boolean
                         (default #t))
  (shared?               nscd-cache-shared?       ;Boolean
                         (default #t))
  (max-database-size     nscd-cache-max-database-size ;integer
                         (default (* 32 (expt 2 20))))
  (auto-propagate?       nscd-cache-auto-propagate? ;Boolean
                         (default #t)))

(define %nscd-default-caches
  ;; Caches that we want to enable by default.  Note that when providing an
  ;; empty nscd.conf, all caches are disabled.
  (list (nscd-cache (database 'hosts)

                    ;; Aggressively cache the host name cache to improve
                    ;; privacy and resilience.
                    (positive-time-to-live (* 3600 12))
                    (negative-time-to-live 20)
                    (persistent? #t))

        (nscd-cache (database 'services)

                    ;; Services are unlikely to change, so we can be even more
                    ;; aggressive.
                    (positive-time-to-live (* 3600 24))
                    (negative-time-to-live 3600)
                    (check-files? #t)             ;check /etc/services changes
                    (persistent? #t))

        ;; Enable minimal caching of the user databases, not so much for
        ;; caching but rather to allow that uses of NSS plugins like LDAP
        ;; don't lead user processes to dlopen them (which is likely to fail
        ;; due to them not being found in $LD_LIBRARY_PATH).
        (nscd-cache (database 'passwd)
                    (positive-time-to-live 600)
                    (negative-time-to-live 20)
                    (check-files? #t)             ;check /etc/passwd changes
                    (persistent? #f))
        (nscd-cache (database 'group)
                    (positive-time-to-live 600)
                    (negative-time-to-live 20)
                    (check-files? #t)             ;check /etc/group changes
                    (persistent? #f))))

(define-deprecated %nscd-default-configuration
  #f
  ;; Default nscd configuration.
  (nscd-configuration))

(define (nscd.conf-file config)
  "Return the @file{nscd.conf} configuration file for @var{config}, an
@code{<nscd-configuration>} object."
  (define (cache->config cache)
    (match-record cache <nscd-cache>
      (database positive-time-to-live negative-time-to-live
                suggested-size check-files?
                persistent? shared? max-database-size auto-propagate?)
      (let ((database (symbol->string database)))
        (string-append "\nenable-cache\t" database "\tyes\n"

                       "positive-time-to-live\t" database "\t"
                       (number->string positive-time-to-live) "\n"
                       "negative-time-to-live\t" database "\t"
                       (number->string negative-time-to-live) "\n"
                       "suggested-size\t" database "\t"
                       (number->string suggested-size) "\n"
                       "check-files\t" database "\t"
                       (if check-files? "yes\n" "no\n")
                       "persistent\t" database "\t"
                       (if persistent? "yes\n" "no\n")
                       "shared\t" database "\t"
                       (if shared? "yes\n" "no\n")
                       "max-db-size\t" database "\t"
                       (number->string max-database-size) "\n"
                       "auto-propagate\t" database "\t"
                       (if auto-propagate? "yes\n" "no\n")))))

  (match-record config <nscd-configuration>
    (log-file debug-level caches)
    (plain-file "nscd.conf"
                (string-append "\
# Configuration of libc's name service cache daemon (nscd).\n\n"
                               (if log-file
                                   (string-append "logfile\t" log-file)
                                   "")
                               "\n"
                               (if debug-level
                                   (string-append "debug-level\t"
                                                  (number->string debug-level))
                                   "")
                               "\n"
                               (string-concatenate
                                (map cache->config caches))))))

(define (nscd-action-procedure nscd config option)
  ;; XXX: This is duplicated from mcron; factorize.
  #~(lambda (_ . args)
      ;; Run 'nscd' in a pipe so we can explicitly redirect its output to
      ;; 'current-output-port', which at this stage is bound to the client
      ;; connection.
      (let ((pipe (apply open-pipe* OPEN_READ #$nscd
                         "-f" #$config #$option args)))
        (let loop ()
          (match (read-line pipe 'concat)
            ((? eof-object?)
             (catch 'system-error
               (lambda ()
                 (zero? (close-pipe pipe)))
               (lambda args
                 ;; There's a race with the SIGCHLD handler, which could
                 ;; call 'waitpid' before 'close-pipe' above does.  If we
                 ;; get ECHILD, that means we lost the race; in that case, we
                 ;; cannot tell what the exit code was (FIXME).
                 (or (= ECHILD (system-error-errno args))
                     (apply throw args)))))
            (line
             (display line)
             (loop)))))))

(define (nscd-actions nscd config)
  "Return Shepherd actions for NSCD using CONFIG its config file."
  ;; Make this functionality available as actions because that's a simple way
  ;; to run the right 'nscd' binary with the right config file.
  (list (shepherd-configuration-action config)
        (shepherd-action
         (name 'statistics)
         (documentation "Display statistics about nscd usage.")
         (procedure (nscd-action-procedure nscd config "--statistics")))
        (shepherd-action
         (name 'invalidate)
         (documentation
          "Invalidate the given cache--e.g., 'hosts' for host name lookups.")
         (procedure (nscd-action-procedure nscd config "--invalidate")))))

(define (nscd-shepherd-service config)
  "Return a shepherd service for CONFIG, an <nscd-configuration> object."
  (let ((nscd          (file-append (nscd-configuration-glibc config)
                                    "/sbin/nscd"))
        (nscd.conf     (nscd.conf-file config))
        (name-services (nscd-configuration-name-services config)))
    (list (shepherd-service
           (documentation "Run libc's name service cache daemon (nscd).")
           (provision '(nscd))

           ;; Logs are written with syslog(3), which writes to /dev/console
           ;; when nobody's listening--ugly.  Thus, wait for syslogd.
           (requirement '(user-processes syslogd))

           (start #~(make-forkexec-constructor
                     (list #$nscd "-f" #$nscd.conf "--foreground")

                     ;; Wait for the PID file.  However, the PID file is
                     ;; written before nscd is actually listening on its
                     ;; socket (XXX).
                     #:pid-file "/var/run/nscd/nscd.pid"

                     #:environment-variables
                     (list (string-append "LD_LIBRARY_PATH="
                                          (string-join
                                           (map (lambda (dir)
                                                  (string-append dir "/lib"))
                                                (list #$@name-services))
                                           ":")))))
           (stop #~(make-kill-destructor))
           (modules `((ice-9 popen)               ;for the actions
                      (ice-9 rdelim)
                      (ice-9 match)
                      ,@%default-modules))
           (actions (nscd-actions nscd nscd.conf))))))

(define nscd-activation
  ;; Actions to take before starting nscd.
  #~(begin
      (use-modules (guix build utils))
      (mkdir-p "/var/run/nscd")
      (mkdir-p "/var/db/nscd")                    ;for the persistent cache

      ;; In libc 2.25 nscd uses inotify to watch /etc/resolv.conf, but only if
      ;; that file exists when it is started.  Thus create it here.  Note: on
      ;; some systems, such as when NetworkManager is used, /etc/resolv.conf
      ;; is a symlink, hence 'lstat'.
      (unless (false-if-exception (lstat "/etc/resolv.conf"))
        (call-with-output-file "/etc/resolv.conf"
          (lambda (port)
            (display "# This is a placeholder.\n" port))))))

(define nscd-service-type
  (service-type (name 'nscd)
                (extensions
                 (list (service-extension activation-service-type
                                          (const nscd-activation))
                       (service-extension shepherd-root-service-type
                                          nscd-shepherd-service)))

                ;; This can be extended by providing additional name services
                ;; such as nss-mdns.
                (compose concatenate)
                (extend (lambda (config name-services)
                          (nscd-configuration
                           (inherit config)
                           (name-services (append
                                           (nscd-configuration-name-services config)
                                           name-services)))))
                (default-value (nscd-configuration))
                (description
                 "Runs libc's @dfn{name service cache daemon} (nscd) with the
given configuration---an @code{<nscd-configuration>} object.  @xref{Name
Service Switch}, for an example.")))

(define-deprecated (nscd-service #:optional (config (nscd-configuration)))
  nscd-service-type
  "Return a service that runs libc's name service cache daemon (nscd) with the
given @var{config}---an @code{<nscd-configuration>} object.  @xref{Name
Service Switch}, for an example."
  (service nscd-service-type config))

;;; Snippet adapted from the GNU inetutils manual.
(define %default-syslog.conf
  (plain-file "syslog.conf" "\
# See info '(inetutils) syslogd invocation' for the documentation
# of the syslogd configuration syntax.

# Log all error messages, authentication messages of
# level notice or higher and anything of level err or
# higher to the console.
# Don't log private authentication messages!
*.alert;auth.notice;authpriv.none      -/dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none         -/var/log/messages

# Log \"debug\"-level entries and nothing else.
*.=debug                               -/var/log/debug

# Same, in a different place.
*.info;mail.none;authpriv.none         -/dev/tty12

# The authpriv file has restricted access.
# 'fsync' the file after each line (hence the lack of a leading dash).
# Also include unprivileged auth logs of info or higher level
# to conveniently gather the authentication data at the same place.
authpriv.*;auth.info                    /var/log/secure

# Log all the mail messages in one place.
mail.*                                 -/var/log/maillog
"))

(define-record-type* <syslog-configuration>
  syslog-configuration  make-syslog-configuration
  syslog-configuration?
  (syslogd              syslog-configuration-syslogd
                        (default (file-append inetutils "/libexec/syslogd")))
  (config-file          syslog-configuration-config-file
                        (default %default-syslog.conf)))

;;; Note: a static file name is used for syslog.conf so that the reload action
;;; work as intended.
(define syslog.conf "/etc/syslog.conf")

(define (syslog-etc configuration)
  (match-record configuration <syslog-configuration>
    (config-file)
    (list `(,(basename syslog.conf) ,config-file))))

(define (syslog-shepherd-service config)
  (define config-file
    (syslog-configuration-config-file config))

  (shepherd-service
   (documentation "Run the syslog daemon (syslogd).")
   (provision '(syslogd))
   (requirement '(user-processes))
   (actions
    (list (shepherd-configuration-action syslog.conf)
          (shepherd-action
           (name 'reload)
           (documentation "Reload the configuration file from disk.")
           (procedure
            #~(lambda (pid)
                (if pid
                    (begin
                      (kill pid SIGHUP)
                      (display #$(G_ "Service syslog has been asked to \
reload its settings file.")))
                    (display #$(G_ "Service syslog is not running."))))))))
   ;; Note: a static file name is used for syslog.conf so that the reload
   ;; action work as intended.
   (start #~(make-forkexec-constructor
             (list #$(syslog-configuration-syslogd config)
                   #$(string-append "--rcfile=" syslog.conf))
             #:file-creation-mask #o137
             #:pid-file "/var/run/syslog.pid"))
   (stop #~(make-kill-destructor))))

(define syslog-service-type
  (service-type
   (name 'syslog)
   (default-value (syslog-configuration))
   (extensions (list (service-extension shepherd-root-service-type
                                        (compose list syslog-shepherd-service))
                     (service-extension etc-service-type syslog-etc)))
   (description "Run the syslog daemon, @command{syslogd}, which is
responsible for logging system messages.")))

(define-deprecated (syslog-service #:optional (config (syslog-configuration)))
  syslog-service-type
  "Return a service that runs @command{syslogd} and takes
@var{<syslog-configuration>} as a parameter.

@xref{syslogd invocation,,, inetutils, GNU Inetutils}, for more
information on the configuration file syntax."
  (service syslog-service-type config))


(define pam-limits-service-type
  (let ((pam-extension
         (lambda (limits-file)
           (pam-extension
            (transformer
             (lambda (pam)
               (let ((pam-limits (pam-entry
                                  (control "required")
                                  (module "pam_limits.so")
                                  (arguments
                                   (list #~(string-append "conf=" #$limits-file))))))
                 (if (member (pam-service-name pam)
                             '("login" "greetd" "su" "slim" "gdm-password"
                               "sddm" "lightdm" "sudo" "sshd"))
                     (pam-service
                      (inherit pam)
                      (session (cons pam-limits
                                     (pam-service-session pam))))
                     pam)))))))
        (make-limits-file
         (match-lambda
           ;; XXX: Using file-like objects is deprecated, use lists instead.
           ;;      This is to be reduced into the list? case when the deprecated
           ;;      code gets removed.
           ((? file-like? obj)
            (warning (G_ "Using file-like value for \
'pam-limits-service-type' is deprecated~%"))
            obj)
           ((? list? lst)
            (plain-file "limits.conf"
                        (string-join (map pam-limits-entry->string lst)
                                     "\n" 'suffix)))
           (_ (raise
               (formatted-message
                (G_ "invalid input for 'pam-limits-service-type'~%")))))))

    (service-type
     (name 'limits)
     (extensions
      (list (service-extension pam-root-service-type
                               (lambda (config)
                                 (list (pam-extension (make-limits-file config)))))))
     (description
      "Use the @code{pam_limits} authentication module to set the specified
resource usage limits.")
     (default-value '()))))

(define-deprecated (pam-limits-service #:optional (limits '()))
  pam-limits-service-type
  "Return a service that makes selected programs respect the list of
pam-limits-entry specified in LIMITS via pam_limits.so."
  (service pam-limits-service-type
           (plain-file "limits.conf"
                       (string-join (map pam-limits-entry->string limits)
                                    "\n"))))


;;;
;;; Guix services.
;;;

(define* (guix-build-accounts count #:key
                              (group "guixbuild")
                              (shadow shadow))
  "Return a list of COUNT user accounts for Guix build users with the given
GID."
  (unfold (cut > <> count)
          (lambda (n)
            (user-account
             (name (format #f "guixbuilder~2,'0d" n))
             (system? #t)
             (group group)

             ;; guix-daemon expects GROUP to be listed as a
             ;; supplementary group too:
             ;; <http://lists.gnu.org/archive/html/bug-guix/2013-01/msg00239.html>.
             (supplementary-groups (list group "kvm"))

             (comment (format #f "Guix Build User ~2d" n))
             (home-directory "/var/empty")
             (shell (file-append shadow "/sbin/nologin"))))
          1+
          1))

(define not-config?
  ;; Select (guix …) and (gnu …) modules, except (guix config).
  (match-lambda
    (('guix 'config) #f)
    (('guix rest ...) #t)
    (('gnu rest ...) #t)
    (rest #f)))

(define (substitute-key-authorization keys guix)
  "Return a gexp with code to register KEYS, a list of files containing 'guix
archive' public keys, with GUIX."
  (define default-acl
    (with-extensions (list guile-gcrypt)
      (with-imported-modules `(((guix config) => ,(make-config.scm))
                               ,@(source-module-closure '((guix pki))
                                                        #:select? not-config?))
        (computed-file "acl"
                       #~(begin
                           (use-modules (guix pki)
                                        (gcrypt pk-crypto)
                                        (ice-9 rdelim))

                           (define keys
                             (map (lambda (file)
                                    (call-with-input-file file
                                      (compose string->canonical-sexp
                                               read-string)))
                                  '(#$@keys)))

                           (call-with-output-file #$output
                             (lambda (port)
                               (write-acl (public-keys->acl keys)
                                          port))))))))

  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))
        (define acl-file #$%acl-file)
        ;; If the ACL already exists, move it out of the way.  Create a backup
        ;; if it's a regular file: it's likely that the user manually updated
        ;; it with 'guix archive --authorize'.
        (if (file-exists? acl-file)
            (if (and (symbolic-link? acl-file)
                     (store-file-name? (readlink acl-file)))
                (delete-file acl-file)
                (rename-file acl-file (string-append acl-file ".bak")))
            (mkdir-p (dirname acl-file)))

        ;; Installed the declared ACL.
        (symlink #+default-acl acl-file))))

(define (install-channels-file channels)
  "Return a gexp with code to install CHANNELS, a list of channels, in
/etc/guix/channels.scm."
  (define channels-file
    (scheme-file "channels.scm"
                 `(list ,@(map channel->code channels))))

  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        ;; If channels.scm already exists, move it out of the way. Create a
        ;; backup if it's a regular file: it's likely that the user
        ;; manually defined it.
        (if (file-exists? "/etc/guix/channels.scm")
            (if (and (symbolic-link? "/etc/guix/channels.scm")
                     (store-file-name? (readlink "/etc/guix/channels.scm")))
                (delete-file "/etc/guix/channels.scm")
                (rename-file "/etc/guix/channels.scm"
                             "/etc/guix/channels.scm.bak"))
            (mkdir-p "/etc/guix"))

        ;; Installed the declared channels.
        (symlink #+channels-file "/etc/guix/channels.scm"))))

(define %default-authorized-guix-keys
  ;; List of authorized substitute keys.
  (list (file-append guix "/share/guix/berlin.guix.gnu.org.pub")
        (file-append guix "/share/guix/bordeaux.guix.gnu.org.pub")))

(define (guix-machines-files-installation machines)
  "Return a gexp to install MACHINES, a list of gexps, as
/etc/guix/machines.scm, which is used for offloading."
  (with-imported-modules '((guix build utils))
    #~(begin
        (use-modules (guix build utils))

        (define machines-file
          "/etc/guix/machines.scm")

        ;; If MACHINES-FILE already exists, move it out of the way.
        ;; Create a backup if it's a regular file: it's likely that the
        ;; user manually updated it.
        (let ((stat (false-if-exception (lstat machines-file))))
          (if stat
              (if (and (eq? 'symlink (stat:type stat))
                       (store-file-name? (readlink machines-file)))
                  (delete-file machines-file)
                  (rename-file machines-file
                               (string-append machines-file ".bak")))
              (mkdir-p (dirname machines-file))))

        ;; Installed the declared machines file.
        (symlink #+(scheme-file "machines.scm"
                                #~((@ (srfi srfi-1) append-map)
                                   (lambda (entry)
                                     (if (build-machine? entry)
                                         (list entry)
                                         entry))
                                   #$machines))
                 machines-file))))

(define-record-type* <guix-configuration>
  guix-configuration make-guix-configuration
  guix-configuration?
  (guix             guix-configuration-guix       ;file-like
                    (default guix))
  (build-group      guix-configuration-build-group ;string
                    (default "guixbuild"))
  (build-accounts   guix-configuration-build-accounts ;integer
                    (default 10))
  (authorize-key?   guix-configuration-authorize-key? ;Boolean
                    (default #t))
  (authorized-keys  guix-configuration-authorized-keys ;list of gexps
                    (default %default-authorized-guix-keys))
  (use-substitutes? guix-configuration-use-substitutes? ;Boolean
                    (default #t))
  (substitute-urls  guix-configuration-substitute-urls ;list of strings
                    (default %default-substitute-urls))
  (generate-substitute-key? guix-configuration-generate-substitute-key?
                            (default #t))         ;Boolean
  (channels         guix-configuration-channels ;file-like
                    (default #f))
  (chroot-directories guix-configuration-chroot-directories ;list of file-like/strings
                      (default '()))
  (max-silent-time  guix-configuration-max-silent-time ;integer
                    (default 3600))
  (timeout          guix-configuration-timeout    ;integer
                    (default (* 3600 24)))
  (log-compression  guix-configuration-log-compression
                    (default 'gzip))
  (discover?        guix-configuration-discover?
                    (default #f))
  (extra-options    guix-configuration-extra-options ;list of strings
                    (default '()))
  (log-file         guix-configuration-log-file   ;string
                    (default "/var/log/guix-daemon.log"))
  (http-proxy       guix-http-proxy               ;string | #f
                    (default #f))
  (tmpdir           guix-tmpdir                   ;string | #f
                    (default #f))
  (build-machines   guix-configuration-build-machines ;list of gexps | '()
                    (default '()))
  (environment      guix-configuration-environment  ;list of strings
                    (default '())))

(define %default-guix-configuration
  (guix-configuration))

(define shepherd-set-http-proxy-action
  ;; Shepherd action to change the HTTP(S) proxy.
  (shepherd-action
   (name 'set-http-proxy)
   (documentation
    "Change the HTTP(S) proxy used by 'guix-daemon' and restart it.")
   (procedure #~(lambda* (_ #:optional proxy)
                  (let ((environment (environ)))
                    ;; A bit of a hack: communicate PROXY to the 'start'
                    ;; method via environment variables.
                    (if proxy
                        (begin
                          (format #t "changing HTTP/HTTPS \
proxy of 'guix-daemon' to ~s...~%"
                                  proxy)
                          (setenv "http_proxy" proxy))
                        (begin
                          (format #t "clearing HTTP/HTTPS \
proxy of 'guix-daemon'...~%")
                          (unsetenv "http_proxy")))
                    (perform-service-action (lookup-service 'guix-daemon)
                                            'restart)
                    (environ environment)
                    #t)))))

(define shepherd-discover-action
  ;; Shepherd action to enable or disable substitute servers discovery.
  (shepherd-action
   (name 'discover)
   (documentation
    "Enable or disable substitute servers discovery and restart the
'guix-daemon'.")
   (procedure #~(lambda* (_ status)
                  (let ((environment (environ)))
                    (if (and status
                             (string=? status "on"))
                        (begin
                          (format #t "enable substitute servers discovery~%")
                          (setenv "discover" "on"))
                        (begin
                          (format #t "disable substitute servers discovery~%")
                          (unsetenv "discover")))
                    (perform-service-action (lookup-service 'guix-daemon)
                                            'restart)
                    (environ environment)
                    #t)))))

(define (guix-shepherd-service config)
  "Return a <shepherd-service> for the Guix daemon service with CONFIG."
  (define locales
    (let-system (system target)
      (if (target-hurd? (or target system))
          (make-glibc-utf8-locales glibc/hurd)
          glibc-utf8-locales)))

  (match-record config <guix-configuration>
    (guix build-group build-accounts authorize-key? authorized-keys
          use-substitutes? substitute-urls max-silent-time timeout
          log-compression discover? extra-options log-file
          http-proxy tmpdir chroot-directories environment)
    (list (shepherd-service
           (documentation "Run the Guix daemon.")
           (provision '(guix-daemon))
           (requirement `(user-processes
                          ,@(if discover? '(avahi-daemon) '())))
           (actions (list shepherd-set-http-proxy-action
                          shepherd-discover-action))
           (modules '((srfi srfi-1)
                      (ice-9 match)
                      (gnu build shepherd)))
           (start
            (with-imported-modules `(((guix config) => ,(make-config.scm))
                                     ,@(source-module-closure
                                        '((gnu build shepherd))
                                        #:select? not-config?))
              #~(lambda args
                  (define proxy
                    ;; HTTP/HTTPS proxy.  The 'http_proxy' variable is set by
                    ;; the 'set-http-proxy' action.
                    (or (getenv "http_proxy") #$http-proxy))

                  (define discover?
                    (or (getenv "discover") #$discover?))

                  ;; Start the guix-daemon from a container, when supported,
                  ;; to solve an installation issue. See the comment below for
                  ;; more details.
                  (fork+exec-command/container
                   (cons* #$(file-append guix "/bin/guix-daemon")
                          "--build-users-group" #$build-group
                          "--max-silent-time"
                          #$(number->string max-silent-time)
                          "--timeout" #$(number->string timeout)
                          "--log-compression"
                          #$(symbol->string log-compression)
                          #$@(if use-substitutes?
                                 '()
                                 '("--no-substitutes"))
                          (string-append "--discover="
                                         (if discover? "yes" "no"))
                          "--substitute-urls" #$(string-join substitute-urls)
                          #$@extra-options

                          ;; Add CHROOT-DIRECTORIES and all their dependencies
                          ;; (if these are store items) to the chroot.
                          (append-map
                           (lambda (file)
                             (append-map (lambda (directory)
                                           (list "--chroot-directory"
                                                 directory))
                                         (call-with-input-file file
                                           read)))
                           '#$(map references-file
                                   chroot-directories)))

                   ;; When running the installer, we need guix-daemon to
                   ;; operate from within the same MNT namespace as the
                   ;; installation container. In that case only, enter the
                   ;; namespace of the process PID passed as start argument.
                   ;; Otherwise, for symmetry purposes enter the caller
                   ;; namespaces which is a no-op.
                   #:pid (match args
                           ((pid) (string->number pid))
                           (else (getpid)))

                   #:environment-variables
                   (append (list #$@(if tmpdir
                                        (list (string-append "TMPDIR=" tmpdir))
                                        '())

                                 ;; Make sure we run in a UTF-8 locale so that
                                 ;; 'guix offload' correctly restores nars
                                 ;; that contain UTF-8 file names such as
                                 ;; 'nss-certs'.  See
                                 ;; <https://bugs.gnu.org/32942>.
                                 (string-append "GUIX_LOCPATH="
                                                #$locales "/lib/locale")
                                 "LC_ALL=en_US.utf8"
                                 ;; Make 'tar' and 'gzip' available so
                                 ;; that 'guix perform-download' can use
                                 ;; them when downloading from Software
                                 ;; Heritage via '(guix swh)'.
                                 (string-append "PATH="
                                                #$(file-append tar "/bin") ":"
                                                #$(file-append gzip "/bin")))
                           (if proxy
                               (list (string-append "http_proxy=" proxy)
                                     (string-append "https_proxy=" proxy))
                               '())
                           '#$environment)

                   #:log-file #$log-file))))
           (stop #~(make-kill-destructor))))))

(define (guix-accounts config)
  "Return the user accounts and user groups for CONFIG."
  (cons (user-group
         (name (guix-configuration-build-group config))
         (system? #t)

         ;; Use a fixed GID so that we can create the store with the right
         ;; owner.
         (id 30000))
        (guix-build-accounts (guix-configuration-build-accounts config)
                             #:group (guix-configuration-build-group config))))

(define (guix-activation config)
  "Return the activation gexp for CONFIG."
  (match-record config <guix-configuration>
    (guix generate-substitute-key? authorize-key? authorized-keys channels)
    #~(begin
        ;; Assume that the store has BUILD-GROUP as its group.  We could
        ;; otherwise call 'chown' here, but the problem is that on a COW overlayfs,
        ;; chown leads to an entire copy of the tree, which is a bad idea.

        ;; Generate a key pair and optionally authorize substitute server keys.
        (unless (or #$(not generate-substitute-key?)
                    (file-exists? "/etc/guix/signing-key.pub"))
          (system* #$(file-append guix "/bin/guix") "archive"
                   "--generate-key"))

        ;; Optionally install /etc/guix/acl...
        #$(if authorize-key?
              (substitute-key-authorization authorized-keys guix)
              #~#f)

        ;; ... and /etc/guix/channels.scm...
        #$(and channels (install-channels-file channels))

        ;; ... and /etc/guix/machines.scm.
        #$(if (null? (guix-configuration-build-machines config))
              #~#f
              (guix-machines-files-installation
               #~(list #$@(guix-configuration-build-machines config)))))))

(define-record-type* <guix-extension>
  guix-extension make-guix-extension
  guix-extension?
  (authorized-keys guix-extension-authorized-keys ;list of file-like
                    (default '()))
  (substitute-urls guix-extension-substitute-urls ;list of strings
                    (default '()))
  (build-machines  guix-extension-build-machines  ;list of gexps
                   (default '()))
  (chroot-directories guix-extension-chroot-directories ;list of file-like/strings
                      (default '())))

(define (guix-extension-merge a b)
  (guix-extension
   (authorized-keys (append (guix-extension-authorized-keys a)
                            (guix-extension-authorized-keys b)))
   (substitute-urls (append (guix-extension-substitute-urls a)
                            (guix-extension-substitute-urls b)))
   (build-machines (append (guix-extension-build-machines a)
                           (guix-extension-build-machines b)))
   (chroot-directories (append (guix-extension-chroot-directories a)
                               (guix-extension-chroot-directories b)))))

(define guix-service-type
  (service-type
   (name 'guix)
   (extensions
    (list (service-extension shepherd-root-service-type guix-shepherd-service)
          (service-extension account-service-type guix-accounts)
          (service-extension activation-service-type guix-activation)
          (service-extension profile-service-type
                             (compose list guix-configuration-guix))))

   ;; Extensions can specify extra directories to add to the build chroot,
   ;; extra substitute urls and extra authorized keys
   (compose (lambda (args) (fold guix-extension-merge (guix-extension) args)))
   (extend (lambda (config extension)
             (guix-configuration
              (inherit config)
              (authorized-keys (append (guix-extension-authorized-keys extension)
                                       (guix-configuration-authorized-keys config)))
              (substitute-urls (append (guix-extension-substitute-urls extension)
                                       (guix-configuration-substitute-urls config)))
              (build-machines
               (and (or (guix-configuration-build-machines config)
                        (pair? (guix-extension-build-machines extension)))
                    (append (guix-configuration-build-machines config)
                            (guix-extension-build-machines extension))))
              (chroot-directories
               (append (guix-extension-chroot-directories extension)
                       (guix-configuration-chroot-directories config))))))

   (default-value (guix-configuration))
   (description
    "Run the build daemon of GNU@tie{}Guix, aka. @command{guix-daemon}.")))


(define-record-type* <guix-publish-configuration>
  guix-publish-configuration make-guix-publish-configuration
  guix-publish-configuration?
  (guix    guix-publish-configuration-guix        ;file-like
           (default guix))
  (port    guix-publish-configuration-port        ;number
           (default 80))
  (host    guix-publish-configuration-host        ;string
           (default "localhost"))
  (advertise? guix-publish-advertise?             ;boolean
              (default #f))
  (compression       guix-publish-configuration-compression
                     (thunked)
                     (default (default-compression this-record)))
  (nar-path    guix-publish-configuration-nar-path ;string
               (default "nar"))
  (cache       guix-publish-configuration-cache   ;#f | string
               (default #f))
  (cache-bypass-threshold guix-publish-configuration-cache-bypass-threshold
                          (default (* 10 (expt 2 20)))) ;integer
  (workers     guix-publish-configuration-workers ;#f | integer
               (default #f))
  (ttl         guix-publish-configuration-ttl     ;#f | integer
               (default #f))
  (negative-ttl guix-publish-configuration-negative-ttl ;#f | integer
                (default #f)))

(define (default-compression config)
  "Return the default 'guix publish' compression according to CONFIG, and
raise a deprecation warning if the 'compression-level' field was used."
  ;; Default to low compression levels when there's no cache so that users
  ;; get good bandwidth by default.
  (if (guix-publish-configuration-cache config)
      '(("gzip" 5) ("zstd" 19))
      '(("gzip" 3) ("zstd" 3))))               ;zstd compresses faster

(define (guix-publish-shepherd-service config)
  (define (config->compression-options config)
    (match (guix-publish-configuration-compression config)
      (()                                   ;empty list means "no compression"
       '("-C0"))
      (lst
       (append-map (match-lambda
                     ((type level)
                      `("-C" ,(string-append type ":"
                                             (number->string level)))))
                   lst))))

  (match-record config <guix-publish-configuration>
    (guix port host nar-path cache workers ttl negative-ttl
          cache-bypass-threshold advertise?)
    (let ((command #~(list #$(file-append guix "/bin/guix")
                           "publish" "-u" "guix-publish"
                           "-p" #$(number->string port)
                           #$@(config->compression-options config)
                           (string-append "--nar-path=" #$nar-path)
                           (string-append "--listen=" #$host)
                           #$@(if advertise?
                                  #~("--advertise")
                                  #~())
                           #$@(if workers
                                  #~((string-append "--workers="
                                                    #$(number->string
                                                       workers)))
                                  #~())
                           #$@(if ttl
                                  #~((string-append "--ttl="
                                                    #$(number->string ttl)
                                                    "s"))
                                  #~())
                           #$@(if negative-ttl
                                  #~((string-append "--negative-ttl="
                                                    #$(number->string negative-ttl)
                                                    "s"))
                                  #~())
                           #$@(if cache
                                  #~((string-append "--cache=" #$cache)
                                     #$(string-append
                                        "--cache-bypass-threshold="
                                        (number->string
                                         cache-bypass-threshold)))
                                  #~())))
          (options #~(#:environment-variables
                      ;; Make sure we run in a UTF-8 locale so we can produce
                      ;; nars for packages that contain UTF-8 file names such
                      ;; as 'nss-certs'.  See <https://bugs.gnu.org/26948>.
                      (list (string-append "GUIX_LOCPATH="
                                           #$(libc-utf8-locales-for-target)
                                           "/lib/locale")
                            "LC_ALL=en_US.utf8")
                      #:log-file "/var/log/guix-publish.log"))
          (endpoints #~(let ((ai (false-if-exception
                                  (getaddrinfo #$host
                                               #$(number->string port)
                                               AI_NUMERICSERV))))
                         (if (pair? ai)
                             (list (endpoint (addrinfo:addr (car ai))))
                             '()))))
      (list (shepherd-service
             (provision '(guix-publish))
             (requirement `(user-processes
                            guix-daemon
                            ,@(if advertise? '(avahi-daemon) '())))

             ;; Use lazy socket activation unless ADVERTISE? is true: in that
             ;; case the process should start right away to advertise itself.
             (start #~(make-systemd-constructor
                       #$command #$endpoints #$@options
                       #:lazy-start? #$(not advertise?)))
             (stop #~(make-systemd-destructor)))))))

(define %guix-publish-accounts
  (list (user-group (name "guix-publish") (system? #t))
        (user-account
         (name "guix-publish")
         (group "guix-publish")
         (system? #t)
         (comment "guix publish user")
         (home-directory "/var/empty")
         (shell (file-append shadow "/sbin/nologin")))))

(define %guix-publish-log-rotations
  (list (log-rotation
         (files (list "/var/log/guix-publish.log"))
         (options `("rotate 4"                    ;don't keep too many of them
                    ,@%default-log-rotation-options)))))

(define (guix-publish-activation config)
  (let ((cache (guix-publish-configuration-cache config)))
    (if cache
        (with-imported-modules '((guix build utils))
          #~(begin
              (use-modules (guix build utils))

              (mkdir-p #$cache)
              (let* ((pw  (getpw "guix-publish"))
                     (uid (passwd:uid pw))
                     (gid (passwd:gid pw)))
                (chown #$cache uid gid))))
        #t)))

(define guix-publish-service-type
  (service-type (name 'guix-publish)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          guix-publish-shepherd-service)
                       (service-extension account-service-type
                                          (const %guix-publish-accounts))
                       (service-extension rottlog-service-type
                                          (const %guix-publish-log-rotations))
                       (service-extension activation-service-type
                                          guix-publish-activation)))
                (default-value (guix-publish-configuration))
                (description
                 "Add a Shepherd service running @command{guix publish}, a
command that allows you to share pre-built binaries with others over HTTP.")))


;;;
;;; Udev.
;;;

(define-record-type* <udev-configuration>
  udev-configuration make-udev-configuration
  udev-configuration?
  (udev   udev-configuration-udev                 ;file-like
          (default eudev))
  (rules  udev-configuration-rules                ;list of file-like
          (default '()))
  (hardware  udev-configuration-hardware          ;list of file-like
             (default '())))

(define (udev-configurations-union subdirectory packages)
  "Return the union of the lib/udev/SUBDIRECTORY directories found in each
item of PACKAGES."
  (define build
    (with-imported-modules '((guix build union)
                             (guix build utils))
      #~(begin
          (use-modules (guix build union)
                       (guix build utils)
                       (srfi srfi-1)
                       (srfi srfi-26))

          (define %standard-locations
            '(#$(string-append "/lib/udev/" subdirectory)
                #$(string-append "/libexec/udev/" subdirectory)))

          (define (configuration-sub-directory directory)
            ;; Return the sub-directory of DIRECTORY containing udev
            ;; configurations, or #f if none was found.
            (find directory-exists?
                  (map (cut string-append directory <>) %standard-locations)))

          (union-build #$output
                       (filter-map configuration-sub-directory '#$packages)))))

  (computed-file (string-append "udev-" subdirectory) build))

(define (udev-rules-union packages)
  "Return the union of the lib/udev/rules.d directories found in each
item of PACKAGES."
  (udev-configurations-union "rules.d" packages))

(define (udev-configuration-file subdirectory file-name contents)
  "Return a directory with a udev configuration file FILE-NAME containing CONTENTS."
  (file->udev-configuration-file subdirectory file-name (plain-file file-name contents)))

(define (udev-rule file-name contents)
  "Return a directory with a udev rule file FILE-NAME containing CONTENTS."
  (udev-configuration-file "rules.d" file-name contents))

(define (udev-hardware file-name contents)
  "Return a directory with a udev hardware file FILE-NAME containing CONTENTS."
  (udev-configuration-file "hwdb.d" file-name contents))

(define (file->udev-configuration-file subdirectory file-name file)
  "Return a directory with a udev configuration file FILE-NAME which is a copy
 of FILE."
  (computed-file file-name
                 (with-imported-modules '((guix build utils))
                   #~(begin
                       (use-modules (guix build utils))

                       (define configuration-directory
                         (string-append #$output
                                        "/lib/udev/"
                                        #$subdirectory))

                       (define file-copy-dest
                         (string-append configuration-directory "/" #$file-name))

                       (mkdir-p configuration-directory)
                       (copy-file #$file file-copy-dest)))))

(define (file->udev-rule file-name file)
  "Return a directory with a udev rule file FILE-NAME which is a copy of FILE."
  (file->udev-configuration-file "rules.d" file-name file))

(define (file->udev-hardware file-name file)
  "Return a directory with a udev hardware file FILE-NAME which is a copy of FILE."
  (file->udev-configuration-file "hwdb.d" file-name file))

(define kvm-udev-rule
  ;; Return a directory with a udev rule that changes the group of /dev/kvm to
  ;; "kvm" and makes it #o660.  Apparently QEMU-KVM used to ship this rule,
  ;; but now we have to add it by ourselves.

  ;; Build users are part of the "kvm" group, so we can fearlessly make
  ;; /dev/kvm 660 (see <http://bugs.gnu.org/18994>, for background.)
  (udev-rule "90-kvm.rules"
             "KERNEL==\"kvm\", GROUP=\"kvm\", MODE=\"0660\"\n"))

(define (udev-shepherd-service config)
  ;; Return a <shepherd-service> for UDEV with RULES.
  (let ((udev (udev-configuration-udev config)))
    (list
     (shepherd-service
      (provision '(udev))

      ;; Udev needs /dev to be a 'devtmpfs' mount so that new device nodes can
      ;; be added: see
      ;; <http://www.linuxfromscratch.org/lfs/view/development/chapter07/udev.html>.
      (requirement '(root-file-system))

      (documentation "Populate the /dev directory, dynamically.")
      (start
       (with-imported-modules (source-module-closure
                               '((gnu build linux-boot)))
         #~(lambda ()
             (define udevd
               ;; 'udevd' from eudev.
               #$(file-append udev "/sbin/udevd"))

             (define (wait-for-udevd)
               ;; Wait until someone's listening on udevd's control
               ;; socket.
               (let ((sock (socket AF_UNIX SOCK_SEQPACKET 0)))
                 (let try ()
                   (catch 'system-error
                     (lambda ()
                       (connect sock PF_UNIX "/run/udev/control")
                       (close-port sock))
                     (lambda args
                       (format #t "waiting for udevd...~%")
                       (usleep 500000)
                       (try))))))

             ;; Allow udev to find the modules.
             (setenv "LINUX_MODULE_DIRECTORY"
                     "/run/booted-system/kernel/lib/modules")

             (let* ((kernel-release
                     (utsname:release (uname)))
                    (linux-module-directory
                     (getenv "LINUX_MODULE_DIRECTORY"))
                    (directory
                     (string-append linux-module-directory "/"
                                    kernel-release))
                    (old-umask (umask #o022)))
               ;; If we're in a container, DIRECTORY might not exist,
               ;; for instance because the host runs a different
               ;; kernel.  In that case, skip it; we'll just miss a few
               ;; nodes like /dev/fuse.
               (when (file-exists? directory)
                 (make-static-device-nodes directory))
               (umask old-umask))

             (let ((pid (fork+exec-command
                         (list udevd)
                         #:environment-variables
                         (cons*
                          ;; The first one is for udev, the second one for
                          ;; eudev.
                          "UDEV_CONFIG_FILE=/etc/udev/udev.conf"
                          "EUDEV_RULES_DIRECTORY=/etc/udev/rules.d"
                          (string-append "LINUX_MODULE_DIRECTORY="
                                         (getenv "LINUX_MODULE_DIRECTORY"))
                          (default-environment-variables)))))
               ;; Wait until udevd is up and running.  This appears to
               ;; be needed so that the events triggered below are
               ;; actually handled.
               (wait-for-udevd)

               ;; Trigger device node creation.
               (system* #$(file-append udev "/bin/udevadm")
                        "trigger" "--action=add")

               ;; Wait for things to settle down.
               (system* #$(file-append udev "/bin/udevadm")
                        "settle")
               pid))))
      (stop #~(make-kill-destructor))

      ;; When halting the system, 'udev' is actually killed by
      ;; 'user-processes', i.e., before its own 'stop' method was called.
      ;; Thus, make sure it is not respawned.
      (respawn? #f)
      ;; We need additional modules.
      (modules `((gnu build linux-boot)           ;'make-static-device-nodes'
                 ,@%default-modules))))))

(define udev.conf
  (computed-file "udev.conf"
                 #~(call-with-output-file #$output
                     (lambda (port)
                       (format port "udev_rules=\"/etc/udev/rules.d\"~%")))))

(define (udev-etc config)
  (match-record config <udev-configuration>
    (udev rules hardware)
    (let* ((hardware
            (udev-configurations-union "hwdb.d" (cons* udev hardware)))
           (hwdb.bin
            (computed-file
             "hwdb.bin"
             (with-imported-modules '((guix build utils))
               #~(begin
                   (use-modules (guix build utils))
                   (setenv "UDEV_HWDB_PATH" #$hardware)
                   (invoke #+(file-append udev "/bin/udevadm")
                           "hwdb"
                           "--update"
                           "-o" #$output))))))
    `(("udev"
       ,(file-union "udev"
                    `(("udev.conf" ,udev.conf)
                      ("rules.d"
                       ,(udev-rules-union (cons* udev kvm-udev-rule
                                                 rules)))
                      ("hwdb.bin" ,hwdb.bin))))))))

(define udev-service-type
  (service-type (name 'udev)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          udev-shepherd-service)
                       (service-extension etc-service-type udev-etc)))
                (compose concatenate)           ;concatenate the list of rules
                (extend (lambda (config extensions)
                          (let ((initial-rules
                                 (udev-configuration-rules config))
                                (initial-hardware
                                 (udev-configuration-hardware config)))
                            (udev-configuration
                             (inherit config)
                             (rules (append initial-rules extensions))
                             (hardware (append initial-hardware extensions))))))
                (default-value (udev-configuration))
                (description
                 "Run @command{udev}, which populates the @file{/dev}
directory dynamically.  Get extra rules from the packages listed in the
@code{rules} field of its value, @code{udev-configuration} object.")))

(define-deprecated (udev-service #:key (udev eudev) (rules '()))
  udev-service-type
  "Run @var{udev}, which populates the @file{/dev} directory dynamically.  Get
extra rules from the packages listed in @var{rules}."
  (service udev-service-type
           (udev-configuration (udev udev) (rules rules))))

(define* (udev-rules-service name rules #:key (groups '()))
  "Return a service that extends udev-service-type with RULES and
account-service-type with GROUPS as system groups.  This works by creating a
singleton service type NAME-udev-rules, of which the returned service is an
instance."
  (let* ((name (symbol-append name '-udev-rules))
         (account-extension
          (const (map (lambda (group)
                        (user-group (name group) (system? #t)))
                      groups)))
         (udev-extension (const (list rules)))
         (type (service-type
                (name name)
                (extensions (list
                             (service-extension
                              account-service-type account-extension)
                             (service-extension
                              udev-service-type udev-extension)))
                (description "This service adds udev rules."))))
    (service type #f)))

(define (udev-hardware-service name hardware-files)
  "Return a service that extends udev-service-type with HARDWARE-FILES, named
NAME-udev-hardware."
  (let* ((name (symbol-append name '-udev-hardware))
         (udev-extension (const (list hardware-files)))
         (type (service-type
                (name name)
                (extensions (list
                             (service-extension
                              udev-service-type udev-extension)))
                (description "This service adds udev hardware files."))))
    (service type #f)))

(define (swap-space->shepherd-service-name space)
  (let ((target (swap-space-target space)))
    (symbol-append 'swap-
                   (string->symbol
                    (cond ((uuid? target)
                           (uuid->string target))
                          ((file-system-label? target)
                           (file-system-label->string target))
                          (else
                           target))))))

; TODO Remove after deprecation
(define (swap-deprecated->shepherd-service-name sdep)
  (symbol-append 'swap-
                 (string->symbol
                  (cond ((uuid? sdep)
                         (string-take (uuid->string sdep) 6))
                        ((file-system-label? sdep)
                         (file-system-label->string sdep))
                        (else
                         sdep)))))

(define swap->shepherd-service-name
  (match-lambda ((? swap-space? space)
                 (swap-space->shepherd-service-name space))
                (sdep
                 (swap-deprecated->shepherd-service-name sdep))))

(define swap-service-type
  (shepherd-service-type
   'swap
   (lambda (swap)
     (define requirements
       (cond ((swap-space? swap)
              (map dependency->shepherd-service-name
                   (swap-space-dependencies swap)))
             ; TODO Remove after deprecation
             ((and (string? swap) (string-prefix? "/dev/mapper/" swap))
              (list (symbol-append 'device-mapping-
                                   (string->symbol (basename swap)))))
             (else
              '())))

     (define device-lookup
       ;; The generic 'find-partition' procedures could return a partition
       ;; that's not swap space, but that's unlikely.
       (cond ((swap-space? swap)
              (let ((target (swap-space-target swap)))
                (cond ((uuid? target)
                       #~(find-partition-by-uuid #$(uuid-bytevector target)))
                      ((file-system-label? target)
                       #~(find-partition-by-label
                          #$(file-system-label->string target)))
                      (else
                       target))))
             ; TODO Remove after deprecation
             ((uuid? swap)
              #~(find-partition-by-uuid #$(uuid-bytevector swap)))
             ((file-system-label? swap)
              #~(find-partition-by-label
                 #$(file-system-label->string swap)))
             (else
              swap)))

     (with-imported-modules (source-module-closure '((gnu build file-systems)))
       (shepherd-service
        (provision (list (swap->shepherd-service-name swap)))
        (requirement `(udev ,@requirements))
        (documentation "Enable the given swap space.")
        (modules `((gnu build file-systems)
                   ,@%default-modules))
        (start #~(lambda ()
                   (let ((device #$device-lookup))
                     (and device
                          (begin
                            (restart-on-EINTR (swapon device
                                                      #$(if (swap-space? swap)
                                                            (swap-space->flags-bit-mask
                                                             swap)
                                                            0)))
                            #t)))))
        (stop #~(lambda _
                  (let ((device #$device-lookup))
                    (when device
                      (restart-on-EINTR (swapoff device)))
                    #f)))
        (respawn? #f))))
   (description "Turn on the virtual memory swap area.")))

(define (swap-service swap)
  "Return a service that uses @var{swap} as a swap space."
  (service swap-service-type swap))

(define %default-gpm-options
  ;; Default options for GPM.
  '("-m" "/dev/input/mice" "-t" "ps2"))

(define-record-type* <gpm-configuration>
  gpm-configuration make-gpm-configuration gpm-configuration?
  (gpm      gpm-configuration-gpm                 ;file-like
            (default gpm))
  (options  gpm-configuration-options             ;list of strings
            (default %default-gpm-options)))

(define (gpm-shepherd-service config)
  (match-record config <gpm-configuration>
    (gpm options)
    (list (shepherd-service
           (requirement '(udev))
           (provision '(gpm))
           ;; 'gpm' runs in the background and sets a PID file.
           ;; Note that it requires running as "root".
           (start #~(make-forkexec-constructor
                     (list #$(file-append gpm "/sbin/gpm")
                           #$@options)
                     #:pid-file "/var/run/gpm.pid"
                     #:pid-file-timeout 3))
           (stop #~(lambda (_)
                     ;; Return #f if successfully stopped.
                     (not (zero? (system* #$(file-append gpm "/sbin/gpm")
                                          "-k")))))))))

(define gpm-service-type
  (service-type (name 'gpm)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          gpm-shepherd-service)))
                (default-value (gpm-configuration))
                (description
                 "Run GPM, the general-purpose mouse daemon, with the given
command-line options.  GPM allows users to use the mouse in the console,
notably to select, copy, and paste text.  The default options use the
@code{ps2} protocol, which works for both USB and PS/2 mice.")))


(define-record-type* <kmscon-configuration>
  kmscon-configuration     make-kmscon-configuration
  kmscon-configuration?
  (kmscon                  kmscon-configuration-kmscon
                           (default kmscon))
  (virtual-terminal        kmscon-configuration-virtual-terminal)
  (login-program           kmscon-configuration-login-program
                           (default (file-append shadow "/bin/login")))
  (login-arguments         kmscon-configuration-login-arguments
                           (default '("-p")))
  (auto-login              kmscon-configuration-auto-login
                           (default #f))
  (hardware-acceleration?  kmscon-configuration-hardware-acceleration?
                           (default #f))  ; #t causes failure
  (font-engine             kmscon-configuration-font-engine
                           (default "pango"))
  (font-size               kmscon-configuration-font-size
                           (default 12))
  (keyboard-layout         kmscon-configuration-keyboard-layout
                           (default #f))) ; #f | <keyboard-layout>

(define kmscon-service-type
  (shepherd-service-type
   'kmscon
   (lambda (config)
     (let ((kmscon (kmscon-configuration-kmscon config))
           (virtual-terminal (kmscon-configuration-virtual-terminal config))
           (login-program (kmscon-configuration-login-program config))
           (login-arguments (kmscon-configuration-login-arguments config))
           (auto-login (kmscon-configuration-auto-login config))
           (hardware-acceleration? (kmscon-configuration-hardware-acceleration? config))
           (font-engine (kmscon-configuration-font-engine config))
           (font-size (kmscon-configuration-font-size config))
           (keyboard-layout (kmscon-configuration-keyboard-layout config)))

       (define kmscon-command
         #~(list
            #$(file-append kmscon "/bin/kmscon") "--login"
            "--vt" #$virtual-terminal
            "--no-switchvt" ;Prevent a switch to the virtual terminal.
            "--font-engine" #$font-engine
            "--font-size" #$(number->string font-size)
            #$@(if keyboard-layout
                   (let* ((layout (keyboard-layout-name keyboard-layout))
                          (variant (keyboard-layout-variant keyboard-layout))
                          (model (keyboard-layout-model keyboard-layout))
                          (options (keyboard-layout-options keyboard-layout)))
                     `("--xkb-layout" ,layout
                       ,@(if variant `("--xkb-variant" ,variant) '())
                       ,@(if model `("--xkb-model" ,model) '())
                       ,@(if (null? options)
                             '()
                             `("--xkb-options" ,(string-join options ",")))))
                   '())
            #$@(if hardware-acceleration? '("--hwaccel") '())
            "--login" "--"
            #$login-program #$@login-arguments
            #$@(if auto-login
                   #~(#$auto-login)
                   #~())))

       (shepherd-service
        (documentation "kmscon virtual terminal")
        (requirement '(user-processes udev dbus-system))
        (provision (list (symbol-append 'term- (string->symbol virtual-terminal))))
        (start #~(make-forkexec-constructor
                  #$kmscon-command

                  ;; The installer needs to be able to display glyphs from
                  ;; various scripts, so give it access to unifont.
                  ;; TODO: Make this configurable.
                  #:environment-variables
                  (list (string-append "XDG_DATA_DIRS="
                                       #+font-gnu-unifont "/share"))))
        (stop #~(make-kill-destructor)))))
   (description "Start the @command{kmscon} virtual terminal emulator for the
Linux @dfn{kernel mode setting} (KMS).")))


;;;
;;; Static networking.
;;;

(define (ipv6-address? str)
  "Return true if STR denotes an IPv6 address."
  (false-if-exception (->bool (inet-pton AF_INET6 str))))

(define-compile-time-procedure (assert-valid-address (address string?))
  "Ensure ADDRESS has a valid netmask."
  (unless (cidr->netmask address)
    (raise
     (make-compound-condition
      (formatted-message (G_ "address '~a' lacks a network mask")
                         address)
      (condition (&error-location
                  (location
                   (source-properties->location procedure-call-location))))
      (condition (&fix-hint
                  (hint (format #f (G_ "\
Write, say, @samp{\"~a/24\"} for a 24-bit network mask.")
                                address)))))))
  address)

(define (mac-address? str)
  "Return true if STR is a valid MAC address."
  (let ((pattern (make-regexp "^([0-9A-Fa-f]{2}:?){6}$")))
    (false-if-exception (vector? (regexp-exec pattern str)))))

(define-compile-time-procedure (assert-network-link-mac-address (value identity))
  (cond
   ((eq? value #f) value)
   ((and (string? value) (mac-address? value)) value)
   (else (raise
          (make-compound-condition
           (formatted-message (G_ "Value (~S) is not a valid mac address.~%")
                              value)
           (condition (&error-location
                       (location (source-properties->location procedure-call-location)))))))))

(define-compile-time-procedure (assert-network-link-type (value identity))
  (match value
    (#f value)
    (('quote _) (datum->syntax #'value value))
    (else
     (raise
      (make-compound-condition
       (formatted-message (G_ "Value (~S) is not a symbol.~%") value)
       (condition (&error-location
                   (location (source-properties->location procedure-call-location)))))))))

(define-record-type* <static-networking>
  static-networking make-static-networking
  static-networking?
  (addresses static-networking-addresses)         ;list of <network-address>
  (links     static-networking-links (default '())) ;list of <network-link>
  (routes    static-networking-routes (default '())) ;list of <network-routes>
  (provision static-networking-provision
             (default '(networking)))
  (requirement static-networking-requirement
               (default '(udev)))
  (name-servers static-networking-name-servers    ;FIXME: doesn't belong here
                (default '())))

(define-record-type* <network-address>
  network-address make-network-address
  network-address?
  (device    network-address-device)              ;string--e.g., "en01"
  (value     network-address-value                ;string--CIDR notation
             (sanitize assert-valid-address))
  (ipv6?     network-address-ipv6?                ;Boolean
             (thunked)
             (default
               (ipv6-address? (cidr->ip (network-address-value this-record))))))

(define-record-type* <network-link>
  network-link make-network-link
  network-link?
  (name      network-link-name
             (default #f))                   ;string or #f --e.g, "v0p0"
  (type      network-link-type
             (sanitize assert-network-link-type)
             (default #f))                   ;symbol or #f--e.g.,'veth, 'bond
  (mac-address network-link-mac-address
               (sanitize assert-network-link-mac-address)
               (default #f))
  (arguments network-link-arguments))             ;list

(define-record-type* <network-route>
  network-route make-network-route
  network-route?
  (destination network-route-destination)
  (source      network-route-source (default #f))
  (device      network-route-device (default #f))
  (ipv6?       network-route-ipv6? (thunked)
               (default
                 (or (ipv6-address? (network-route-destination this-record))
                     (and=> (network-route-gateway this-record)
                            ipv6-address?))))
  (gateway     network-route-gateway (default #f)))

(eval-when (expand load eval)
  (define* (cidr->netmask str #:optional (family AF_INET))
    "Given @var{str}, a string in CIDR notation (e.g., \"1.2.3.4/24\"), return
the netmask as a string like \"255.255.255.0\"."
    (match (string-split str #\/)
      ((ip (= string->number bits))
       (let ((mask (ash (- (expt 2 bits) 1)
                        (- (if (= family AF_INET6) 128 32)
                           bits))))
         (inet-ntop family mask)))
      (_ #f))))

(define (cidr->ip str)
  "Strip the netmask bit of @var{str}, a CIDR-notation IP/netmask address."
  (match (string-split str #\/)
    ((or (ip _) (ip))
     ip)))

(define* (ip+netmask->cidr ip netmask #:optional (family AF_INET))
  "Return the CIDR notation (a string) for @var{ip} and @var{netmask}, two
@var{family} address strings, where @var{family} is @code{AF_INET} or
@code{AF_INET6}."
  (let* ((netmask (inet-pton family netmask))
         (bits    (logcount netmask)))
    (string-append ip "/" (number->string bits))))

(define (static-networking->hurd-pfinet-options config)
  "Return command-line options for the Hurd's pfinet translator corresponding
to CONFIG."
  (unless (null? (static-networking-links config))
    ;; XXX: Presumably this is not supported, or perhaps could be approximated
    ;; by running separate pfinet instances in some cases?
    (warning (G_ "network links are currently ignored on GNU/Hurd~%")))

  (match (static-networking-addresses config)
    ((and addresses (first _ ...))
     `("--ipv6" "/servers/socket/26"
       "--interface" ,(string-append "/dev/" (network-address-device first))
       ,@(append-map (lambda (address)
                       `(,(if (network-address-ipv6? address)
                              "--address6"
                              "--address")
                         ,(cidr->ip (network-address-value address))
                         ,@(match (cidr->netmask (network-address-value address)
                                                 (if (network-address-ipv6? address)
                                                     AF_INET6
                                                     AF_INET))
                             (#f '())
                             (mask (list "--netmask" mask)))))
                     addresses)
       ,@(append-map (lambda (route)
                       (match route
                         (($ <network-route> "default" #f device _ gateway)
                          (if (network-route-ipv6? route)
                              `("--gateway6" ,gateway)
                              `("--gateway" ,gateway)))
                         (($ <network-route> destination)
                          (warning (G_ "ignoring network route for '~a'~%")
                                   destination)
                          '())))
                     (static-networking-routes config))))))

(define (network-set-up/hurd config)
  "Set up networking for the Hurd."
  ;; The Hurd implements SIOCGIFADDR and other old-style ioctls, but the only
  ;; way to set up IPv6 is by starting pfinet with the right options.
  (if (equal? (static-networking-provision config) '(loopback))
      (scheme-file "set-up-pflocal" #~(begin 'nothing-to-do! #t))
      (scheme-file "set-up-pfinet"
                   (with-imported-modules '((guix build utils))
                     #~(begin
                         (use-modules (guix build utils)
                                      (ice-9 format))

                         ;; TODO: Do that without forking.
                         (let ((options '#$(static-networking->hurd-pfinet-options
                                            config)))
                           (format #t "starting '~a~{ ~s~}'~%"
                                   #$(file-append hurd "/hurd/pfinet")
                                   options)
                           (apply invoke #$(file-append hurd "/bin/settrans")
                                  "--active"
                                  "--create"
                                  "--keep-active"
                                  "/servers/socket/2"
                                  #$(file-append hurd "/hurd/pfinet")
                                  options)))))))

(define (network-tear-down/hurd config)
  (scheme-file "tear-down-pfinet"
               (with-imported-modules '((guix build utils))
                 #~(begin
                     (use-modules (guix build utils))

                     ;; Forcefully terminate pfinet.  XXX: In theory this
                     ;; should just undo the addresses and routes of CONFIG;
                     ;; this could be done using ioctls like SIOCDELRT, but
                     ;; these are IPv4-only; another option would be to use
                     ;; fsysopts but that seems to crash pfinet.
                     (invoke #$(file-append hurd "/bin/settrans") "-fg"
                             "/servers/socket/2")
                     #f))))

(define (network-set-up/linux config)
  (match-record config <static-networking>
    (addresses links routes)
    (scheme-file "set-up-network"
                 (with-extensions (list guile-netlink)
                   #~(begin
                       (use-modules (ip addr) (ip link) (ip route)
                                    (srfi srfi-1)
                                    (ice-9 format)
                                    (ice-9 match))

                       (define (match-link-by field-accessor value)
                         (fold (lambda (link result)
                                 (if (equal? (field-accessor link) value)
                                     link
                                     result))
                               #f
                               (get-links)))

                       (define (alist->keyword+value alist)
                         (fold (match-lambda*
                                 (((k . v) r)
                                  (cons* (symbol->keyword k) v r))) '() alist))

                       ;; FIXME: It is interesting that "modprobe bonding" creates an
                       ;; interface bond0 straigt away.  If we won't have bonding
                       ;; module, and execute `ip link add name bond0 type bond' we
                       ;; will get
                       ;;
                       ;; RTNETLINK answers: File exists
                       ;;
                       ;; This breaks our configuration if we want to
                       ;; use `bond0' name.  Create (force modprobe
                       ;; bonding) and delete the interface to free up
                       ;; bond0 name.
                       #$(let lp ((links links))
                           (cond
                            ((null? links) #f)
                            ((and (network-link? (car links))
                                  ;; Type is not mandatory
                                  (false-if-exception
                                   (eq? (network-link-type (car links)) 'bond)))
                             #~(begin
                                 (false-if-exception (link-add "bond0" "bond"))
                                 (link-del "bond0")))
                            (else (lp (cdr links)))))

                       #$@(map (match-lambda
                                 (($ <network-link> name type mac-address arguments)
                                  (cond
                                   ;; Create a new interface
                                   ((and (string? name) (symbol? type))
                                    #~(begin
                                        (link-add #$name (symbol->string '#$type) #:type-args '#$arguments)
                                        ;; XXX: If we add routes, addresses must be
                                        ;; already assigned, and interfaces must be
                                        ;; up. It doesn't matter if they won't have
                                        ;; carrier or anything.
                                        (link-set #$name #:up #t)))

                                   ;; Amend an existing interface
                                   ((and (string? name)
                                         (eq? type #f))
                                    #~(let ((link (match-link-by link-name #$name)))
                                        (if link
                                            (apply link-set
                                                   (link-id link)
                                                   (alist->keyword+value '#$arguments))
                                            (format #t (G_ "Interface with name '~a' not found~%") #$name))))
                                   ((string? mac-address)
                                    #~(let ((link (match-link-by link-addr #$mac-address)))
                                        (if link
                                            (apply link-set
                                                   (link-id link)
                                                   (alist->keyword+value '#$arguments))
                                            (format #t (G_ "Interface with mac-address '~a' not found~%") #$mac-address)))))))
                                        links)

                       #$@(map (lambda (address)
                                 #~(begin
                                     ;; Before going any further, wait for the
                                     ;; device to show up.
                                     (wait-for-link
                                      #$(network-address-device address)
                                      #:blocking? #f)

                                     (addr-add #$(network-address-device address)
                                               #$(network-address-value address)
                                               #:ipv6?
                                               #$(network-address-ipv6? address))
                                     ;; FIXME: loopback?
                                     (link-set #$(network-address-device address)
                                               #:multicast-on #t
                                               #:up #t)))
                               addresses)

                       #$@(map (lambda (route)
                                 #~(route-add #$(network-route-destination route)
                                              #:device
                                              #$(network-route-device route)
                                              #:ipv6?
                                              #$(network-route-ipv6? route)
                                              #:via
                                              #$(network-route-gateway route)
                                              #:src
                                              #$(network-route-source route)))
                               routes)
                       #t)))))

(define (network-tear-down/linux config)
  (match-record config <static-networking>
    (addresses links routes)
    (scheme-file "tear-down-network"
                 (with-extensions (list guile-netlink)
                   #~(begin
                       (use-modules (ip addr) (ip link) (ip route)
                                    (netlink error)
                                    (srfi srfi-34))

                       (define-syntax-rule (false-if-netlink-error exp)
                         (guard (c ((netlink-error? c) #f))
                           exp))

                       ;; Wrap calls in 'false-if-netlink-error' so this
                       ;; script goes as far as possible undoing the effects
                       ;; of "set-up-network".

                       #$@(map (lambda (route)
                                 #~(false-if-netlink-error
                                    (route-del #$(network-route-destination route)
                                               #:device
                                               #$(network-route-device route)
                                               #:ipv6?
                                               #$(network-route-ipv6? route)
                                               #:via
                                               #$(network-route-gateway route)
                                               #:src
                                               #$(network-route-source route))))
                               routes)

                       ;; Cleanup addresses first, they might be assigned to
                       ;; created bonds, vlans or bridges.
                       #$@(map (lambda (address)
                                 #~(false-if-netlink-error
                                    (addr-del #$(network-address-device
                                                 address)
                                              #$(network-address-value address)
                                              #:ipv6?
                                              #$(network-address-ipv6? address))))
                               addresses)

                       ;; It is now safe to delete some links
                       #$@(map (match-lambda
                                 (($ <network-link> name type mac-address arguments)
                                  (cond
                                   ;; We delete interfaces that were created
                                   ((and (string? name) (symbol? type))
                                    #~(false-if-netlink-error
                                       (link-del #$name)))
                                   (else #t))))
                               links)
                       #f)))))

(define (static-networking-shepherd-service config)
  (match-record config <static-networking>
    (addresses links routes provision requirement name-servers)
    (let ((loopback? (and provision (memq 'loopback provision))))
      (shepherd-service

       (documentation
        "Bring up the networking interface using a static IP address.")
       (requirement requirement)
       (provision provision)

       (start #~(lambda _
                  ;; Return #t if successfully started.
                  (load #$(let-system (system target)
                            (if (string-contains (or target system) "-linux")
                                (network-set-up/linux config)
                                (network-set-up/hurd config))))))
       (stop #~(lambda _
                 ;; Return #f is successfully stopped.
                 (load #$(let-system (system target)
                           (if (string-contains (or target system) "-linux")
                               (network-tear-down/linux config)
                               (network-tear-down/hurd config))))))
       (respawn? #f)))))

(define (static-networking-shepherd-services networks)
  (map static-networking-shepherd-service networks))

(define (static-networking-etc-files interfaces)
  "Return a /etc/resolv.conf entry for INTERFACES or the empty list."
  (match (delete-duplicates
          (append-map static-networking-name-servers
                      interfaces))
    (()
     '())
    ((name-servers ...)
     (let ((content (string-join
                     (map (cut string-append "nameserver " <>)
                          name-servers)
                     "\n" 'suffix)))
       `(("resolv.conf"
          ,(plain-file "resolv.conf"
                       (string-append "\
# Generated by 'static-networking-service'.\n"
                                      content))))))))

(define static-networking-service-type
  ;; The service type for statically-defined network interfaces.
  (service-type (name 'static-networking)
                (extensions
                 (list
                  (service-extension shepherd-root-service-type
                                     static-networking-shepherd-services)
                  (service-extension etc-service-type
                                     static-networking-etc-files)))
                (compose concatenate)
                (extend append)
                (description
                 "Turn up the specified network interfaces upon startup,
with the given IP address, gateway, netmask, and so on.  The value for
services of this type is a list of @code{static-networking} objects, one per
network interface.")))

(define-deprecated (static-networking-service interface ip
                                              #:key
                                              netmask gateway provision
                                              ;; Most interfaces require udev to be usable.
                                              (requirement '(udev))
                                              (name-servers '()))
  static-networking-service-type
  "Return a service that starts @var{interface} with address @var{ip}.  If
@var{netmask} is true, use it as the network mask.  If @var{gateway} is true,
it must be a string specifying the default network gateway.

This procedure can be called several times, one for each network
interface of interest.  Behind the scenes what it does is extend
@code{static-networking-service-type} with additional network interfaces
to handle."
  (simple-service 'static-network-interface
                  static-networking-service-type
                  (list (static-networking
                         (addresses
                          (list (network-address
                                 (device interface)
                                 (value (if netmask
                                            (ip+netmask->cidr ip netmask)
                                            ip))
                                 (ipv6? #f))))
                         (routes
                          (if gateway
                              (list (network-route
                                     (destination "default")
                                     (gateway gateway)
                                     (ipv6? #f)))
                              '()))
                         (requirement requirement)
                         (provision (or provision '(networking)))
                         (name-servers name-servers)))))

(define %loopback-static-networking
  ;; The loopback device.
  (static-networking
   (addresses (list (network-address
                     (device "lo")
                     (value "127.0.0.1/8"))))
   (requirement '())
   (provision '(loopback))))

(define %qemu-static-networking
  ;; Networking configuration for QEMU's user-mode network stack (info "(QEMU)
  ;; Using the user mode network stack").
  (static-networking
   (addresses (list (network-address
                     (device "eth0")
                     (value "10.0.2.15/24"))))
   (routes (list (network-route
                  (destination "default")
                  (gateway "10.0.2.2"))))
   (requirement '())
   (provision '(networking))
   (name-servers '("10.0.2.3"))))


;;;
;;; greetd-service-type -- minimal and flexible login manager daemon
;;;

(define-record-type* <greetd-agreety-session>
  greetd-agreety-session make-greetd-agreety-session
  greetd-agreety-session?
  (agreety greetd-agreety (default greetd))
  (command greetd-agreety-command (default (file-append bash "/bin/bash")))
  (command-args greetd-agreety-command-args (default '("-l")))
  (extra-env greetd-agreety-extra-env (default '()))
  (xdg-env? greetd-agreety-xdg-env? (default #t)))

(define (greetd-agreety-tty-session-command config)
  (match-record config <greetd-agreety-session>
    (command command-args extra-env)
    (program-file
     "agreety-tty-session-command"
     #~(begin
         (use-modules (ice-9 match))
         (for-each (match-lambda ((var . val) (setenv var val)))
                   (quote (#$@extra-env)))
         (apply execl #$command #$command (list #$@command-args))))))

(define (greetd-agreety-tty-xdg-session-command config)
  (match-record config <greetd-agreety-session>
    (command command-args extra-env)
    (program-file
     "agreety-tty-xdg-session-command"
     #~(begin
         (use-modules (ice-9 match))
         (let*
             ((username (getenv "USER"))
              (useruid (passwd:uid (getpwuid username)))
              (useruid (number->string useruid)))
           (setenv "XDG_SESSION_TYPE" "tty")
           (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid)))
         (for-each (match-lambda ((var . val) (setenv var val)))
                   (quote (#$@extra-env)))
         (apply execl #$command #$command (list #$@command-args))))))

(define-gexp-compiler (greetd-agreety-session-compiler
                       (session <greetd-agreety-session>)
                       system target)
  (let ((agreety (file-append (greetd-agreety session)
                              "/bin/agreety"))
        (command ((if (greetd-agreety-xdg-env? session)
                      greetd-agreety-tty-xdg-session-command
                      greetd-agreety-tty-session-command)
                  session)))
    (lower-object
     (program-file "agreety-command"
       #~(execl #$agreety #$agreety "-c" #$command)))))

(define-record-type* <greetd-wlgreet-session>
  greetd-wlgreet-session make-greetd-wlgreet-session
  greetd-wlgreet-session?
  (wlgreet greetd-wlgreet (default wlgreet))
  (command greetd-wlgreet-command
           (default (file-append sway "/bin/sway")))
  (command-args greetd-wlgreet-command-args (default '()))
  (output-mode greetd-wlgreet-output-mode (default "all"))
  (scale greetd-wlgreet-scale (default 1))
  (background greetd-wlgreet-background (default '(0 0 0 0.9)))
  (headline greetd-wlgreet-headline (default '(1 1 1 1)))
  (prompt greetd-wlgreet-prompt (default '(1 1 1 1)))
  (prompt-error greetd-wlgreet-prompt-error (default '(1 1 1 1)))
  (border greetd-wlgreet-border (default '(1 1 1 1)))
  (extra-env greetd-wlgreet-extra-env (default '())))

(define (greetd-wlgreet-wayland-session-command session)
  (program-file "wlgreet-session-command"
    #~(let* ((username (getenv "USER"))
             (useruid (number->string
                       (passwd:uid (getpwuid username))))
             (command #$(greetd-wlgreet-command session)))
        (use-modules (ice-9 match))
        (setenv "XDG_SESSION_TYPE" "wayland")
        (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid))
        (for-each (lambda (env) (setenv (car env) (cdr env)))
                  '(#$@(greetd-wlgreet-extra-env session)))
        (apply execl command command
               (list #$@(greetd-wlgreet-command-args session))))))

(define (make-wlgreet-config-color section-name color)
  (match color
    ((red green blue opacity)
     (string-append
      "[" section-name "]\n"
      "red = " (number->string red) "\n"
      "green = " (number->string green) "\n"
      "blue = " (number->string blue) "\n"
      "opacity = " (number->string opacity) "\n"))))

(define (make-wlgreet-configuration-file session)
  (let ((command (greetd-wlgreet-wayland-session-command session))
        (output-mode (greetd-wlgreet-output-mode session))
        (scale (greetd-wlgreet-scale session))
        (background (greetd-wlgreet-background session))
        (headline (greetd-wlgreet-headline session))
        (prompt (greetd-wlgreet-prompt session))
        (prompt-error (greetd-wlgreet-prompt-error session))
        (border (greetd-wlgreet-border session)))
    (mixed-text-file "wlgreet.toml"
      "command = \"" command "\"\n"
      "outputMode = \"" output-mode "\"\n"
      "scale = " (number->string scale) "\n"
      (apply string-append
             (map (match-lambda
                    ((section-name . color)
                     (make-wlgreet-config-color section-name color)))
                  `(("background" . ,background)
                    ("headline" . ,headline)
                    ("prompt" . ,prompt)
                    ("prompt-error" . ,prompt-error)
                    ("border" . ,border)))))))

(define-record-type* <greetd-wlgreet-sway-session>
  greetd-wlgreet-sway-session make-greetd-wlgreet-sway-session
  greetd-wlgreet-sway-session?
  (wlgreet-session greetd-wlgreet-sway-session-wlgreet-session       ;<greetd-wlgreet-session>
                   (default (greetd-wlgreet-session)))
  (sway greetd-wlgreet-sway-session-sway (default sway))             ;<package>
  (sway-configuration greetd-wlgreet-sway-session-sway-configuration ;file-like
                      (default (plain-file "wlgreet-sway-config" ""))))

(define (make-wlgreet-sway-configuration-file session)
  (let* ((wlgreet-session (greetd-wlgreet-sway-session-wlgreet-session session))
         (wlgreet-config (make-wlgreet-configuration-file wlgreet-session))
         (wlgreet (file-append (greetd-wlgreet wlgreet-session) "/bin/wlgreet"))
         (sway-config (greetd-wlgreet-sway-session-sway-configuration session))
         (swaymsg (file-append (greetd-wlgreet-sway-session-sway session)
                               "/bin/swaymsg")))
    (mixed-text-file "wlgreet-sway.conf"
      "include " sway-config "\n"
      "xwayland disable\n"
      "exec \"" wlgreet " --config " wlgreet-config "; "
      swaymsg " exit\"\n")))

(define-gexp-compiler (greetd-wlgreet-sway-session-compiler
                       (session <greetd-wlgreet-sway-session>)
                       system target)
  (let ((sway (file-append (greetd-wlgreet-sway-session-sway session)
                           "/bin/sway"))
        (config (make-wlgreet-sway-configuration-file session)))
    (lower-object
     (program-file "wlgreet-sway-session-command"
       #~(let* ((log-file (open-output-file
                           (string-append "/tmp/sway-greeter."
                                          (number->string (getpid))
                                          ".log")))
                (username (getenv "USER"))
                (useruid (number->string (passwd:uid (getpwuid username)))))
           ;; redirect stdout/err to log-file
           (dup2 (fileno log-file) 1)
           (dup2 1 2)
           (sleep 1) ;give seatd/logind some time to start up
           (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid))
           (execl #$sway #$sway "-d" "-c" #$config))))))

(define-record-type* <greetd-terminal-configuration>
  greetd-terminal-configuration make-greetd-terminal-configuration
  greetd-terminal-configuration?
  (greetd greetd-package (default greetd))
  (config-file-name greetd-config-file-name (thunked)
                    (default (default-config-file-name this-record)))
  (log-file-name greetd-log-file-name (thunked)
                 (default (default-log-file-name this-record)))
  (terminal-vt greetd-terminal-vt (default "7"))
  (terminal-switch greetd-terminal-switch (default #f))
  (source-profile? greetd-source-profile? (default #t))
  (default-session-user greetd-default-session-user (default "greeter"))
  (default-session-command greetd-default-session-command
    (default (greetd-agreety-session))))

(define (default-config-file-name config)
  (string-join (list "config-" (greetd-terminal-vt config) ".toml") ""))

(define (default-log-file-name config)
  (string-join (list "/var/log/greetd-" (greetd-terminal-vt config) ".log") ""))

(define (make-greetd-terminal-configuration-file config)
  (let*
      ((config-file-name (greetd-config-file-name config))
       (source-profile? (greetd-source-profile? config))
       (terminal-vt (greetd-terminal-vt config))
       (terminal-switch (greetd-terminal-switch config))
       (default-session-user (greetd-default-session-user config))
       (default-session-command (greetd-default-session-command config)))
    (mixed-text-file
     config-file-name
     "[general]\n"
     "source_profile = " (if source-profile? "true" "false") "\n"
     "[terminal]\n"
     "vt = " terminal-vt "\n"
     "switch = " (if terminal-switch "true" "false") "\n"
     "[default_session]\n"
     "user = " default-session-user "\n"
     "command = " default-session-command "\n")))

(define %greetd-file-systems
  (list (file-system
          (device "none")
          (mount-point "/run/greetd/pam_mount")
          (type "tmpfs")
          (check? #f)
          (flags '(no-suid no-dev no-exec))
          (options "mode=0755")
          (create-mount-point? #t))))

(define %greetd-pam-mount-rules
  `((debug (@ (enable "0")))
    (volume (@ (sgrp "users")
               (fstype "tmpfs")
               (mountpoint "/run/user/%(USERUID)")
               (options "noexec,nosuid,nodev,size=1g,mode=0700,uid=%(USERUID),gid=%(USERGID)")))
    (logout (@ (wait "0")
               (hup "0")
               (term "yes")
               (kill "no")))
    (mkmountpoint (@ (enable "1") (remove "true")))))

(define-record-type* <greetd-configuration>
  greetd-configuration make-greetd-configuration
  greetd-configuration?
  (motd greetd-motd (default %default-motd))
  (allow-empty-passwords? greetd-allow-empty-passwords? (default #t))
  (terminals greetd-terminals (default '()))
  (greeter-supplementary-groups greetd-greeter-supplementary-groups (default '())))

(define (greetd-accounts config)
  (list (user-group (name "greeter") (system? #t))
        (user-account
         (name "greeter")
         (group "greeter")
         (supplementary-groups (greetd-greeter-supplementary-groups config))
         (system? #t))))

(define (make-greetd-pam-mount-conf-file config)
  (computed-file
   "greetd_pam_mount.conf.xml"
   #~(begin
       (use-modules (sxml simple))
       (call-with-output-file #$output
         (lambda (port)
           (sxml->xml
            '(*TOP*
              (*PI* xml "version='1.0' encoding='utf-8'")
              (pam_mount
               #$@%greetd-pam-mount-rules
               (pmvarrun
                #$(file-append greetd-pam-mount
                               "/sbin/pmvarrun -u '%(USER)' -o '%(OPERATION)'"))))
            port))))))

(define (greetd-etc-service config)
  `(("security/greetd_pam_mount.conf.xml"
     ,(make-greetd-pam-mount-conf-file config))))

(define (greetd-pam-service config)
  (define optional-pam-mount
    (pam-entry
     (control "optional")
     (module (file-append greetd-pam-mount "/lib/security/pam_mount.so"))
     (arguments '("disable_interactive"))))

  (list
   (unix-pam-service "greetd"
                     #:login-uid? #t
                     #:allow-empty-passwords?
                     (greetd-allow-empty-passwords? config)
                     #:motd
                     (greetd-motd config))
   (pam-extension
    (transformer
     (lambda (pam)
       (if (member (pam-service-name pam)
                   '("login" "greetd" "su" "slim" "gdm-password"))
           (pam-service
            (inherit pam)
            (auth (append (pam-service-auth pam)
                          (list optional-pam-mount)))
            (session (append (pam-service-session pam)
                             (list optional-pam-mount))))
           pam))))))

(define (greetd-shepherd-services config)
  (map
   (lambda (tc)
     (let*
         ((greetd-bin (file-append (greetd-package tc) "/sbin/greetd"))
          (greetd-conf (make-greetd-terminal-configuration-file tc))
          (greetd-log (greetd-log-file-name tc))
          (greetd-vt (greetd-terminal-vt tc)))
       (shepherd-service
        (documentation "Minimal and flexible login manager daemon")
        (requirement '(pam user-processes host-name udev virtual-terminal))
        (provision (list (symbol-append
                          'term-tty
                          (string->symbol (greetd-terminal-vt tc)))))
        (start #~(make-forkexec-constructor
                  (list #$greetd-bin "-c" #$greetd-conf)
                  #:log-file #$greetd-log))
        (stop #~(make-kill-destructor)))))
   (greetd-terminals config)))

(define greetd-service-type
  (service-type
   (name 'greetd)
   (description "Provides necessary infrastructure for logging into the
system including @code{greetd} PAM service, @code{pam-mount} module to
mount/unmount /run/user/<uid> directory for user and @code{greetd}
login manager daemon.")
   (extensions
    (list
     (service-extension account-service-type greetd-accounts)
     (service-extension file-system-service-type (const %greetd-file-systems))
     (service-extension etc-service-type greetd-etc-service)
     (service-extension pam-root-service-type greetd-pam-service)
     (service-extension shepherd-root-service-type greetd-shepherd-services)))
   (default-value (greetd-configuration))))


(define %base-services
  ;; Convenience variable holding the basic services.
  (list (service login-service-type)

        (service virtual-terminal-service-type)
        (service console-font-service-type
                 (map (lambda (tty)
                        (cons tty %default-console-font))
                      '("tty1" "tty2" "tty3" "tty4" "tty5" "tty6")))

        (service syslog-service-type)
        (service agetty-service-type (agetty-configuration
                                       (extra-options '("-L")) ; no carrier detect
                                       (term "vt100")
                                       (tty #f) ; automatic
                                       (shepherd-requirement '(syslogd))))

        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty1")))
        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty2")))
        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty3")))
        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty4")))
        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty5")))
        (service mingetty-service-type (mingetty-configuration
                                         (tty "tty6")))

        (service static-networking-service-type
                 (list %loopback-static-networking))
        (service urandom-seed-service-type)
        (service guix-service-type)
        (service nscd-service-type)

        (service rottlog-service-type)

        ;; Periodically delete old build logs.
        (service log-cleanup-service-type
                 (log-cleanup-configuration
                  (directory "/var/log/guix/drvs")))

        ;; The LVM2 rules are needed as soon as LVM2 or the device-mapper is
        ;; used, so enable them by default.  The FUSE and ALSA rules are
        ;; less critical, but handy.
        (service udev-service-type
                 (udev-configuration
                   (rules (list lvm2 fuse alsa-utils crda))))

        (service sysctl-service-type)

        (service special-files-service-type
                 `(("/bin/sh" ,(file-append bash "/bin/sh"))
                   ("/usr/bin/env" ,(file-append coreutils "/bin/env"))))))

;;; base.scm ends here
e\n" "transactional database. Unlike more complex relational databases, LMDB handles\n" "only key-value pairs (stored as arbitrary byte arrays) and relies on the\n" "underlying operating system for caching and locking, keeping the code small and\n" "simple.\n" "The use of ‘zero-copy’ memory-mapped files combines the persistence of classic\n" "disk-based databases with high read performance that scales linearly over\n" "multiple cores. The size of each database is limited only by the size of the\n" "virtual address space — not physical RAM." msgstr "" #: gnu/packages/databases.scm:2835 msgid "C++11 wrapper for the LMDB embedded B+ tree database library" msgstr "" #: gnu/packages/databases.scm:2836 msgid "" "@code{lmdbxx} is a comprehensive @code{C++} wrapper for the\n" "@code{LMDB} embedded database library, offering both an error-checked\n" "procedural interface and an object-oriented resource interface with RAII\n" "semantics." msgstr "" #: gnu/packages/databases.scm:2859 msgid "C++ connector for PostgreSQL" msgstr "" #: gnu/packages/databases.scm:2861 msgid "" "Libpqxx is a C++ library to enable user programs to communicate with the\n" "PostgreSQL database back-end. The database back-end can be local or it may be\n" "on another machine, accessed via TCP/IP." msgstr "" #: gnu/packages/databases.scm:2888 msgid "Embedded key/value database for Go" msgstr "" #: gnu/packages/databases.scm:2889 msgid "" "Bolt is a pure Go key/value store inspired by Howard Chu's\n" "LMDB project. The goal of the project is to provide a simple, fast, and\n" "reliable database for projects that don't require a full database server such as\n" "Postgres or MySQL." msgstr "" #: gnu/packages/databases.scm:2913 msgid "Small object-relational mapping utility" msgstr "" #: gnu/packages/databases.scm:2915 msgid "" "Peewee is a simple and small ORM (object-relation mapping) tool. Peewee\n" "handles converting between pythonic values and those used by databases, so you\n" "can use Python types in your code without having to worry. It has built-in\n" "support for sqlite, mysql and postgresql. If you already have a database, you\n" "can autogenerate peewee models using @code{pwiz}, a model generator." msgstr "" #: gnu/packages/databases.scm:2934 msgid "Pypika fork for tortoise-orm" msgstr "" #: gnu/packages/databases.scm:2935 msgid "" "Pypika-tortoise is a fork of pypika which has been\n" "streamlined for its use in the context of tortoise-orm. It removes support\n" "for many database kinds that tortoise-orm doesn't need, for example." msgstr "" #: gnu/packages/databases.scm:2954 msgid "Sphinx extension to support coroutines in markup" msgstr "" #: gnu/packages/databases.scm:2955 msgid "" "This package is a Sphinx extension providing additional\n" "coroutine-specific markup." msgstr "" #: gnu/packages/databases.scm:2977 msgid "Fast PostgreSQL database client library for Python" msgstr "" #: gnu/packages/databases.scm:2978 msgid "" "@code{asyncpg} is a database interface library designed\n" "specifically for PostgreSQL and Python/asyncio. @code{asyncpg} is an\n" "efficient, clean implementation of PostgreSQL server binary protocol for use\n" "with Python's asyncio framework." msgstr "" #: gnu/packages/databases.scm:2997 msgid "Fast MySQL driver for Python" msgstr "" #: gnu/packages/databases.scm:2998 msgid "" "@code{asyncmy} is a fast @code{asyncio} MySQL driver, which\n" "reuses most of @code{pymysql} and @code{aiomysql} but rewrites the core\n" "protocol with Cython for performance." msgstr "" #: gnu/packages/databases.scm:3017 msgid "MySQL driver for Python" msgstr "" #: gnu/packages/databases.scm:3018 msgid "" "@code{aiomysql} is a driver for accessing a MySQL database\n" "from the @code{asyncio} Python framework. It depends on and reuses most parts\n" "of PyMySQL. @code{aiomysql} tries to preserve the same API as the\n" "@code{aiopg} library." msgstr "" #: gnu/packages/databases.scm:3050 msgid "Asynchronous Object Relational Mapper (ORM) for Python" msgstr "" #: gnu/packages/databases.scm:3051 msgid "" "Tortoise ORM is an easy-to-use asyncio ORM (Object\n" "Relational Mapper) inspired by Django. Tortoise ORM was built with relations\n" "in mind and admiration for the excellent and popular Django ORM. It's\n" "engraved in its design that you are working not with just tables, you work\n" "with relational data." msgstr "" #: gnu/packages/databases.scm:3095 msgid "Library providing transparent encryption of SQLite database files" msgstr "" #: gnu/packages/databases.scm:3096 msgid "" "SQLCipher is an implementation of SQLite, extended to\n" "provide transparent 256-bit AES encryption of database files. Pages are\n" "encrypted before being written to disk and are decrypted when read back. It’s\n" "well suited for protecting embedded application databases and for mobile\n" "development." msgstr "" #: gnu/packages/databases.scm:3128 msgid "Python ODBC Library written in C" msgstr "" #: gnu/packages/databases.scm:3129 msgid "" "@code{python-pyodbc-c} provides a Python DB-API driver\n" "for ODBC, similar to python-pyodbc but written in C.\n" "\n" "It's designed to stand alone and not have other dependencies on other packages\n" "or languages. It uses only Python's built-in data types." msgstr "" #: gnu/packages/databases.scm:3164 msgid "Python ODBC Library" msgstr "" #: gnu/packages/databases.scm:3165 msgid "" "@code{python-pyodbc} provides a Python DB-API driver\n" "for ODBC." msgstr "" #: gnu/packages/databases.scm:3194 msgid "Read Microsoft Access databases" msgstr "" #: gnu/packages/databases.scm:3195 msgid "" "MDB Tools is a set of tools and applications to read the\n" "proprietary MDB file format used in Microsoft's Access database package. This\n" "includes programs to export schema and data from Microsoft's Access database\n" "file format to other databases such as MySQL, Oracle, Sybase, PostgreSQL,\n" "etc., and an SQL engine for performing simple SQL queries." msgstr "" #: gnu/packages/databases.scm:3223 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "MongoDB driver for Go" msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/databases.scm:3224 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "This package provides a MongoDB driver for Go." msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/databases.scm:3263 msgid "Python binding for the ‘Lightning’ database (LMDB)" msgstr "" #: gnu/packages/databases.scm:3265 msgid "" "python-lmdb or py-lmdb is a Python binding for the @dfn{Lightning\n" "Memory-Mapped Database} (LMDB), a high-performance key-value store." msgstr "" #: gnu/packages/databases.scm:3358 msgid "Multi-model database system" msgstr "" #: gnu/packages/databases.scm:3359 msgid "" "Virtuoso is a scalable cross-platform server that combines\n" "relational, graph, and document data management with web application server\n" "and web services platform functionality." msgstr "" #: gnu/packages/databases.scm:3384 msgid "" "Cassandra Cluster Manager for Apache Cassandra clusters on\n" "localhost" msgstr "" #: gnu/packages/databases.scm:3386 msgid "" "Cassandra Cluster Manager is a development tool for testing\n" "local Cassandra clusters. It creates, launches and removes Cassandra clusters\n" "on localhost." msgstr "" #: gnu/packages/databases.scm:3420 msgid "Database abstraction library" msgstr "" #: gnu/packages/databases.scm:3422 msgid "" "SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that\n" "gives application developers the full power and flexibility of SQL. It\n" "provides a full suite of well known enterprise-level persistence patterns,\n" "designed for efficient and high-performing database access, adapted into a\n" "simple and Pythonic domain language." msgstr "" #: gnu/packages/databases.scm:3444 msgid "SQLAlchemy stubs and mypy plugin" msgstr "" #: gnu/packages/databases.scm:3445 msgid "" "This package contains type stubs and a mypy plugin to\n" "provide more precise static types and type inference for SQLAlchemy\n" "framework." msgstr "" #: gnu/packages/databases.scm:3474 msgid "Various utility functions for SQLAlchemy" msgstr "" #: gnu/packages/databases.scm:3476 msgid "" "SQLAlchemy-utils provides various utility functions and custom data types\n" "for SQLAlchemy. SQLAlchemy is an SQL database abstraction library for Python.\n" "\n" "You might also want to install the following optional dependencies:\n" "@enumerate\n" "@item @code{python-passlib}\n" "@item @code{python-babel}\n" "@item @code{python-cryptography}\n" "@item @code{python-pytz}\n" "@item @code{python-psycopg2}\n" "@item @code{python-furl}\n" "@item @code{python-flask-babel}\n" "@end enumerate\n" msgstr "" #: gnu/packages/databases.scm:3521 msgid "Mock helpers for SQLAlchemy" msgstr "" #: gnu/packages/databases.scm:3523 msgid "" "This package provides mock helpers for SQLAlchemy that makes it easy\n" "to mock an SQLAlchemy session while preserving the ability to do asserts.\n" "\n" "Normally Normally SQLAlchemy's expressions cannot be easily compared as\n" "comparison on binary expression produces yet another binary expression, but\n" "this library provides functions to facilitate such comparisons." msgstr "" #: gnu/packages/databases.scm:3552 msgid "Database migration tool for SQLAlchemy" msgstr "" #: gnu/packages/databases.scm:3554 msgid "" "Alembic is a lightweight database migration tool for usage with the\n" "SQLAlchemy Database Toolkit for Python." msgstr "" #: gnu/packages/databases.scm:3577 msgid "Tiny key value database with concurrency support" msgstr "" #: gnu/packages/databases.scm:3579 msgid "" "PickleShare is a small ‘shelve’-like datastore with concurrency support.\n" "Like shelve, a PickleShareDB object acts like a normal dictionary. Unlike\n" "shelve, many processes can access the database simultaneously. Changing a\n" "value in database is immediately visible to other processes accessing the same\n" "database. Concurrency is possible because the values are stored in separate\n" "files. Hence the “database” is a directory where all files are governed by\n" "PickleShare." msgstr "" #: gnu/packages/databases.scm:3619 msgid "Another Python SQLite Wrapper" msgstr "" #: gnu/packages/databases.scm:3621 msgid "" "APSW is a Python wrapper for the SQLite embedded relational database\n" "engine. In contrast to other wrappers such as pysqlite it focuses on being a\n" "minimal layer over SQLite attempting just to translate the complete SQLite API\n" "into Python." msgstr "" #: gnu/packages/databases.scm:3653 msgid "Asyncio bridge for sqlite3" msgstr "" #: gnu/packages/databases.scm:3655 msgid "" "The package aiosqlite replicates the standard sqlite3 module, but with\n" "async versions of all the standard connection and cursor methods, and context\n" "managers for automatically closing connections." msgstr "" #: gnu/packages/databases.scm:3679 msgid "Async database support for Python" msgstr "" #: gnu/packages/databases.scm:3680 msgid "This package implements async database support for Python." msgstr "" #: gnu/packages/databases.scm:3701 msgid "Python PostgreSQL adapter" msgstr "" #: gnu/packages/databases.scm:3703 msgid "" "psycopg2 is a thread-safe PostgreSQL adapter that implements DB-API\n" "2.0." msgstr "" #: gnu/packages/databases.scm:3728 msgid "Connection pooler for psycopg" msgstr "" #: gnu/packages/databases.scm:3730 msgid "" "This module provides connection pool implementations that can be used\n" "with the @code{psycopg} PostgreSQL driver." msgstr "" #: gnu/packages/databases.scm:3802 msgid "PostgreSQL driver for Python" msgstr "" #: gnu/packages/databases.scm:3804 msgid "" "Psycopg 3 is a new implementation of the popular @code{psycopg2}\n" "database adapter for Python." msgstr "" #: gnu/packages/databases.scm:3837 msgid "SQLAlchemy schema displayer" msgstr "" #: gnu/packages/databases.scm:3838 msgid "" "This package provides a program to build Entity\n" "Relationship diagrams from a SQLAlchemy model (or directly from the\n" "database)." msgstr "" #: gnu/packages/databases.scm:3866 msgid "Database migrations with SQL" msgstr "" #: gnu/packages/databases.scm:3868 msgid "" "Yoyo is a database schema migration tool. Migrations are written as SQL\n" "files or Python scripts that define a list of migration steps." msgstr "" #: gnu/packages/databases.scm:3888 msgid "MySQLdb is an interface to the popular MySQL database server for Python" msgstr "" #: gnu/packages/databases.scm:3889 msgid "" "MySQLdb is an interface to the popular MySQL database server\n" "for Python. The design goals are:\n" "@enumerate\n" "@item Compliance with Python database API version 2.0 [PEP-0249],\n" "@item Thread-safety,\n" "@item Thread-friendliness (threads will not block each other).\n" "@end enumerate" msgstr "" #: gnu/packages/databases.scm:3914 msgid "Python extension that wraps protocol parsing code in hiredis" msgstr "" #: gnu/packages/databases.scm:3915 msgid "" "Python-hiredis is a python extension that wraps protocol\n" "parsing code in hiredis. It primarily speeds up parsing of multi bulk replies." msgstr "" #: gnu/packages/databases.scm:3949 msgid "Redis support for Python's @code{asyncio} module" msgstr "" #: gnu/packages/databases.scm:3950 msgid "" "This package provides Redis support for the Python\n" "@code{asyncio} (PEP 3156) module." msgstr "" #: gnu/packages/databases.scm:3972 msgid "Fake implementation of redis API for testing purposes" msgstr "" #: gnu/packages/databases.scm:3974 msgid "" "Fakeredis is a pure-Python implementation of the redis-py Python client\n" "that simulates talking to a redis server. It was created for a single purpose:\n" "to write unit tests.\n" "\n" "Setting up redis is not hard, but one often wants to write unit tests that don't\n" "talk to an external server such as redis. This module can be used as a\n" "reasonable substitute." msgstr "" #: gnu/packages/databases.scm:4000 msgid "Redis Python client" msgstr "" #: gnu/packages/databases.scm:4002 msgid "This package provides a Python interface to the Redis key-value store." msgstr "" #: gnu/packages/databases.scm:4038 msgid "Simple job queues for Python" msgstr "" #: gnu/packages/databases.scm:4040 msgid "" "RQ (Redis Queue) is a simple Python library for queueing jobs and\n" "processing them in the background with workers. It is backed by Redis and it\n" "is designed to have a low barrier to entry." msgstr "" #: gnu/packages/databases.scm:4075 msgid "Job scheduling capabilities for RQ (Redis Queue)" msgstr "" #: gnu/packages/databases.scm:4077 msgid "" "This package provides job scheduling capabilities to @code{python-rq}\n" "(Redis Queue)." msgstr "" #: gnu/packages/databases.scm:4115 msgid "Non-validating SQL parser" msgstr "" #: gnu/packages/databases.scm:4116 msgid "" "Sqlparse is a non-validating SQL parser for Python. It\n" "provides support for parsing, splitting and formatting SQL statements." msgstr "" #: gnu/packages/databases.scm:4133 msgid "Library to write SQL queries in a pythonic way" msgstr "" #: gnu/packages/databases.scm:4134 msgid "" "@code{python-sql} is a library to write SQL queries, that\n" "transforms idiomatic python function calls to well-formed SQL queries." msgstr "" #: gnu/packages/databases.scm:4155 msgid "SQL query builder API for Python" msgstr "" #: gnu/packages/databases.scm:4157 msgid "" "PyPika is a python SQL query builder that exposes the full richness of\n" "the SQL language using a syntax that reflects the resulting query." msgstr "" #: gnu/packages/databases.scm:4282 gnu/packages/databases.scm:4414 #: gnu/packages/databases.scm:4540 msgid "Columnar in-memory analytics" msgstr "" #: gnu/packages/databases.scm:4283 gnu/packages/databases.scm:4415 #: gnu/packages/databases.scm:4541 msgid "" "Apache Arrow is a columnar in-memory analytics layer\n" "designed to accelerate big data. It houses a set of canonical in-memory\n" "representations of flat and hierarchical data along with multiple\n" "language-bindings for structure manipulation. It also provides IPC and common\n" "algorithm implementations." msgstr "" #: gnu/packages/databases.scm:4582 gnu/packages/databases.scm:4640 msgid "Python bindings for Apache Arrow" msgstr "" #: gnu/packages/databases.scm:4584 gnu/packages/databases.scm:4642 msgid "" "This library provides a Pythonic API wrapper for the reference Arrow C++\n" "implementation, along with tools for interoperability with pandas, NumPy, and\n" "other traditional Python scientific computing packages." msgstr "" #: gnu/packages/databases.scm:4661 msgid "CrateDB Python client" msgstr "" #: gnu/packages/databases.scm:4663 msgid "" "This package provides a Python client library for CrateDB.\n" "It implements the Python DB API 2.0 specification and includes support for\n" "SQLAlchemy." msgstr "" #: gnu/packages/databases.scm:4680 msgid "Database independent abstraction layer in C" msgstr "" #: gnu/packages/databases.scm:4682 msgid "" "This library implements a database independent abstraction layer in C,\n" "similar to the DBI/DBD layer in Perl. Writing one generic set of code,\n" "programmers can leverage the power of multiple databases and multiple\n" "simultaneous database connections by using this framework." msgstr "" #: gnu/packages/databases.scm:4746 msgid "Database drivers for the libdbi framework" msgstr "" #: gnu/packages/databases.scm:4748 msgid "" "The @code{libdbi-drivers} library provides the database specific drivers\n" "for the @code{libdbi} framework.\n" "\n" "The drivers officially supported by @code{libdbi} are:\n" "@itemize\n" "@item MySQL,\n" "@item PostgreSQL,\n" "@item SQLite.\n" "@end itemize" msgstr "" #: gnu/packages/databases.scm:4788 msgid "C++ Database Access Library" msgstr "" #: gnu/packages/databases.scm:4790 msgid "" "SOCI is an abstraction layer for several database backends, including\n" "PostreSQL, SQLite, ODBC and MySQL." msgstr "" #: gnu/packages/databases.scm:4812 msgid "Client libraries for MS SQL and Sybase servers" msgstr "" #: gnu/packages/databases.scm:4814 msgid "" "FreeTDS is an implementation of the Tabular DataStream protocol, used for\n" "connecting to MS SQL and Sybase servers over TCP/IP." msgstr "" #: gnu/packages/databases.scm:4834 msgid "TinyDB is a lightweight document oriented database" msgstr "" #: gnu/packages/databases.scm:4836 msgid "" "TinyDB is a small document oriented database written in pure Python\n" "with no external dependencies. The targets are small apps that would\n" "be blown away by a SQL-DB or an external database server." msgstr "" #: gnu/packages/databases.scm:4883 msgid "Friendly SQL Client" msgstr "" #: gnu/packages/databases.scm:4884 msgid "" "Sequeler is a native Linux SQL client built in Vala and\n" "Gtk. It allows you to connect to your local and remote databases, write SQL in\n" "a handy text editor with language recognition, and visualize SELECT results in\n" "a Gtk.Grid Widget." msgstr "" #: gnu/packages/databases.scm:4928 msgid "Visual database browser and editor for SQLite" msgstr "" #: gnu/packages/databases.scm:4929 msgid "" "Sqlitebrowser lets you create, design, and edit database files\n" "compatible with SQLite using a graphical user interface." msgstr "" #: gnu/packages/databases.scm:4963 msgid "SQL language server written in Go" msgstr "" #: gnu/packages/databases.scm:4965 msgid "This package implements the @acronym{LSP, Language Server Protocol} for SQL." msgstr "" #: gnu/packages/databases.scm:4989 msgid "Caching front-end based on the Dogpile lock" msgstr "" #: gnu/packages/databases.scm:4990 msgid "" "@code{dogpile.cache} is a caching API which provides a\n" "generic interface to caching backends of any variety, and additionally\n" "provides API hooks which integrate these cache backends with the locking\n" "mechanism of @code{dogpile}." msgstr "" #: gnu/packages/debug.scm:117 msgid "Heuristical file minimizer" msgstr "" #: gnu/packages/debug.scm:119 msgid "" "Delta assists you in minimizing \"interesting\" files subject to a test\n" "of their interestingness. A common such situation is when attempting to\n" "isolate a small failure-inducing substring of a large input that causes your\n" "program to exhibit a bug." msgstr "" #: gnu/packages/debug.scm:178 gnu/packages/debug.scm:230 msgid "Reducer for interesting code" msgstr "" #: gnu/packages/debug.scm:180 msgid "" "C-Reduce is a tool that takes a large C or C++ program that has a\n" "property of interest (such as triggering a compiler bug) and automatically\n" "produces a much smaller C/C++ program that has the same property. It is\n" "intended for use by people who discover and report bugs in compilers and other\n" "tools that process C/C++ code." msgstr "" #: gnu/packages/debug.scm:232 msgid "" "C-Vise is a Python port of the C-Reduce tool that is fully compatible\n" "and uses the same efficient LLVM-based C/C++ @code{clang_delta} reduction\n" "tool." msgstr "" #: gnu/packages/debug.scm:300 msgid "Security-oriented fuzzer" msgstr "" #: gnu/packages/debug.scm:302 msgid "" "American fuzzy lop is a security-oriented fuzzer that employs a novel\n" "type of compile-time instrumentation and genetic algorithms to automatically\n" "discover clean, interesting test cases that trigger new internal states in the\n" "targeted binary. This substantially improves the functional coverage for the\n" "fuzzed code. The compact synthesized corpora produced by the tool are also\n" "useful for seeding other, more labor- or resource-intensive testing regimes\n" "down the road." msgstr "" #: gnu/packages/debug.scm:444 msgid "Machine emulator and virtualizer (without GUI) for american fuzzy lop" msgstr "" #: gnu/packages/debug.scm:446 msgid "" "QEMU is a generic machine emulator and virtualizer. This package\n" "of QEMU is used only by the american fuzzy lop package.\n" "\n" "When used as a machine emulator, QEMU can run OSes and programs made for one\n" "machine (e.g. an ARM board) on a different machine---e.g., your own PC. By\n" "using dynamic translation, it achieves very good performance.\n" "\n" "When used as a virtualizer, QEMU achieves near native performances by\n" "executing the guest code directly on the host CPU. QEMU supports\n" "virtualization when executing under the Xen hypervisor or using\n" "the KVM kernel module in Linux. When using KVM, QEMU can virtualize x86,\n" "server and embedded PowerPC, and S390 guests." msgstr "" #: gnu/packages/debug.scm:512 msgid "Expose race conditions in Makefiles" msgstr "" #: gnu/packages/debug.scm:514 msgid "" "Stress Make is a customized GNU Make that explicitly manages the order\n" "in which concurrent jobs are run to provoke erroneous behavior into becoming\n" "manifest. It can run jobs in the order in which they're launched, in backwards\n" "order, or in random order. The thought is that if code builds correctly with\n" "Stress Make, then it is likely that the @code{Makefile} contains no race\n" "conditions." msgstr "" #: gnu/packages/debug.scm:541 msgid "Transparent application input fuzzer" msgstr "" #: gnu/packages/debug.scm:542 msgid "" "Zzuf is a transparent application input fuzzer. It works by\n" "intercepting file operations and changing random bits in the program's\n" "input. Zzuf's behaviour is deterministic, making it easy to reproduce bugs." msgstr "" #: gnu/packages/debug.scm:593 msgid "Memory scanner" msgstr "" #: gnu/packages/debug.scm:594 msgid "" "Scanmem is a debugging utility designed to isolate the\n" "address of an arbitrary variable in an executing process. Scanmem simply\n" "needs to be told the pid of the process and the value of the variable at\n" "several different times. After several scans of the process, scanmem isolates\n" "the position of the variable and allows you to modify its value." msgstr "" #: gnu/packages/debug.scm:624 msgid "" "Remake is an enhanced version of GNU Make that adds improved\n" "error reporting, better tracing, profiling, and a debugger." msgstr "" #: gnu/packages/debug.scm:680 msgid "Record and reply debugging framework" msgstr "" #: gnu/packages/debug.scm:682 msgid "" "rr is a lightweight tool for recording, replaying and debugging\n" "execution of applications (trees of processes and threads). Debugging extends\n" "GDB with very efficient reverse-execution, which in combination with standard\n" "GDB/x86 features like hardware data watchpoints, makes debugging much more\n" "fun." msgstr "" #: gnu/packages/debug.scm:709 msgid "C library for producing symbolic backtraces" msgstr "" #: gnu/packages/debug.scm:710 msgid "" "The @code{libbacktrace} library can be linked into a C/C++\n" "program to produce symbolic backtraces." msgstr "" #: gnu/packages/debug.scm:749 msgid "Memory leaks detection tool" msgstr "" #: gnu/packages/debug.scm:750 msgid "" "The libleak tool detects memory leaks by hooking memory\n" "functions such as @code{malloc}. It comes as a shared object to be pre-loaded\n" "via @code{LD_PRELOAD} when launching the application. It prints the full call\n" "stack at suspicious memory leak points. Modifying or recompiling the target\n" "program is not required, and the detection can be enabled or disabled while\n" "the target application is running. The overhead incurred by libleak is\n" "smaller than that of other tools such as Valgrind, and it aims to be easier to\n" "use than similar tools like @command{mtrace}." msgstr "" #: gnu/packages/debug.scm:792 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "Console front-end to the GNU debugger" msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/debug.scm:794 msgid "" "@code{cgdb} is a lightweight curses (terminal-based) interface to the\n" "GNU Debugger (GDB). In addition to the standard gdb console, cgdb provides\n" "a split screen view that displays the source code as it executes. The\n" "keyboard interface is modeled after vim, so vim users should feel at home\n" "using cgdb." msgstr "" #: gnu/packages/debug.scm:828 msgid "Debugging tool for MSP430 MCUs" msgstr "" #: gnu/packages/debug.scm:829 msgid "" "MspDebug supports FET430UIF, eZ430, RF2500 and Olimex\n" "MSP430-JTAG-TINY programmers, as well as many other compatible\n" "devices. It can be used as a proxy for gdb or as an independent\n" "debugger with support for programming, disassembly and reverse\n" "engineering." msgstr "" #: gnu/packages/debug.scm:860 msgid "GUI frontend for GDB" msgstr "" #: gnu/packages/debug.scm:861 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "This package provides a frontend to GDB, the GNU debugger." msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/debug.scm:886 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "Graphical front-end for GDB and other debuggers" msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/debug.scm:887 msgid "" "GNU DDD, the Data Display Debugger, is a graphical front-end\n" "for command-line debuggers. Many back-end debuggers are supported, notably\n" "the GNU debugger, GDB. In addition to usual debugging features such as\n" "viewing the source files, DDD has additional graphical, interactive features\n" "to aid in debugging." msgstr "" #: gnu/packages/debug.scm:918 msgid "Debugger for the Go programming language" msgstr "" #: gnu/packages/debug.scm:919 msgid "Delve is a debugger for the Go programming language." msgstr "" #: gnu/packages/dejagnu.scm:78 msgid "GNU software testing framework" msgstr "" #: gnu/packages/dejagnu.scm:80 msgid "" "DejaGnu is a framework for testing software. In effect, it serves as\n" "a front-end for all tests written for a program. Thus, each program can have\n" "multiple test suites, which are then all managed by a single harness." msgstr "" #: gnu/packages/games.scm:291 msgid "Scrolling, platform-jumping, ancient pyramid exploring game" msgstr "" #: gnu/packages/games.scm:293 msgid "" "Abe's Amazing Adventure is a scrolling,\n" "platform-jumping, key-collecting, ancient pyramid exploring game, vaguely in\n" "the style of similar games for the Commodore+4." msgstr "" #: gnu/packages/games.scm:361 msgid "Action game in four spatial dimensions" msgstr "" #: gnu/packages/games.scm:363 msgid "" "Adanaxis is a fast-moving first person shooter set in deep space, where\n" "the fundamentals of space itself are changed. By adding another dimension to\n" "space this game provides an environment with movement in four directions and\n" "six planes of rotation. Initially the game explains the 4D control system via\n" "a graphical sequence, before moving on to 30 levels of gameplay with numerous\n" "enemy, ally, weapon and mission types. Features include simulated 4D texturing,\n" "mouse and joystick control, and original music." msgstr "" #: gnu/packages/games.scm:405 msgid "Retro platform game" msgstr "" #: gnu/packages/games.scm:407 msgid "" "Guide Alex the Allegator through the jungle in order to save his\n" "girlfriend Lola from evil humans who want to make a pair of shoes out of her.\n" "Plenty of classic platforming in four nice colors guaranteed!\n" "\n" "The game includes a built-in editor so you can design and share your own maps." msgstr "" #: gnu/packages/games.scm:436 msgid "Tron clone in 3D" msgstr "" #: gnu/packages/games.scm:437 msgid "" "Armagetron Advanced is a multiplayer game in 3d that\n" "attempts to emulate and expand on the lightcycle sequence from the movie Tron.\n" "It's an old school arcade game slung into the 21st century. Highlights\n" "include a customizable playing arena, HUD, unique graphics, and AI bots. For\n" "the more advanced player there are new game modes and a wide variety of\n" "physics settings to tweak as well." msgstr "" #: gnu/packages/games.scm:490 msgid "3D space shooter with spaceship upgrade possibilities" msgstr "" #: gnu/packages/games.scm:492 msgid "" "Space is a vast area, an unbounded territory where it seems there is\n" "a room for everybody, but reversal of fortune put things differently. The\n" "hordes of hostile creatures crawled out from the dark corners of the universe,\n" "craving to conquer your homeland. Their force is compelling, their legions\n" "are interminable. However, humans didn't give up without a final showdown and\n" "put their best pilot to fight back. These malicious invaders chose the wrong\n" "galaxy to conquer and you are to prove it! Go ahead and make alien aggressors\n" "regret their insolence." msgstr "" #: gnu/packages/games.scm:548 msgid "3D first-person roguelike game" msgstr "" #: gnu/packages/games.scm:550 msgid "" "Barony is a first-person roguelike role-playing game with cooperative\n" "play. The player must descend a dark dungeon and destroy an undead lich while\n" "avoiding traps and fighting monsters. The game features randomly generated\n" "dungeons, 13 character classes, hundreds of items and artifacts, and\n" "cooperative multiplayer for up to four players. This package does @emph{not}\n" "provide the game assets." msgstr "" #: gnu/packages/games.scm:611 msgid "Antagonistic Tetris-style falling brick game for text terminals" msgstr "" #: gnu/packages/games.scm:613 msgid "" "Bastet (short for Bastard Tetris) is a simple ncurses-based falling brick\n" "game. Unlike normal Tetris, Bastet does not choose the next brick at random.\n" "Instead, it uses a special algorithm to choose the worst brick possible.\n" "\n" "Playing bastet can be a painful experience, especially if you usually make\n" "canyons and wait for the long I-shaped block to clear four rows at a time." msgstr "" #: gnu/packages/games.scm:657 msgid "Terminal-based multiplayer Tetris clone" msgstr "" #: gnu/packages/games.scm:658 msgid "" "Tetrinet is a multiplayer Tetris-like game with powerups and\n" "attacks you can use on opponents." msgstr "" #: gnu/packages/games.scm:691 msgid "Terminal-based Tetris clone" msgstr "" #: gnu/packages/games.scm:692 msgid "" "Vitetris is a classic multiplayer Tetris clone for the\n" "terminal." msgstr "" #: gnu/packages/games.scm:734 msgid "Platform action game featuring a blob with a lot of weapons" msgstr "" #: gnu/packages/games.scm:735 msgid "" "Blobwars: Metal Blob Solid is a 2D platform game, the first\n" "in the Blobwars series. You take on the role of a fearless Blob agent. Your\n" "mission is to infiltrate various enemy bases and rescue as many MIAs as\n" "possible, while battling many vicious aliens." msgstr "" #: gnu/packages/games.scm:826 msgid "Collection of the old text-based games and amusements" msgstr "" #: gnu/packages/games.scm:828 msgid "" "These are the BSD games.\n" "\n" "Action: atc (keep the airplanes safe), hack (explore the dangerous Dungeon),\n" "hunt (kill the others for the Pair of Boots, multi-player only), robots (avoid\n" "the evil robots), sail (game of naval warfare with wooden ships), snake (steal\n" "the $$ from the cave, anger the snake, and get out alive), tetris (game of\n" "lining up the falling bricks of different shapes), and worm (eat, grow big,\n" "and neither bite your tail, nor ram the wall).\n" "\n" "Amusements: banner (prints a large banner), bcd & morse & ppt (print a punch\n" "card, or paper tape, or Morse codes), caesar & rot13 (ciphers and deciphers\n" "the input), factor (factorizes a number), number (translates numbers into\n" "text), pig (translates from English to Pig Latin), pom (should print the\n" "Moon's phase), primes (generates primes), rain & worms (plays an screen-saver\n" "in terminal), random (prints randomly chosen lines from files, or returns a\n" "random exit-code), and wtf (explains what do some acronyms mean).\n" "\n" "Board: backgammon (lead the men out of board faster than the friend do),\n" "boggle (find the words in the square of letters), dab (game of dots and\n" "boxes), gomoku (game of five in a row), hangman (guess a word before man is\n" "hanged), and monop (game of monopoly, hot-seat only). Also the card-games:\n" "canfield, cribbage, fish (juniors game), and mille.\n" "\n" "Quests: adventure (search for treasures with the help of wizard),\n" "battlestar (explore the world around, starting from dying spaceship),\n" "phantasia (role-play as an rogue), trek (hunt the Klingons, and save the\n" "Federation), and wump (hunt the big smelly Wumpus in a dark cave).\n" "\n" "Quizzes: arithmetic and quiz." msgstr "" #: gnu/packages/games.scm:921 msgid "3D first person tank battle game" msgstr "" #: gnu/packages/games.scm:923 msgid "" "BZFlag is a 3D multi-player multiplatform tank battle game that\n" "allows users to play against each other in a network environment.\n" "There are five teams: red, green, blue, purple and rogue (rogue tanks\n" "are black). Destroying a player on another team scores a win, while\n" "being destroyed or destroying a teammate scores a loss. Rogues have\n" "no teammates (not even other rogues), so they cannot shoot teammates\n" "and they do not have a team score.\n" "\n" "There are two main styles of play: capture-the-flag and free-for-all.\n" "In capture-the-flag, each team (except rogues) has a team base and\n" "each team with at least one player has a team flag. The object is to\n" "capture an enemy team's flag by bringing it to your team's base. This\n" "destroys every player on the captured team, subtracts one from that\n" "team's score, and adds one to your team's score. In free-for-all,\n" "there are no team flags or team bases. The object is simply to get as\n" "high a score as possible." msgstr "" #: gnu/packages/games.scm:1004 msgid "Survival horror roguelike video game" msgstr "" #: gnu/packages/games.scm:1006 msgid "" "Cataclysm: Dark Days Ahead (or \"DDA\" for short) is a roguelike set\n" "in a post-apocalyptic world. Struggle to survive in a harsh, persistent,\n" "procedurally generated world. Scavenge the remnants of a dead civilization\n" "for food, equipment, or, if you are lucky, a vehicle with a full tank of gas\n" "to get you out of Dodge. Fight to defeat or escape from a wide variety of\n" "powerful monstrosities, from zombies to giant insects to killer robots and\n" "things far stranger and deadlier, and against the others like yourself, that\n" "want what you have." msgstr "" #: gnu/packages/games.scm:1054 msgid "Tabletop card game simulator" msgstr "" #: gnu/packages/games.scm:1055 msgid "" "Cockatrice is a program for playing tabletop card games\n" "over a network. Its server design prevents users from manipulating the game\n" "for unfair advantage. The client also provides a single-player mode, which\n" "allows users to brew while offline." msgstr "" #: gnu/packages/games.scm:1107 msgid "Implementation of the @i{Theme Hospital} game engine" msgstr "" #: gnu/packages/games.scm:1109 msgid "" "This package provides a reimplementation of the 1997 Bullfrog business\n" "simulation game @i{Theme Hospital}. As well as faithfully recreating the\n" "original engine, CorsixTH adds support for high resolutions, custom levels and\n" "more. This package does @emph{not} provide the game assets." msgstr "" #: gnu/packages/games.scm:1150 msgid "Speaking cow text filter" msgstr "" #: gnu/packages/games.scm:1151 msgid "" "Cowsay is basically a text filter. Send some text into it,\n" "and you get a cow saying your text. If you think a talking cow isn't enough,\n" "cows can think too: all you have to do is run @command{cowthink}. If you're\n" "tired of cows, a variety of other ASCII-art messengers are available." msgstr "" #: gnu/packages/games.scm:1180 msgid "Fallout 2 game engine" msgstr "" #: gnu/packages/games.scm:1181 #, scheme-format msgid "" "This package provides the Fallout 2 game engine. Game data\n" "should be placed in @file{~/.local/share/falltergeist}." msgstr "" #: gnu/packages/games.scm:1291 msgid "3D billiard game" msgstr "" #: gnu/packages/games.scm:1292 msgid "" "FooBillard++ is an advanced 3D OpenGL billiard game\n" "based on the original foobillard 3.0a sources from Florian Berger.\n" "You can play it with one or two players or against the computer.\n" "\n" "The game features:\n" "\n" "@itemize\n" "@item Wood paneled table with gold covers and gold diamonds.\n" "@item Reflections on balls.\n" "@item Zoom in and out, rotation, different angles and bird's eye view.\n" "@item Different game modes: 8 or 9-ball, Snooker or Carambole.\n" "@item Tournaments. Compete against other players.\n" "@item Animated cue with strength and eccentric hit adjustment.\n" "@item Jump shots and snipping.\n" "@item Realistic gameplay and billiard sounds.\n" "@item Red-Green stereo.\n" "@item And much more.\n" "@end itemize" msgstr "" #: gnu/packages/games.scm:1350 msgid "Free content game based on the Doom engine" msgstr "" #: gnu/packages/games.scm:1359 msgid "" "The Freedoom project aims to create a complete free content first person\n" "shooter game. Freedoom by itself is just the raw material for a game: it must\n" "be paired with a compatible game engine (such as @code{prboom-plus}) to be\n" "played. Freedoom complements the Doom engine with free levels, artwork, sound\n" "effects and music to make a completely free game." msgstr "" #: gnu/packages/games.scm:1412 msgid "Isometric role-playing game against killer robots" msgstr "" #: gnu/packages/games.scm:1414 msgid "" "Freedroid RPG is an @dfn{RPG} (Role-Playing Game) with isometric graphics.\n" "The game tells the story of a world destroyed by a conflict between robots and\n" "their human masters. To restore peace to humankind, the player must complete\n" "numerous quests while fighting off rebelling robots---either by taking control\n" "of them, or by simply blasting them to pieces with melee and ranged weapons in\n" "real-time combat." msgstr "" #: gnu/packages/games.scm:1477 msgid "Software for exploring cellular automata" msgstr "" #: gnu/packages/games.scm:1479 msgid "" "Golly simulates Conway's Game of Life and many other types of cellular\n" "automata. The following features are available:\n" "@enumerate\n" "@item Support for bounded and unbounded universes, with cells of up to 256\n" " states.\n" "@item Support for multiple algorithms, including Bill Gosper's Hashlife\n" " algorithm.\n" "@item Loading patterns from BMP, PNG, GIF and TIFF image files.\n" "@item Reading RLE, macrocell, Life 1.05/1.06, dblife and MCell files.\n" "@item Scriptable via Lua or Python.\n" "@item Extracting patterns, rules and scripts from zip files.\n" "@item Downloading patterns, rules and scripts from online archives.\n" "@item Pasting patterns from the clipboard.\n" "@item Unlimited undo/redo.\n" "@item Configurable keyboard shortcuts.\n" "@item Auto fit option to keep patterns within the view.\n" "@end enumerate" msgstr "" #: gnu/packages/games.scm:1534 msgid "Joy-Con controller daemon" msgstr "" #: gnu/packages/games.scm:1535 #, fuzzy #| msgid "This package provides a dictionary for the GNU Aspell spell checker." msgid "" "This package provides a userspace daemon for the Nintendo\n" "Joy-Con controllers." msgstr "Questo pacchetto fornisce un dizionario per il correttore ortografico GNU Aspell." #: gnu/packages/games.scm:1563 msgid "Re-implementation of Caesar III game engine" msgstr "" #: gnu/packages/games.scm:1565 msgid "" "Engine for Caesar III, a city-building real-time strategy game.\n" "Julius includes some UI enhancements while preserving the logic (including\n" "bugs) of the original game, so that saved games are compatible. This package\n" "does not include game data." msgstr "" #: gnu/packages/games.scm:1599 msgid "Re-implementation of Caesar III game engine with gameplay changes" msgstr "" #: gnu/packages/games.scm:1601 msgid "" "Fork of Julius, an engine for the a city-building real-time strategy\n" "game Caesar III. Gameplay enhancements include:\n" "\n" "@itemize\n" "@item roadblocks;\n" "@item market special orders;\n" "@item global labour pool;\n" "@item partial warehouse storage;\n" "@item increased game limits;\n" "@item zoom controls.\n" "@end itemize\n" msgstr "" #: gnu/packages/games.scm:1639 msgid "Puzzle/platform game" msgstr "" #: gnu/packages/games.scm:1640 msgid "" "Me and My Shadow is a puzzle/platform game in which you try\n" "to reach the exit by solving puzzles. Spikes, moving blocks, fragile blocks\n" "and much more stand between you and the exit. Record your moves and let your\n" "shadow mimic them to reach blocks you couldn't reach alone." msgstr "" #: gnu/packages/games.scm:1692 msgid "2D retro side-scrolling game" msgstr "" #: gnu/packages/games.scm:1693 msgid "" "@code{Open Surge} is a 2D retro side-scrolling platformer\n" "inspired by the Sonic games. The player runs at high speeds through each\n" "level while collecting items and avoiding obstacles. The game includes a\n" "built-in level editor." msgstr "" #: gnu/packages/games.scm:1738 msgid "Multiplayer dungeon game involving knights and quests" msgstr "" #: gnu/packages/games.scm:1739 msgid "" "Knights is a multiplayer game involving several knights who\n" "must run around a dungeon and complete various quests. Each game revolves\n" "around a quest – for example, you might have to find some items and carry them\n" "back to your starting point. This may sound easy, but as there are only\n" "enough items in the dungeon for one player to win, you may end up having to\n" "kill your opponents to get their stuff! Other quests involve escaping from\n" "the dungeon, fighting a duel to the death against the enemy knights, or\n" "destroying an ancient book using a special wand." msgstr "" #: gnu/packages/games.scm:1788 msgid "Move the tiles until you obtain the 2048 tile" msgstr "" #: gnu/packages/games.scm:1789 msgid "" "GNOME 2048 provides a 2D grid for playing 2048, a\n" "single-player sliding tile puzzle game. The objective of the game is to merge\n" "together adjacent tiles of the same number until the sum of 2048 is achieved\n" "in one tile." msgstr "" #: gnu/packages/games.scm:1827 msgid "Chess board for GNOME" msgstr "" #: gnu/packages/games.scm:1828 msgid "" "GNOME Chess provides a 2D board for playing chess games\n" "against human or computer players. It supports loading and saving games in\n" "Portable Game Notation. To play against a computer, install a chess engine\n" "such as chess or stockfish." msgstr "" #: gnu/packages/games.scm:1888 msgid "Backgammon game" msgstr "" #: gnu/packages/games.scm:1889 msgid "" "The GNU backgammon application (also known as \"gnubg\") can\n" "be used for playing, analyzing and teaching the game. It has an advanced\n" "evaluation engine based on artificial neural networks suitable for both\n" "beginners and advanced players. In addition to a command-line interface, it\n" "also features an attractive, 3D representation of the playing board." msgstr "" #: gnu/packages/games.scm:1928 msgid "3d Rubik's cube game" msgstr "" #: gnu/packages/games.scm:1930 msgid "" "GNUbik is a puzzle game in which you must manipulate a cube to make\n" "each of its faces have a uniform color. The game is customizable, allowing\n" "you to set the size of the cube (the default is 3x3) or to change the colors.\n" "You may even apply photos to the faces instead of colors. The game is\n" "scriptable with Guile." msgstr "" #: gnu/packages/games.scm:1952 msgid "The game of Shogi (Japanese chess)" msgstr "" #: gnu/packages/games.scm:1953 msgid "" "GNU Shogi is a program that plays the game Shogi (Japanese\n" "Chess). It is similar to standard chess but this variant is far more complicated." msgstr "" #: gnu/packages/games.scm:1981 msgid "Tetris clone based on the SDL library" msgstr "" #: gnu/packages/games.scm:1983 msgid "" "LTris is a tetris clone: differently shaped blocks are falling down the\n" "rectangular playing field and can be moved sideways or rotated by 90 degree\n" "units with the aim of building lines without gaps which then disappear (causing\n" "any block above the deleted line to fall down). LTris has three game modes: In\n" "Classic you play until the stack of blocks reaches the top of the playing field\n" "and no new blocks can enter. In Figures the playing field is reset to a new\n" "figure each level and later on tiles and lines suddenly appear. In Multiplayer\n" "up to three players (either human or CPU) compete with each other sending\n" "removed lines to all opponents. There is also a Demo mode in which you can\n" "watch your CPU playing while enjoying a cup of tea!" msgstr "" #: gnu/packages/games.scm:2105 msgid "Classic dungeon crawl game" msgstr "" #: gnu/packages/games.scm:2106 msgid "" "NetHack is a single player dungeon exploration game that runs\n" "on a wide variety of computer systems, with a variety of graphical and text\n" "interfaces all using the same game engine. Unlike many other Dungeons &\n" "Dragons-inspired games, the emphasis in NetHack is on discovering the detail of\n" "the dungeon and not simply killing everything in sight - in fact, killing\n" "everything in sight is a good way to die quickly. Each game presents a\n" "different landscape - the random number generator provides an essentially\n" "unlimited number of variations of the dungeon and its denizens to be discovered\n" "by the player in one of a number of characters: you can pick your race, your\n" "role, and your gender." msgstr "" #: gnu/packages/games.scm:2148 msgid "Logical tile puzzle" msgstr "" #: gnu/packages/games.scm:2150 msgid "" "PipeWalker is a simple puzzle game with many diffent themes: connect all\n" "computers to one network server, bring water from a source to the taps, etc.\n" "The underlying mechanism is always the same: you must turn each tile in the\n" "grid in the right direction to combine all components into a single circuit.\n" "Every puzzle has a complete solution, although there may be more than one." msgstr "" #: gnu/packages/games.scm:2197 msgid "Version of the classic 3D shoot'em'up game Doom" msgstr "" #: gnu/packages/games.scm:2199 msgid "PrBoom+ is a Doom source port developed from the original PrBoom project." msgstr "" #: gnu/packages/games.scm:2246 msgid "Action platformer game" msgstr "" #: gnu/packages/games.scm:2248 msgid "" "ReTux is an action platformer loosely inspired by the Mario games,\n" "utilizing the art assets from the @code{SuperTux} project." msgstr "" #: gnu/packages/games.scm:2283 msgid "Thematic meditative game" msgstr "" #: gnu/packages/games.scm:2285 msgid "" "You are a robot moving around in a realm filled with ASCII characters.\n" "Examine humorously described though useless items as you search for a kitten\n" "among them. The theme of this Zen simulation is continued in its\n" "documentation." msgstr "" #: gnu/packages/games.scm:2388 msgid "Classical roguelike/sandbox game" msgstr "" #: gnu/packages/games.scm:2390 msgid "" "RogueBox Adventures is a graphical roguelike with strong influences\n" "from sandbox games like Minecraft or Terraria. The main idea of RogueBox\n" "Adventures is to offer the player a kind of roguelike toy-world. This world\n" "can be explored and changed freely." msgstr "" #: gnu/packages/games.scm:2498 msgid "Help Barbie the seahorse float on bubbles to the moon" msgstr "" #: gnu/packages/games.scm:2500 msgid "" "Barbie Seahorse Adventures is a retro style platform arcade game.\n" "You are Barbie the seahorse who travels through the jungle, up to the\n" "volcano until you float on bubbles to the moon. On the way to your\n" "final destination you will encounter various enemies, servants of the\n" "evil overlord who has stolen the galaxy crystal. Avoid getting hit\n" "and defeat them with your bubbles!" msgstr "" #: gnu/packages/games.scm:2558 msgid "Lightweight game engine for Action-RPGs" msgstr "" #: gnu/packages/games.scm:2560 msgid "" "Solarus is a 2D game engine written in C++, that can run games\n" "scripted in Lua. It has been designed with 16-bit classic Action-RPGs\n" "in mind." msgstr "" #: gnu/packages/games.scm:2587 msgid "Create and modify quests for the Solarus engine" msgstr "" #: gnu/packages/games.scm:2589 msgid "" "Solarus Quest Editor is a graphical user interface to create and\n" "modify quests for the Solarus engine." msgstr "" #: gnu/packages/games.scm:2664 msgid "Fast-paced local multiplayer arcade game" msgstr "" #: gnu/packages/games.scm:2665 msgid "" "In SuperStarfighter, up to four local players compete in a\n" "2D arena with fast-moving ships and missiles. Different game types are\n" "available, as well as a single-player mode with AI-controlled ships." msgstr "" #: gnu/packages/games.scm:2693 msgid "Jigsaw puzzle game that uses tetrominoes for the pieces" msgstr "" #: gnu/packages/games.scm:2695 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any image\n" "can be imported and used to create puzzles with a wide range of sizes. Games are\n" "saved automatically, and you can select between currently in progress games." msgstr "" #: gnu/packages/games.scm:2826 msgid "Fast-paced single-player racing game" msgstr "" #: gnu/packages/games.scm:2827 msgid "" "Trigger-rally is a 3D rally simulation with great physics\n" "for drifting on over 200 maps. Different terrain materials like dirt,\n" "asphalt, sand, ice, etc. and various weather, light, and fog conditions give\n" "this rally simulation the edge over many other games. You need to make it\n" "through the maps in often tight time limits and can further improve by beating\n" "the recorded high scores. All attached single races must be finished in time\n" "in order to win an event, unlocking additional events and cars. Most maps are\n" "equipped with spoken co-driver notes and co-driver icons." msgstr "" #: gnu/packages/games.scm:2881 msgid "UFO: AI map generator" msgstr "" #: gnu/packages/games.scm:2883 msgid "" "This package provides @command{ufo2map}, a program used to generate\n" "maps for the UFO: Alien Invasion strategy game." msgstr "" #: gnu/packages/games.scm:2923 msgid "UFO: AI data files" msgstr "" #: gnu/packages/games.scm:2925 msgid "This package contains maps and other assets for UFO: Alien Invasion." msgstr "" #: gnu/packages/games.scm:3010 msgid "Turn-based tactical strategy game" msgstr "" #: gnu/packages/games.scm:3012 msgid "" "UFO: Alien Invasion is a tactical strategy game set in the year 2084.\n" "You control a secret organisation charged with defending Earth from a brutal\n" "alien enemy. Build up your bases, prepare your team, and dive head-first into\n" "the fast and flowing turn-based combat.\n" "\n" "Over the long term you will need to conduct research into the alien threat to\n" "figure out their mysterious goals and use their powerful weapons for your own\n" "ends. You will produce unique items and use them in combat against your\n" "enemies.\n" "\n" "You can also use them against your friends with the multiplayer functionality.\n" "\n" "Warning: This is a pre-release version of UFO: AI! Some things may not work\n" "properly." msgstr "" #: gnu/packages/games.scm:3048 msgid "User interface for gnushogi" msgstr "" #: gnu/packages/games.scm:3049 msgid "A graphical user interface for the package @code{gnushogi}." msgstr "" #: gnu/packages/games.scm:3101 msgid "GNU/Linux port of the indie game \"l'Abbaye des Morts\"" msgstr "" #: gnu/packages/games.scm:3102 msgid "" "L'Abbaye des Morts is a 2D platform game set in 13th century\n" "France. The Cathars, who preach about good Christian beliefs, were being\n" "expelled by the Catholic Church out of the Languedoc region in France. One of\n" "them, called Jean Raymond, found an old church in which to hide, not knowing\n" "that beneath its ruins lay buried an ancient evil." msgstr "" #: gnu/packages/games.scm:3145 msgid "Dungeon exploration roguelike" msgstr "" #: gnu/packages/games.scm:3146 msgid "" "Angband is a Classic dungeon exploration roguelike. Explore\n" "the depths below Angband, seeking riches, fighting monsters, and preparing to\n" "fight Morgoth, the Lord of Darkness." msgstr "" #: gnu/packages/games.scm:3192 msgid "Lemmings clone" msgstr "" #: gnu/packages/games.scm:3194 msgid "" "Pingus is a free Lemmings-like puzzle game in which the player takes\n" "command of a bunch of small animals and has to guide them through levels.\n" "Since the animals walk on their own, the player can only influence them by\n" "giving them commands, like build a bridge, dig a hole, or redirect all animals\n" "in the other direction. Multiple such commands are necessary to reach the\n" "level's exit. The game is presented in a 2D side view." msgstr "" #: gnu/packages/games.scm:3216 msgid "Convert English text to humorous dialects" msgstr "" #: gnu/packages/games.scm:3217 msgid "" "The GNU Talk Filters are programs that convert English text\n" "into stereotyped or otherwise humorous dialects. The filters are provided as\n" "a C library, so they can easily be integrated into other programs." msgstr "" #: gnu/packages/games.scm:3259 msgid "Shoot'em up fangame and libre clone of Touhou Project" msgstr "" #: gnu/packages/games.scm:3261 msgid "" "The player controls a character (one of three: Good, Bad, and Dead),\n" "dodges the missiles (lots of it cover the screen, but the character's hitbox\n" "is very small), and shoot at the adversaries that keep appear on the screen." msgstr "" #: gnu/packages/games.scm:3303 msgid "Simulate the display from \"The Matrix\"" msgstr "" #: gnu/packages/games.scm:3304 msgid "" "CMatrix simulates the display from \"The Matrix\" and is\n" "based on the screensaver from the movie's website. It works with terminal\n" "settings up to 132x300 and can scroll lines all at the same rate or\n" "asynchronously and at a user-defined speed." msgstr "" #: gnu/packages/games.scm:3334 msgid "Full chess implementation" msgstr "" #: gnu/packages/games.scm:3335 msgid "" "GNU Chess is a chess engine. It allows you to compete\n" "against the computer in a game of chess, either through the default terminal\n" "interface or via an external visual interface such as GNU XBoard." msgstr "" #: gnu/packages/games.scm:3395 msgid "Twisted adventures of young pig farmer Dink Smallwood" msgstr "" #: gnu/packages/games.scm:3397 msgid "" "GNU FreeDink is a free and portable re-implementation of the engine\n" "for the role-playing game Dink Smallwood. It supports not only the original\n" "game data files but it also supports user-produced game mods or \"D-Mods\".\n" "To that extent, it also includes a front-end for managing all of your D-Mods." msgstr "" #: gnu/packages/games.scm:3423 msgid "Game data for GNU Freedink" msgstr "" #: gnu/packages/games.scm:3425 msgid "This package contains the game data of GNU Freedink." msgstr "" #: gnu/packages/games.scm:3447 msgid "Front-end for managing and playing Dink Modules" msgstr "" #: gnu/packages/games.scm:3448 msgid "" "DFArc makes it easy to play and manage the GNU FreeDink game\n" "and its numerous D-Mods." msgstr "" #: gnu/packages/games.scm:3517 msgid "Graphical user interface for chess programs" msgstr "" #: gnu/packages/games.scm:3518 msgid "" "GNU XBoard is a graphical board for all varieties of chess,\n" "including international chess, xiangqi (Chinese chess), shogi (Japanese chess)\n" "and Makruk. Several lesser-known variants are also supported. It presents a\n" "fully interactive graphical interface and it can load and save games in the\n" "Portable Game Notation." msgstr "" #: gnu/packages/games.scm:3551 msgid "Typing tutor" msgstr "" #: gnu/packages/games.scm:3553 msgid "" "GNU Typist is a universal typing tutor. It can be used to learn and\n" "practice touch-typing. Several tutorials are included; in addition to\n" "tutorials for the standard QWERTY layout, there are also tutorials for the\n" "alternative layouts Dvorak and Colemak, as well as for the numpad. Tutorials\n" "are primarily in English, however some in other languages are provided." msgstr "" #: gnu/packages/games.scm:3629 msgid "3D game engine written in C++" msgstr "" #: gnu/packages/games.scm:3631 msgid "" "The Irrlicht Engine is a high performance realtime 3D engine written in\n" "C++. Features include an OpenGL renderer, extensible materials, scene graph\n" "management, character animation, particle and other special effects, support\n" "for common mesh file formats, and collision detection." msgstr "" #: gnu/packages/games.scm:3703 msgid "2D space shooter" msgstr "" #: gnu/packages/games.scm:3705 msgid "" "M.A.R.S. is a 2D space shooter with pretty visual effects and\n" "attractive physics. Players can battle each other or computer controlled\n" "enemies in different game modes such as space ball, death match, team death\n" "match, cannon keep, and grave-itation pit." msgstr "" #: gnu/packages/games.scm:3742 msgid "Curses Implementation of the Glk API" msgstr "" #: gnu/packages/games.scm:3744 msgid "" "Glk defines a portable API for applications with text UIs. It was\n" "primarily designed for interactive fiction, but it should be suitable for many\n" "interactive text utilities, particularly those based on a command line.\n" "This is an implementation of the Glk library which runs in a terminal window,\n" "using the @code{curses.h} library for screen control." msgstr "" #: gnu/packages/games.scm:3782 msgid "Interpreter for Glulx VM" msgstr "" #: gnu/packages/games.scm:3784 msgid "" "Glulx is a 32-bit portable virtual machine intended for writing and\n" "playing interactive fiction. It was designed by Andrew Plotkin to relieve\n" "some of the restrictions in the venerable Z-machine format. This is the\n" "reference interpreter, using the Glk API." msgstr "" #: gnu/packages/games.scm:3808 msgid "Cross platform GUI library specifically for games" msgstr "" #: gnu/packages/games.scm:3810 msgid "" "Fifechan is a lightweight cross platform GUI library written in C++\n" "specifically designed for games. It has a built in set of extendable GUI\n" "Widgets, and allows users to create more." msgstr "" #: gnu/packages/games.scm:3883 msgid "FIFE is a multi-platform isometric game engine written in C++" msgstr "" #: gnu/packages/games.scm:3885 msgid "" "@acronym{FIFE, Flexible Isometric Free Engine} is a multi-platform\n" "isometric game engine. Python bindings are included allowing users to create\n" "games using Python as well as C++." msgstr "" #: gnu/packages/games.scm:3918 msgid "Z-machine interpreter" msgstr "" #: gnu/packages/games.scm:3920 msgid "" "Fizmo is a console-based Z-machine interpreter. It is used to play\n" "interactive fiction, also known as text adventures, which were implemented\n" "either by Infocom or created using the Inform compiler." msgstr "" #: gnu/packages/games.scm:3941 msgid "Play the game of Go" msgstr "" #: gnu/packages/games.scm:3943 msgid "" "GNU Go is a program that plays the game of Go, in which players\n" "place stones on a grid to form territory or capture other stones. While\n" "it can be played directly from the terminal, rendered in ASCII characters,\n" "it is also possible to play GNU Go with 3rd party graphical interfaces or\n" "even in Emacs. It supports the standard game storage format (SGF, Smart\n" "Game Format) and inter-process communication format (GMP, Go Modem\n" "Protocol)." msgstr "" #: gnu/packages/games.scm:3970 msgid "High-speed arctic racing game based on Tux Racer" msgstr "" #: gnu/packages/games.scm:3972 msgid "" "Extreme Tux Racer, or etracer as it is called for short, is\n" "a simple OpenGL racing game featuring Tux, the Linux mascot. The goal of the\n" "game is to slide down a snow- and ice-covered mountain as quickly as possible,\n" "avoiding the trees and rocks that will slow you down.\n" "\n" "Collect herrings and other goodies while sliding down the hill, but avoid fish\n" "bones.\n" "\n" "This game is based on the GPL version of the famous game TuxRacer." msgstr "" #: gnu/packages/games.scm:4066 msgid "Role-playing game engine compatible with Ultima VII" msgstr "" #: gnu/packages/games.scm:4068 #, scheme-format msgid "" "Exult is an Ultima 7 game engine that runs on modern operating systems.\n" "Ultima 7 (or Ultima VII) is a two-part @acronym{RPG, role-playing game} from the\n" "early 1990s.\n" "\n" "Exult is fully compatible with the original Ultima 7, but doesn't require any\n" "of its data files to be useful. Explore entirely new game worlds---or create\n" "your own with the included game and map editor, Exult Studio.\n" "\n" "This package expects the game(s) to be placed in subdirectories of\n" "@file{~/.local/share/exult}." msgstr "" #: gnu/packages/games.scm:4141 msgid "3D kart racing game" msgstr "" #: gnu/packages/games.scm:4142 msgid "" "SuperTuxKart is a 3D kart racing game, with a focus on\n" "having fun over realism. You can play with up to 4 friends on one PC, racing\n" "against each other or just trying to beat the computer; single-player mode is\n" "also available." msgstr "" #: gnu/packages/games.scm:4216 msgid "Isometric realtime strategy, economy and city building simulation" msgstr "" #: gnu/packages/games.scm:4218 msgid "" "Unknown Horizons is a 2D realtime strategy simulation with an emphasis\n" "on economy and city building. Expand your small settlement to a strong and\n" "wealthy colony, collect taxes and supply your inhabitants with valuable\n" "goods. Increase your power with a well balanced economy and with strategic\n" "trade and diplomacy." msgstr "" #: gnu/packages/games.scm:4269 msgid "Game of jumping to the next floor, trying not to fall" msgstr "" #: gnu/packages/games.scm:4271 msgid "" "GNUjump is a simple, yet addictive game in which you must jump from\n" "platform to platform to avoid falling, while the platforms drop at faster rates\n" "the higher you go. The game features multiplayer, unlimited FPS, smooth floor\n" "falling, themeable graphics and sounds, and replays." msgstr "" #: gnu/packages/games.scm:4305 msgid "Turn-based strategy game" msgstr "" #: gnu/packages/games.scm:4307 msgid "" "The Battle for Wesnoth is a fantasy, turn based tactical strategy game,\n" "with several single player campaigns, and multiplayer games (both networked and\n" "local).\n" "\n" "Battle for control on a range of maps, using variety of units which have\n" "advantages and disadvantages against different types of attacks. Units gain\n" "experience and advance levels, and are carried over from one scenario to the\n" "next campaign." msgstr "" #: gnu/packages/games.scm:4326 msgid "Dedicated @emph{Battle for Wesnoth} server" msgstr "" #: gnu/packages/games.scm:4327 msgid "" "This package contains a dedicated server for @emph{The\n" "Battle for Wesnoth}." msgstr "" #: gnu/packages/games.scm:4367 msgid "Mouse and keyboard discovery for children" msgstr "" #: gnu/packages/games.scm:4369 msgid "" "Gamine is a game designed for young children who are learning to use the\n" "mouse and keyboard. The child uses the mouse to draw colored dots and lines\n" "on the screen and keyboard to display letters." msgstr "" #: gnu/packages/games.scm:4399 msgid "Client for 'The Mana World' and similar games" msgstr "" #: gnu/packages/games.scm:4401 msgid "" "ManaPlus is a 2D MMORPG client for game servers. It is the only\n" "fully supported client for @uref{http://www.themanaworld.org, The mana\n" "world}, @uref{http://evolonline.org, Evol Online} and\n" "@uref{http://landoffire.org, Land of fire}." msgstr "" #: gnu/packages/games.scm:4432 msgid "Transportation economics simulator game" msgstr "" #: gnu/packages/games.scm:4433 msgid "" "OpenTTD is a game in which you transport goods and\n" "passengers by land, water and air. It is a re-implementation of Transport\n" "Tycoon Deluxe with many enhancements including multiplayer mode,\n" "internationalization support, conditional orders and the ability to clone,\n" "autoreplace and autoupdate vehicles. This package only includes the game\n" "engine. When you start it you will be prompted to download a graphics set." msgstr "" #: gnu/packages/games.scm:4494 msgid "Base graphics set for OpenTTD" msgstr "" #: gnu/packages/games.scm:4496 msgid "" "The OpenGFX project is an implementation of the OpenTTD base graphics\n" "set that aims to ensure the best possible out-of-the-box experience.\n" "\n" "OpenGFX provides you with...\n" "@enumerate\n" "@item All graphics you need to enjoy OpenTTD.\n" "@item Uniquely drawn rail vehicles for every climate.\n" "@item Completely snow-aware rivers.\n" "@item Different river and sea water.\n" "@item Snow-aware buoys.\n" "@end enumerate" msgstr "" #: gnu/packages/games.scm:4553 msgid "Base sounds for OpenTTD" msgstr "" #: gnu/packages/games.scm:4554 msgid "" "OpenSFX is a set of free base sounds for OpenTTD which make\n" "it possible to play OpenTTD without requiring the proprietary sound files from\n" "the original Transport Tycoon Deluxe." msgstr "" #: gnu/packages/games.scm:4597 msgid "Music set for OpenTTD" msgstr "" #: gnu/packages/games.scm:4598 msgid "" "OpenMSX is a music set for OpenTTD which makes it possible\n" "to play OpenTTD without requiring the proprietary music from the original\n" "Transport Tycoon Deluxe." msgstr "" #: gnu/packages/games.scm:4675 msgid "Title sequences for OpenRCT2" msgstr "" #: gnu/packages/games.scm:4677 msgid "openrct2-title-sequences is a set of title sequences for OpenRCT2." msgstr "" #: gnu/packages/games.scm:4715 msgid "Objects for OpenRCT2" msgstr "" #: gnu/packages/games.scm:4717 msgid "openrct2-objects is a set of objects for OpenRCT2." msgstr "" #: gnu/packages/games.scm:4779 msgid "Free software re-implementation of RollerCoaster Tycoon 2" msgstr "" #: gnu/packages/games.scm:4780 msgid "" "OpenRCT2 is a free software re-implementation of\n" "RollerCoaster Tycoon 2 (RCT2). The gameplay revolves around building and\n" "maintaining an amusement park containing attractions, shops and facilities.\n" "\n" "Note that this package does @emph{not} provide the game assets (sounds,\n" "images, etc.)" msgstr "" #: gnu/packages/games.scm:4816 msgid "Japanese Mahjong client" msgstr "" #: gnu/packages/games.scm:4818 msgid "" "OpenRiichi is a client for playing Japanese Mahjong, and it supports\n" "singleplayer and multiplayer, with or without bots. It features all the\n" "standard riichi rules, as well as some optional ones. It also supports game\n" "logging, so games can be viewed again." msgstr "" #: gnu/packages/games.scm:4867 msgid "Pinball simulator" msgstr "" #: gnu/packages/games.scm:4868 msgid "" "The Emilia Pinball Project is a pinball simulator. There\n" "are only two levels to play with, but they are very addictive." msgstr "" #: gnu/packages/games.scm:4896 msgid "Board game inspired by The Settlers of Catan" msgstr "" #: gnu/packages/games.scm:4897 msgid "" "Pioneers is an emulation of the board game The Settlers of\n" "Catan. It can be played on a local network, on the internet, and with AI\n" "players." msgstr "" #: gnu/packages/games.scm:4938 gnu/packages/gnome.scm:5424 msgid "Logic puzzle game" msgstr "" #: gnu/packages/games.scm:4939 msgid "" "The goal of this logic game is to open all cards in a 6x6\n" "grid, using a number of hints as to their relative position. The game idea\n" "is attributed to Albert Einstein." msgstr "" #: gnu/packages/games.scm:4967 msgid "MUD and telnet client" msgstr "" #: gnu/packages/games.scm:4969 msgid "" "POWWOW is a client software which can be used for telnet as well as for\n" "@dfn{Multi-User Dungeon} (MUD). Additionally it can serve as a nice client for\n" "the chat server psyced with the specific config located at\n" "http://lavachat.symlynx.com/unix/" msgstr "" #: gnu/packages/games.scm:5074 msgid "Arena shooter derived from the Cube 2 engine" msgstr "" #: gnu/packages/games.scm:5076 msgid "" "Red Eclipse is an arena shooter, created from the Cube2 engine.\n" "Offering an innovative parkour system and distinct but all potent weapons,\n" "Red Eclipse provides fast paced and accessible gameplay." msgstr "" #: gnu/packages/games.scm:5139 msgid "Text adventure game" msgstr "" #: gnu/packages/games.scm:5141 msgid "" "Grue Hunter is a text adventure game written in Perl. You must make\n" "your way through an underground cave system in search of the Grue. Can you\n" "capture it and get out alive?" msgstr "" #: gnu/packages/games.scm:5178 msgid "Old-school earthworm action game" msgstr "" #: gnu/packages/games.scm:5180 msgid "" "lierolibre is an earthworm action game where you fight another player\n" "(or the computer) underground using a wide array of weapons.\n" "\n" "Features:\n" "@itemize\n" "@item 2 worms, 40 weapons, great playability, two game modes: Kill'em All\n" "and Game of Tag, plus AI-players without true intelligence!\n" "@item Dat nostalgia.\n" "@item Extensions via a hidden F1 menu:\n" "@itemize\n" "@item Replays\n" "@item Game controller support\n" "@item Powerlevel palettes\n" "@end itemize\n" "@item Ability to write game variables to plain text files.\n" "@item Ability to load game variables from both EXE and plain text files.\n" "@item Scripts to extract and repack graphics, sounds and levels.\n" "@end itemize\n" "\n" "To switch between different window sizes, use F6, F7 and F8, to switch to\n" "fullscreen, use F5 or Alt+Enter." msgstr "" #: gnu/packages/games.scm:5258 msgid "Play tennis against the computer or a friend" msgstr "" #: gnu/packages/games.scm:5259 msgid "" "Tennix is a 2D tennis game. You can play against the\n" "computer or against another player using the keyboard. The game runs\n" "in-window at 640x480 resolution or fullscreen." msgstr "" #: gnu/packages/games.scm:5342 msgid "3D Real-time strategy and real-time tactics game" msgstr "" #: gnu/packages/games.scm:5344 msgid "" "Warzone 2100 offers campaign, multi-player, and single-player skirmish\n" "modes. An extensive tech tree with over 400 different technologies, combined\n" "with the unit design system, allows for a wide variety of possible units and\n" "tactics." msgstr "" #: gnu/packages/games.scm:5418 msgid "Fantasy real-time strategy game" msgstr "" #: gnu/packages/games.scm:5420 msgid "" "In Widelands, you are the regent of a small clan. You start out with\n" "nothing but your headquarters, where all your resources are stored.\n" "\n" "In the course of the game, you will build an ever growing settlement. Every\n" "member of your clan will do his or her part to produce more resources---wood,\n" "food, iron, gold and more---to further this growth. The economic network is\n" "complex and different in the five tribes (Barbarians, Empire, Atlanteans,\n" "Frisians and Amazons).\n" "\n" "As you are not alone in the world, you will meet other clans sooner or later.\n" "Some of them may be friendly and you may eventually trade with them. However,\n" "if you want to rule the world, you will have to train soldiers and fight.\n" "\n" "Widelands offers single-player mode with different campaigns; the campaigns\n" "all tell stories of tribes and their struggle in the Widelands universe!\n" "However, settling really starts when you unite with friends over the Internet\n" "or LAN to build up new empires together---or to crush each other in the dusts\n" "of war. Widelands also offers an Artificial Intelligence to challenge you." msgstr "" #: gnu/packages/games.scm:5470 msgid "2D scrolling shooter game" msgstr "" #: gnu/packages/games.scm:5472 msgid "" "In the year 2579, the intergalactic weapons corporation, WEAPCO, has\n" "dominated the galaxy. Guide Chris Bainfield and his friend Sid Wilson on\n" "their quest to liberate the galaxy from the clutches of WEAPCO. Along the\n" "way, you will encounter new foes, make new allies, and assist local rebels\n" "in strikes against the evil corporation." msgstr "" #: gnu/packages/games.scm:5501 msgid "Fast-paced, arcade-style, top-scrolling space shooter" msgstr "" #: gnu/packages/games.scm:5503 msgid "" "In this game you are the captain of the cargo ship Chromium B.S.U. and\n" "are responsible for delivering supplies to the troops on the front line. Your\n" "ship has a small fleet of robotic fighters which you control from the relative\n" "safety of the Chromium vessel." msgstr "" #: gnu/packages/games.scm:5584 msgid "Drawing software for children" msgstr "" #: gnu/packages/games.scm:5586 msgid "" "Tux Paint is a free drawing program designed for young children (kids\n" "ages 3 and up). It has a simple, easy-to-use interface; fun sound effects;\n" "and an encouraging cartoon mascot who helps guide children as they use the\n" "program. It provides a blank canvas and a variety of drawing tools to help\n" "your child be creative." msgstr "" #: gnu/packages/games.scm:5624 msgid "Stamp images for Tux Paint" msgstr "" #: gnu/packages/games.scm:5626 msgid "" "This package contains a set of \"Rubber Stamp\" images which can be used\n" "with the \"Stamp\" tool within Tux Paint." msgstr "" #: gnu/packages/games.scm:5673 msgid "Configure Tux Paint" msgstr "" #: gnu/packages/games.scm:5675 msgid "Tux Paint Config is a graphical configuration editor for Tux Paint." msgstr "" #: gnu/packages/games.scm:5726 msgid "2D platformer game" msgstr "" #: gnu/packages/games.scm:5727 msgid "" "SuperTux is a classic 2D jump'n run sidescroller game in\n" "a style similar to the original Super Mario games." msgstr "" #: gnu/packages/games.scm:5757 msgid "MUD client" msgstr "" #: gnu/packages/games.scm:5759 msgid "" "TinTin++ is a MUD client which supports MCCP (Mud Client Compression\n" "Protocol), MMCP (Mud Master Chat Protocol), xterm 256 colors, most TELNET\n" "options used by MUDs, as well as those required to login via telnet on\n" "Linux / Mac OS X servers, and an auto mapper with a VT100 map display." msgstr "" #: gnu/packages/games.scm:5795 msgid "Programming game" msgstr "" #: gnu/packages/games.scm:5796 msgid "" "Learn programming, playing with ants and spider webs ;-)\n" "Your robot ant can be programmed in many languages: OCaml, Python, C, C++,\n" "Java, Ruby, Lua, JavaScript, Pascal, Perl, Scheme, Vala, Prolog. Experienced\n" "programmers may also add their own favorite language." msgstr "" #: gnu/packages/games.scm:5834 msgid "Keyboard mashing and doodling game for babies" msgstr "" #: gnu/packages/games.scm:5835 msgid "" "Bambam is a simple baby keyboard (and gamepad) masher\n" "application that locks the keyboard and mouse and instead displays bright\n" "colors, pictures, and sounds." msgstr "" #: gnu/packages/games.scm:5894 msgid "Arcade-style fire fighting game" msgstr "" #: gnu/packages/games.scm:5896 msgid "" "Mr. Rescue is an arcade styled 2d action game centered around evacuating\n" "civilians from burning buildings. The game features fast-paced fire\n" "extinguishing action, intense boss battles, a catchy soundtrack, and lots of\n" "throwing people around in pseudo-randomly generated buildings." msgstr "" #: gnu/packages/games.scm:5963 msgid "Non-euclidean graphical rogue-like game" msgstr "" #: gnu/packages/games.scm:5965 msgid "" "HyperRogue is a game in which the player collects treasures and fights\n" "monsters -- rogue-like but for the fact that it is played on the hyperbolic\n" "plane and not in euclidean space.\n" "\n" "In HyperRogue, the player can move through different parts of the world, which\n" "are home to particular creatures and may be subject to their own rules of\n" "\"physics\".\n" "\n" "While the game can use ASCII characters to display the the classical rogue\n" "symbols, it still needs graphics to render the non-euclidean world." msgstr "" #: gnu/packages/games.scm:6010 msgid "Shooter with space station destruction" msgstr "" #: gnu/packages/games.scm:6012 msgid "" "Kobo Deluxe is an enhanced version of Akira Higuchi's XKobo graphical game\n" "for Un*x systems with X11." msgstr "" #: gnu/packages/games.scm:6039 msgid "Turn-based empire building strategy game" msgstr "" #: gnu/packages/games.scm:6040 msgid "" "Freeciv is a turn-based empire building strategy game\n" "inspired by the history of human civilization. The game commences in\n" "prehistory and your mission is to lead your tribe from the Stone Age\n" "into the Space Age." msgstr "" #: gnu/packages/games.scm:6071 msgid "Recreation of data decryption effect in \"Sneakers\"" msgstr "" #: gnu/packages/games.scm:6073 msgid "" "@code{No More Secrets} provides a command line tool called \"nms\"\n" "that recreates the famous data decryption effect seen on screen in the 1992\n" "movie \"Sneakers\".\n" "\n" "This command works on piped data. Pipe any ASCII or UTF-8 text to nms, and\n" "it will apply the hollywood effect, initially showing encrypted data, then\n" "starting a decryption sequence to reveal the original plaintext characters." msgstr "" #: gnu/packages/games.scm:6100 msgid "Data files for MegaGlest" msgstr "" #: gnu/packages/games.scm:6101 msgid "This package contains the data files required for MegaGlest." msgstr "" #: gnu/packages/games.scm:6155 msgid "3D real-time strategy (RTS) game" msgstr "" #: gnu/packages/games.scm:6156 msgid "" "MegaGlest is a cross-platform 3D real-time strategy (RTS)\n" "game, where you control the armies of one of seven different factions: Tech,\n" "Magic, Egypt, Indians, Norsemen, Persian or Romans." msgstr "" #: gnu/packages/games.scm:6207 msgid "Side-scrolling physics platformer with a ball of tar" msgstr "" #: gnu/packages/games.scm:6208 msgid "" "In FreeGish you control Gish, a ball of tar who lives\n" "happily with his girlfriend Brea, until one day a mysterious dark creature\n" "emerges from a sewer hole and pulls her below ground." msgstr "" #: gnu/packages/games.scm:6243 msgid "Classic overhead run-and-gun game" msgstr "" #: gnu/packages/games.scm:6244 msgid "" "C-Dogs SDL is a classic overhead run-and-gun game,\n" "supporting up to 4 players in co-op and deathmatch modes. Customize your\n" "player, choose from many weapons, and blast, slide and slash your way through\n" "over 100 user-created campaigns." msgstr "" #: gnu/packages/games.scm:6343 msgid "3D puzzle game" msgstr "" #: gnu/packages/games.scm:6344 msgid "" "Kiki the nano bot is a 3D puzzle game. It is basically a\n" "mixture of the games Sokoban and Kula-World. Your task is to help Kiki, a\n" "small robot living in the nano world, repair its maker." msgstr "" #: gnu/packages/games.scm:6419 msgid "2D retro multiplayer shooter game" msgstr "" #: gnu/packages/games.scm:6420 msgid "" "Teeworlds is an online multiplayer game. Battle with up to\n" "16 players in a variety of game modes, including Team Deathmatch and Capture\n" "The Flag. You can even design your own maps!" msgstr "" #: gnu/packages/games.scm:6479 msgid "Puzzle game with a dexterity component" msgstr "" #: gnu/packages/games.scm:6480 msgid "" "Enigma is a puzzle game with 550 unique levels. The object\n" "of the game is to find and uncover pairs of identically colored ‘Oxyd’ stones.\n" "Simple? Yes. Easy? Certainly not! Hidden traps, vast mazes, laser beams,\n" "and most of all, countless hairy puzzles usually block your direct way to the\n" "Oxyd stones. Enigma’s game objects (and there are hundreds of them, lest you\n" "get bored) interact in many unexpected ways, and since many of them follow the\n" "laws of physics (Enigma’s special laws of physics, that is), controlling them\n" "with the mouse isn’t always trivial." msgstr "" #: gnu/packages/games.scm:6513 msgid "Abstract puzzle game" msgstr "" #: gnu/packages/games.scm:6514 msgid "" "Chroma is an abstract puzzle game. A variety of colourful\n" "shapes are arranged in a series of increasingly complex patterns, forming\n" "fiendish traps that must be disarmed and mysterious puzzles that must be\n" "manipulated in order to give up their subtle secrets. Initially so\n" "straightforward that anyone can pick it up and begin to play, yet gradually\n" "becoming difficult enough to tax even the brightest of minds." msgstr "" #: gnu/packages/games.scm:6578 msgid "Puzzle game" msgstr "" #: gnu/packages/games.scm:6579 msgid "" "Fish Fillets NG is strictly a puzzle game. The goal in\n" "every of the seventy levels is always the same: find a safe way out. The fish\n" "utter witty remarks about their surroundings, the various inhabitants of their\n" "underwater realm quarrel among themselves or comment on the efforts of your\n" "fish. The whole game is accompanied by quiet, comforting music." msgstr "" #: gnu/packages/games.scm:6652 msgid "Roguelike dungeon crawler game" msgstr "" #: gnu/packages/games.scm:6653 msgid "" "Dungeon Crawl Stone Soup (also known as \"Crawl\" or DCSS\n" "for short) is a roguelike adventure through dungeons filled with dangerous\n" "monsters in a quest to find the mystifyingly fabulous Orb of Zot." msgstr "" #: gnu/packages/games.scm:6693 msgid "Graphical roguelike dungeon crawler game" msgstr "" #: gnu/packages/games.scm:6723 msgid "Cross-platform third-person action game" msgstr "" #: gnu/packages/games.scm:6724 msgid "" "Lugaru is a third-person action game. The main character,\n" "Turner, is an anthropomorphic rebel bunny rabbit with impressive combat skills.\n" "In his quest to find those responsible for slaughtering his village, he uncovers\n" "a far-reaching conspiracy involving the corrupt leaders of the rabbit republic\n" "and the starving wolves from a nearby den. Turner takes it upon himself to\n" "fight against their plot and save his fellow rabbits from slavery." msgstr "" #: gnu/packages/games.scm:6768 msgid "Data files for 0ad" msgstr "" #: gnu/packages/games.scm:6769 msgid "0ad-data provides the data files required by the game 0ad." msgstr "" #: gnu/packages/games.scm:6905 msgid "3D real-time strategy game of ancient warfare" msgstr "" #: gnu/packages/games.scm:6906 msgid "" "0 A.D. is a real-time strategy (RTS) game of ancient\n" "warfare. It's a historically-based war/economy game that allows players to\n" "relive or rewrite the history of twelve ancient civilizations, each depicted\n" "at their peak of economic growth and military prowess.\n" "\n" "0ad needs a window manager that supports 'Extended Window Manager Hints'." msgstr "" #: gnu/packages/games.scm:6969 msgid "Colossal Cave Adventure" msgstr "" #: gnu/packages/games.scm:6971 msgid "" "The original Colossal Cave Adventure from 1976 was the origin of all\n" "text adventures, dungeon-crawl (computer) games, and computer-hosted\n" "roleplaying games. This is a forward port of the last version released by\n" "Crowther & Woods, its original authors, in 1995. It has been known as\n" "``adventure 2.5'' and ``430-point adventure''." msgstr "" #: gnu/packages/games.scm:6988 msgid "Single-player, RPG roguelike game set in the world of Eyal" msgstr "" #: gnu/packages/games.scm:7094 msgid "" "Tales of Maj’Eyal (ToME) RPG, featuring tactical turn-based\n" "combat and advanced character building. Play as one of many unique races and\n" "classes in the lore-filled world of Eyal, exploring random dungeons, facing\n" "challenging battles, and developing characters with your own tailored mix of\n" "abilities and powers. With a modern graphical and customisable interface,\n" "intuitive mouse control, streamlined mechanics and deep, challenging combat,\n" "Tales of Maj’Eyal offers engaging roguelike gameplay for the 21st century." msgstr "" #: gnu/packages/games.scm:7139 msgid "First person shooter engine for Quake 1" msgstr "" #: gnu/packages/games.scm:7140 msgid "" "Quakespasm is a modern engine for id software's Quake 1.\n" "It includes support for 64 bit CPUs, custom music playback, a new sound driver,\n" "some graphical niceities, and numerous bug-fixes and other improvements." msgstr "" #: gnu/packages/games.scm:7197 msgid "" "vkquake is a modern engine for id software's Quake 1.\n" "It includes support for 64 bit CPUs, custom music playback, a new sound driver,\n" "some graphical niceities, and numerous bug-fixes and other improvements." msgstr "" #: gnu/packages/games.scm:7261 msgid "First person shooter engine based on quake2" msgstr "" #: gnu/packages/games.scm:7262 msgid "" "Yamagi Quake II is an enhanced client for id Software's Quake II.\n" "The main focus is an unchanged single player experience like back in 1997,\n" "thus the gameplay and the graphics are unaltered. However the user may use one\n" "of the unofficial retexturing packs. In comparison with the official client,\n" "over 1000 bugs were fixed and an extensive code audit done,\n" "making Yamagi Quake II one of the most solid Quake II implementations available." msgstr "" #: gnu/packages/games.scm:7294 msgid "Sudoku for your terminal" msgstr "" #: gnu/packages/games.scm:7295 msgid "Nudoku is a ncurses-based Sudoku game for your terminal." msgstr "" #: gnu/packages/games.scm:7340 msgid "Realistic physics puzzle game" msgstr "" #: gnu/packages/games.scm:7341 msgid "" "The Butterfly Effect (tbe) is a game that uses\n" "realistic physics simulations to combine lots of simple mechanical\n" "elements to achieve a simple goal in the most complex way possible." msgstr "" #: gnu/packages/games.scm:7386 msgid "Game of lonely space adventure" msgstr "" #: gnu/packages/games.scm:7388 msgid "" "Pioneer is a space adventure game set in our galaxy at the turn of the\n" "31st century. The game is open-ended, and you are free to eke out whatever\n" "kind of space-faring existence you can think of. Look for fame or fortune by\n" "exploring the millions of star systems. Turn to a life of crime as a pirate,\n" "smuggler or bounty hunter. Forge and break alliances with the various\n" "factions fighting for power, freedom or self-determination. The universe is\n" "whatever you make of it." msgstr "" #: gnu/packages/games.scm:7415 msgid "Hacking contribution graphs in git" msgstr "" #: gnu/packages/games.scm:7417 msgid "" "Badass generates false commits for a range of dates, essentially\n" "hacking the gamification of contribution graphs on platforms such as\n" "Github or Gitlab." msgstr "" #: gnu/packages/games.scm:7489 msgid "Educational programming strategy game" msgstr "" #: gnu/packages/games.scm:7490 msgid "" "Colobot: Gold Edition is a real-time strategy game, where\n" "you can program your units (bots) in a language called CBOT, which is similar\n" "to C++ and Java. Your mission is to find a new planet to live and survive.\n" "You can save humanity and get programming skills!" msgstr "" #: gnu/packages/games.scm:7581 msgid "Modern Doom 2 source port" msgstr "" #: gnu/packages/games.scm:7582 msgid "" "GZdoom is a port of the Doom 2 game engine, with a modern\n" "renderer. It improves modding support with ZDoom's advanced mapping features\n" "and the new ZScript language. In addition to Doom, it supports Heretic, Hexen,\n" "Strife, Chex Quest, and fan-created games like Harmony, Hacx and Freedoom." msgstr "" #: gnu/packages/games.scm:7620 msgid "Multiplayer Doom port" msgstr "" #: gnu/packages/games.scm:7621 msgid "" "Odamex is a modification of the Doom engine that\n" "allows players to easily join servers dedicated to playing Doom\n" "online." msgstr "" #: gnu/packages/games.scm:7646 msgid "" "Doom source port preserving the look, feel, and bugs of vanilla\n" "Doom" msgstr "" #: gnu/packages/games.scm:7649 msgid "" "Chocolate Doom takes a different approach to other source ports. Its\n" "aim is to accurately reproduce the experience of playing Vanilla Doom. It is\n" "a conservative, historically accurate Doom source port, which is compatible\n" "with the thousands of mods and levels that were made before the Doom source\n" "code was released. Rather than flashy new graphics, Chocolate Doom's main\n" "features are its accurate reproduction of the game as it was played in the\n" "1990s. The project is developed around a carefully-considered philosophy that\n" "intentionally restricts which features may be added (and rejects any that\n" "affect gameplay)." msgstr "" #: gnu/packages/games.scm:7686 msgid "" "Limit-removing enhanced-resolution Doom source port based on\n" "Chocolate Doom" msgstr "" #: gnu/packages/games.scm:7689 msgid "" "Crispy Doom is a friendly fork of Chocolate Doom that provides a higher\n" "display resolution, removes the static limits of the Doom engine and offers\n" "further optional visual, tactical and physical enhancements while remaining\n" "entirely config file, savegame, netplay and demo compatible with the\n" "original." msgstr "" #: gnu/packages/games.scm:7727 msgid "Data files for Xonotic" msgstr "" #: gnu/packages/games.scm:7729 msgid "Xonotic-data provides the data files required by the game Xonotic." msgstr "" #: gnu/packages/games.scm:7873 msgid "Fast-paced first-person shooter game" msgstr "" #: gnu/packages/games.scm:7875 msgid "" "Xonotic is a free, fast-paced first-person shooter.\n" "The project is geared towards providing addictive arena shooter\n" "gameplay which is all spawned and driven by the community itself.\n" "Xonotic is a direct successor of the Nexuiz project with years of\n" "development between them, and it aims to become the best possible\n" "open-source FPS of its kind." msgstr "" #: gnu/packages/games.scm:7918 msgid "Portable Z-machine interpreter (ncurses version) for text adventure games" msgstr "" #: gnu/packages/games.scm:7919 msgid "" "Frotz is an interpreter for Infocom games and other Z-machine\n" "games in the text adventure/interactive fiction genre. This version of Frotz\n" "complies with standard 1.0 of Graham Nelson's specification. It plays all\n" "Z-code games V1-V8, including V6, with sound support through libao, and uses\n" "ncurses for text display." msgstr "" #: gnu/packages/games.scm:7967 msgid "Game about space exploration, trade and combat" msgstr "" #: gnu/packages/games.scm:7969 msgid "" "Naev is a 2d action/rpg space game that combines elements from\n" "the action, RPG and simulation genres. You pilot a spaceship from\n" "a top-down perspective, and are more or less free to do what you want.\n" "As the genre name implies, you’re able to trade and engage in combat\n" "at will. Beyond that, there’s an ever-growing number of story-line\n" "missions, equipment, and ships; even the galaxy itself grows larger\n" "with each release. For the literacy-inclined, there are large amounts\n" "of lore accompanying everything from planets to equipment." msgstr "" #: gnu/packages/games.scm:8016 msgid "Portable Z-machine dumb interpreter for text adventure games" msgstr "" #: gnu/packages/games.scm:8017 msgid "" "Frotz is an interpreter for Infocom games and\n" "other Z-machine games in the text adventure/interactive fiction genre.\n" "dfrotz is the dumb interface version. You get no screen control; everything\n" "is just printed to the terminal line by line. The terminal handles all the\n" "scrolling. Maybe you'd like to experience what it's like to play Adventure on\n" "a teletype. A much cooler use for compiling Frotz with the dumb interface is\n" "that it can be wrapped in CGI scripting, PHP, and the like to allow people\n" "to play games on webpages. It can also be made into a chat bot." msgstr "" #: gnu/packages/games.scm:8078 msgid "Portable Z-machine interpreter (SDL port) for text adventure games" msgstr "" #: gnu/packages/games.scm:8079 msgid "" "Frotz is an interpreter for Infocom games and other Z-machine\n" "games in the text adventure/interactive fiction genre. This version of Frotz\n" "using SDL fully supports all these versions of the Z-Machine including the\n" "graphical version 6. Graphics and sound are created through the use of the SDL\n" "libraries. AIFF sound effects and music in MOD and OGG formats are supported\n" "when packaged in Blorb container files or optionally from individual files." msgstr "" #: gnu/packages/games.scm:8168 msgid "Puzzle with bubbles" msgstr "" #: gnu/packages/games.scm:8170 msgid "" "Frozen-Bubble is a clone of the popular Puzzle Bobble game, in which\n" "you attempt to shoot bubbles into groups of the same color to cause them to\n" "pop.\n" "\n" "Players compete as penguins and must use the arrow keys to aim a colored\n" "bubble at groups of bubbles. The objective is to clear all the bubbles off\n" "the screen before a bubble passes below a line at the bottom.\n" "\n" "It features 100 single-player levels, a two-player mode, music and striking\n" "graphics. A level editor is also included to allow players to create and play\n" "their own levels." msgstr "" #: gnu/packages/games.scm:8202 msgid "Game controller library" msgstr "" #: gnu/packages/games.scm:8203 msgid "" "Libmanette is a small GObject library giving you simple\n" "access to game controllers. It supports the de-facto standard gamepads as\n" "defined by the W3C standard Gamepad specification or as implemented by the SDL\n" "GameController." msgstr "" #: gnu/packages/games.scm:8248 msgid "GNOME version of Tetris" msgstr "" #: gnu/packages/games.scm:8249 msgid "" "Quadrapassel comes from the classic falling-block game,\n" "Tetris. The goal of the game is to create complete horizontal lines of\n" "blocks, which will disappear. The blocks come in seven different shapes made\n" "from four blocks each: one straight, two L-shaped, one square, and two\n" "S-shaped. The blocks fall from the top center of the screen in a random\n" "order. You rotate the blocks and move them across the screen to drop them in\n" "complete lines. You score by dropping blocks fast and completing lines. As\n" "your score gets higher, you level up and the blocks fall faster." msgstr "" #: gnu/packages/games.scm:8297 msgid "2D space trading and combat game" msgstr "" #: gnu/packages/games.scm:8298 msgid "" "Endless Sky is a 2D space trading and combat game. Explore\n" "other star systems. Earn money by trading, carrying passengers, or completing\n" "missions. Use your earnings to buy a better ship or to upgrade the weapons and\n" "engines on your current one. Blow up pirates. Take sides in a civil war. Or\n" "leave human space behind and hope to find friendly aliens whose culture is more\n" "civilized than your own." msgstr "" #: gnu/packages/games.scm:8446 msgid "Advanced rhythm game designed for both home and arcade use" msgstr "" #: gnu/packages/games.scm:8447 msgid "" "StepMania is a dance and rhythm game. It features 3D\n" "graphics, keyboard and dance pad support, and an editor for creating your own\n" "steps.\n" "\n" "This package provides the core application, but no song is shipped. You need\n" "to download and install them in @file{$HOME/.stepmania-X.Y/Songs} directory." msgstr "" #: gnu/packages/games.scm:8482 msgid "Rhythm game in which you click on circles" msgstr "" #: gnu/packages/games.scm:8483 msgid "" "@i{oshu!} is a minimalist variant of the @i{osu!} rhythm game,\n" "which is played by pressing buttons and following along sliders as they appear\n" "on screen. Its aim is to be able to play any beatmap even on low-end hardware.\n" "\n" "This package provides the core application, but no beatmaps. You need to\n" "download and unpack them separately." msgstr "" #: gnu/packages/games.scm:8565 msgid "Multiplayer tank battle game" msgstr "" #: gnu/packages/games.scm:8566 msgid "" "Battle Tanks (also known as \"btanks\") is a funny battle\n" "game, where you can choose one of three vehicles and eliminate your enemy\n" "using the whole arsenal of weapons. It has original cartoon-like graphics and\n" "cool music, it’s fun and dynamic, it has several network modes for deathmatch\n" "and cooperative." msgstr "" #: gnu/packages/games.scm:8598 msgid "Unrealistic 2D volleyball simulation" msgstr "" #: gnu/packages/games.scm:8600 msgid "" "Slime Volley is a 2D arcade-oriented volleyball simulation, in\n" "the spirit of some Java games of the same name.\n" "\n" "Two teams, 1-3 players each, try to be the first to get 10 points.\n" "This happens when the one ball touches the floor on the other side of\n" "the net. There can be 1 to 8 balls in game. Once one ball touches\n" "the ground, the set ends and all balls are served again." msgstr "" #: gnu/packages/games.scm:8650 msgid "4D Tetris" msgstr "" #: gnu/packages/games.scm:8651 msgid "" "4D-TRIS is an alteration of the well-known Tetris game. The\n" "game field is extended to 4D space, which has to filled up by the gamer with\n" "4D hyper cubes." msgstr "" #: gnu/packages/games.scm:8726 msgid "Port of Arx Fatalis, a first-person role-playing game" msgstr "" #: gnu/packages/games.scm:8727 msgid "" "Arx Libertatis is a cross-platform port of Arx Fatalis, a 2002\n" "first-person role-playing game / dungeon crawler developed by Arkane Studios.\n" "This port however does not include the game data, so you need to obtain a copy\n" "of the original Arx Fatalis or its demo to play Arx Libertatis. Arx Fatalis\n" "features crafting, melee and ranged combat, as well as a unique casting system\n" "where the player draws runes in real time to effect the desired spell." msgstr "" #: gnu/packages/games.scm:8772 msgid "2d action platformer game" msgstr "" #: gnu/packages/games.scm:8773 msgid "" "The Legend of Edgar is a 2D platform game with a persistent world.\n" "When Edgar's father fails to return home after venturing out one dark and stormy night,\n" "Edgar fears the worst: he has been captured by the evil sorcerer who lives in\n" "a fortress beyond the forbidden swamp." msgstr "" #: gnu/packages/games.scm:8874 msgid "Multiplayer action game where you control small and nimble humanoids" msgstr "" #: gnu/packages/games.scm:8875 msgid "" "OpenClonk is a multiplayer action/tactics/skill game. It is\n" "often referred to as a mixture of The Settlers and Worms. In a simple 2D\n" "antfarm-style landscape, the player controls a crew of Clonks, small but\n" "robust humanoid beings. The game encourages free play but the normal goal is\n" "to either exploit valuable resources from the earth by building a mine or\n" "fight each other on an arena-like map." msgstr "" #: gnu/packages/games.scm:8907 msgid "Action Roleplaying Engine" msgstr "" #: gnu/packages/games.scm:8908 msgid "" "Flare (Free Libre Action Roleplaying Engine) is a simple\n" "game engine built to handle a very specific kind of game: single-player 2D\n" "action RPGs." msgstr "" #: gnu/packages/games.scm:8970 msgid "Fantasy action RPG using the FLARE engine" msgstr "" #: gnu/packages/games.scm:8971 msgid "" "Flare is a single-player 2D action RPG with\n" "fast-paced action and a dark fantasy style." msgstr "" #: gnu/packages/games.scm:9022 msgid "Action-adventure dungeon crawl game" msgstr "" #: gnu/packages/games.scm:9023 msgid "" "Far below the surface of the planet is a place of limitless\n" "power. Those that seek to control such a utopia will soon bring an end to\n" "themselves. Seeking an end to the troubles that plague him, PSI user Merit\n" "journeys into the hallowed Orcus Dome in search of answers.\n" "\n" "Meritous is a action-adventure game with simple controls but a challenge to\n" "find a balance of power versus recovery time during real-time battles. Set in\n" "a procedurally generated world, the player can explore thousands of rooms in\n" "search of powerful artifacts, tools to help them, and to eventually free the\n" "Orcus Dome from evil." msgstr "" #: gnu/packages/games.scm:9084 msgid "Guide a marble across fractal landscapes" msgstr "" #: gnu/packages/games.scm:9085 msgid "" "Marble Marcher is a video game that uses a fractal physics\n" "engine and fully procedural rendering to produce beautiful and unique\n" "gameplay. The game is played on the surface of evolving fractals. The goal\n" "of the game is to get your marble to the flag as quickly as possible. But be\n" "careful not to fall off the level or get crushed by the fractal! There are 24\n" "levels to unlock." msgstr "" #: gnu/packages/games.scm:9135 msgid "Libraries for 3D simulations and games" msgstr "" #: gnu/packages/games.scm:9136 msgid "" "SimGear is a set of libraries designed to be used as\n" "building blocks for quickly assembling 3D simulations, games, and\n" "visualization applications. SimGear is developed by the FlightGear project\n" "and also provides the base for the FlightGear Flight Simulator." msgstr "" #: gnu/packages/games.scm:9227 msgid "Flight simulator" msgstr "" #: gnu/packages/games.scm:9228 msgid "" "The goal of the FlightGear project is to create a\n" "sophisticated flight simulator framework for use in research or academic\n" "environments, pilot training, as an industry engineering tool, for DIY-ers to\n" "pursue their favorite interesting flight simulation idea, and last but\n" "certainly not least as a fun, realistic, and challenging desktop flight\n" "simulator." msgstr "" #: gnu/packages/games.scm:9280 msgid "Multiplayer platform game with bunnies" msgstr "" #: gnu/packages/games.scm:9281 msgid "" "You, as a bunny, have to jump on your opponents to make them\n" "explode. It is a true multiplayer game; you cannot play this alone. You can\n" "play with up to four players simultaneously. It has network support." msgstr "" #: gnu/packages/games.scm:9342 msgid "Turn-based artillery game featuring fighting hedgehogs" msgstr "" #: gnu/packages/games.scm:9344 msgid "" "Hedgewars is a turn based strategy, artillery, action and comedy game,\n" "featuring the antics of pink hedgehogs with attitude as they battle from the\n" "depths of hell to the depths of space.\n" "\n" "As commander, it's your job to assemble your crack team of hedgehog soldiers\n" "and bring the war to your enemy." msgstr "" #: gnu/packages/games.scm:9377 msgid "Cross-platform grid-based UI and game framework" msgstr "" #: gnu/packages/games.scm:9378 msgid "" "The gruid module provides packages for easily building\n" "grid-based applications in Go. The library abstracts rendering and input for\n" "different platforms. There are drivers available for terminal apps, native\n" "graphical apps and browser apps. The original application for the library was\n" "creating grid-based games, but it's also well suited for any grid-based\n" "application." msgstr "" #: gnu/packages/games.scm:9407 msgid "Gruid driver using the tcell library" msgstr "" #: gnu/packages/games.scm:9408 msgid "" "The gruid-tcell module provides a Gruid driver for building\n" "terminal full-window applications." msgstr "" #: gnu/packages/games.scm:9434 msgid "Stealth coffee-break roguelike game" msgstr "" #: gnu/packages/games.scm:9435 msgid "" "Harmonist: Dayoriah Clan Infiltration is a stealth\n" "coffee-break roguelike game. The game has a heavy focus on tactical\n" "positioning, light and noise mechanisms, making use of various terrain types\n" "and cones of view for monsters. Aiming for a replayable streamlined experience,\n" "the game avoids complex inventory management and character building, relying\n" "on items and player adaptability for character progression." msgstr "" #: gnu/packages/games.scm:9543 gnu/packages/games.scm:9719 msgid "Classic 2D point and click adventure game" msgstr "" #: gnu/packages/games.scm:9544 msgid "" "Drascula: The Vampire Strikes Back is a classic humorous 2D\n" "point and click adventure game.\n" "\n" "In Drascula you play the role of John Hacker, a British estate agent, that\n" "gets to meet a gorgeous blond girl who is kidnapped by the notorious vampire\n" "Count Drascula and embark on a fun yet dangerous quest to rescue her.\n" "Unfortunately, Hacker is not aware of Drascula's real ambitions: DOMINATING\n" "the World and demonstrating that he is even more evil than his brother Vlad." msgstr "" #: gnu/packages/games.scm:9622 msgid "2D point and click fantasy adventure game" msgstr "" #: gnu/packages/games.scm:9624 msgid "" "Lure of the Temptress is a classic 2D point and click adventure game.\n" "\n" "You are Diermot, an unwilling hero who'd prefer a quiet life, and are, to all\n" "intents and purposes, a good man. After decades of unrest the King has united\n" "the warring factions in his kingdom and all his lands are at peace, except\n" "a remote region around a town called Turnvale. A revolt has recently taken\n" "place in Turnvale, a revolt orchestrated by an apprentice sorceress called\n" "Selena, the titular temptress. The king calls together his finest horsemen\n" "and heads off (with you in tow) to Turnvale just to witness how hellish\n" "mercenary monsters called Skorl are invading the town.\n" "\n" "The king's men are defeated, the king is killed and you fall of your horse and\n" "bang your head heavily on the ground. You have been *unconscious for a while\n" "when you realize that you are in a dingy cell guarded by a not so friendly\n" "Skorl. Maybe it would be an idea to try and escape..." msgstr "" #: gnu/packages/games.scm:9720 msgid "" "Flight of the Amazon Queen is a 2D point-and-click\n" "adventure game set in the 1940s.\n" "\n" "You assume the role of Joe King, a pilot for hire who is given the job\n" "of flying Faye Russell (a famous movie star) into the Amazon jungle\n" "for a photo shoot. Of course, things never go according to plans.\n" "After an unfortunate turn of events they find themselves stranded in\n" "the heart of the Amazon jungle, where Joe will embark on a quest to\n" "rescue a kidnapped princess and in the process, discover the true\n" "sinister intentions of a suspiciously located Lederhosen company. In\n" "a rich 2D environment, Joe will cross paths with a variety of unlikely\n" "jungle inhabitants including, but not limited to, a tribe of Amazon\n" "women and 6-foot-tall pygmies." msgstr "" #: gnu/packages/games.scm:9818 msgid "Classic 2D point and click science-fiction adventure game" msgstr "" #: gnu/packages/games.scm:9820 msgid "" "Beneath a Steel Sky is a science-fiction thriller set in a bleak\n" "post-apocalyptic vision of the future. It revolves around Union City,\n" "where selfishness, rivalry, and corruption by its citizens seems to be\n" "all too common, those who can afford it live underground, away from\n" "the pollution and social problems which are plaguing the city.\n" "\n" "You take on the role of Robert Foster, an outcast of sorts from the\n" "city since a boy who was raised in a remote environment outside of\n" "Union City simply termed ``the gap''. Robert's mother took him away\n" "from Union City as a child on their way to ``Hobart'' but the\n" "helicopter crashed on its way. Unfortunately, Robert's mother died,\n" "but he survived and was left to be raised by a local tribe from the\n" "gap.\n" "\n" "Years later, Union City security drops by and abducts Robert, killing\n" "his tribe in the process; upon reaching the city the helicopter taking\n" "him there crashes with him escaping, high upon a tower block in the\n" "middle of the city. He sets out to discover the truth about his past,\n" "and to seek vengeance for the killing of his tribe." msgstr "" #: gnu/packages/games.scm:9877 msgid "Program a little robot and watch it explore a world" msgstr "" #: gnu/packages/games.scm:9879 msgid "" "GNU Robots is a game in which you program a robot to explore a world\n" "full of enemies that can hurt it, obstacles and food to be eaten. The goal of\n" "the game is to stay alive and collect prizes. The robot program conveniently\n" "may be written in a plain text file in the Scheme programming language." msgstr "" #: gnu/packages/games.scm:9948 msgid "Toy train simulation game" msgstr "" #: gnu/packages/games.scm:9949 msgid "" "Ri-li is a game in which you drive a wooden toy\n" "steam locomotive across many levels and collect all the coaches to\n" "win." msgstr "" #: gnu/packages/games.scm:10003 msgid "Turn-based space empire and galactic conquest computer game" msgstr "" #: gnu/packages/games.scm:10005 msgid "" "FreeOrion is a turn-based space empire and galactic conquest (4X)\n" "computer game being designed and built by the FreeOrion project. Control an\n" "empire with the goal of exploring the galaxy, expanding your territory,\n" "exploiting the resources, and exterminating rival alien empires. FreeOrion is\n" "inspired by the tradition of the Master of Orion games, but is not a clone or\n" "remake of that series or any other game." msgstr "" #: gnu/packages/games.scm:10059 msgid "Program playing the game of Go" msgstr "" #: gnu/packages/games.scm:10061 msgid "" "Leela-zero is a Go engine with no human-provided knowledge, modeled after\n" "the AlphaGo Zero paper. The current best network weights file for the engine\n" "can be downloaded from @url{https://zero.sjeng.org/best-network}." msgstr "" #: gnu/packages/games.scm:10137 msgid "Qt GUI to play the game of Go" msgstr "" #: gnu/packages/games.scm:10139 msgid "" "This a tool for Go players which performs the following functions:\n" "@itemize\n" "@item SGF editor,\n" "@item Analysis frontend for Leela Zero (or compatible engines),\n" "@item GTP interface (to play against an engine),\n" "@item IGS client (to play on the internet),\n" "@item Export games to a variety of formats.\n" "@end itemize" msgstr "" #: gnu/packages/games.scm:10231 msgid "2D motocross platform game" msgstr "" #: gnu/packages/games.scm:10233 msgid "" "X-Moto is a challenging 2D motocross platform game, where\n" "physics play an all important role in the gameplay. You need to\n" "control your bike to its limit, if you want to have a chance finishing\n" "the more difficult challenges." msgstr "" #: gnu/packages/games.scm:10276 msgid "Graphical user interface to play chess" msgstr "" #: gnu/packages/games.scm:10278 msgid "" "Eboard is a chess board interface for ICS (Internet Chess Servers)\n" "and chess engines." msgstr "" #: gnu/packages/games.scm:10329 msgid "Chess game database" msgstr "" #: gnu/packages/games.scm:10331 msgid "" "ChessX is a chess database. With ChessX you can operate on your\n" "collection of chess games in many ways: browse, edit, add, organize, analyze,\n" "etc. You can also play games on FICS or against an engine." msgstr "" #: gnu/packages/games.scm:10397 msgid "Strong chess engine" msgstr "" #: gnu/packages/games.scm:10399 msgid "" "Stockfish is a very strong chess engine. It is much stronger than the\n" "best human chess grandmasters. It can be used with UCI-compatible GUIs like\n" "ChessX." msgstr "" #: gnu/packages/games.scm:10426 msgid "Violent point-and-click shooting game with nice effects" msgstr "" #: gnu/packages/games.scm:10428 msgid "" "Barrage is a rather destructive action game that puts you on a shooting\n" "range with the objective to hit as many dummy targets as possible within\n" "3 minutes. You control a gun that may either fire small or large grenades at\n" "soldiers, jeeps and tanks. The gameplay is simple but it is not that easy to\n" "get high scores." msgstr "" #: gnu/packages/games.scm:10452 msgid "Avoid evil foodstuffs and make burgers" msgstr "" #: gnu/packages/games.scm:10454 msgid "" "This is a clone of the classic game BurgerTime. In it, you play\n" "the part of a chef who must create burgers by stepping repeatedly on\n" "the ingredients until they fall into place. And to make things more\n" "complicated, you also must avoid evil animate food items while\n" "performing this task, with nothing but your trusty pepper shaker to\n" "protect you." msgstr "" #: gnu/packages/games.scm:10480 msgid "Seven Kingdoms Ancient Adversaries: real-time strategy game" msgstr "" #: gnu/packages/games.scm:10482 msgid "" "Seven Kingdoms, designed by Trevor Chan, brings a blend of Real-Time\n" "Strategy with the addition of trade, diplomacy, and espionage. The game\n" "enables players to compete against up to six other kingdoms allowing players\n" "to conquer opponents by defeating them in war (with troops or machines),\n" "capturing their buildings with spies, or offering opponents money for their\n" "kingdom." msgstr "" #: gnu/packages/games.scm:10596 msgid "3D floor-tilting game" msgstr "" #: gnu/packages/games.scm:10598 msgid "" "In the grand tradition of Marble Madness and Super Monkey Ball,\n" "Neverball has you guide a rolling ball through dangerous territory. Balance\n" "on narrow bridges, navigate mazes, ride moving platforms, and dodge pushers\n" "and shovers to get to the goal. Race against the clock to collect coins to\n" "earn extra balls. Also included is Neverputt, which is a 3D miniature golf\n" "game." msgstr "" #: gnu/packages/games.scm:10667 msgid "Texas holdem poker game" msgstr "" #: gnu/packages/games.scm:10669 msgid "" "With PokerTH you can play the Texas holdem poker game, either against\n" "computer opponents or against real players online." msgstr "" #: gnu/packages/games.scm:10738 msgid "X11/Motif blackjack game" msgstr "" #: gnu/packages/games.scm:10740 msgid "" "Xblackjack is a MOTIF/OLIT based tool constructed to get you ready for\n" "the casino. It was inspired by a book called \"Beat the Dealer\" by Edward\n" "O. Thorp, Ph.D. of UCLA. A number of important statistics are maintained\n" "for display, and used by the program to implement Thorp's \"Complete Point\n" "System\" (high-low system)." msgstr "" #: gnu/packages/games.scm:10778 msgid "Metroidvania game with vector graphics" msgstr "" #: gnu/packages/games.scm:10780 msgid "" "Pilot your ship inside a planet to find and rescue the colonists trapped\n" "inside the Zenith Colony." msgstr "" #: gnu/packages/games.scm:10799 msgid "Go client for X11" msgstr "" #: gnu/packages/games.scm:10800 msgid "" "Provides a large set of Go-related services for X11:\n" "@itemize\n" "@item Local games with precise implementation of the Chinese and Japanese rulesets\n" "@item Edition and visualization of SGF files\n" "@item Connection to the NNGS or IGS Go servers\n" "@item Bridge to Go modem protocol, allowing to play against Go modem-capable AIs\n" "such as GnuGo.\n" "@end itemize" msgstr "" #: gnu/packages/games.scm:10859 msgid "Memento mori game" msgstr "" #: gnu/packages/games.scm:10861 msgid "" "Passage is meant to be a memento mori game. It presents an entire life,\n" "from young adulthood through old age and death, in the span of five minutes.\n" "Of course, it's a game, not a painting or a film, so the choices that you make\n" "as the player are crucial. There's no ``right'' way to play Passage, just as\n" "there's no right way to interpret it." msgstr "" #: gnu/packages/games.scm:10894 msgid "High performance X11 animated wallpaper setter" msgstr "" #: gnu/packages/games.scm:10895 msgid "" "High performance animated desktop background setter for\n" "X11 that won't set your CPU on fire, drain your laptop battery, or lower video\n" "game FPS." msgstr "" #: gnu/packages/games.scm:10924 msgid "Fast-paced action strategy game" msgstr "" #: gnu/packages/games.scm:10925 msgid "" "Curse of War is a fast-paced action strategy game originally\n" "implemented using ncurses user interface. An SDL graphical version is also\n" "available." msgstr "" #: gnu/packages/games.scm:10954 msgid "Pixelart survival game" msgstr "" #: gnu/packages/games.scm:10956 msgid "" "Schiffbruch is a mix of building, strategy and adventure and gets played\n" "with a two-dimensional view. The game deals with the consequences of a ship\n" "wreckage. You're stranded on a desert island and have to survive. In order to\n" "do so you need to explore the island, find food, build a shelter and try to\n" "get attention, so you get found." msgstr "" #: gnu/packages/games.scm:11015 msgid "Port of Prince of Persia game" msgstr "" #: gnu/packages/games.scm:11016 msgid "" "This package provides port of Prince of Persia, based on the\n" "disassembly of the DOS version, extended with new features." msgstr "" #: gnu/packages/games.scm:11046 msgid "Turn-based strategy game engine" msgstr "" #: gnu/packages/games.scm:11047 #, scheme-format msgid "" "@code{fheroes2} is an implementation of Heroes of Might and\n" "Magic II (aka HOMM2) game engine. It requires assets and game resources to\n" "play; it will look for them at @file{~/.local/share/fheroes2} folder." msgstr "" #: gnu/packages/games.scm:11071 msgid "Arcade airplane game" msgstr "" #: gnu/packages/games.scm:11072 msgid "" "@code{apricots} is a game where you fly a little plane\n" "around the screen and shoot things and drop bombs on enemy targets. It's\n" "meant to be quick and fun." msgstr "" #: gnu/packages/games.scm:11110 msgid "Liquid War 6 is a unique multiplayer wargame" msgstr "" #: gnu/packages/games.scm:11112 msgid "" "Liquid War 6 is a unique multiplayer war game. Your army is a blob of\n" "liquid and you have to try and eat your opponents. Rules are very simple yet\n" "original, they have been invented by Thomas Colcombet." msgstr "" #: gnu/packages/games.scm:11137 msgid "Theme park management simulation game" msgstr "" #: gnu/packages/games.scm:11139 msgid "" "FreeRCT is a game that captures the look and feel of the popular games\n" "RollerCoaster Tycoon 1 and 2, graphics- and gameplay-wise.\n" "\n" "In this game, you play as a manager of a theme park, allowing you to make a\n" "park of your dreams. The list of responsibilities includes managing staff,\n" "finances, landscaping, and most importantly: rides. Good managers follow the\n" "principle of prioritizing the guests' happiness with a well-maintained park.\n" "Should they go unwise, a theme park plunge into chaos with vandalizing guests\n" "and unsafe rides. Which path will you take?" msgstr "" #: gnu/packages/games.scm:11233 msgid "Karaoke game" msgstr "" #: gnu/packages/games.scm:11235 msgid "" "UltraStar Deluxe (USDX) is a karaoke game. It allows up to six players\n" "to sing along with music using microphones in order to score points, depending\n" "on the pitch of the voice and the rhythm of singing." msgstr "" #: gnu/packages/games.scm:11271 msgid "udev rules for game controllers and virtual reality devices" msgstr "" #: gnu/packages/games.scm:11273 msgid "" "This package provides a set of udev rules for game controllers and\n" "virtual reality devices." msgstr "" #: gnu/packages/gcc.scm:373 msgid "GNU Compiler Collection" msgstr "" #: gnu/packages/gcc.scm:375 msgid "" "GCC is the GNU Compiler Collection. It provides compiler front-ends\n" "for several languages, including C, C++, Objective-C, Fortran, Java, Ada, and\n" "Go. It also includes runtime support libraries for these languages." msgstr "" #: gnu/packages/gcc.scm:615 msgid "" "GCC is the GNU Compiler Collection. It provides compiler front-ends\n" "for several languages, including C, C++, Objective-C, Fortran, Ada, and Go.\n" "It also includes runtime support libraries for these languages." msgstr "" #: gnu/packages/gcc.scm:851 msgid "GNU C++ standard library" msgstr "" #: gnu/packages/gcc.scm:876 msgid "Headers of GNU libstdc++" msgstr "" #: gnu/packages/gcc.scm:905 msgid "Collection of subroutines used by various GNU programs" msgstr "" #: gnu/packages/gcc.scm:1015 msgid "GCC library generating machine code on-the-fly at runtime" msgstr "" #: gnu/packages/gcc.scm:1017 msgid "" "This package is part of the GNU Compiler Collection and provides an\n" "embeddable library for generating machine code on-the-fly at runtime. This\n" "shared library can then be dynamically-linked into bytecode interpreters and\n" "other such programs that want to generate machine code on-the-fly at run-time.\n" "It can also be used for ahead-of-time code generation for building standalone\n" "compilers. The just-in-time (jit) part of the name is now something of a\n" "misnomer." msgstr "" #: gnu/packages/gcc.scm:1037 gnu/packages/gcc.scm:1076 msgid "Go frontend to GCC" msgstr "" #: gnu/packages/gcc.scm:1039 gnu/packages/gcc.scm:1078 msgid "" "This package is part of the GNU Compiler Collection and\n" "provides the GNU compiler for the Go programming language." msgstr "" #: gnu/packages/gcc.scm:1202 msgid "GNU libstdc++ documentation" msgstr "" #: gnu/packages/gcc.scm:1288 msgid "Manipulating sets and relations of integer points bounded by linear constraints" msgstr "" #: gnu/packages/gcc.scm:1291 msgid "" "isl is a library for manipulating sets and relations of integer points\n" "bounded by linear constraints. Supported operations on sets include\n" "intersection, union, set difference, emptiness check, convex hull, (integer)\n" "affine hull, integer projection, computing the lexicographic minimum using\n" "parametric integer programming, coalescing and parametric vertex\n" "enumeration. It also includes an ILP solver based on generalized basis\n" "reduction, transitive closures on maps (which may encode infinite graphs),\n" "dependence analysis and bounds on piecewise step-polynomials." msgstr "" #: gnu/packages/gcc.scm:1352 msgid "Library to generate code for scanning Z-polyhedra" msgstr "" #: gnu/packages/gcc.scm:1354 msgid "" "CLooG is a free software library to generate code for scanning\n" "Z-polyhedra. That is, it finds a code (e.g., in C, FORTRAN...) that\n" "reaches each integral point of one or more parameterized polyhedra.\n" "CLooG has been originally written to solve the code generation problem\n" "for optimizing compilers based on the polytope model. Nevertheless it\n" "is used now in various area e.g., to build control automata for\n" "high-level synthesis or to find the best polynomial approximation of a\n" "function. CLooG may help in any situation where scanning polyhedra\n" "matters. While the user has full control on generated code quality,\n" "CLooG is designed to avoid control overhead and to produce a very\n" "effective code." msgstr "" #: gnu/packages/gcc.scm:1408 msgid "Reference manual for the C programming language" msgstr "" #: gnu/packages/gcc.scm:1410 msgid "" "This is a reference manual for the C programming language, as\n" "implemented by the GNU C Compiler (gcc). As a reference, it is not intended\n" "to be a tutorial of the language. Rather, it outlines all of the constructs\n" "of the language. Library functions are not included." msgstr "" #: gnu/packages/gettext.scm:141 msgid "Tools and documentation for translation (used to build other packages)" msgstr "" #: gnu/packages/gettext.scm:143 msgid "" "GNU Gettext is a package providing a framework for translating the\n" "textual output of programs into multiple languages. It provides translators\n" "with the means to create message catalogs, and a runtime library to load\n" "translated messages from the catalogs. Nearly all GNU packages use Gettext." msgstr "" #: gnu/packages/gettext.scm:174 msgid "Tools and documentation for translation" msgstr "" #: gnu/packages/gettext.scm:199 msgid "Text styling library" msgstr "" #: gnu/packages/gettext.scm:201 msgid "" "GNU libtextstyle is a C library that provides an easy way to add styling\n" "to programs that produce output to a console or terminal emulator window. It\n" "allows applications to emit text annotated with styling information, such as\n" "color, font attributes (weight, posture), or underlining." msgstr "" #: gnu/packages/gettext.scm:235 msgid "Markdown file translation utilities using pofiles" msgstr "" #: gnu/packages/gettext.scm:237 msgid "" "The mdpo utility creates pofiles, the format stabilished by GNU Gettext,\n" "from Markdown files." msgstr "" #: gnu/packages/gettext.scm:317 msgid "Scripts to ease maintenance of translations" msgstr "" #: gnu/packages/gettext.scm:319 msgid "" "The po4a (PO for anything) project goal is to ease translations (and\n" "more interestingly, the maintenance of translations) using gettext tools on\n" "areas where they were not expected like documentation." msgstr "" #: gnu/packages/gimp.scm:136 msgid "2D constrained Delaunay triangulation library" msgstr "" #: gnu/packages/gimp.scm:137 msgid "" "Poly2Tri-C is a library for generating, refining and rendering\n" "2-Dimensional Constrained Delaunay Triangulations." msgstr "" #: gnu/packages/gimp.scm:168 msgid "Microraptor GUI" msgstr "" #: gnu/packages/gimp.scm:169 msgid "" "MrG is is a C API for creating user interfaces. It can be\n" "used as an application writing environment or as an interactive canvas for part\n" "of a larger interface." msgstr "" #: gnu/packages/gimp.scm:204 msgid "Image pixel format conversion library" msgstr "" #: gnu/packages/gimp.scm:206 msgid "" "Babl is a dynamic, any-to-any pixel format translation library.\n" "It allows converting between different methods of storing pixels, known as\n" "@dfn{pixel formats}, that have different bit depths and other data\n" "representations, color models, and component permutations.\n" "\n" "A vocabulary to formulate new pixel formats from existing primitives is\n" "provided, as well as a framework to add new color models and data types." msgstr "" #: gnu/packages/gimp.scm:280 msgid "Graph based image processing framework" msgstr "" #: gnu/packages/gimp.scm:281 msgid "" "GEGL (Generic Graphics Library) provides infrastructure to\n" "do demand based cached non destructive image editing on larger than RAM\n" "buffers." msgstr "" #: gnu/packages/gimp.scm:365 msgid "GNU Image Manipulation Program" msgstr "" #: gnu/packages/gimp.scm:367 msgid "" "GIMP is an application for image manipulation tasks such as photo\n" "retouching, composition and authoring. It supports all common image formats\n" "as well as specialized ones. It features a highly customizable interface\n" "that is extensible via a plugin system." msgstr "" #: gnu/packages/gimp.scm:427 msgid "GIMP plug-in to edit image in fourier space" msgstr "" #: gnu/packages/gimp.scm:429 msgid "" "This package provides a simple plug-in to apply the fourier transform on\n" "an image, allowing you to work with the transformed image inside GIMP. You\n" "can draw or apply filters in fourier space and get the modified image with an\n" "inverse fourier transform." msgstr "" #: gnu/packages/gimp.scm:455 msgid "Artistic brushes library" msgstr "" #: gnu/packages/gimp.scm:456 msgid "" "Libmypaint, also called \"brushlib\", is a library for making\n" "brushstrokes which is used by MyPaint and GIMP." msgstr "" #: gnu/packages/gimp.scm:477 msgid "Default brushes for MyPaint" msgstr "" #: gnu/packages/gimp.scm:478 msgid "" "This package provides the default set of brushes for\n" "MyPaint." msgstr "" #: gnu/packages/gimp.scm:559 msgid "GIMP plugins for texture synthesis" msgstr "" #: gnu/packages/gimp.scm:561 msgid "" "This package provides resynthesizer plugins for GIMP, which encompasses\n" "tools for healing selections (content-aware fill), enlarging the canvas and\n" "healing the border, increasing the resolution while adding detail, and\n" "transferring the style of an image." msgstr "" #: gnu/packages/gnome.scm:294 msgid "UPnP IGD for GNOME" msgstr "" #: gnu/packages/gnome.scm:295 msgid "GUPnP-IGD is a library to handle UPnP IGD port mapping." msgstr "" #: gnu/packages/gnome.scm:349 msgid "CD/DVD burning tool for Gnome" msgstr "" #: gnu/packages/gnome.scm:350 msgid "" "Brasero is an application to burn CD/DVD for the Gnome\n" "Desktop. It is designed to be as simple as possible and has some unique\n" "features to enable users to create their discs easily and quickly." msgstr "" #: gnu/packages/gnome.scm:381 msgid "Cloudproviders Integration API" msgstr "" #: gnu/packages/gnome.scm:382 msgid "" "Libcloudproviders is a DBus API that allows cloud storage sync\n" "clients to expose their services. Clients such as file managers and desktop\n" "environments can then provide integrated access to the cloud providers\n" "services." msgstr "" #: gnu/packages/gnome.scm:453 msgid "Glib library for feeds" msgstr "" #: gnu/packages/gnome.scm:454 msgid "" "LibGRSS is a Glib abstraction to handle feeds in RSS, Atom,\n" "and other formats." msgstr "" #: gnu/packages/gnome.scm:481 msgid "Common JS Modules" msgstr "" #: gnu/packages/gnome.scm:482 msgid "" "GNOME-JS-Common provides common modules for GNOME JavaScript\n" "bindings." msgstr "" #: gnu/packages/gnome.scm:564 msgid "GObject JavaScriptCore bridge" msgstr "" #: gnu/packages/gnome.scm:565 msgid "" "Seed is a library and interpreter, dynamically bridging\n" "(through GObjectIntrospection) the WebKit JavaScriptCore engine, with the\n" "GNOME platform. It serves as something which enables you to write standalone\n" "applications in JavaScript, or easily enable your application to be extensible\n" "in JavaScript." msgstr "" #: gnu/packages/gnome.scm:620 msgid "Media management library" msgstr "" #: gnu/packages/gnome.scm:621 msgid "" "Libdmapsharing is a library which allows programs to access,\n" "share and control the playback of media content using DMAP (DAAP, DPAP & DACP).\n" "It is written in C using GObject and libsoup." msgstr "" #: gnu/packages/gnome.scm:653 msgid "GLib Testing Framework" msgstr "" #: gnu/packages/gnome.scm:654 msgid "" "GTX is a small collection of convenience functions intended to\n" "enhance the GLib testing framework. With specific emphasis on easing the pain\n" "of writing test cases for asynchronous interactions." msgstr "" #: gnu/packages/gnome.scm:727 msgid "Model to synchronize multiple instances over DBus" msgstr "" #: gnu/packages/gnome.scm:728 msgid "" "Dee is a library that uses DBus to provide objects allowing\n" "you to create Model-View-Controller type programs across DBus. It also consists\n" "of utility objects which extend DBus allowing for peer-to-peer discoverability\n" "of known objects without needing a central registrar." msgstr "" #: gnu/packages/gnome.scm:804 msgid "Desktop Activity Logging" msgstr "" #: gnu/packages/gnome.scm:805 msgid "" "Zeitgeist is a service which logs the users’s activities and\n" "events, anywhere from files opened to websites visited and conversations. It\n" "makes this information readily available for other applications to use. It is\n" "able to establish relationships between items based on similarity and usage\n" "patterns." msgstr "" #: gnu/packages/gnome.scm:869 msgid "Discover recipes for preparing food" msgstr "" #: gnu/packages/gnome.scm:870 msgid "" "GNOME Recipes helps you discover what to cook today,\n" "tomorrow, the rest of the week and for special occasions." msgstr "" #: gnu/packages/gnome.scm:941 msgid "Access, organize and share your photos on GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:942 msgid "" "GNOME Photos is a simple and elegant replacement for using a\n" "file manager to deal with photos. Enhance, crop and edit in a snap. Seamless\n" "cloud integration is offered through GNOME Online Accounts." msgstr "" #: gnu/packages/gnome.scm:1016 msgid "Simple music player for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1017 msgid "" "GNOME Music is the new GNOME music playing application that\n" "aims to combine an elegant and immersive browsing experience with simple\n" "and straightforward controls." msgstr "" #: gnu/packages/gnome.scm:1037 msgid "External Data Representation Library" msgstr "" #: gnu/packages/gnome.scm:1038 msgid "" "PortableXDR is an implementation of External Data\n" "Representation (XDR) Library. It is a standard data serialization format, for\n" "uses such as computer network protocols. It allows data to be transferred\n" "between different kinds of computer systems." msgstr "" #: gnu/packages/gnome.scm:1092 msgid "Text editor product line" msgstr "" #: gnu/packages/gnome.scm:1093 msgid "" "Tepl is a library that eases the development of\n" "GtkSourceView-based text editors and IDEs." msgstr "" #: gnu/packages/gnome.scm:1117 msgid "Popup dialogs for Kerberos 5" msgstr "" #: gnu/packages/gnome.scm:1118 msgid "" "krb5-auth-dialog is a simple dialog that monitors Kerberos\n" "tickets, and pops up a dialog when they are about to expire." msgstr "" #: gnu/packages/gnome.scm:1142 msgid "Notification Daemon for GNOME Desktop" msgstr "" #: gnu/packages/gnome.scm:1143 msgid "" "Notification-Daemon is the server implementation of the\n" "freedesktop.org desktop notification specification." msgstr "" #: gnu/packages/gnome.scm:1191 msgid "Simple compositing window manager" msgstr "" #: gnu/packages/gnome.scm:1192 msgid "" "Metacity is a window manager with a focus on simplicity and\n" "usability rather than novelties or gimmicks. Its author has characterized it\n" "as a \"boring window manager for the adult in you.\"" msgstr "" #: gnu/packages/gnome.scm:1227 msgid "Module of GNOME C++ bindings" msgstr "" #: gnu/packages/gnome.scm:1228 msgid "" "The mm-common module provides the build infrastructure\n" "and utilities shared among the GNOME C++ binding libraries. Release\n" "archives of mm-common include the Doxygen tag file for the GNU C++\n" "Library reference documentation." msgstr "" #: gnu/packages/gnome.scm:1277 msgid "WebDav server implementation using libsoup" msgstr "" #: gnu/packages/gnome.scm:1278 msgid "" "PhoDav was initially developed as a file-sharing mechanism for Spice,\n" "but it is generic enough to be reused in other projects,\n" "in particular in the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:1330 msgid "Color profile manager for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1331 msgid "" "GNOME Color Manager is a session framework that makes\n" "it easy to manage, install and generate color profiles\n" "in the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:1381 msgid "Web Crawlers for GNOME" msgstr "" #: gnu/packages/gnome.scm:1382 msgid "" "GNOME Online Miners provides a set of crawlers that\n" "go through your online content and index them locally in Tracker.\n" "It has miners for Facebook, Flickr, Google, ownCloud and SkyDrive." msgstr "" #: gnu/packages/gnome.scm:1413 msgid "" "GObject-based API over @acronym{SSDP, Simple Service Discovery\n" "Protocol} for GNOME" msgstr "" #: gnu/packages/gnome.scm:1415 msgid "" "This package provides a library to handle resource discovery\n" "and announcement over @acronym{SSDP, Simple Service Discovery Protocol} and\n" "a debugging tool, @command{gssdp-device-sniffer}." msgstr "" #: gnu/packages/gnome.scm:1471 msgid "PnP API for GNOME" msgstr "" #: gnu/packages/gnome.scm:1472 msgid "" "This package provides GUPnP, an object-oriented framework\n" "for creating UPnP devices and control points, written in C using\n" "@code{GObject} and @code{libsoup}." msgstr "" #: gnu/packages/gnome.scm:1520 msgid "GUPnP DLNA for GNOME" msgstr "" #: gnu/packages/gnome.scm:1521 msgid "" "This package provides a small utility library to\n" "support DLNA-related tasks such as media profile guessing, transcoding to a\n" "given profile, etc. DLNA is a subset of UPnP A/V." msgstr "" #: gnu/packages/gnome.scm:1550 msgid "GUPnP A/V for GNOME" msgstr "" #: gnu/packages/gnome.scm:1551 msgid "" "This package provides a small library for handling\n" "and implementation of UPnP A/V profiles." msgstr "" #: gnu/packages/gnome.scm:1577 msgid "Media art library for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1579 msgid "" "The libmediaart library is the foundation for media art caching,\n" "extraction, and lookup for applications on the desktop." msgstr "" #: gnu/packages/gnome.scm:1641 msgid "Initial setup wizard for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1642 msgid "" "This package provides a set-up wizard when a\n" "user logs into GNOME for the first time. It typically provides a\n" "tour of all gnome components and allows the user to set them up." msgstr "" #: gnu/packages/gnome.scm:1682 msgid "File sharing for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1683 msgid "" "GNOME User Share is a small package that binds together\n" "various free software projects to bring easy to use user-level file\n" "sharing to the masses." msgstr "" #: gnu/packages/gnome.scm:1738 msgid "File previewer for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1739 msgid "" "Sushi is a DBus-activated service that allows applications\n" "to preview files on the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:1790 msgid "Share audio, video, and pictures with other devices" msgstr "" #: gnu/packages/gnome.scm:1792 msgid "" "Rygel is a home media solution (@dfn{UPnP AV MediaServer and\n" "MediaRenderer}) for GNOME that allows you to easily share audio, video, and\n" "pictures, and to control a media player on your home network.\n" "\n" "Rygel achieves interoperability with other devices by trying to conform to the\n" "strict requirements of DLNA and by converting media on-the-fly to formats that\n" "client devices can handle." msgstr "" #: gnu/packages/gnome.scm:1847 msgid "Network Manager's applet library" msgstr "" #: gnu/packages/gnome.scm:1848 msgid "" "Libnma is an applet library for Network Manager. It was\n" "initially part of network-manager-applet and has now become a separate\n" "project." msgstr "" #: gnu/packages/gnome.scm:1871 msgid "Menu support for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1872 msgid "" "GNOME Menus contains the libgnome-menu library, the layout\n" "configuration files for the GNOME menu, as well as a simple menu editor." msgstr "" #: gnu/packages/gnome.scm:1950 msgid "Simple backup tool, for regular encrypted backups" msgstr "" #: gnu/packages/gnome.scm:1952 msgid "" "Déjà Dup is a simple backup tool, for regular encrypted backups. It\n" "uses duplicity as the backend, which supports incremental backups and storage\n" "either on a local, or remote machine via a number of methods." msgstr "" #: gnu/packages/gnome.scm:1984 msgid "Two-pane graphical file manager for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:1986 msgid "" "GNOME Commander is a two-pane graphical file manager using GNOME\n" "libraries. It aims to fulfill the demands of more advanced users who\n" "like to focus on file management, their work through special applications\n" "and running smart commands." msgstr "" #: gnu/packages/gnome.scm:2007 msgid "User documentation for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:2009 msgid "" "The GNOME User Documentation explains how to use the GNOME desktop and its\n" "components. It covers usage and setup of the core GNOME programs by end-users\n" "and system administrators." msgstr "" #: gnu/packages/gnome.scm:2052 msgid "Diagram creation for GNOME" msgstr "" #: gnu/packages/gnome.scm:2053 msgid "" "Dia can be used to draw different types of diagrams, and\n" "includes support for UML static structure diagrams (class diagrams), entity\n" "relationship modeling, and network diagrams. The program supports various file\n" "formats like PNG, SVG, PDF and EPS." msgstr "" #: gnu/packages/gnome.scm:2096 msgid "Library for accessing online service APIs" msgstr "" #: gnu/packages/gnome.scm:2098 msgid "" "libgdata is a GLib-based library for accessing online service APIs using\n" "the GData protocol — most notably, Google's services. It provides APIs to\n" "access the common Google services, and has full asynchronous support." msgstr "" #: gnu/packages/gnome.scm:2124 msgid "GObject-based library for handling and rendering XPS documents" msgstr "" #: gnu/packages/gnome.scm:2126 msgid "" "libgxps is a GObject-based library for handling and rendering XPS\n" "documents. This package also contains binaries that can convert XPS documents\n" "to other formats." msgstr "" #: gnu/packages/gnome.scm:2173 msgid "Find and insert unusual characters" msgstr "" #: gnu/packages/gnome.scm:2174 msgid "" "Characters is a simple utility application to find\n" "and insert unusual characters. It allows you to quickly find the\n" "character you are looking for by searching for keywords." msgstr "" #: gnu/packages/gnome.scm:2194 msgid "Bootstrap GNOME modules built from Git" msgstr "" #: gnu/packages/gnome.scm:2195 msgid "" "gnome-common contains various files needed to bootstrap\n" "GNOME modules built from Git. It contains a common \"autogen.sh\" script that\n" "can be used to configure a source directory checked out from Git and some\n" "commonly used macros." msgstr "" #: gnu/packages/gnome.scm:2248 msgid "GNOME's integrated address book" msgstr "" #: gnu/packages/gnome.scm:2250 msgid "" "GNOME Contacts organizes your contact information from online and\n" "offline sources, providing a centralized place for managing your contacts." msgstr "" #: gnu/packages/gnome.scm:2327 msgid "Libgnome-desktop, gnome-about, and desktop-wide documents" msgstr "" #: gnu/packages/gnome.scm:2329 msgid "" "The libgnome-desktop library provides API shared by several applications\n" "on the desktop, but that cannot live in the platform for various reasons.\n" "There is no API or ABI guarantee, although we are doing our best to provide\n" "stability. Documentation for the API is available with gtk-doc.\n" "\n" "The gnome-about program helps find which version of GNOME is installed." msgstr "" #: gnu/packages/gnome.scm:2383 msgid "Disk management utility for GNOME" msgstr "" #: gnu/packages/gnome.scm:2384 msgid "Disk management utility for GNOME." msgstr "" #: gnu/packages/gnome.scm:2427 msgid "GNOME Fonts" msgstr "" #: gnu/packages/gnome.scm:2428 msgid "" "Application to show you the fonts installed on your computer\n" "for your use as thumbnails. Selecting any thumbnails shows the full view of how\n" "the font would look under various sizes." msgstr "" #: gnu/packages/gnome.scm:2501 msgid "Libraries for displaying certificates and accessing key stores" msgstr "" #: gnu/packages/gnome.scm:2503 msgid "" "The GCR package contains libraries used for displaying certificates and\n" "accessing key stores. It also provides the viewer for crypto files on the\n" "GNOME Desktop." msgstr "" #: gnu/packages/gnome.scm:2541 msgid "GNOME docking library" msgstr "" #: gnu/packages/gnome.scm:2542 msgid "This library provides docking features for gtk+." msgstr "" #: gnu/packages/gnome.scm:2586 msgid "Accessing passwords from the GNOME keyring" msgstr "" #: gnu/packages/gnome.scm:2588 msgid "Client library to access passwords from the GNOME keyring." msgstr "" #: gnu/packages/gnome.scm:2657 msgid "Daemon to store passwords and encryption keys" msgstr "" #: gnu/packages/gnome.scm:2659 msgid "" "@command{gnome-keyring} is a program that keeps passwords and other\n" "secrets for users. It is run as a daemon in the session, similar to\n" "@command{ssh-agent}, and other applications locate it via an environment\n" "variable or D-Bus.\n" "\n" "The program can manage several keyrings, each with its own master password,\n" "and there is also a session keyring which is never stored to disk, but\n" "forgotten when the session ends." msgstr "" #: gnu/packages/gnome.scm:2727 msgid "GNOME's document viewer" msgstr "" #: gnu/packages/gnome.scm:2729 msgid "" "Evince is a document viewer for multiple document formats. It\n" "currently supports PDF, PostScript, DjVu, TIFF and DVI. The goal\n" "of Evince is to replace the multiple document viewers that exist\n" "on the GNOME Desktop with a single simple application." msgstr "" #: gnu/packages/gnome.scm:2769 msgid "GNOME settings for various desktop components" msgstr "" #: gnu/packages/gnome.scm:2770 msgid "" "Gsettings-desktop-schemas contains a collection of GSettings\n" "schemas for settings shared by various components of the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:2814 msgid "Library to easily handle complex data structures" msgstr "" #: gnu/packages/gnome.scm:2816 msgid "" "Liblarch is a Python library built to easily handle data structures such\n" "as lists, trees and acyclic graphs. There's also a GTK binding that will\n" "allow you to use your data structure in a @code{Gtk.Treeview}.\n" "\n" "Liblarch support multiple views of one data structure and complex filtering.\n" "That way, you have a clear separation between your data themselves (Model)\n" "and how they are displayed (View)." msgstr "" #: gnu/packages/gnome.scm:2876 msgid "Personal organizer for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:2878 msgid "" "Getting Things GNOME! (GTG) is a personal tasks and TODO list items\n" "organizer for the GNOME desktop environment inspired by the Getting Things\n" "Done (GTD) methodology. GTG is designed with flexibility, adaptability,\n" "and ease of use in mind so it can be used as more than just GTD software.\n" "GTG is intended to help you track everything you need to do and need to\n" "know, from small tasks to large projects." msgstr "" #: gnu/packages/gnome.scm:2915 msgid "Utility to implement the Freedesktop Icon Naming Specification" msgstr "" #: gnu/packages/gnome.scm:2917 msgid "" "To help with the transition to the Freedesktop Icon Naming\n" "Specification, the icon naming utility maps the icon names used by the\n" "GNOME and KDE desktops to the icon names proposed in the specification." msgstr "" #: gnu/packages/gnome.scm:2946 msgid "GNOME icon theme" msgstr "" #: gnu/packages/gnome.scm:2947 msgid "Icons for the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:2968 msgid "Tango icon theme" msgstr "" #: gnu/packages/gnome.scm:2969 msgid "" "This is an icon theme that follows the Tango visual\n" "guidelines." msgstr "" #: gnu/packages/gnome.scm:2997 msgid "Database of common MIME types" msgstr "" #: gnu/packages/gnome.scm:2999 msgid "" "The shared-mime-info package contains the core database of common types\n" "and the update-mime-database command used to extend it. It requires glib2 to\n" "be installed for building the update command. Additionally, it uses intltool\n" "for translations, though this is only a dependency for the maintainers. This\n" "database is translated at Transifex." msgstr "" #: gnu/packages/gnome.scm:3087 msgid "CUPS administration tool" msgstr "" #: gnu/packages/gnome.scm:3089 msgid "" "system-config-printer is a CUPS administration tool. It's written in\n" "Python using GTK+, and uses the @acronym{IPP, Internet Printing Protocol} when\n" "configuring CUPS." msgstr "" #: gnu/packages/gnome.scm:3111 msgid "Freedesktop icon theme" msgstr "" #: gnu/packages/gnome.scm:3113 msgid "Freedesktop icon theme." msgstr "" #: gnu/packages/gnome.scm:3160 msgid "GNOME desktop notification library" msgstr "" #: gnu/packages/gnome.scm:3162 msgid "" "Libnotify is a library that sends desktop notifications to a\n" "notification daemon, as defined in the Desktop Notifications spec. These\n" "notifications can be used to inform the user about an event or display\n" "some form of information without getting in the user's way." msgstr "" #: gnu/packages/gnome.scm:3210 msgid "GObject plugin system" msgstr "" #: gnu/packages/gnome.scm:3212 msgid "" "Libpeas is a gobject-based plugin engine, targeted at giving every\n" "application the chance to assume its own extensibility. It also has a set of\n" "features including, but not limited to: multiple extension points; on-demand\n" "(lazy) programming language support for C, Python and JS; simplicity of the\n" "API." msgstr "" #: gnu/packages/gnome.scm:3247 msgid "OpenGL extension to GTK+" msgstr "" #: gnu/packages/gnome.scm:3248 msgid "" "GtkGLExt is an OpenGL extension to GTK+. It provides\n" "additional GDK objects which support OpenGL rendering in GTK+ and GtkWidget\n" "API add-ons to make GTK+ widgets OpenGL-capable." msgstr "" #: gnu/packages/gnome.scm:3315 msgid "GTK+ rapid application development tool" msgstr "" #: gnu/packages/gnome.scm:3316 msgid "" "Glade is a rapid application development (RAD) tool to\n" "enable quick & easy development of user interfaces for the GTK+ toolkit and\n" "the GNOME desktop environment." msgstr "" #: gnu/packages/gnome.scm:3363 msgid "Template markup language" msgstr "" #: gnu/packages/gnome.scm:3365 msgid "" "Blueprint is a markup language for GTK user interfaces. Internally, it\n" "compiles to GTKBuilder XML." msgstr "" #: gnu/packages/gnome.scm:3455 msgid "Rapid application development tool" msgstr "" #: gnu/packages/gnome.scm:3456 msgid "" "Cambalache is a rapid application development (RAD) tool for\n" "Gtk 4 and 3 with a clear model-view-controller (MVC) design and\n" "data model first philosophy." msgstr "" #: gnu/packages/gnome.scm:3481 msgid "CSS2 parsing and manipulation library" msgstr "" #: gnu/packages/gnome.scm:3483 msgid "" "Libcroco is a standalone CSS2 parsing and manipulation library.\n" "The parser provides a low level event driven SAC-like API and a CSS object\n" "model like API. Libcroco provides a CSS2 selection engine and an experimental\n" "XML/CSS rendering engine." msgstr "" #: gnu/packages/gnome.scm:3549 msgid "G Structured File Library" msgstr "" #: gnu/packages/gnome.scm:3550 msgid "" "Libgsf aims to provide an efficient extensible I/O abstraction\n" "for dealing with different structured file formats." msgstr "" #: gnu/packages/gnome.scm:3716 msgid "SVG rendering library" msgstr "" #: gnu/packages/gnome.scm:3717 msgid "" "Librsvg is a library to render SVG images to Cairo surfaces.\n" "GNOME uses this to render SVG icons. Outside of GNOME, other desktop\n" "environments use it for similar purposes. Wikimedia uses it for Wikipedia's SVG\n" "diagrams." msgstr "" #: gnu/packages/gnome.scm:3808 msgid "Render SVG files using Cairo (ancient C version)" msgstr "" #: gnu/packages/gnome.scm:3841 msgid "Create trees of CORBA Interface Definition Language files" msgstr "" #: gnu/packages/gnome.scm:3842 msgid "" "Libidl is a library for creating trees of CORBA Interface\n" "Definition Language (idl) files, which is a specification for defining\n" "portable interfaces. libidl was initially written for orbit (the orb from the\n" "GNOME project, and the primary means of libidl distribution). However, the\n" "functionality was designed to be as reusable and portable as possible." msgstr "" #: gnu/packages/gnome.scm:3896 msgid "CORBA 2.4-compliant Object Request Broker" msgstr "" #: gnu/packages/gnome.scm:3897 msgid "" "ORBit2 is a CORBA 2.4-compliant Object Request Broker (orb)\n" "featuring mature C, C++ and Python bindings." msgstr "" #: gnu/packages/gnome.scm:3950 msgid "Framework for creating reusable components for use in GNOME applications" msgstr "" #: gnu/packages/gnome.scm:3951 msgid "" "Bonobo is a framework for creating reusable components for\n" "use in GNOME applications, built on top of CORBA." msgstr "" #: gnu/packages/gnome.scm:3981 msgid "Store application preferences" msgstr "" #: gnu/packages/gnome.scm:3982 msgid "" "Gconf is a system for storing application preferences. It\n" "is intended for user preferences; not arbitrary data storage." msgstr "" #: gnu/packages/gnome.scm:4015 msgid "Base MIME and Application database for GNOME" msgstr "" #: gnu/packages/gnome.scm:4016 msgid "" "GNOME Mime Data is a module which contains the base MIME\n" "and Application database for GNOME. The data stored by this module is\n" "designed to be accessed through the MIME functions in GnomeVFS." msgstr "" #: gnu/packages/gnome.scm:4054 msgid "Access files and folders in GNOME applications" msgstr "" #: gnu/packages/gnome.scm:4056 msgid "" "GnomeVFS is the core library used to access files and folders in GNOME\n" "applications. It provides a file system abstraction which allows applications\n" "to access local and remote files with a single consistent API." msgstr "" #: gnu/packages/gnome.scm:4096 msgid "Useful routines for building applications" msgstr "" #: gnu/packages/gnome.scm:4097 msgid "" "The libgnome library provides a number of useful routines\n" "for building modern applications, including session management, activation of\n" "files and URIs, and displaying help." msgstr "" #: gnu/packages/gnome.scm:4120 msgid "2D drawing library" msgstr "" #: gnu/packages/gnome.scm:4121 msgid "" "Libart is a 2D drawing library intended as a\n" "high-quality vector-based 2D library with antialiasing and alpha composition." msgstr "" #: gnu/packages/gnome.scm:4147 msgid "Flexible widget for creating interactive structured graphics" msgstr "" #: gnu/packages/gnome.scm:4148 msgid "" "The GnomeCanvas widget provides a flexible widget for\n" "creating interactive structured graphics." msgstr "" #: gnu/packages/gnome.scm:4169 msgid "C++ bindings to the GNOME Canvas library" msgstr "" #: gnu/packages/gnome.scm:4170 msgid "C++ bindings to the GNOME Canvas library." msgstr "" #: gnu/packages/gnome.scm:4195 msgid "Additional widgets for applications" msgstr "" #: gnu/packages/gnome.scm:4196 msgid "" "The libgnomeui library provides additional widgets for\n" "applications. Many of the widgets from libgnomeui have already been\n" "ported to GTK+." msgstr "" #: gnu/packages/gnome.scm:4221 msgid "Load glade interfaces and access the glade built widgets" msgstr "" #: gnu/packages/gnome.scm:4222 msgid "" "Libglade is a library that provides interfaces for loading\n" "graphical interfaces described in glade files and for accessing the\n" "widgets built in the loading process." msgstr "" #: gnu/packages/gnome.scm:4263 msgid "Some user interface controls using Bonobo" msgstr "" #: gnu/packages/gnome.scm:4264 msgid "" "The Bonobo UI library provides a number of user interface\n" "controls using the Bonobo component framework." msgstr "" #: gnu/packages/gnome.scm:4291 msgid "Window Navigator Construction Kit" msgstr "" #: gnu/packages/gnome.scm:4293 msgid "" "Libwnck is the Window Navigator Construction Kit, a library for use in\n" "writing pagers, tasklists, and more generally applications that are dealing\n" "with window management. It tries hard to respect the Extended Window Manager\n" "Hints specification (EWMH)." msgstr "" #: gnu/packages/gnome.scm:4342 msgid "Document-centric objects and utilities" msgstr "" #: gnu/packages/gnome.scm:4343 msgid "A GLib/GTK+ set of document-centric objects and utilities." msgstr "" #: gnu/packages/gnome.scm:4427 msgid "Spreadsheet application" msgstr "" #: gnu/packages/gnome.scm:4429 msgid "" "GNUmeric is a GNU spreadsheet application, running under GNOME. It is\n" "interoperable with other spreadsheet applications. It has a vast array of\n" "features beyond typical spreadsheet functionality, such as support for linear\n" "and non-linear solvers, statistical analysis, and telecommunication\n" "engineering." msgstr "" #: gnu/packages/gnome.scm:4489 msgid "Basic image editor for GNOME" msgstr "" #: gnu/packages/gnome.scm:4491 msgid "Drawing is a basic image editor aiming at the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:4541 msgid "Manage encryption keys and passwords in the GNOME keyring" msgstr "" #: gnu/packages/gnome.scm:4543 msgid "" "Seahorse is a GNOME application for managing encryption keys and\n" "passwords in the GNOME keyring." msgstr "" #: gnu/packages/gnome.scm:4593 msgid "Compiler using the GObject type system" msgstr "" #: gnu/packages/gnome.scm:4594 msgid "" "Vala is a programming language using modern high level\n" "abstractions without imposing additional runtime requirements and without using\n" "a different ABI compared to applications and libraries written in C. Vala uses\n" "the GObject type system and has additional code generation routines that make\n" "targeting the GNOME stack simple." msgstr "" #: gnu/packages/gnome.scm:4682 msgid "Virtual Terminal Emulator" msgstr "" #: gnu/packages/gnome.scm:4684 msgid "" "VTE is a library (libvte) implementing a terminal emulator widget for\n" "GTK+, and a minimal sample application (vte) using that. Vte is mainly used in\n" "gnome-terminal, but can also be used to embed a console/terminal in games,\n" "editors, IDEs, etc." msgstr "" #: gnu/packages/gnome.scm:4715 msgid "Enhanced VTE terminal widget" msgstr "" #: gnu/packages/gnome.scm:4717 msgid "" "VTE is a library (libvte) implementing a terminal emulator widget for\n" "GTK+, this fork provides additional functions exposed for keyboard text\n" "selection and URL hints." msgstr "" #: gnu/packages/gnome.scm:4796 msgid "Remote desktop viewer for GNOME" msgstr "" #: gnu/packages/gnome.scm:4797 msgid "" "Vinagre is a remote display client supporting the VNC, SPICE\n" "and RDP protocols." msgstr "" #: gnu/packages/gnome.scm:4849 msgid "Low-level GNOME configuration system" msgstr "" #: gnu/packages/gnome.scm:4850 msgid "" "Dconf is a low-level configuration system. Its main purpose\n" "is to provide a backend to GSettings on platforms that don't already have\n" "configuration storage systems." msgstr "" #: gnu/packages/gnome.scm:4879 msgid "Glib and GObject implementation of JSON" msgstr "" #: gnu/packages/gnome.scm:4880 msgid "" "JSON-GLib is a library providing serialization and\n" "described by RFC 4627. It implements a full JSON parser and generator using\n" "GLib and GObject, and integrates JSON with GLib data types." msgstr "" #: gnu/packages/gnome.scm:4977 msgid "High-level API for X Keyboard Extension" msgstr "" #: gnu/packages/gnome.scm:4979 msgid "" "LibXklavier is a library providing high-level API for X Keyboard\n" "Extension known as XKB. This library is intended to support XFree86 and other\n" "commercial X servers. It is useful for creating XKB-related software (layout\n" "indicators etc)." msgstr "" #: gnu/packages/gnome.scm:5017 msgid "Network extensions for GLib" msgstr "" #: gnu/packages/gnome.scm:5019 msgid "" "Glib-networking contains the implementations of certain GLib networking\n" "features that cannot be implemented directly in GLib itself because of their\n" "dependencies. Currently it contains GnuTLS and OpenSSL-based implementations of\n" "GTlsBackend, a libproxy-based implementation of GProxyResolver,\n" "GLibproxyResolver, and a GNOME GProxyResolver that uses the proxy information\n" "from the GSettings schemas in gsettings-desktop-schemas." msgstr "" #: gnu/packages/gnome.scm:5071 msgid "Securely delete your files" msgstr "" #: gnu/packages/gnome.scm:5073 msgid "" "Raider is a simple shredding program built for GNOME. Also known as\n" "File Shredder, it uses the GNU Core Utility called shred to securely delete\n" "files." msgstr "" #: gnu/packages/gnome.scm:5105 msgid "RESTful web api query library" msgstr "" #: gnu/packages/gnome.scm:5107 msgid "" "This library was designed to make it easier to access web services that\n" "claim to be \"RESTful\". It includes convenience wrappers for libsoup and\n" "libxml to ease remote use of the RESTful API." msgstr "" #: gnu/packages/gnome.scm:5193 msgid "GtkWidget C library for displaying maps" msgstr "" #: gnu/packages/gnome.scm:5194 msgid "" "@code{libshumate} is a C library providing a\n" "@code{GtkWidget} to display maps. It supports numerous free map sources such\n" "as OpenStreetMap, OpenCycleMap, OpenAerialMap and Maps." msgstr "" #: gnu/packages/gnome.scm:5257 msgid "GLib-based HTTP Library" msgstr "" #: gnu/packages/gnome.scm:5259 msgid "" "LibSoup is an HTTP client/server library for GNOME. It uses GObjects\n" "and the GLib main loop, to integrate well with GNOME applications." msgstr "" #: gnu/packages/gnome.scm:5386 msgid "GObject bindings for \"Secret Service\" API" msgstr "" #: gnu/packages/gnome.scm:5388 msgid "" "Libsecret is a GObject based library for storing and retrieving passwords\n" "and other secrets. It communicates with the \"Secret Service\" using DBus." msgstr "" #: gnu/packages/gnome.scm:5425 msgid "" "Five or More is a game where you try to align\n" " five or more objects of the same color and shape causing them to disappear.\n" " On every turn more objects will appear, until the board is full.\n" " Try to last as long as possible." msgstr "" #: gnu/packages/gnome.scm:5449 msgid "Documentation tool for GObject-based libraries" msgstr "" #: gnu/packages/gnome.scm:5450 msgid "" "GI-DocGen is a document generator for GObject-based\n" "libraries. GObject is the base type system of the GNOME project. GI-Docgen\n" "reuses the introspection data generated by GObject-based libraries to generate\n" "the API reference of these libraries, as well as other ancillary\n" "documentation." msgstr "" #: gnu/packages/gnome.scm:5493 msgid "Minesweeper game" msgstr "" #: gnu/packages/gnome.scm:5495 msgid "" "Mines (previously gnomine) is a puzzle game where you locate mines\n" "floating in an ocean using only your brain and a little bit of luck." msgstr "" #: gnu/packages/gnome.scm:5534 msgid "Write to multiple USB devices at once" msgstr "" #: gnu/packages/gnome.scm:5536 msgid "" "MultiWriter can be used to write an ISO file to multiple USB devices at\n" "once." msgstr "" #: gnu/packages/gnome.scm:5578 msgid "Japanese logic game" msgstr "" #: gnu/packages/gnome.scm:5580 msgid "" "Sudoku is a Japanese logic game that exploded in popularity in 2005.\n" "GNOME Sudoku is meant to have an interface as simple and unobstrusive as\n" "possible while still providing features that make playing difficult Sudoku\n" "more fun." msgstr "" #: gnu/packages/gnome.scm:5622 msgid "GNOME terminal emulator" msgstr "" #: gnu/packages/gnome.scm:5624 msgid "Console is a simple terminal emulator for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:5680 msgid "Terminal emulator" msgstr "" #: gnu/packages/gnome.scm:5682 msgid "" "GNOME Terminal is a terminal emulator application for accessing a\n" "UNIX shell environment which can be used to run programs available on\n" "your system.\n" "\n" "It supports several profiles, multiple tabs and implements several\n" "keyboard shortcuts." msgstr "" #: gnu/packages/gnome.scm:5715 gnu/packages/gnome.scm:8004 msgid "GNOME text editor" msgstr "" #: gnu/packages/gnome.scm:5717 msgid "" "GNOME Text Editor is a simple text editor that focuses on session\n" "management. It keeps track of changes and state even if you quit the\n" "application. You can come back to your work even if you've never saved it to a\n" "file." msgstr "" #: gnu/packages/gnome.scm:5786 msgid "Color management service" msgstr "" #: gnu/packages/gnome.scm:5787 msgid "" "Colord is a system service that makes it easy to manage,\n" "install and generate color profiles to accurately color manage input and\n" "output devices." msgstr "" #: gnu/packages/gnome.scm:5864 msgid "Geolocation service" msgstr "" #: gnu/packages/gnome.scm:5865 msgid "" "Geoclue is a D-Bus service that provides location\n" "information. The primary goal of the Geoclue project is to make creating\n" "location-aware applications as simple as possible, while the secondary goal is\n" "to ensure that no application can access location information without explicit\n" "permission from user." msgstr "" #: gnu/packages/gnome.scm:5909 msgid "Geocoding and reverse-geocoding library" msgstr "" #: gnu/packages/gnome.scm:5911 msgid "" "geocode-glib is a convenience library for geocoding (finding longitude,\n" "and latitude from an address) and reverse geocoding (finding an address from\n" "coordinates) using the Nominatim service. geocode-glib caches requests for\n" "faster results and to avoid unnecessary server load." msgstr "" #: gnu/packages/gnome.scm:5998 msgid "System daemon for managing power devices" msgstr "" #: gnu/packages/gnome.scm:6000 msgid "" "UPower is an abstraction for enumerating power devices,\n" "listening to device events and querying history and statistics. Any\n" "application or service on the system can access the org.freedesktop.UPower\n" "service via the system message bus." msgstr "" #: gnu/packages/gnome.scm:6049 msgid "Location, time zone, and weather library for GNOME" msgstr "" #: gnu/packages/gnome.scm:6051 msgid "" "libgweather is a library to access weather information from online\n" "services for numerous locations." msgstr "" #: gnu/packages/gnome.scm:6208 msgid "GNOME settings daemon" msgstr "" #: gnu/packages/gnome.scm:6210 msgid "" "This package contains the daemon responsible for setting the various\n" "parameters of a GNOME session and the applications that run under it. It\n" "handles settings such keyboard layout, shortcuts, and accessibility, clipboard\n" "settings, themes, mouse settings, and startup of other daemons." msgstr "" #: gnu/packages/gnome.scm:6240 msgid "Library to parse and save media playlists for GNOME" msgstr "" #: gnu/packages/gnome.scm:6241 msgid "" "Totem-pl-parser is a GObjects-based library to parse and save\n" "playlists in a variety of formats." msgstr "" #: gnu/packages/gnome.scm:6272 msgid "Solitaire card games" msgstr "" #: gnu/packages/gnome.scm:6274 msgid "" "Aisleriot (also known as Solitaire or sol) is a collection of card games\n" "which are easy to play with the aid of a mouse." msgstr "" #: gnu/packages/gnome.scm:6298 msgid "Actions, Menus and Toolbars Kit for GTK+ applications" msgstr "" #: gnu/packages/gnome.scm:6300 msgid "" "Amtk is the acronym for @acronym{Amtk, Actions Menus and Toolbars Kit}.\n" "It is a basic GtkUIManager replacement based on GAction. It is suitable for\n" "both a traditional UI or a modern UI with a GtkHeaderBar." msgstr "" #: gnu/packages/gnome.scm:6340 msgid "API documentation browser for GNOME" msgstr "" #: gnu/packages/gnome.scm:6342 msgid "" "Devhelp is an API documentation browser for GTK+ and GNOME. It works\n" "natively with GTK-Doc (the API reference system developed for GTK+ and used\n" "throughout GNOME for API documentation)." msgstr "" #: gnu/packages/gnome.scm:6424 msgid "Object oriented GL/GLES Abstraction/Utility Layer" msgstr "" #: gnu/packages/gnome.scm:6426 msgid "" "Cogl is a small library for using 3D graphics hardware to draw pretty\n" "pictures. The API departs from the flat state machine style of OpenGL and is\n" "designed to make it easy to write orthogonal components that can render\n" "without stepping on each others toes." msgstr "" #: gnu/packages/gnome.scm:6483 msgid "OpenGL-based interactive canvas library" msgstr "" #: gnu/packages/gnome.scm:6485 gnu/packages/gnome.scm:6512 msgid "" "Clutter is an OpenGL-based interactive canvas library, designed for\n" "creating fast, mainly 2D single window applications such as media box UIs,\n" "presentations, kiosk style applications and so on." msgstr "" #: gnu/packages/gnome.scm:6510 msgid "OpenGL-based interactive canvas library GTK+ widget" msgstr "" #: gnu/packages/gnome.scm:6536 msgid "Integration library for using GStreamer with Clutter" msgstr "" #: gnu/packages/gnome.scm:6538 msgid "" "Clutter-Gst is an integration library for using GStreamer with Clutter.\n" "It provides a GStreamer sink to upload frames to GL and an actor that\n" "implements the ClutterGstPlayer interface using playbin. Clutter is an\n" "OpenGL-based interactive canvas library." msgstr "" #: gnu/packages/gnome.scm:6569 msgid "C library providing a ClutterActor to display maps" msgstr "" #: gnu/packages/gnome.scm:6571 msgid "" "libchamplain is a C library providing a ClutterActor to display maps.\n" "It also provides a Gtk+ widget to display maps in Gtk+ applications. Python\n" "and Perl bindings are also available. It supports numerous free map sources\n" "such as OpenStreetMap, OpenCycleMap, OpenAerialMap, and Maps for free." msgstr "" #: gnu/packages/gnome.scm:6613 msgid "Object mapper from GObjects to SQLite" msgstr "" #: gnu/packages/gnome.scm:6615 msgid "" "Gom provides an object mapper from GObjects to SQLite. It helps you\n" "write applications that need to store structured data as well as make complex\n" "queries upon that data." msgstr "" #: gnu/packages/gnome.scm:6648 msgid "Useful functionality shared among GNOME games" msgstr "" #: gnu/packages/gnome.scm:6650 msgid "" "libgnome-games-support is a small library intended for internal use by\n" "GNOME Games, but it may be used by others." msgstr "" #: gnu/packages/gnome.scm:6706 msgid "Sliding block puzzles" msgstr "" #: gnu/packages/gnome.scm:6708 msgid "" "GNOME Klotski is a set of block sliding puzzles. The objective is to move\n" "the patterned block to the area bordered by green markers. To do so, you will\n" "need to slide other blocks out of the way. Complete each puzzle in as few moves\n" "as possible!" msgstr "" #: gnu/packages/gnome.scm:6755 msgid "Framework for discovering and browsing media" msgstr "" #: gnu/packages/gnome.scm:6757 msgid "" "Grilo is a framework focused on making media discovery and browsing easy\n" "for application developers." msgstr "" #: gnu/packages/gnome.scm:6812 msgid "Plugins for the Grilo media discovery library" msgstr "" #: gnu/packages/gnome.scm:6814 msgid "" "Grilo is a framework focused on making media discovery and browsing easy\n" "for application developers. This package provides plugins for common media\n" "discovery protocols." msgstr "" #: gnu/packages/gnome.scm:6907 msgid "Simple media player for GNOME based on GStreamer" msgstr "" #: gnu/packages/gnome.scm:6908 msgid "" "Totem is a simple yet featureful media player for GNOME\n" "which can read a large number of file formats." msgstr "" #: gnu/packages/gnome.scm:6995 msgid "Music player for GNOME" msgstr "" #: gnu/packages/gnome.scm:6996 msgid "" "Rhythmbox is a music playing application for GNOME. It\n" "supports playlists, song ratings, and any codecs installed through gstreamer." msgstr "" #: gnu/packages/gnome.scm:7057 msgid "GNOME image viewer" msgstr "" #: gnu/packages/gnome.scm:7058 msgid "" "Eye of GNOME is the GNOME image viewer. It\n" "supports image conversion, rotation, and slideshows." msgstr "" #: gnu/packages/gnome.scm:7080 msgid "Extensions for the Eye of GNOME image viewer" msgstr "" #: gnu/packages/gnome.scm:7094 msgid "" "This package provides plugins for the Eye of GNOME (EOG) image viewer,\n" "notably:\n" "\n" "@itemize\n" "@item @dfn{EXIF Display}, which displays camera (EXIF) information;\n" "@item @dfn{Map}, which displays a map of where the picture was taken on the\n" "side panel;\n" "@item @dfn{Slideshow Shuffle}, to shuffle images in slideshow mode.\n" "@end itemize\n" msgstr "" #: gnu/packages/gnome.scm:7131 msgid "GObject bindings for libudev" msgstr "" #: gnu/packages/gnome.scm:7133 msgid "" "This library provides GObject bindings for libudev. It was originally\n" "part of udev-extras, then udev, then systemd. It's now a project on its own." msgstr "" #: gnu/packages/gnome.scm:7194 msgid "Userspace virtual file system for GIO" msgstr "" #: gnu/packages/gnome.scm:7196 msgid "" "GVFS is a userspace virtual file system designed to work with the I/O\n" "abstraction of GIO. It contains a GIO module that seamlessly adds GVFS\n" "support to all applications using the GIO API. It also supports exposing the\n" "GVFS mounts to non-GIO applications using FUSE.\n" "\n" "GVFS comes with a set of backends, including trash support, SFTP, SMB, HTTP,\n" "DAV, and others." msgstr "" #: gnu/packages/gnome.scm:7235 msgid "GLib binding for libusb1" msgstr "" #: gnu/packages/gnome.scm:7237 msgid "" "GUsb is a GObject wrapper for libusb1 that makes it easy to do\n" "asynchronous control, bulk and interrupt transfers with proper cancellation\n" "and integration into a mainloop. This makes it easy to integrate low level\n" "USB transfers with your high-level application or system daemon." msgstr "" #: gnu/packages/gnome.scm:7289 msgid "Document and image scanner" msgstr "" #: gnu/packages/gnome.scm:7291 msgid "" "Document Scanner is an easy-to-use application that lets you connect your\n" "scanner and quickly capture images and documents in an appropriate format. It\n" "supports any scanner for which a suitable SANE driver is available, which is\n" "almost all of them." msgstr "" #: gnu/packages/gnome.scm:7361 msgid "Web browser for GNOME" msgstr "" #: gnu/packages/gnome.scm:7363 msgid "" "Eolie is a new web browser for GNOME. It features Firefox sync support,\n" "a secret password store, an adblocker, and a modern UI." msgstr "" #: gnu/packages/gnome.scm:7438 msgid "GNOME web browser" msgstr "" #: gnu/packages/gnome.scm:7440 msgid "" "Epiphany is a GNOME web browser targeted at non-technical users. Its\n" "principles are simplicity and standards compliance." msgstr "" #: gnu/packages/gnome.scm:7489 gnu/packages/gnome.scm:7529 msgid "D-Bus debugger" msgstr "" #: gnu/packages/gnome.scm:7491 msgid "" "D-Feet is a D-Bus debugger, which can be used to inspect D-Bus interfaces\n" "of running programs and invoke methods on those interfaces." msgstr "" #: gnu/packages/gnome.scm:7531 msgid "" "D-Spy is a tool to explore and test end-points and interfaces of running\n" "programs via D-Bus. It also ships a library for integration into development\n" "environments." msgstr "" #: gnu/packages/gnome.scm:7561 msgid "XSL stylesheets for Yelp" msgstr "" #: gnu/packages/gnome.scm:7562 msgid "" "Yelp-XSL is a collection of programs and data files to help\n" "you build, maintain, and distribute documentation. It provides XSLT stylesheets\n" "that can be built upon for help viewers and publishing systems. These\n" "stylesheets output JavaScript and CSS content, and reference images\n" "provided by yelp-xsl. It also redistributes copies of the jQuery and\n" "jQuery.Syntax JavaScript libraries." msgstr "" #: gnu/packages/gnome.scm:7606 msgid "GNOME help browser" msgstr "" #: gnu/packages/gnome.scm:7608 msgid "" "Yelp is the help viewer in Gnome. It natively views Mallard, DocBook,\n" "man, info, and HTML documents. It can locate documents according to the\n" "freedesktop.org help system specification." msgstr "" #: gnu/packages/gnome.scm:7636 msgid "Yelp documentation tools" msgstr "" #: gnu/packages/gnome.scm:7638 msgid "" "Yelp-tools is a collection of scripts and build utilities to help create,\n" "manage, and publish documentation for Yelp and the web. Most of the heavy\n" "lifting is done by packages like yelp-xsl and itstool. This package just\n" "wraps things up in a developer-friendly way." msgstr "" #: gnu/packages/gnome.scm:7674 msgid "GObject collection library" msgstr "" #: gnu/packages/gnome.scm:7676 msgid "" "Libgee is a utility library providing GObject-based interfaces and\n" "classes for commonly used data structures." msgstr "" #: gnu/packages/gnome.scm:7718 msgid "GObject wrapper around the Exiv2 photo metadata library" msgstr "" #: gnu/packages/gnome.scm:7720 msgid "" "Gexiv2 is a GObject wrapper around the Exiv2 photo metadata library. It\n" "allows for GNOME applications to easily inspect and update EXIF, IPTC, and XMP\n" "metadata in photo and video files of various formats." msgstr "" #: gnu/packages/gnome.scm:7773 msgid "Photo manager for GNOME 3" msgstr "" #: gnu/packages/gnome.scm:7775 msgid "" "Shotwell is a digital photo manager designed for the GNOME desktop\n" "environment. It allows you to import photos from disk or camera, organize\n" "them by keywords and events, view them in full-window or fullscreen mode, and\n" "share them with others via social networking and more." msgstr "" #: gnu/packages/gnome.scm:7816 msgid "Graphical archive manager for GNOME" msgstr "" #: gnu/packages/gnome.scm:7817 msgid "" "File Roller is an archive manager for the GNOME desktop\n" "environment that allows users to view, unpack, and create compressed archives\n" "such as gzip tarballs." msgstr "" #: gnu/packages/gnome.scm:7876 msgid "Session manager for GNOME" msgstr "" #: gnu/packages/gnome.scm:7878 msgid "" "This package contains the GNOME session manager, as well as a\n" "configuration program to choose applications starting on login." msgstr "" #: gnu/packages/gnome.scm:7928 msgid "Javascript bindings for GNOME" msgstr "" #: gnu/packages/gnome.scm:7931 msgid "" "Gjs is a javascript binding for GNOME. It's mainly based on spidermonkey\n" "javascript engine and the GObject introspection framework." msgstr "" #: gnu/packages/gnome.scm:8005 msgid "" "While aiming at simplicity and ease of use, gedit is a\n" "powerful general purpose text editor." msgstr "" #: gnu/packages/gnome.scm:8031 msgid "Display graphical dialog boxes from shell scripts" msgstr "" #: gnu/packages/gnome.scm:8034 msgid "" "Zenity is a rewrite of gdialog, the GNOME port of dialog which allows you\n" "to display dialog boxes from the commandline and shell scripts." msgstr "" #: gnu/packages/gnome.scm:8236 msgid "Window and compositing manager" msgstr "" #: gnu/packages/gnome.scm:8239 msgid "" "Mutter is a window and compositing manager that displays and manages your\n" "desktop via OpenGL. Mutter combines a sophisticated display engine using the\n" "Clutter toolkit with solid window-management logic inherited from the Metacity\n" "window manager." msgstr "" #: gnu/packages/gnome.scm:8284 msgid "Single sign-on framework for GNOME" msgstr "" #: gnu/packages/gnome.scm:8287 msgid "" "GNOME Online Accounts provides interfaces so that applications and\n" "libraries in GNOME can access the user's online accounts. It has providers\n" "for Google, ownCloud, Facebook, Flickr, Windows Live, Pocket, Foursquare,\n" "Microsoft Exchange, Last.fm, IMAP/SMTP, Jabber, SIP and Kerberos." msgstr "" #: gnu/packages/gnome.scm:8404 msgid "Store address books and calendars" msgstr "" #: gnu/packages/gnome.scm:8407 msgid "" "This package provides a unified backend for programs that work with\n" "contacts, tasks, and calendar information. It was originally developed for\n" "Evolution (hence the name), but is now used by other packages as well." msgstr "" #: gnu/packages/gnome.scm:8491 msgid "Text entry and UI navigation application" msgstr "" #: gnu/packages/gnome.scm:8494 msgid "" "Caribou is an input assistive technology intended for switch and pointer\n" "users." msgstr "" #: gnu/packages/gnome.scm:8640 msgid "Network connection manager" msgstr "" #: gnu/packages/gnome.scm:8643 msgid "" "NetworkManager is a system network service that manages your network\n" "devices and connections, attempting to keep active network connectivity when\n" "available. It manages ethernet, WiFi, mobile broadband (WWAN), and PPPoE\n" "devices, and provides VPN integration with a variety of different VPN\n" "services." msgstr "" #: gnu/packages/gnome.scm:8704 msgid "OpenVPN plug-in for NetworkManager" msgstr "" #: gnu/packages/gnome.scm:8706 msgid "" "This extension of NetworkManager allows it to take care of connections\n" "to virtual private networks (VPNs) via OpenVPN." msgstr "" #: gnu/packages/gnome.scm:8755 msgid "VPNC plug-in for NetworkManager" msgstr "" #: gnu/packages/gnome.scm:8757 msgid "" "Support for configuring virtual private networks based on VPNC.\n" "Compatible with Cisco VPN concentrators configured to use IPsec." msgstr "" #: gnu/packages/gnome.scm:8808 msgid "OpenConnect plug-in for NetworkManager" msgstr "" #: gnu/packages/gnome.scm:8810 msgid "" "This extension of NetworkManager allows it to take care of connections\n" "to @acronym{VPNs, virtual private networks} via OpenConnect, an open client for\n" "Cisco's AnyConnect SSL VPN." msgstr "" #: gnu/packages/gnome.scm:8872 msgid "Fortinet SSLVPN plug-in for NetworkManager" msgstr "" #: gnu/packages/gnome.scm:8874 msgid "" "This extension of NetworkManager allows it to take care of connections\n" "to virtual private networks (VPNs) via Fortinet SSLVPN." msgstr "" #: gnu/packages/gnome.scm:8897 msgid "Database of broadband connection configuration" msgstr "" #: gnu/packages/gnome.scm:8898 msgid "Database of broadband connection configuration." msgstr "" #: gnu/packages/gnome.scm:8937 msgid "Applet for managing network connections" msgstr "" #: gnu/packages/gnome.scm:8940 msgid "" "This package contains a systray applet for NetworkManager. It displays\n" "the available networks and allows users to easily switch between them." msgstr "" #: gnu/packages/gnome.scm:8997 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "C++ bindings to the libxml2 XML parser library" msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/gnome.scm:8999 #, fuzzy #| msgid "" #| "This package provides a dictionary for the Hunspell spell-checking\n" #| "library." msgid "" "This package provides a C++ interface to the libxml2 XML parser\n" "library." msgstr "" "Questo pacchetto fornisce un dizionario per il controllo ortografico per la libreria \n" "Hunspell." #: gnu/packages/gnome.scm:9235 msgid "Display manager for GNOME" msgstr "" #: gnu/packages/gnome.scm:9238 msgid "" "GNOME Display Manager is a system service that is responsible for\n" "providing graphical log-ins and managing local and remote displays." msgstr "" #: gnu/packages/gnome.scm:9259 msgid "Portable system access library" msgstr "" #: gnu/packages/gnome.scm:9262 msgid "" "LibGTop is a library to get system specific data such as CPU and memory\n" "usage and information about running processes." msgstr "" #: gnu/packages/gnome.scm:9300 msgid "GNOME Bluetooth subsystem" msgstr "" #: gnu/packages/gnome.scm:9303 msgid "" "This package contains tools for managing and manipulating Bluetooth\n" "devices using the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:9399 msgid "Utilities to configure the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:9402 msgid "" "This package contains configuration applets for the GNOME desktop,\n" "allowing to set accessibility configuration, desktop fonts, keyboard and mouse\n" "properties, sound setup, desktop theme and background, user interface\n" "properties, screen resolution, and other GNOME parameters." msgstr "" #: gnu/packages/gnome.scm:9579 msgid "Desktop shell for GNOME" msgstr "" #: gnu/packages/gnome.scm:9582 msgid "" "GNOME Shell provides core user interface functions for the GNOME desktop,\n" "like switching to windows and launching applications." msgstr "" #: gnu/packages/gnome.scm:9631 msgid "VNC client viewer widget for GTK+" msgstr "" #: gnu/packages/gnome.scm:9632 msgid "" "GTK-VNC is a project providing client side APIs for the RFB\n" "protocol / VNC remote desktop technology. It is built using coroutines allowing\n" "it to be completely asynchronous while remaining single threaded. It provides a\n" "core C library, and bindings for Python (PyGTK)." msgstr "" #: gnu/packages/gnome.scm:9658 msgid "Archives integration support for GNOME" msgstr "" #: gnu/packages/gnome.scm:9661 msgid "" "GNOME Autoar is a library which makes creating and extracting archives\n" "easy, safe, and automatic." msgstr "" #: gnu/packages/gnome.scm:9754 gnu/packages/gnome.scm:9887 msgid "Metadata database, indexer and search tool" msgstr "" #: gnu/packages/gnome.scm:9757 msgid "" "Tracker is a search engine and triplestore for desktop, embedded and mobile.\n" "\n" "It is a middleware component aimed at desktop application developers who want\n" "their apps to browse and search user content. It's not designed to be used\n" "directly by desktop users, but it provides a commandline tool named\n" "@command{tracker} for the adventurous.\n" "\n" "Tracker allows your application to instantly perform full-text searches across\n" "all documents. This feature is used by the @{emph{search} bar in GNOME Files, for\n" "example. This is achieved by indexing the user's home directory in the\n" "background.\n" "\n" "Tracker also allows your application to query and list content that the user\n" "has stored. For example, GNOME Music displays all the music files that are\n" "found by Tracker. This means that GNOME Music doesn't need to maintain a\n" "database of its own.\n" "\n" "If you need to go beyond simple searches, Tracker is also a linked data\n" "endpoint and it understands SPARQL." msgstr "" #: gnu/packages/gnome.scm:9890 msgid "" "Tracker is an advanced framework for first class objects with associated\n" "metadata and tags. It provides a one stop solution for all metadata, tags,\n" "shared object databases, search tools and indexing." msgstr "" #: gnu/packages/gnome.scm:9975 msgid "File manager for GNOME" msgstr "" #: gnu/packages/gnome.scm:9978 msgid "" "Nautilus (Files) is a file manager designed to fit the GNOME desktop\n" "design and behaviour, giving the user a simple way to navigate and manage its\n" "files." msgstr "" #: gnu/packages/gnome.scm:10014 msgid "Disk usage analyzer for GNOME" msgstr "" #: gnu/packages/gnome.scm:10016 msgid "" "Baobab (Disk Usage Analyzer) is a graphical application to analyse disk\n" "usage in the GNOME desktop environment. It can easily scan device volumes or\n" "a specific user-requested directory branch (local or remote). Once the scan\n" "is complete it provides a graphical representation of each selected folder." msgstr "" #: gnu/packages/gnome.scm:10039 msgid "Background images for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:10041 msgid "" "GNOME backgrounds package contains a collection of graphics files which\n" "can be used as backgrounds in the GNOME Desktop environment. Additionally,\n" "the package creates the proper framework and directory structure so that you\n" "can add your own files to the collection." msgstr "" #: gnu/packages/gnome.scm:10087 msgid "Take pictures of your screen" msgstr "" #: gnu/packages/gnome.scm:10089 msgid "" "GNOME Screenshot is a utility used for taking screenshots of the entire\n" "screen, a window or a user defined area of the screen, with optional\n" "beautifying border effects." msgstr "" #: gnu/packages/gnome.scm:10119 msgid "Graphical editor for GNOME's dconf configuration system" msgstr "" #: gnu/packages/gnome.scm:10121 msgid "" "Dconf-editor is a graphical tool for browsing and editing the dconf\n" "configuration system for GNOME. It allows users to configure desktop\n" "software that do not provide their own configuration interface." msgstr "" #: gnu/packages/gnome.scm:10149 msgid "Default MIME type associations for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:10151 msgid "" "Given many installed packages which might handle a given MIME type, a\n" "user running the GNOME desktop probably has some preferences: for example,\n" "that folders be opened by default by the Nautilus file manager, not the Baobab\n" "disk usage analyzer. This package establishes that set of default MIME type\n" "associations for GNOME." msgstr "" #: gnu/packages/gnome.scm:10190 msgid "GoVirt Library" msgstr "" #: gnu/packages/gnome.scm:10191 msgid "GoVirt is a GObject wrapper for the oVirt REST API." msgstr "" #: gnu/packages/gnome.scm:10251 msgid "Weather monitoring for GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:10252 msgid "" "GNOME Weather is a small application that allows you to\n" "monitor the current weather conditions for your city, or anywhere in the\n" "world." msgstr "" #: gnu/packages/gnome.scm:10353 msgid "The GNU desktop environment" msgstr "" #: gnu/packages/gnome.scm:10356 msgid "" "GNOME is the graphical desktop for GNU. It includes a wide variety of\n" "applications for browsing the web, editing text and images, creating\n" "documents and diagrams, playing media, scanning, and much more." msgstr "" #: gnu/packages/gnome.scm:10401 msgid "Desktop recording program" msgstr "" #: gnu/packages/gnome.scm:10402 msgid "" "Byzanz is a simple desktop recording program with a\n" "command-line interface. It can record part or all of an X display for a\n" "specified duration and save it as a GIF encoded animated image file." msgstr "" #: gnu/packages/gnome.scm:10462 msgid "Two-factor authentication application built for GNOME" msgstr "" #: gnu/packages/gnome.scm:10464 msgid "" "Authenticator is a two-factor authentication (2FA) application built for\n" "the GNOME desktop environment.\n" "\n" "Features:\n" "\n" "@itemize\n" "@item QR code scanner\n" "@item Beautiful UI\n" "@item Huge database of more than 560 supported services\n" "@item Keep your PIN tokens secure by locking the application with a password\n" "@item Automatically fetch an image for services using their favicon\n" "@item The possibility to add new services\n" "@end itemize" msgstr "" #: gnu/packages/gnome.scm:10497 msgid "GObject wrapper for libcanberra" msgstr "" #: gnu/packages/gnome.scm:10499 msgid "" "GSound is a small library for playing system sounds. It's designed to be\n" "used via GObject Introspection, and is a thin wrapper around the libcanberra C\n" "library." msgstr "" #: gnu/packages/gnome.scm:10522 msgid "Library for accessing SkyDrive and Hotmail" msgstr "" #: gnu/packages/gnome.scm:10524 msgid "" "Libzapojit is a GLib-based library for accessing online service APIs of\n" "Microsoft SkyDrive and Hotmail, using their REST protocols." msgstr "" #: gnu/packages/gnome.scm:10568 msgid "GNOME's clock application" msgstr "" #: gnu/packages/gnome.scm:10570 msgid "" "GNOME Clocks is a simple clocks application designed to fit the GNOME\n" "desktop. It supports world clock, stop watch, alarms, and count down timer." msgstr "" #: gnu/packages/gnome.scm:10615 msgid "GNOME's calendar application" msgstr "" #: gnu/packages/gnome.scm:10617 msgid "" "GNOME Calendar is a simple calendar application designed to fit the GNOME\n" "desktop. It supports multiple calendars, month, week and year view." msgstr "" #: gnu/packages/gnome.scm:10677 msgid "GNOME's ToDo Application" msgstr "" #: gnu/packages/gnome.scm:10678 msgid "" "GNOME To Do is a simplistic personal task manager designed\n" "to perfectly fit the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:10718 msgid "Look up words in dictionary sources" msgstr "" #: gnu/packages/gnome.scm:10720 msgid "" "GNOME Dictionary can look for the definition or translation of a word in\n" "existing databases over the internet." msgstr "" #: gnu/packages/gnome.scm:10781 msgid "Customize advanced GNOME 3 options" msgstr "" #: gnu/packages/gnome.scm:10784 msgid "" "GNOME Tweaks allows adjusting advanced configuration settings in\n" "GNOME 3. This includes things like the fonts used in user interface elements,\n" "alternative user interface themes, changes in window management behavior,\n" "GNOME Shell appearance and extension, etc." msgstr "" #: gnu/packages/gnome.scm:10811 msgid "Extensions for GNOME Shell" msgstr "" #: gnu/packages/gnome.scm:10812 msgid "" "GNOME Shell extensions modify and extend GNOME Shell\n" "functionality and behavior." msgstr "" #: gnu/packages/gnome.scm:10855 msgid "Library to aggregate data about people" msgstr "" #: gnu/packages/gnome.scm:10856 msgid "" "Libfolks is a library that aggregates information about people\n" "from multiple sources (e.g., Telepathy connection managers for IM contacts,\n" "Evolution Data Server for local contacts, libsocialweb for web service contacts,\n" "etc.) to create metacontacts. It's written in Vala, which generates C code when\n" "compiled." msgstr "" #: gnu/packages/gnome.scm:10896 msgid "GLib/GObject wrapper for the Facebook API" msgstr "" #: gnu/packages/gnome.scm:10897 msgid "" "This library allows you to use the Facebook API from\n" "GLib/GObject code." msgstr "" #: gnu/packages/gnome.scm:10929 msgid "GNOME keyboard configuration library" msgstr "" #: gnu/packages/gnome.scm:10931 msgid "" "Libgnomekbd is a keyboard configuration library for the GNOME desktop\n" "environment, which can notably display keyboard layouts." msgstr "" #: gnu/packages/gnome.scm:10965 msgid "Library for writing single instance applications" msgstr "" #: gnu/packages/gnome.scm:10967 msgid "" "Libunique is a library for writing single instance applications. If you\n" "launch a single instance application twice, the second instance will either just\n" "quit or will send a message to the running instance. Libunique makes it easy to\n" "write this kind of application, by providing a base class, taking care of all\n" "the IPC machinery needed to send messages to a running instance, and also\n" "handling the startup notification side." msgstr "" #: gnu/packages/gnome.scm:11020 msgid "Desktop calculator" msgstr "" #: gnu/packages/gnome.scm:11022 msgid "" "Calculator is an application that solves mathematical equations and\n" "is suitable as a default application in a Desktop environment." msgstr "" #: gnu/packages/gnome.scm:11046 msgid "Virtual sticky note" msgstr "" #: gnu/packages/gnome.scm:11048 msgid "" "Xpad is a sticky note that strives to be simple, fault tolerant,\n" "and customizable. Xpad consists of independent pad windows, each is\n" "basically a text box in which notes can be written." msgstr "" #: gnu/packages/gnome.scm:11119 msgid "Unicode character picker and font browser" msgstr "" #: gnu/packages/gnome.scm:11121 msgid "" "This program allows you to browse through all the available Unicode\n" "characters and categories for the installed fonts, and to examine their\n" "detailed properties. It is an easy way to find the character you might\n" "only know by its Unicode name or code point." msgstr "" #: gnu/packages/gnome.scm:11152 msgid "Simple color chooser written in GTK3" msgstr "" #: gnu/packages/gnome.scm:11153 msgid "" "Color Picker is a simple color chooser written in GTK3. It\n" "supports both X and Wayland display servers." msgstr "" #: gnu/packages/gnome.scm:11174 msgid "Web development studio" msgstr "" #: gnu/packages/gnome.scm:11176 msgid "" "Bluefish is an editor aimed at programmers and web developers,\n" "with many options to write web sites, scripts and other code.\n" "Bluefish supports many programming and markup languages." msgstr "" #: gnu/packages/gnome.scm:11215 msgid "Process viewer and system resource monitor for GNOME" msgstr "" #: gnu/packages/gnome.scm:11217 msgid "" "GNOME System Monitor is a GNOME process viewer and system monitor with\n" "an attractive, easy-to-use interface. It has features, such as a tree view\n" "for process dependencies, icons for processes, the ability to hide processes,\n" "graphical time histories of CPU/memory/swap usage and the ability to\n" "kill/reinice processes." msgstr "" #: gnu/packages/gnome.scm:11254 msgid "Python client bindings for D-Bus AT-SPI" msgstr "" #: gnu/packages/gnome.scm:11258 msgid "" "This package includes a python client library for the AT-SPI D-Bus\n" "accessibility infrastructure." msgstr "" #: gnu/packages/gnome.scm:11314 msgid "Screen reader for individuals who are blind or visually impaired" msgstr "" #: gnu/packages/gnome.scm:11317 msgid "" "Orca is a screen reader that provides access to the graphical desktop\n" "via speech and refreshable braille. Orca works with applications and toolkits\n" "that support the Assistive Technology Service Provider Interface (AT-SPI)." msgstr "" #: gnu/packages/gnome.scm:11376 msgid "GNOME's alternative spell checker" msgstr "" #: gnu/packages/gnome.scm:11378 msgid "" "gspell provides a flexible API to add spell-checking to a GTK+\n" "application. It provides a GObject API, spell-checking to text entries and\n" "text views, and buttons to choose the language." msgstr "" #: gnu/packages/gnome.scm:11418 msgid "Project management software for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:11420 msgid "" "GNOME Planner is a project management tool based on the Work Breakdown\n" "Structure (WBS). Its goal is to enable you to easily plan projects. Based on\n" "the resources, tasks, and constraints that you define, Planner generates\n" "various views into a project. For example, Planner can show a Gantt chart of\n" "the project. It can show a detailed summary of tasks including their\n" "duration, cost, and current progress. It can also show a report of resource\n" "utilization that highlights under-utilized and over-utilized resources. These\n" "views can be printed as PDF or PostScript files, or exported to HTML." msgstr "" #: gnu/packages/gnome.scm:11488 msgid "GNOME music playing application" msgstr "" #: gnu/packages/gnome.scm:11490 msgid "" "Lollypop is a music player designed to play well with GNOME desktop.\n" "Lollypop plays audio formats such as mp3, mp4, ogg and flac and gets information\n" "from artists and tracks from the web. It also fetches cover artworks\n" "automatically and it can stream songs from online music services and charts." msgstr "" #: gnu/packages/gnome.scm:11512 msgid "Video effects for Cheese and other GNOME applications" msgstr "" #: gnu/packages/gnome.scm:11514 msgid "" "A collection of GStreamer video filters and effects to be used in\n" "photo-booth-like software, such as Cheese." msgstr "" #: gnu/packages/gnome.scm:11580 msgid "Webcam photo booth software for GNOME" msgstr "" #: gnu/packages/gnome.scm:11582 msgid "" "Cheese uses your webcam to take photos and videos. Cheese can also\n" "apply fancy special effects and lets you share the fun with others." msgstr "" #: gnu/packages/gnome.scm:11641 msgid "Password manager for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:11643 msgid "" "Secrets is a password manager which makes use of the KeePass v4\n" "format. It integrates perfectly with the GNOME desktop and provides an easy\n" "and uncluttered interface for the management of password databases." msgstr "" #: gnu/packages/gnome.scm:11693 msgid "Audio music cd ripper" msgstr "" #: gnu/packages/gnome.scm:11694 msgid "" "Sound Juicer extracts audio from compact discs and convert it\n" "into audio files that a personal computer or digital audio player can play.\n" "It supports ripping to any audio codec supported by a GStreamer plugin, such as\n" "mp3, Ogg Vorbis and FLAC" msgstr "" #: gnu/packages/gnome.scm:11744 msgid "Convert between audio formats with a graphical interface" msgstr "" #: gnu/packages/gnome.scm:11746 msgid "" "SoundConverter supports converting between many audio formats including\n" "Opus, Ogg Vorbis, FLAC and more. It supports parallel conversion, and\n" "configurable file renaming." msgstr "" #: gnu/packages/gnome.scm:11792 msgid "Tool to help prevent repetitive strain injury (RSI)" msgstr "" #: gnu/packages/gnome.scm:11794 msgid "" "Workrave is a program that assists in the recovery and prevention of\n" "repetitive strain injury (@dfn{RSI}). The program frequently alerts you to take\n" "micro-pauses and rest breaks, and restricts you to your daily limit." msgstr "" #: gnu/packages/gnome.scm:11833 msgid "GNOME hexadecimal editor" msgstr "" #: gnu/packages/gnome.scm:11834 msgid "" "The GHex program can view and edit files in two ways:\n" "hexadecimal or ASCII. It is useful for editing binary files in general." msgstr "" #: gnu/packages/gnome.scm:11871 msgid "Companion library to GObject and Gtk+" msgstr "" #: gnu/packages/gnome.scm:11872 msgid "" "The libdazzle library is a companion library to GObject and\n" "Gtk+. It provides various features that the authors wish were in the\n" "underlying library but cannot for various reasons. In most cases, they are\n" "wildly out of scope for those libraries. In other cases, they are not quite\n" "generic enough to work for everyone." msgstr "" #: gnu/packages/gnome.scm:11944 msgid "Manage your email, contacts and schedule" msgstr "" #: gnu/packages/gnome.scm:11945 msgid "" "Evolution is a personal information management application\n" "that provides integrated mail, calendaring and address book\n" "functionality." msgstr "" #: gnu/packages/gnome.scm:12000 msgid "GNOME image viewer and browser" msgstr "" #: gnu/packages/gnome.scm:12001 msgid "" "GThumb is an image viewer, browser, organizer, editor and\n" "advanced image management tool" msgstr "" #: gnu/packages/gnome.scm:12072 msgid "Store and run multiple GNOME terminals in one window" msgstr "" #: gnu/packages/gnome.scm:12074 msgid "" "Terminator allows you to run multiple GNOME terminals in a grid and\n" "tabs, and it supports drag and drop re-ordering of terminals." msgstr "" #: gnu/packages/gnome.scm:12133 msgid "Library full of GTK+ widgets for mobile phones" msgstr "" #: gnu/packages/gnome.scm:12134 msgid "" "The aim of the handy library is to help with developing user\n" "interfaces for mobile devices using GTK+. It provides responsive GTK+ widgets\n" "for usage on small and big screens." msgstr "" #: gnu/packages/gnome.scm:12181 msgid "GLib wrapper around the libgit2 Git access library" msgstr "" #: gnu/packages/gnome.scm:12182 msgid "" "libgit2-glib is a GLib wrapper library around the libgit2 Git\n" "access library. It only implements the core plumbing functions, not really the\n" "higher level porcelain stuff." msgstr "" #: gnu/packages/gnome.scm:12243 msgid "Graphical user interface for git" msgstr "" #: gnu/packages/gnome.scm:12245 msgid "" "gitg is a graphical user interface for git. It aims at being a small,\n" "fast and convenient tool to visualize the history of git repositories.\n" "Besides visualization, gitg also provides several utilities to manage your\n" "repository and commit your work." msgstr "" #: gnu/packages/gnome.scm:12315 msgid "File alteration monitor" msgstr "" #: gnu/packages/gnome.scm:12317 msgid "" "Gamin is a file and directory monitoring system defined to be a subset\n" "of the FAM (File Alteration Monitor) system. This is a service provided by a\n" "library which detects when a file or a directory has been modified." msgstr "" #: gnu/packages/gnome.scm:12350 msgid "Mahjongg tile-matching game" msgstr "" #: gnu/packages/gnome.scm:12351 msgid "" "GNOME Mahjongg is a game based on the classic Chinese\n" "tile-matching game Mahjongg. It features multiple board layouts, tile themes,\n" "and a high score table." msgstr "" #: gnu/packages/gnome.scm:12388 msgid "GNOME Extra Themes" msgstr "" #: gnu/packages/gnome.scm:12389 msgid "" "This package provides themes and related elements that don't\n" "really fit in other upstream packages. It offers legacy support for GTK+ 2\n" "versions of Adwaita, Adwaita-dark and HighContrast themes. It also provides\n" "index files needed for Adwaita to be used outside of GNOME." msgstr "" #: gnu/packages/gnome.scm:12437 msgid "Note-taking application for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:12438 msgid "" "Gnote is a note-taking application written for the GNOME\n" "desktop environment." msgstr "" #: gnu/packages/gnome.scm:12500 msgid "Simple IRC Client" msgstr "" #: gnu/packages/gnome.scm:12502 msgid "" "Polari is a simple Internet Relay Chat (IRC) client that is designed to\n" "integrate seamlessly with the GNOME desktop." msgstr "" #: gnu/packages/gnome.scm:12566 msgid "View, access, and manage remote and virtual systems" msgstr "" #: gnu/packages/gnome.scm:12567 msgid "" "GNOME Boxes is a simple application to view, access, and\n" "manage remote and virtual systems. Note that this application requires the\n" "@code{libvirt} and @code{virtlog} daemons to run. Use the command\n" "@command{info '(guix) Virtualization Services'} to learn how to configure\n" "these services on the Guix System. If you do not use the\n" "@code{gnome-desktop-service-type}, you will also want to extend the\n" "@code{polkit-service-type} with the @code{spice-gtk} package, as well as\n" "configure the @file{libexec/spice-client-glib-usb-acl-helper} executable of\n" "@code{spice-gtk} as setuid, to make it possible to redirect USB devices as a\n" "non-privileged user." msgstr "" #: gnu/packages/gnome.scm:12670 msgid "GNOME email application built around conversations" msgstr "" #: gnu/packages/gnome.scm:12672 msgid "" "Geary collects related messages together into conversations,\n" "making it easy to find and follow your discussions. Full-text and keyword\n" "search makes it easy to find the email you are looking for. Geary's\n" "full-featured composer lets you send rich, styled text with images, links, and\n" "lists, but also send lightweight, easy to read text messages. Geary\n" "automatically picks up your existing GNOME Online Accounts, and adding more is\n" "easy. Geary has a clean, fast, modern interface that works like you want it\n" "to." msgstr "" #: gnu/packages/gnome.scm:12715 msgid "Program for creating labels and business cards" msgstr "" #: gnu/packages/gnome.scm:12717 msgid "" "gLabels is a program for creating labels and business cards. It is\n" "designed to work with various laser/ink-jet peel-off label and business\n" "card sheets that you’ll find at most office supply stores." msgstr "" #: gnu/packages/gnome.scm:12751 msgid "LaTeX editor for the GNOME desktop" msgstr "" #: gnu/packages/gnome.scm:12753 msgid "" "GNOME LaTeX is a LaTeX editor for the GNOME desktop. It has features\n" "such as build tools, completion of LaTeX commands, structure navigation,\n" "symbol tables, document templates, project management, spell-checking, menus\n" "and toolbars." msgstr "" #: gnu/packages/gnome.scm:12808 msgid "LaTeX editor written in Python with GTK+" msgstr "" #: gnu/packages/gnome.scm:12810 msgid "" "Setzer is a simple yet full-featured LaTeX editor written in Python with\n" "GTK+. It integrates well with the GNOME desktop environment." msgstr "" #: gnu/packages/gnome.scm:12874 msgid "Markdown editor written in Python with GTK+" msgstr "" #: gnu/packages/gnome.scm:12875 msgid "" "Apostrophe is a GTK+ based distraction-free Markdown editor.\n" "It uses pandoc as back-end for parsing Markdown." msgstr "" #: gnu/packages/gnome.scm:12935 msgid "DBus daemon and utility for configuring gaming mice" msgstr "" #: gnu/packages/gnome.scm:12936 msgid "" "libratbag provides @command{ratbagd}, a DBus daemon to\n" "configure input devices, mainly gaming mice. The daemon provides a generic\n" "way to access the various features exposed by these mice and abstracts away\n" "hardware-specific and kernel-specific quirks. There is also the\n" "@command{ratbagctl} command line interface for configuring devices.\n" "\n" "libratbag currently supports devices from Logitech, Etekcity, GSkill, Roccat,\n" "Steelseries.\n" "\n" "The ratbagd DBus service can be enabled by adding the following service to\n" "your operating-system definition:\n" "\n" " (simple-service 'ratbagd dbus-root-service-type (list libratbag))" msgstr "" #: gnu/packages/gnome.scm:13006 msgid "Configure bindings and LEDs on gaming mice" msgstr "" #: gnu/packages/gnome.scm:13007 msgid "" "Piper is a GTK+ application for configuring gaming mice with\n" "onboard configuration for key bindings via libratbag. Piper requires\n" "a @command{ratbagd} daemon running with root privileges. It can be run\n" "manually as root, but is preferably configured as a DBus service that can\n" "launch on demand. This can be configured by enabling the following service,\n" "provided there is a DBus service present:\n" "\n" " (simple-service 'ratbagd dbus-root-service-type (list libratbag))" msgstr "" #: gnu/packages/gnome.scm:13068 msgid "GNOME audio player for transcription" msgstr "" #: gnu/packages/gnome.scm:13069 msgid "" "Parlatype is an audio player for the GNOME desktop\n" "environment. Its main purpose is the manual transcription of spoken\n" "audio files." msgstr "" #: gnu/packages/gnome.scm:13096 msgid "JSON-RPC library for GLib" msgstr "" #: gnu/packages/gnome.scm:13097 msgid "" "Jsonrpc-GLib is a library to communicate with JSON-RPC based\n" "peers in either a synchronous or asynchronous fashion. It also allows\n" "communicating using the GVariant serialization format instead of JSON when\n" "both peers support it. You might want that when communicating on a single\n" "host to avoid parser overhead and memory-allocator fragmentation." msgstr "" #: gnu/packages/gnome.scm:13124 msgid "Haptic/visual/audio feedback via DBus" msgstr "" #: gnu/packages/gnome.scm:13125 msgid "" "Feedbackd provides a DBus daemon to act on events to provide\n" "haptic, visual and audio feedback. It offers the libfeedbackd library and\n" "GObject introspection bindings." msgstr "" #: gnu/packages/gnome.scm:13177 msgid "System-wide performance profiler for GNU/Linux" msgstr "" #: gnu/packages/gnome.scm:13179 msgid "" "Sysprof performs detailed, accurate, and fast CPU profiling of an entire\n" "GNU/Linux system including the kernel and all user-space applications. This\n" "helps find the function(s) in which a program spends most of its time.\n" "\n" "It uses the kernel's built-in @code{ptrace} feature and handles shared\n" "libraries. Applications do not need to be recompiled--or even restarted." msgstr "" #: gnu/packages/gnome.scm:13280 msgid "Toolsmith for GNOME-based applications" msgstr "" #: gnu/packages/gnome.scm:13282 msgid "" "Builder aims to be an integrated development environment (IDE) for\n" "writing GNOME-based software. It features fuzzy search, auto-completion,\n" "a mini code map, documentation browsing, Git integration, an integrated\n" "profiler via Sysprof, debugging support, and more." msgstr "" #: gnu/packages/gnome.s