Package: photocollage
Version: 1.4.3-2.2
Severity: normal
Tags: patch  pending  sid  booksworm

Dear maintainer,

I've prepared an NMU for photocollage (versioned as 1.4.5-0.1) and
uploaded it to DELAYED/14. Please feel free to tell me if I
should delay it longer.

Regards.

diff -Nru photocollage-1.4.3/data/photocollage.appdata.xml photocollage-
1.4.5/data/photocollage.appdata.xml
--- photocollage-1.4.3/data/photocollage.appdata.xml    2016-05-17
15:51:10.000000000 -0400
+++ photocollage-1.4.5/data/photocollage.appdata.xml    2021-07-09
11:08:13.922905000 -0400
@@ -7,8 +7,11 @@
  <summary>Graphical tool to make photo collage posters</summary>
  <summary xml:lang="cs">Grafický nástroj pro vytváření koláží z
fotografií</summary>
  <summary xml:lang="de">Grafisches Werkzeug zum erstellen von Foto-Collagen
Poster</summary>
+ <summary xml:lang="es">Herramienta gráfica para hacer póster de collage de
fotos.</summary>
  <summary xml:lang="fr">Outil graphique pour fabriquer des posters en collant
plusieurs photos</summary>
  <summary xml:lang="it">Strumento grafico per creare collage di
fotografie</summary>
+ <summary xml:lang="nl">Grafische toepassing om fotocollageposters te
maken</summary>
+ <summary xml:lang="ru">Графический инструмент для создания фотоколлажа из
плакатов</summary>
  <description>
   <p>
    PhotoCollage allows you to create photo collage posters. It assembles the
@@ -59,6 +62,23 @@
    Webseiten. Jedoch ist es kostenlos und der Quellcode unter einer freien 
    Lizenz erhältlich.
   </p>
+  <p xml:lang="es">
+   PhotoCollage te permite crear póster de collage de fotos. Reúne las 
+   fotografías de entrada que se le dan para generar un gran póster. Las 
+   fotos se organizan automáticamente para llenar todo el póster, luego 
+   puede cambiar el diseño final, las dimensiones, los bordes o intercambiar 
+   fotos en la cuadrícula generada. Finalmente, la imagen final del póster 
+   se puede guardar en cualquier tamaño.
+  </p>
+  <p xml:lang="es">
+   El algoritmo genera diseños aleatorios que colocan fotos mientras 
+   aprovechan todo el espacio libre. Intenta llenar todo el espacio 
+   manteniendo cada foto lo más grande posible.
+  </p>
+  <p xml:lang="es">
+   PhotoCollage hace más o menos lo mismo que muchos sitios web comerciales, 
+   pero de forma gratuita y con código de open source.
+  </p>
   <p xml:lang="fr">
    PhotoCollage permet de créer des posters de photo-collages. Il assemble
les
    photos qu'on lui donne pour générer un grand poster. Les photos sont
@@ -93,6 +113,29 @@
    PhotoCollage fa più o meno quello che fanno molti siti web commerciali, ma
    gratuitamente e con codice open source.
   </p>
+  <p xml:lang="nl">
+   Met PhotoCollage kun je collageposters maken. Alle opgegeven
+   afbeeldingen worden samengevoegd tot één grote poster: ze worden
+   automatisch ingedeeld om de gehele poster op te vullen. Daarna kun je de
+   indeling, afmetingen, randdikte en volgorde aanpassen en de poster opslaan
+   in elke denkbare grootte.
+  </p>
+  <p xml:lang="ru">
+   PhotoCollage позволяет создавать фотоколлажа из плакатов. Он собирает
+   входные фотографии, которые ему выдают, для создания большого плаката.
Фотографии
+   автоматически располагаются так, чтобы заполнить весь плакат, затем вы
можете изменить
+   окончательный макет, размеры, границы или поменять местами фотографии в
сгенерированной сетке.
+   В конечном итоге окончательное изображение плаката может быть сохранено в
любом размере.
+  </p>
+  <p xml:lang="ru">
+   Алгоритм генерирует случайные макеты, которые размещают фотографии,
+   используя при этом все свободное пространство. Он пытается заполнить все
пространство,
+   сохраняя при этом каждую фотографию как можно большего размера.
+  </p>
+  <p xml:lang="ru">
+   PhotoCollage делает более или менее то же самое, что и многие коммерческие
веб-сайты,
+   но бесплатно и с открытым исходным кодом.
+  </p>
  </description>
  <screenshots>
   <screenshot type="default" width="800" height="450">
diff -Nru photocollage-1.4.3/data/photocollage.desktop photocollage-
1.4.5/data/photocollage.desktop
--- photocollage-1.4.3/data/photocollage.desktop        2016-05-17
15:51:10.000000000 -0400
+++ photocollage-1.4.5/data/photocollage.desktop        2021-07-09
11:08:13.922905000 -0400
@@ -13,6 +13,10 @@
Keywords[de]=Fotos;Bilder;Poster;Plakate;Zusammenstellung;Collage,Photo;Image;
 Comment[de]=Ein grafisches Werkzeug zum Erstellen von Fotocollage-Postern aus
mehreren Bildern
 
+Name[es]=PhotoCollage
+Keywords[es]=foto;collage;carteles;imágenes;imagen;fotografía;fotografías;pós
ter;
+Comment[es]=Herramienta gráfica para hacer carteles de collage de fotos a
partir de múltiples imágenes.
+
 Name[fr]=PhotoCollage
 Keywords[fr]=photo;collage;image;
 Comment[fr]=Outil graphique pour fabriquer des posters en collant plusieurs
photos
@@ -20,3 +24,11 @@
 Name[it]=PhotoCollage
 Keywords[it]=foto;collage;immagine;fotografia;fotografie;immagini;poster;
 Comment[it]=Utilità grafica per creare poster da collage di fotografie
+
+Name[nl]=PhotoCollage
+Keywords[nl]=foto;collage;afbeelding;fotografie;poster;
+Comment[nl]=Grafische toepassing om fotocollageposters samen te stellen uit
meerdere afbeeldingen
+
+Name[ru]=PhotoCollage
+Keywords[ru]=фотография;коллаж;изображение;
+Comment[ru]=Графический инструмент для создания плаката фотоколлажа из
нескольких изображений
diff -Nru photocollage-1.4.3/debian/changelog photocollage-
1.4.5/debian/changelog
--- photocollage-1.4.3/debian/changelog 2021-01-20 10:18:47.000000000 -0500
+++ photocollage-1.4.5/debian/changelog 2021-09-30 09:51:44.000000000 -0400
@@ -1,3 +1,14 @@
+photocollage (1.4.5-0.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * New upstream release 1.4.5.
+  * Bump Standards-Version to 4.6.0.
+  * Bump debhelper compat to v13.
+  * debian/control: Add Vcs-* fields to use git packaging repo on
+    Salsa Debian GitLab.
+
+ -- Boyuan Yang <by...@debian.org>  Thu, 30 Sep 2021 09:51:44 -0400
+
 photocollage (1.4.3-2.2) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru photocollage-1.4.3/debian/compat photocollage-1.4.5/debian/compat
--- photocollage-1.4.3/debian/compat    2021-01-20 10:18:02.000000000 -0500
+++ photocollage-1.4.5/debian/compat    1969-12-31 19:00:00.000000000 -0500
@@ -1 +0,0 @@
-9
diff -Nru photocollage-1.4.3/debian/control photocollage-1.4.5/debian/control
--- photocollage-1.4.3/debian/control   2021-01-20 10:18:41.000000000 -0500
+++ photocollage-1.4.5/debian/control   2021-09-30 09:51:07.000000000 -0400
@@ -3,12 +3,14 @@
 Priority: optional
 Maintainer: Adrien Vergé <adrienve...@gmail.com>
 Build-Depends:
- debhelper (>=9),
+ debhelper-compat (= 13),
  gettext,
- dh-python,
+ dh-sequence-python3,
  python3-all,
-Standards-Version: 3.9.8
+Standards-Version: 4.6.0
 Homepage: https://github.com/adrienverge/PhotoCollage
+Vcs-Git: https://salsa.debian.org/debian/photocollage.git
+Vcs-Browser: https://salsa.debian.org/debian/photocollage
 
 Package: photocollage
 Architecture: all
diff -Nru photocollage-1.4.3/debian/rules photocollage-1.4.5/debian/rules
--- photocollage-1.4.3/debian/rules     2021-01-20 10:18:02.000000000 -0500
+++ photocollage-1.4.5/debian/rules     2021-09-30 09:51:14.000000000 -0400
@@ -1,4 +1,4 @@
 #!/usr/bin/make -f
 
 %:
-       dh $@ --with python3 --buildsystem=pybuild
+       dh $@ --buildsystem=pybuild
diff -Nru photocollage-1.4.3/photocollage/artwork.py photocollage-
1.4.5/photocollage/artwork.py
--- photocollage-1.4.3/photocollage/artwork.py  2016-05-17 15:51:10.000000000
-0400
+++ photocollage-1.4.5/photocollage/artwork.py  2020-09-24 08:20:02.075167200
-0400
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Copyright (C) 2014 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -30,85 +29,67 @@
 #   for i in range(0, len(encoded_image), n):
 #       print('    "' + encoded_image[i:i+n].decode('ascii') + '"')
 ICON_DRAG_AND_DROP = (
-   
"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"
-   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"
-   
"pGLFCQxyILy5br2LLTUewuWzE1TLtZ1KlT7/mqW7fu7Q/5SD19b3V9nHrO+/m8b9Xc+O45lzT"
-   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"
-   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"
-   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"
-   
"50Sk6y5F+zGVYsC+xpSrKyDdKaXS143S1nEchS6pM25S4c2SQIs5nGJguOPbgaudu88tNtVht"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   
"hoUZr4JTcXDGn4Zjf0b8cIsas9EWhZ3glxSS7o7LqqhzoCqHivVJ3sNUGPCVIpOnQKS/V8nVB"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   
"K1HK0J3KqyLIp7+GULU28V4fvymv26kWAVBhb/ucX1i4X+Fv+DLv8Evzioih3B5rKZMNQB2/p"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-   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"
-    "/8mFbafV794AAAAABJRU5ErkJggg==")
+   
"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"
+    "U4Z3kUZTSagAAAAASUVORK5CYII=")
 
 
 def load_pixbuf(encoded):
diff -Nru photocollage-1.4.3/photocollage/collage.py photocollage-
1.4.5/photocollage/collage.py
--- photocollage-1.4.3/photocollage/collage.py  2016-05-17 15:51:10.000000000
-0400
+++ photocollage-1.4.5/photocollage/collage.py  2020-09-24 08:20:02.075167200
-0400
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Copyright (C) 2014 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -77,19 +76,34 @@
 """
 
 
-class Photo(object):
+class Photo:
     def __init__(self, filename, w, h, orientation=0):
         self.filename = filename
         self.w = w
         self.h = h
         self.orientation = orientation
+        self.offset_w = 0.5
+        self.offset_h = 0.5
 
     @property
     def ratio(self):
         return float(self.h) / float(self.w)
 
+    def move(self, x, y):
+        self.offset_w = self.calculate_new_offset(self.offset_w, x)
+        self.offset_h = self.calculate_new_offset(self.offset_h, y)
+
+    @staticmethod
+    def calculate_new_offset(offset, value):
+        new_offset = offset + value
+        if new_offset < 0:
+            new_offset = 0
+        elif new_offset > 1:
+            new_offset = 1
+        return new_offset
 
-class Cell(object):
+
+class Cell:
     """Represents a cell in a column
 
     Properties:
@@ -230,7 +244,7 @@
         pass
 
 
-class Column(object):
+class Column:
     """Represents a column in a page
 
     Properties:
@@ -301,7 +315,7 @@
         # First, make groups of "movable" cells. Since cell extents are not
         # movable, these groups only contain pure cell objects. We only
resize
         # those groups.
-        class Group(object):
+        class Group:
             def __init__(self, y):
                 self.y = y
                 self.h = 0
@@ -328,7 +342,7 @@
                 c.h = c.h * alpha
 
 
-class Page(object):
+class Page:
     """Represents a whole page
 
     Properties:
diff -Nru photocollage-1.4.3/photocollage/gtkgui.py photocollage-
1.4.5/photocollage/gtkgui.py
--- photocollage-1.4.3/photocollage/gtkgui.py   2016-05-17 15:51:10.000000000
-0400
+++ photocollage-1.4.5/photocollage/gtkgui.py   2020-09-24 08:20:02.076167300
-0400
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Copyright (C) 2013 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -22,16 +21,17 @@
 import os.path
 import random
 import sys
+import urllib
 
 import cairo
 import gi
-gi.require_version('Gtk', '3.0')  # noqa
-from gi.repository import Gtk, Gdk, GObject
-from six.moves import urllib  # Python 2 backward compatibility
 
 from photocollage import APP_NAME, artwork, collage, render
 from photocollage.render import PIL_SUPPORTED_EXTS as EXTS
 
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk, Gdk, GObject, GdkPixbuf  # noqa: E402, I100
+
 
 gettext.textdomain(APP_NAME)
 _ = gettext.gettext
@@ -116,7 +116,7 @@
     return my_fn
 
 
-class UserCollage(object):
+class UserCollage:
     """Represents a user-defined collage
 
     A UserCollage contains a list of photos (referenced by filenames) and a
@@ -158,11 +158,11 @@
     TARGET_TYPE_URI = 2
 
     def __init__(self):
-        super(PhotoCollageWindow, self).__init__(title=_("PhotoCollage"))
+        super().__init__(title=_("PhotoCollage"))
         self.history = []
         self.history_index = 0
 
-        class Options(object):
+        class Options:
             def __init__(self):
                 self.border_w = 0.01
                 self.border_c = "black"
@@ -282,14 +282,11 @@
             dialog.destroy()
 
     def choose_images(self, button):
-        dialog = Gtk.FileChooserDialog(_("Choose images"),
-                                       button.get_toplevel(),
-                                       Gtk.FileChooserAction.OPEN,
-                                       select_multiple=True)
-        dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
-        dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK)
-
-        set_open_image_filters(dialog)
+        dialog = PreviewFileChooserDialog(title=_("Choose images"),
+                                          parent=button.get_toplevel(),
+                                          action=Gtk.FileChooserAction.OPEN,
+                                          select_multiple=True,
+                                          modal=True)
 
         if dialog.run() == Gtk.ResponseType.OK:
             files = dialog.get_filenames()
@@ -335,7 +332,7 @@
             self.btn_save.set_sensitive(True)
 
         def on_fail(exception):
-            dialog = ErrorDialog(self, "%s:\n\n%s" % (
+            dialog = ErrorDialog(self, "{}:\n\n{}".format(
                 _("An error occurred while rendering image:"), exception))
             compdialog.destroy()
             dialog.run()
@@ -420,7 +417,7 @@
             compdialog.destroy()
 
         def on_fail(exception):
-            dialog = ErrorDialog(self, "%s:\n\n%s" % (
+            dialog = ErrorDialog(self, "{}:\n\n{}".format(
                 _("An error occurred while rendering image:"), exception))
             compdialog.destroy()
             dialog.run()
@@ -456,10 +453,10 @@
 
 class ImagePreviewArea(Gtk.DrawingArea):
     """Area to display the poster preview and react to user actions"""
-    INSENSITIVE, FLYING, SWAPPING = range(3)
+    INSENSITIVE, FLYING, SWAPPING_OR_MOVING = range(3)
 
     def __init__(self, parent):
-        super(ImagePreviewArea, self).__init__()
+        super().__init__()
         self.parent = parent
 
         parse, color = Gdk.Color.parse("#888888")
@@ -481,7 +478,7 @@
         self.image = None
         self.mode = self.INSENSITIVE
 
-        class SwapEnd(object):
+        class SwapEnd:
             def __init__(self, cell=None, x=0, y=0):
                 self.cell = cell
                 self.x = x
@@ -493,8 +490,9 @@
 
     def set_collage(self, image, collage):
         self.image = pil_image_to_cairo_surface(image)
-        # The Collage object must be deeply copied. Otherwise, swapping
photos
-        # in a new page would also affect the original page (in history).
+        # The Collage object must be deeply copied.
+        # Otherwise, SWAPPING_OR_MOVING photos in a new page would also
affect
+        # the original page (in history).
         # The deep copy is done here (not in button_release_event) because
         # references to cells are gathered in other functions, so that making
         # the copy at the end would invalidate these references.
@@ -554,7 +552,7 @@
                 if cell:
                     self.paint_image_border(context, cell)
                     self.paint_image_delete_button(context, cell)
-            elif self.mode == self.SWAPPING:
+            elif self.mode == self.SWAPPING_OR_MOVING:
                 self.paint_image_border(context, self.swap_origin.cell, (3,
3))
                 cell = self.collage.page.get_cell_at_position(self.x, self.y)
                 if cell and cell != self.swap_origin.cell:
@@ -598,27 +596,34 @@
             else:
                 self.swap_origin.x, self.swap_origin.y = x, y
                 self.swap_origin.cell = cell
-                self.mode = self.SWAPPING
+                self.mode = self.SWAPPING_OR_MOVING
         widget.queue_draw()
 
     def button_release_event(self, widget, event):
-        if self.mode == self.SWAPPING:
+        if self.mode == self.SWAPPING_OR_MOVING:
             self.swap_dest.x, self.swap_dest.y = \
                 self.get_pos_in_image(event.x, event.y)
             self.swap_dest.cell = self.collage.page.get_cell_at_position(
                 self.swap_dest.x, self.swap_dest.y)
             if self.swap_dest.cell \
                     and self.swap_origin.cell != self.swap_dest.cell:
+                # different cell: SWAPPING
                 self.collage.page.swap_photos(self.swap_origin.cell,
                                               self.swap_dest.cell)
                 self.parent.render_from_new_collage(self.collage)
+            elif self.swap_dest.cell:
+                # same cell: MOVING
+                move_x = (self.swap_origin.x - self.x) /
self.swap_dest.cell.w
+                move_y = (self.swap_origin.y - self.y) /
self.swap_dest.cell.h
+                self.swap_dest.cell.photo.move(move_x, move_y)
+                self.parent.render_from_new_collage(self.collage)
             self.mode = self.FLYING
         widget.queue_draw()
 
 
 class SettingsDialog(Gtk.Dialog):
     def __init__(self, parent):
-        super(SettingsDialog, self).__init__(
+        super().__init__(
             _("Settings"), parent, 0,
             (Gtk.STOCK_OK, Gtk.ResponseType.OK,
              Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
@@ -693,7 +698,8 @@
         self.etr_border = Gtk.Entry(text=str(100.0 * parent.opts.border_w))
         self.etr_border.connect("changed", self.validate_float)
         self.etr_border.last_valid_text = self.etr_border.get_text()
-        self.etr_border.set_width_chars(2)
+        self.etr_border.set_width_chars(4)
+        self.etr_border.set_alignment(1.0)
         box.pack_start(self.etr_border, False, False, 0)
         label = Gtk.Label("%", xalign=0)
         box.pack_start(label, False, False, 0)
@@ -736,7 +742,7 @@
 class ComputingDialog(Gtk.Dialog):
     """Simple "please wait" dialog, with a "cancel" button"""
     def __init__(self, parent):
-        super(ComputingDialog, self).__init__(
+        super().__init__(
             _("Please wait"), parent, 0, (Gtk.STOCK_CANCEL,
                                           Gtk.ResponseType.CANCEL))
         self.set_default_size(300, -1)
@@ -761,14 +767,52 @@
 
 class ErrorDialog(Gtk.Dialog):
     def __init__(self, parent, message):
-        super(ErrorDialog, self).__init__(_("Error"), parent, 0,
-                                          (Gtk.STOCK_OK,
Gtk.ResponseType.OK))
+        super().__init__(_("Error"), parent, 0,
+                         (Gtk.STOCK_OK, Gtk.ResponseType.OK))
         self.set_border_width(10)
         box = self.get_content_area()
         box.add(Gtk.Label(message))
         self.show_all()
 
 
+class PreviewFileChooserDialog(Gtk.FileChooserDialog):
+    PREVIEW_MAX_SIZE = 256
+
+    def __init__(self, **kw):
+        super().__init__(**kw)
+
+        self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
+        self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK)
+
+        set_open_image_filters(self)
+
+        self._preview = Gtk.Image()
+        # Don't let preview size down horizontally for skinny images, cause
+        # that looks distracting
+        self._preview.set_size_request(
+            PreviewFileChooserDialog.PREVIEW_MAX_SIZE, -1)
+        self.set_preview_widget(self._preview)
+        self.set_use_preview_label(False)
+        self.connect("update-preview", self.update_preview_cb)
+
+    def update_preview_cb(self, file_chooser):
+        filename = self.get_preview_filename()
+        if filename is None or os.path.isdir(filename):
+            self.set_preview_widget_active(False)
+            return
+        try:
+            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(
+                filename,
+                PreviewFileChooserDialog.PREVIEW_MAX_SIZE,
+                PreviewFileChooserDialog.PREVIEW_MAX_SIZE)
+            self._preview.set_from_pixbuf(pixbuf)
+        except Exception as e:
+            print(e)
+            self.set_preview_widget_active(False)
+            return
+        self.set_preview_widget_active(True)
+
+
 def main():
     # Enable threading. Without that, threads hang!
     GObject.threads_init()
diff -Nru photocollage-1.4.3/photocollage/__init__.py photocollage-
1.4.5/photocollage/__init__.py
--- photocollage-1.4.3/photocollage/__init__.py 2016-05-17 15:51:10.000000000
-0400
+++ photocollage-1.4.5/photocollage/__init__.py 2021-07-09 11:08:02.686839800
-0400
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Copyright (C) 2013 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -16,7 +15,7 @@
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 APP_NAME = "photocollage"
-APP_VERSION = "1.4.3"
+APP_VERSION = "1.4.5"
 
 __author__ = "Adrien Vergé"
 __copyright__ = "Copyright 2013, Adrien Vergé"
diff -Nru photocollage-1.4.3/photocollage/render.py photocollage-
1.4.5/photocollage/render.py
--- photocollage-1.4.3/photocollage/render.py   2016-05-17 15:51:10.000000000
-0400
+++ photocollage-1.4.5/photocollage/render.py   2020-09-24 08:20:02.076167300
-0400
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Copyright (C) 2014 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -21,6 +20,7 @@
 
 import PIL.Image
 import PIL.ImageDraw
+import PIL.ImageFile
 
 from photocollage.collage import Photo
 
@@ -30,7 +30,12 @@
 QUALITY_BEST = 2
 
 
-class PIL_SUPPORTED_EXTS(object):
+# Try to continue even if the input file is corrupted.
+# See issue at https://github.com/adrienverge/PhotoCollage/issues/65
+PIL.ImageFile.LOAD_TRUNCATED_IMAGES = True
+
+
+class PIL_SUPPORTED_EXTS:
     """File extensions supported by PIL
 
     Compiled from:
@@ -94,7 +99,7 @@
     for name in filelist:
         try:
             img = PIL.Image.open(name)
-        except IOError:
+        except OSError:
             raise BadPhoto(name)
         w, h = img.size
 
@@ -105,7 +110,7 @@
                 orientation = exif[274]
                 if orientation == 6 or orientation == 8:
                     w, h = h, w
-        except:
+        except Exception:
             pass
 
         ret.append(Photo(name, w, h, orientation))
@@ -126,7 +131,7 @@
     def __init__(self, page, border_width=0.01, border_color=(0, 0, 0),
                  quality=QUALITY_FAST, output_file=None,
                  on_update=None, on_complete=None, on_fail=None):
-        super(RenderingTask, self).__init__()
+        super().__init__()
 
         self.page = page
         self.border_width = border_width
@@ -235,13 +240,23 @@
             cache[cell.photo.filename] = img
 
         if shape > 0:  # image is too thick
-            img = img.crop(
-                (int(round((img.size[0] - cell.w) / 2)), 0,
-                 int(round((img.size[0] + cell.w) / 2)), int(round(cell.h))))
+            width_to_crop = img.size[0] - cell.w
+            img = img.crop((
+                int(round(width_to_crop * cell.photo.offset_w)),
+                0,
+                int(round(img.size[0] - width_to_crop *
+                    (1 - cell.photo.offset_w))),
+                int(round(cell.h))
+            ))
         elif shape < 0:  # image is too tall
-            img = img.crop(
-                (0, int(round((img.size[1] - cell.h) / 2)),
-                 int(round(cell.w)), int(round((img.size[1] + cell.h) / 2))))
+            height_to_crop = img.size[1] - cell.h
+            img = img.crop((
+                0,
+                int(round(height_to_crop * cell.photo.offset_h)),
+                int(round(cell.w)),
+                int(round(img.size[1] - height_to_crop *
+                    (1 - cell.photo.offset_h)))
+            ))
 
         return img
 
diff -Nru photocollage-1.4.3/PKG-INFO photocollage-1.4.5/PKG-INFO
--- photocollage-1.4.3/PKG-INFO 2016-05-17 15:51:18.000000000 -0400
+++ photocollage-1.4.5/PKG-INFO 2021-07-09 11:08:59.068167400 -0400
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: photocollage
-Version: 1.4.3
+Version: 1.4.5
 Summary: Graphical tool to make photo collage posters
 Home-page: https://github.com/adrienverge/PhotoCollage
 Author: Adrien Vergé
@@ -14,11 +14,12 @@
 Classifier: License :: OSI Approved :: GNU General Public License v2 or later
(GPLv2+)
 Classifier: Operating System :: POSIX
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Topic :: Multimedia :: Graphics
 Requires: Pillow
 Requires: pycairo
diff -Nru photocollage-1.4.3/po/bg.po photocollage-1.4.5/po/bg.po
--- photocollage-1.4.3/po/bg.po 1969-12-31 19:00:00.000000000 -0500
+++ photocollage-1.4.5/po/bg.po 2017-11-11 04:12:46.101252000 -0500
@@ -0,0 +1,107 @@
+# PhotoCollage translation file
+# Copyright (C) 2014 Adrien Vergé
+# Copyright (C) 2015 Frank Quotschalla <guts...@computer-retro.de>
+# Copyright (C) 2015 Vincent Bermel <willovi...@openmailbox.org>
+# This file is distributed under the same license as the PhotoCollage
package.
+# Adrien Vergé, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PhotoCollage 1.4.2\n"
+"Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n";
+"POT-Creation-Date: 2016-04-11 22:51+0200\n"
+"PO-Revision-Date: 2017-10-29 20:28+0200\n"
+"Last-Translator: Peyu Yovev <spacy00...@gmail.com>\n"
+"Language-Team: spacy00...@gmail.com\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94
+msgid "All supported image formats"
+msgstr "Всички поддържани формати"
+
+#: photocollage/gtkgui.py:104
+#, python-format
+msgid "%s image"
+msgstr "%s изображение"
+
+#: photocollage/gtkgui.py:161
+msgid "PhotoCollage"
+msgstr "PhotoCollage"
+
+#: photocollage/gtkgui.py:189
+msgid "Add images..."
+msgstr "Добавяне на изображения"
+
+#: photocollage/gtkgui.py:196
+msgid "Save poster..."
+msgstr "Запази колажа..."
+
+#: photocollage/gtkgui.py:221
+msgid "Regenerate"
+msgstr "Регенерирай"
+
+#: photocollage/gtkgui.py:279
+#, python-format
+msgid ""
+"This image could not be opened:\n"
+"\"%(imgname)s\"."
+msgstr ""
+"Изображението не може да се отвори:\n"
+"\"%(imgname)s\"."
+
+#: photocollage/gtkgui.py:285
+msgid "Choose images"
+msgstr "Изберете изображения"
+
+#: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424
+msgid "An error occurred while rendering image:"
+msgstr "Получи се грешка по време на рендирането:"
+
+#: photocollage/gtkgui.py:398
+msgid "Save image"
+msgstr "Запази изображението"
+
+#: photocollage/gtkgui.py:622
+msgid "Settings"
+msgstr "Настройки"
+
+#: photocollage/gtkgui.py:634
+msgid "Output image size"
+msgstr "Размер на изходното изобранжение"
+
+#: photocollage/gtkgui.py:649
+msgid "pixels"
+msgstr "пиксела"
+
+#: photocollage/gtkgui.py:673
+msgid "Apply a template:"
+msgstr "Приложи шаблон"
+
+#: photocollage/gtkgui.py:686
+msgid "Border"
+msgstr "Рамка"
+
+#: photocollage/gtkgui.py:691
+msgid "Thickness:"
+msgstr "Ширина:"
+
+#: photocollage/gtkgui.py:701
+msgid "Color:"
+msgstr "Цвят:"
+
+#: photocollage/gtkgui.py:740
+msgid "Please wait"
+msgstr "Моля изчакайте"
+
+#: photocollage/gtkgui.py:749
+msgid "Performing image computation..."
+msgstr "Изпълнява се преизчисляване на изображението"
+
+#: photocollage/gtkgui.py:764
+msgid "Error"
+msgstr "Грешка"
diff -Nru photocollage-1.4.3/po/es.po photocollage-1.4.5/po/es.po
--- photocollage-1.4.3/po/es.po 1969-12-31 19:00:00.000000000 -0500
+++ photocollage-1.4.5/po/es.po 2021-07-09 11:08:13.922905000 -0400
@@ -0,0 +1,105 @@
+# PhotoCollage translation file
+# This file is distributed under the same license as the PhotoCollage
package.
+# Leonardo J. Caballero G. <leonardocaball...@gmail.com>, 2019.
+# Andrey Novikov <cookin...@yandex.ru>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PhotoCollage 1.4.4\n"
+"Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n";
+"POT-Creation-Date: 2014-01-18 02:46-0500\n"
+"PO-Revision-Date: 2021-07-05 13:10+0500\n"
+"Last-Translator: Leonardo J. Caballero G. <leonardocaball...@gmail.com>\n"
+"Language-Team: ES <l...@li.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94
+msgid "All supported image formats"
+msgstr "Todos los formatos de imágenes soportados"
+
+#: photocollage/gtkgui.py:104
+#, python-format
+msgid "%s image"
+msgstr "%s imagen"
+
+#: photocollage/gtkgui.py:161
+msgid "PhotoCollage"
+msgstr "PhotoCollage"
+
+#: photocollage/gtkgui.py:189
+msgid "Add images..."
+msgstr "Añadir imágenes..."
+
+#: photocollage/gtkgui.py:196
+msgid "Save poster..."
+msgstr "Guardar póster..."
+
+#: photocollage/gtkgui.py:221
+msgid "Regenerate"
+msgstr "Regenerar"
+
+#: photocollage/gtkgui.py:279
+#, python-format
+msgid ""
+"This image could not be opened:\n"
+"\"%(imgname)s\"."
+msgstr ""
+"Esta imagen no pudo ser abierta:\n"
+"\"%(imgname)s\"."
+
+#: photocollage/gtkgui.py:285
+msgid "Choose images"
+msgstr "Elegir imágenes"
+
+#: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424
+msgid "An error occurred while rendering image:"
+msgstr "Un error ocurrió al renderizar la imagen:"
+
+#: photocollage/gtkgui.py:398
+msgid "Save image"
+msgstr "Guardar imagen"
+
+#: photocollage/gtkgui.py:622
+msgid "Settings"
+msgstr "Configuración"
+
+#: photocollage/gtkgui.py:634
+msgid "Output image size"
+msgstr "Tamaño de salida de la imagen"
+
+#: photocollage/gtkgui.py:649
+msgid "pixels"
+msgstr "píxeles"
+
+#: photocollage/gtkgui.py:673
+msgid "Apply a template:"
+msgstr "Aplicar una plantilla:"
+
+#: photocollage/gtkgui.py:686
+msgid "Border"
+msgstr "Borde"
+
+#: photocollage/gtkgui.py:691
+msgid "Thickness:"
+msgstr "Espesor:"
+
+#: photocollage/gtkgui.py:701
+msgid "Color:"
+msgstr "Color:"
+
+#: photocollage/gtkgui.py:740
+msgid "Please wait"
+msgstr "Por favor, aguarde"
+
+#: photocollage/gtkgui.py:749
+msgid "Performing image computation..."
+msgstr "Realizando el cálculo de la imagen..."
+
+#: photocollage/gtkgui.py:764
+msgid "Error"
+msgstr "Error"
diff -Nru photocollage-1.4.3/po/nl.po photocollage-1.4.5/po/nl.po
--- photocollage-1.4.3/po/nl.po 1969-12-31 19:00:00.000000000 -0500
+++ photocollage-1.4.5/po/nl.po 2021-07-09 11:06:40.737365500 -0400
@@ -0,0 +1,107 @@
+# PhotoCollage translation file
+# Copyright (C) 2014 Adrien Vergé
+# Copyright (C) 2015 Frank Quotschalla <guts...@computer-retro.de>
+# Copyright (C) 2015 Vincent Bermel <willovi...@openmailbox.org>
+# This file is distributed under the same license as the PhotoCollage
package.
+# Adrien Vergé, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n";
+"POT-Creation-Date: 2016-04-11 22:51+0200\n"
+"PO-Revision-Date: 2020-09-24 13:56+0200\n"
+"Last-Translator: Heimen Stoffels <vistau...@outlook.com>\n"
+"Language-Team: none <n...@none.com>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94
+msgid "All supported image formats"
+msgstr "Alle ondersteunde afbeeldingsformaten"
+
+#: photocollage/gtkgui.py:104
+#, python-format
+msgid "%s image"
+msgstr "Afbeelding %s"
+
+#: photocollage/gtkgui.py:161
+msgid "PhotoCollage"
+msgstr "PhotoCollage"
+
+#: photocollage/gtkgui.py:189
+msgid "Add images..."
+msgstr "Afbeeldingen toevoegen..."
+
+#: photocollage/gtkgui.py:196
+msgid "Save poster..."
+msgstr "Poster opslaan..."
+
+#: photocollage/gtkgui.py:221
+msgid "Regenerate"
+msgstr "Opnieuw samenstellen"
+
+#: photocollage/gtkgui.py:279
+#, python-format
+msgid ""
+"This image could not be opened:\n"
+"\"%(imgname)s\"."
+msgstr ""
+"De volgende afbeelding kan niet worden geopend:\n"
+"\"%(imgname)s\"."
+
+#: photocollage/gtkgui.py:285
+msgid "Choose images"
+msgstr "Afbeeldingen selecteren"
+
+#: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424
+msgid "An error occurred while rendering image:"
+msgstr "Er is een fout opgetreden tijdens het samenstellen:"
+
+#: photocollage/gtkgui.py:398
+msgid "Save image"
+msgstr "Afbeelding opslaan"
+
+#: photocollage/gtkgui.py:622
+msgid "Settings"
+msgstr "Instellingen"
+
+#: photocollage/gtkgui.py:634
+msgid "Output image size"
+msgstr "Afbeeldingsgrootte"
+
+#: photocollage/gtkgui.py:649
+msgid "pixels"
+msgstr "pixels"
+
+#: photocollage/gtkgui.py:673
+msgid "Apply a template:"
+msgstr "Sjabloon toepassen:"
+
+#: photocollage/gtkgui.py:686
+msgid "Border"
+msgstr "Rand"
+
+#: photocollage/gtkgui.py:691
+msgid "Thickness:"
+msgstr "Dikte:"
+
+#: photocollage/gtkgui.py:701
+msgid "Color:"
+msgstr "Kleur:"
+
+#: photocollage/gtkgui.py:740
+msgid "Please wait"
+msgstr "Even geduld"
+
+#: photocollage/gtkgui.py:749
+msgid "Performing image computation..."
+msgstr "Bezig met berekenen..."
+
+#: photocollage/gtkgui.py:764
+msgid "Error"
+msgstr "Fout"
diff -Nru photocollage-1.4.3/po/ru.po photocollage-1.4.5/po/ru.po
--- photocollage-1.4.3/po/ru.po 1969-12-31 19:00:00.000000000 -0500
+++ photocollage-1.4.5/po/ru.po 2021-07-09 11:06:40.737365500 -0400
@@ -0,0 +1,105 @@
+# PhotoCollage translation file
+# Copyright (C) 2021 Andrey Novikov <cookin...@yandex.ru>
+# This file is distributed under the same license as the PhotoCollage
package.
+# Andrey Novikov <cookin...@yandex.ru>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PhotoCollage 1.4.3\n"
+"Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n";
+"POT-Creation-Date: 2021-07-02 10:29:47+0500\n"
+"PO-Revision-Date: 2021-07-02 10:29:47+0500\n"
+"Last-Translator: Andrey Novikov <cookin...@yandex.ru>\n"
+"Language-Team: Andrey Novikov <cookin...@yandex.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94
+msgid "All supported image formats"
+msgstr "Все поддерживаемые форматы изображений"
+
+#: photocollage/gtkgui.py:104
+#, python-format
+msgid "%s image"
+msgstr "%s изображение"
+
+#: photocollage/gtkgui.py:161
+msgid "PhotoCollage"
+msgstr "PhotoCollage"
+
+#: photocollage/gtkgui.py:189
+msgid "Add images..."
+msgstr "Добавить изображения..."
+
+#: photocollage/gtkgui.py:196
+msgid "Save poster..."
+msgstr "Сохранить плакат..."
+
+#: photocollage/gtkgui.py:221
+msgid "Regenerate"
+msgstr "Перегенерировать"
+
+#: photocollage/gtkgui.py:279
+#, python-format
+msgid ""
+"Изображение не удалось открыть:\n"
+"\"%(imgname)s\"."
+msgstr ""
+"Cette image n'a pas pu être ouverte :\n"
+"\"%(imgname)s\"."
+
+#: photocollage/gtkgui.py:285
+msgid "Choose images"
+msgstr "Выбрать изображения"
+
+#: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424
+msgid "An error occurred while rendering image:"
+msgstr "При отрисовке изображения произошла ошибка:"
+
+#: photocollage/gtkgui.py:398
+msgid "Save image"
+msgstr "Сохранить изображение"
+
+#: photocollage/gtkgui.py:622
+msgid "Settings"
+msgstr "Настройки"
+
+#: photocollage/gtkgui.py:634
+msgid "Output image size"
+msgstr "Размер выходного изображения"
+
+#: photocollage/gtkgui.py:649
+msgid "pixels"
+msgstr "пиксели"
+
+#: photocollage/gtkgui.py:673
+msgid "Apply a template:"
+msgstr "Примените шаблон:"
+
+#: photocollage/gtkgui.py:686
+msgid "Border"
+msgstr "Граница"
+
+#: photocollage/gtkgui.py:691
+msgid "Thickness:"
+msgstr "Толщина:"
+
+#: photocollage/gtkgui.py:701
+msgid "Color:"
+msgstr "Цвет:"
+
+#: photocollage/gtkgui.py:740
+msgid "Please wait"
+msgstr "Пожалуйста, подождите"
+
+#: photocollage/gtkgui.py:749
+msgid "Performing image computation..."
+msgstr "Выполнение вычисления изображений..."
+
+#: photocollage/gtkgui.py:764
+msgid "Error"
+msgstr "Ошибка"
diff -Nru photocollage-1.4.3/README.rst photocollage-1.4.5/README.rst
--- photocollage-1.4.3/README.rst       2016-05-17 15:51:10.000000000 -0400
+++ photocollage-1.4.5/README.rst       2021-07-09 11:08:13.921904800 -0400
@@ -37,29 +37,28 @@
 * save high-resolution image
 * works even with a large number of photos (> 100)
 * integrates into the GNOME environment
-* available in English, French, German, Czech and Italian
+* available in English, French, German, Czech, Italian, Bulgarian, Dutch,
Russian and Spanish
 
 Installation
 ------------
 
-* Fedora:
+* Fedora 19+:
 
   .. code:: bash
 
-   sudo yum install photocollage
+   sudo dnf install photocollage
 
-* Ubuntu:
+* Debian 9+ / Ubuntu 16.10+:
 
   .. code:: bash
 
-   sudo add-apt-repository ppa:dhor/myway && sudo apt-get update
    sudo apt-get install photocollage
 
 * Using pip, the Python package manager:
 
   .. code:: bash
 
-   sudo pip3 install photocollage  # you may need to use python3-pip instead
of pip3
+   sudo pip3 install photocollage
 
 Usage
 -----
@@ -75,12 +74,25 @@
 Hacking
 -------
 
-* If you need to install from source:
+* If you changed the source and want to test your modifications, run:
+
+  .. code:: bash
+
+   PYTHONPATH=. bin/photocollage
+
+  or:
+
+  .. code:: bash
+
+   python3 -c 'from photocollage import gtkgui; gtkgui.main()'
+
+
+* If you need to build a package from source and install it:
 
   .. code:: bash
 
    # Install dependencies
-   sudo yum install python3-pillow python3-gobject
+   sudo dnf install python3-pillow python3-gobject
    sudo apt-get install python3-pil python3-gi
    sudo pacman -S python-pillow python-gobject
 
@@ -93,4 +105,4 @@
   .. code:: bash
 
    flake8 .
-   nosetests-3.4
+   python3 -m unittest tests/test_*.py
diff -Nru photocollage-1.4.3/setup.cfg photocollage-1.4.5/setup.cfg
--- photocollage-1.4.3/setup.cfg        1969-12-31 19:00:00.000000000 -0500
+++ photocollage-1.4.5/setup.cfg        2017-11-11 05:04:39.763326600 -0500
@@ -0,0 +1,3 @@
+[flake8]
+import-order-style = pep8
+application-import-names = photocollage
diff -Nru photocollage-1.4.3/setup.py photocollage-1.4.5/setup.py
--- photocollage-1.4.3/setup.py 2016-05-17 15:51:10.000000000 -0400
+++ photocollage-1.4.5/setup.py 2020-09-24 08:20:02.076167300 -0400
@@ -1,5 +1,4 @@
 #!/usr/bin/env python
-# -*- coding: utf-8 -*-
 # Copyright (C) 2013 Adrien Vergé
 #
 # This program is free software; you can redistribute it and/or modify
@@ -48,12 +47,13 @@
             mo = os.path.join(dir, "%s.mo" % self.distribution.metadata.name)
 
             if distutils.dep_util.newer(po, mo):
-                distutils.log.info("Compile: %s -> %s" % (po, mo))
+                distutils.log.info("Compile: {} -> {}".format(po, mo))
                 self.spawn(["msgfmt", "-o", mo, po])
 
             targetpath = os.path.join("share", "locale", lang, "LC_MESSAGES")
             self.distribution.data_files.append((targetpath, (mo,)))
 
+
 distutils.command.build.build.sub_commands.append(("build_i18n", None))
 
 
@@ -83,11 +83,12 @@
         " :: GNU General Public License v2 or later (GPLv2+)",
         "Operating System :: POSIX",
         "Programming Language :: Python",
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.3",
-        "Programming Language :: Python :: 3.4",
+        "Programming Language :: Python :: 3.5",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3 :: Only",
         "Topic :: Multimedia :: Graphics",
     ],
 

Reply via email to