aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2016-07-29 18:15:03 +0200
committerIsmaël Bouya <ismael.bouya@normalesup.org>2016-07-29 18:44:42 +0200
commit6a3271735186a2b4d3c500f4f60c0c03a12bdd2f (patch)
treee5ceaf01ba400b1ef552fbeec92919826200cd30
parent7d6df771f603e9642047264f967525422ef09e99 (diff)
downloadMusicSampler-6a3271735186a2b4d3c500f4f60c0c03a12bdd2f.tar.gz
MusicSampler-6a3271735186a2b4d3c500f4f60c0c03a12bdd2f.tar.zst
MusicSampler-6a3271735186a2b4d3c500f4f60c0c03a12bdd2f.zip
Make music_sampler multilingual1.2.0
-rw-r--r--.gitignore2
-rw-r--r--MANIFEST.in1
-rw-r--r--documentation_fr.md1
-rw-r--r--music_sampler.spec3
-rw-r--r--music_sampler/action.py2
-rw-r--r--music_sampler/actions/interrupt_wait.py2
-rw-r--r--music_sampler/actions/pause.py4
-rw-r--r--music_sampler/actions/play.py18
-rw-r--r--music_sampler/actions/run_command.py6
-rw-r--r--music_sampler/actions/seek.py8
-rw-r--r--music_sampler/actions/stop.py13
-rw-r--r--music_sampler/actions/stop_all_actions.py2
-rw-r--r--music_sampler/actions/unpause.py4
-rw-r--r--music_sampler/actions/volume.py24
-rw-r--r--music_sampler/actions/wait.py19
-rw-r--r--music_sampler/app_blocks/actionlist.py2
-rw-r--r--music_sampler/helpers.py51
-rw-r--r--music_sampler/locales/fr/LC_MESSAGES/music_sampler.po424
-rw-r--r--music_sampler/music_sampler.kv4
19 files changed, 524 insertions, 66 deletions
diff --git a/.gitignore b/.gitignore
index 5e7aaa4..3c0a7c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
1*.pyc
2*.mo
1build/ 3build/
2dist/ 4dist/
3music_sampler/__pycache__/ 5music_sampler/__pycache__/
diff --git a/MANIFEST.in b/MANIFEST.in
index 5dab67a..0bf0aa5 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1 +1,2 @@
1include music_sampler/music_sampler.kv 1include music_sampler/music_sampler.kv
2recursive-include music_sampler/locales *
diff --git a/documentation_fr.md b/documentation_fr.md
index 2eba81d..529329c 100644
--- a/documentation_fr.md
+++ b/documentation_fr.md
@@ -79,6 +79,7 @@ Toutes les options au lancement sont facultatives ; la plupart du temps lancer l
79 * `-p MUSIC_PATH, --music-path MUSIC_PATH` : précise le chemin des musiques (par défaut, le dossier courant). 79 * `-p MUSIC_PATH, --music-path MUSIC_PATH` : précise le chemin des musiques (par défaut, le dossier courant).
80 * `-d, --debug` : Affiche les informations de déboggage (désactivé par défaut) 80 * `-d, --debug` : Affiche les informations de déboggage (désactivé par défaut)
81 * `-V, --version` : affiche la version courante et quitte (utilisable uniquement pour la version compilée). 81 * `-V, --version` : affiche la version courante et quitte (utilisable uniquement pour la version compilée).
82 * `-L, --language` : change la langue de l'application. Actuellement: fr, en (par défaut 'fr')
82 * `--no-focus-warning`: Ne pas afficher d'avertissement lorsque l'application perd le focus. 83 * `--no-focus-warning`: Ne pas afficher d'avertissement lorsque l'application perd le focus.
83 84
84Les options suivantes sont plutôt réservées à un usage avancé de music_sampler, ou en cas de problème avec la configuration standard : 85Les options suivantes sont plutôt réservées à un usage avancé de music_sampler, ou en cas de problème avec la configuration standard :
diff --git a/music_sampler.spec b/music_sampler.spec
index bd69562..5a81464 100644
--- a/music_sampler.spec
+++ b/music_sampler.spec
@@ -30,7 +30,8 @@ pyinstaller_file.close()
30 30
31data = [ 31data = [
32 ('music_sampler/music_sampler.kv', '.'), 32 ('music_sampler/music_sampler.kv', '.'),
33 ('.pyinstaller_commit', '.') 33 ('.pyinstaller_commit', '.'),
34 ('music_sampler/locales', 'locales')
34] 35]
35 36
36a = Analysis(['run.py'], 37a = Analysis(['run.py'],
diff --git a/music_sampler/action.py b/music_sampler/action.py
index ef56b7c..d269d0e 100644
--- a/music_sampler/action.py
+++ b/music_sampler/action.py
@@ -110,4 +110,4 @@ class Action:
110 return getattr(actions, self.action)\ 110 return getattr(actions, self.action)\
111 .description(self, **self.arguments) 111 .description(self, **self.arguments)
112 else: 112 else:
113 return "unknown action {}".format(self.action) 113 return _("unknown action {}").format(self.action)
diff --git a/music_sampler/actions/interrupt_wait.py b/music_sampler/actions/interrupt_wait.py
index 8f465f0..f85a3c4 100644
--- a/music_sampler/actions/interrupt_wait.py
+++ b/music_sampler/actions/interrupt_wait.py
@@ -2,4 +2,4 @@ def run(action, wait_id=None, **kwargs):
2 action.mapping.interrupt_wait(wait_id) 2 action.mapping.interrupt_wait(wait_id)
3 3
4def description(action, wait_id=None, **kwargs): 4def description(action, wait_id=None, **kwargs):
5 return "interrupt wait with id {}".format(wait_id) 5 return _("interrupt wait with id {}").format(wait_id)
diff --git a/music_sampler/actions/pause.py b/music_sampler/actions/pause.py
index bb27734..4575f32 100644
--- a/music_sampler/actions/pause.py
+++ b/music_sampler/actions/pause.py
@@ -5,6 +5,6 @@ def run(action, music=None, **kwargs):
5 5
6def description(action, music=None, **kwargs): 6def description(action, music=None, **kwargs):
7 if music is not None: 7 if music is not None:
8 return "pausing « {} »".format(music.name) 8 return _("pausing « {} »").format(music.name)
9 else: 9 else:
10 return "pausing all musics" 10 return _("pausing all musics")
diff --git a/music_sampler/actions/play.py b/music_sampler/actions/play.py
index fdba95b..f6057ad 100644
--- a/music_sampler/actions/play.py
+++ b/music_sampler/actions/play.py
@@ -19,26 +19,32 @@ def run(action, music=None, fade_in=0, start_at=0,
19 19
20def description(action, music=None, fade_in=0, start_at=0, 20def description(action, music=None, fade_in=0, start_at=0,
21 restart_if_running=False, volume=100, loop=0, **kwargs): 21 restart_if_running=False, volume=100, loop=0, **kwargs):
22 formats = []
22 message = "starting " 23 message = "starting "
23 if music is not None: 24 if music is not None:
24 message += "« {} »".format(music.name) 25 message += "« {} »"
26 formats.append(music.name)
25 else: 27 else:
26 message += "all musics" 28 message += "all musics"
27 29
28 if start_at != 0: 30 if start_at != 0:
29 message += " at {}s".format(start_at) 31 message += " at {}s"
32 formats.append(start_at)
30 33
31 if fade_in != 0: 34 if fade_in != 0:
32 message += " with {}s fade_in".format(fade_in) 35 message += " with {}s fade_in"
36 formats.append(fade_in)
33 37
34 message += " at volume {}%".format(volume) 38 message += " at volume {}%"
39 formats.append(volume)
35 40
36 if loop > 0: 41 if loop > 0:
37 message += " {} times".format(loop + 1) 42 message += " {} times"
43 formats.append(loop + 1)
38 elif loop < 0: 44 elif loop < 0:
39 message += " in loop" 45 message += " in loop"
40 46
41 if restart_if_running: 47 if restart_if_running:
42 message += " (restarting if already running)" 48 message += " (restarting if already running)"
43 49
44 return message 50 return _(message).format(*formats)
diff --git a/music_sampler/actions/run_command.py b/music_sampler/actions/run_command.py
index 1e80c1e..df23056 100644
--- a/music_sampler/actions/run_command.py
+++ b/music_sampler/actions/run_command.py
@@ -6,8 +6,10 @@ def run(action, command="", wait=False, **kwargs):
6 action.process.wait() 6 action.process.wait()
7 7
8def description(action, command="", wait=False, **kwargs): 8def description(action, command="", wait=False, **kwargs):
9 message = "running command {}".format(command) 9 formats = []
10 message = "running command {}"
11 formats.append(command)
10 if wait: 12 if wait:
11 message += " (waiting for its execution to finish)" 13 message += " (waiting for its execution to finish)"
12 14
13 return message 15 return _(message).format(*formats)
diff --git a/music_sampler/actions/seek.py b/music_sampler/actions/seek.py
index 467af7d..9f19798 100644
--- a/music_sampler/actions/seek.py
+++ b/music_sampler/actions/seek.py
@@ -5,15 +5,15 @@ def run(action, music=None, value=0, delta=False, **kwargs):
5def description(action, music=None, value=0, delta=False, **kwargs): 5def description(action, music=None, value=0, delta=False, **kwargs):
6 if delta: 6 if delta:
7 if music is not None: 7 if music is not None:
8 return "moving music « {} » by {:+d}s" \ 8 return _("moving music « {} » by {:+d}s") \
9 .format(music.name, value) 9 .format(music.name, value)
10 else: 10 else:
11 return "moving all musics by {:+d}s" \ 11 return _("moving all musics by {:+d}s") \
12 .format(value) 12 .format(value)
13 else: 13 else:
14 if music is not None: 14 if music is not None:
15 return "moving music « {} » to position {}s" \ 15 return _("moving music « {} » to position {}s") \
16 .format(music.name, value) 16 .format(music.name, value)
17 else: 17 else:
18 return "moving all musics to position {}s" \ 18 return _("moving all musics to position {}s") \
19 .format(value) 19 .format(value)
diff --git a/music_sampler/actions/stop.py b/music_sampler/actions/stop.py
index 88cc66d..769c312 100644
--- a/music_sampler/actions/stop.py
+++ b/music_sampler/actions/stop.py
@@ -19,22 +19,25 @@ def run(action, music=None, fade_out=0, wait=False,
19def description(action, music=None, fade_out=0, wait=False, 19def description(action, music=None, fade_out=0, wait=False,
20 set_wait_id=None, **kwargs): 20 set_wait_id=None, **kwargs):
21 21
22 formats = []
22 message = "stopping " 23 message = "stopping "
23 if music is not None: 24 if music is not None:
24 message += "music « {} »".format(music.name) 25 message += "music « {} »"
26 formats.append(music.name)
25 else: 27 else:
26 message += "all musics" 28 message += "all musics"
27 29
28 if fade_out > 0: 30 if fade_out > 0:
29 message += " with {}s fadeout".format(fade_out) 31 message += " with {}s fadeout"
32 formats.append(fade_out)
30 if wait: 33 if wait:
31 if set_wait_id is not None: 34 if set_wait_id is not None:
32 message += " (waiting the end of fadeout, with id {})"\ 35 message += " (waiting the end of fadeout, with id {})"
33 .format(set_wait_id) 36 formats.append(set_wait_id)
34 else: 37 else:
35 message += " (waiting the end of fadeout)" 38 message += " (waiting the end of fadeout)"
36 39
37 return message 40 return _(message).format(*formats)
38 41
39def interrupt(action, music=None, fade_out=0, wait=False, 42def interrupt(action, music=None, fade_out=0, wait=False,
40 set_wait_id=None, **kwargs): 43 set_wait_id=None, **kwargs):
diff --git a/music_sampler/actions/stop_all_actions.py b/music_sampler/actions/stop_all_actions.py
index 4ea875a..14a1a94 100644
--- a/music_sampler/actions/stop_all_actions.py
+++ b/music_sampler/actions/stop_all_actions.py
@@ -11,4 +11,4 @@ def description(action, other_only=False, **kwargs):
11 if other_only: 11 if other_only:
12 message += " except this key" 12 message += " except this key"
13 13
14 return message 14 return _(message)
diff --git a/music_sampler/actions/unpause.py b/music_sampler/actions/unpause.py
index 5fa88c3..6505ab8 100644
--- a/music_sampler/actions/unpause.py
+++ b/music_sampler/actions/unpause.py
@@ -5,6 +5,6 @@ def run(action, music=None, **kwargs):
5 5
6def description(action, music=None, **kwargs): 6def description(action, music=None, **kwargs):
7 if music is not None: 7 if music is not None:
8 return "unpausing « {} »".format(music.name) 8 return _("unpausing « {} »").format(music.name)
9 else: 9 else:
10 return "unpausing all musics" 10 return _("unpausing all musics")
diff --git a/music_sampler/actions/volume.py b/music_sampler/actions/volume.py
index 7dda3c1..e02cdfa 100644
--- a/music_sampler/actions/volume.py
+++ b/music_sampler/actions/volume.py
@@ -6,23 +6,27 @@ def run(action, music=None, value=100, fade=0, delta=False, **kwargs):
6 6
7def description(action, music=None, 7def description(action, music=None,
8 value=100, delta=False, fade=0, **kwargs): 8 value=100, delta=False, fade=0, **kwargs):
9 formats = []
9 message = "" 10 message = ""
10 if delta: 11 if delta:
11 if music is not None: 12 if music is not None:
12 message += "{:+d}% to volume of « {} »" \ 13 message += "{:+d}% to volume of « {} »"
13 .format(value, music.name) 14 formats.append(value)
15 formats.append(music.name)
14 else: 16 else:
15 message += "{:+d}% to volume" \ 17 message += "{:+d}% to volume"
16 .format(value) 18 formats.append(value)
17 else: 19 else:
18 if music is not None: 20 if music is not None:
19 message += "setting volume of « {} » to {}%" \ 21 message += "setting volume of « {} » to {}%"
20 .format(music.name, value) 22 formats.append(music.name)
23 formats.append(value)
21 else: 24 else:
22 message += "setting volume to {}%" \ 25 message += "setting volume to {}%"
23 .format(value) 26 formats.append(value)
24 27
25 if fade > 0: 28 if fade > 0:
26 message += " with {}s fade".format(fade) 29 message += " with {}s fade"
30 formats.append(fade)
27 31
28 return message 32 return _(message).format(*formats)
diff --git a/music_sampler/actions/wait.py b/music_sampler/actions/wait.py
index ea42408..e6d07f2 100644
--- a/music_sampler/actions/wait.py
+++ b/music_sampler/actions/wait.py
@@ -16,21 +16,24 @@ def run(action, duration=0, music=None, set_wait_id=None, **kwargs):
16 action.sleep_event.wait() 16 action.sleep_event.wait()
17 17
18def description(action, duration=0, music=None, set_wait_id=None, **kwargs): 18def description(action, duration=0, music=None, set_wait_id=None, **kwargs):
19 formats = []
19 message = "" 20 message = ""
20 if music is None: 21 if music is None:
21 message += "waiting {}s" \ 22 message += "waiting {}s"
22 .format(duration) 23 formats.append(duration)
23 elif duration == 0: 24 elif duration == 0:
24 message += "waiting the end of « {} »" \ 25 message += "waiting the end of « {} »"
25 .format(music.name) 26 formats.append(music.name)
26 else: 27 else:
27 message += "waiting the end of « {} » + {}s" \ 28 message += "waiting the end of « {} » + {}s"
28 .format(music.name, duration) 29 formats.append(music.name)
30 formats.append(duration)
29 31
30 if set_wait_id is not None: 32 if set_wait_id is not None:
31 message += " (setting id = {})".format(set_wait_id) 33 message += " (setting id = {})"
34 formats.append(set_wait_id)
32 35
33 return message 36 return _(message).format(*formats)
34 37
35def interrupt(action, duration=0, music=None, **kwargs): 38def interrupt(action, duration=0, music=None, **kwargs):
36 if action.sleep_event is not None: 39 if action.sleep_event is not None:
diff --git a/music_sampler/app_blocks/actionlist.py b/music_sampler/app_blocks/actionlist.py
index 51f4b82..8c4c5e9 100644
--- a/music_sampler/app_blocks/actionlist.py
+++ b/music_sampler/app_blocks/actionlist.py
@@ -15,7 +15,7 @@ class ActionList(RelativeLayout):
15 action_list = ListProperty([]) 15 action_list = ListProperty([])
16 16
17 def update_list(self, key, action_descriptions): 17 def update_list(self, key, action_descriptions):
18 self.action_title = "actions linked to key {}:".format(key.key_sym) 18 self.action_title = _("actions linked to key {}:").format(key.key_sym)
19 action_list = [] 19 action_list = []
20 20
21 for [action, status] in action_descriptions: 21 for [action, status] in action_descriptions:
diff --git a/music_sampler/helpers.py b/music_sampler/helpers.py
index 2249746..2199058 100644
--- a/music_sampler/helpers.py
+++ b/music_sampler/helpers.py
@@ -5,6 +5,8 @@ import os
5import math 5import math
6import sounddevice as sd 6import sounddevice as sd
7import logging 7import logging
8import gettext
9gettext.install('music_sampler')
8Logger = logging.getLogger("kivy") 10Logger = logging.getLogger("kivy")
9 11
10from . import sysfont 12from . import sysfont
@@ -66,71 +68,76 @@ def parse_args():
66 sys.argv.extend(["-c", "kivy:log_name:/tmp/music_sampler_%_.txt"]) 68 sys.argv.extend(["-c", "kivy:log_name:/tmp/music_sampler_%_.txt"])
67 69
68 parser = argparse.ArgumentParser( 70 parser = argparse.ArgumentParser(
69 description="A Music Sampler application.", 71 description=_("A Music Sampler application."),
70 formatter_class=argparse.ArgumentDefaultsHelpFormatter) 72 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
71 parser.add_argument("-c", "--config", 73 parser.add_argument("-c", "--config",
72 default="config.yml", 74 default="config.yml",
73 required=False, 75 required=False,
74 help="Config file to load") 76 help=_("Config file to load"))
75 parser.add_argument("-p", "--music-path", 77 parser.add_argument("-p", "--music-path",
76 default=".", 78 default=".",
77 required=False, 79 required=False,
78 help="Folder in which to find the music files") 80 help=_("Folder in which to find the music files"))
79 parser.add_argument("-d", "--debug", 81 parser.add_argument("-d", "--debug",
80 nargs=0, 82 nargs=0,
81 action=DebugModeAction, 83 action=DebugModeAction,
82 help="Print messages in console") 84 help=_("Print messages in console"))
83 parser.add_argument("-m", "--builtin-mixing", 85 parser.add_argument("-m", "--builtin-mixing",
84 action="store_true", 86 action="store_true",
85 help="Make the mixing of sounds manually\ 87 help=_("Make the mixing of sounds manually\
86 (do it if the system cannot handle it correctly)") 88 (do it if the system cannot handle it correctly)"))
87 parser.add_argument("-l", "--latency", 89 parser.add_argument("-l", "--latency",
88 default="high", 90 default="high",
89 required=False, 91 required=False,
90 help="Latency: low, high or number of seconds") 92 help=_("Latency: low, high or number of seconds"))
91 parser.add_argument("-b", "--blocksize", 93 parser.add_argument("-b", "--blocksize",
92 default=0, 94 default=0,
93 type=int, 95 type=int,
94 required=False, 96 required=False,
95 help="Blocksize: If not 0, the number of frames to take\ 97 help=_("Blocksize: If not 0, the number of frames to take\
96 at each step for the mixer") 98 at each step for the mixer"))
97 parser.add_argument("-f", "--frame-rate", 99 parser.add_argument("-f", "--frame-rate",
98 default=44100, 100 default=44100,
99 type=int, 101 type=int,
100 required=False, 102 required=False,
101 help="Frame rate to play the musics") 103 help=_("Frame rate to play the musics"))
102 parser.add_argument("-x", "--channels", 104 parser.add_argument("-x", "--channels",
103 default=2, 105 default=2,
104 type=int, 106 type=int,
105 required=False, 107 required=False,
106 help="Number of channels to use") 108 help=_("Number of channels to use"))
107 parser.add_argument("-s", "--sample-width", 109 parser.add_argument("-s", "--sample-width",
108 default=2, 110 default=2,
109 type=int, 111 type=int,
110 required=False, 112 required=False,
111 help="Sample width (number of bytes for each frame)") 113 help=_("Sample width (number of bytes for each frame)"))
112 parser.add_argument("-V", "--version", 114 parser.add_argument("-V", "--version",
113 action="version", 115 action="version",
114 help="Displays the current version and exits. Only use\ 116 help=_("Displays the current version and exits. Only use\
115 in bundled package", 117 in bundled package"),
116 version=show_version()) 118 version=show_version())
117 parser.add_argument("--device", 119 parser.add_argument("--device",
118 action=SelectDeviceAction, 120 action=SelectDeviceAction,
119 help="Select this sound device" 121 help=_("Select this sound device")
120 ) 122 )
121 parser.add_argument("--list-devices", 123 parser.add_argument("--list-devices",
122 nargs=0, 124 nargs=0,
123 action=ListDevicesAction, 125 action=ListDevicesAction,
124 help="List available sound devices" 126 help=_("List available sound devices")
125 ) 127 )
126 parser.add_argument("--no-focus-warning", 128 parser.add_argument("--no-focus-warning",
127 action='store_true', 129 action='store_true',
128 help="Don't show warning when focus is lost" 130 help=_("Don't show warning when focus is lost")
131 )
132 parser.add_argument("-L", "--language",
133 required=False,
134 default="fr",
135 help=_("Select another language")
129 ) 136 )
130 parser.add_argument('--', 137 parser.add_argument('--',
131 dest="args", 138 dest="args",
132 help="Kivy arguments. All arguments after this are interpreted\ 139 help=_("Kivy arguments. All arguments after this are interpreted\
133 by Kivy. Pass \"-- --help\" to get Kivy's usage.") 140 by Kivy. Pass \"-- --help\" to get Kivy's usage."))
134 141
135 args = parser.parse_args(argv) 142 args = parser.parse_args(argv)
136 143
@@ -143,6 +150,10 @@ def parse_args():
143 Config.sample_width = args.sample_width 150 Config.sample_width = args.sample_width
144 Config.builtin_mixing = args.builtin_mixing 151 Config.builtin_mixing = args.builtin_mixing
145 Config.no_focus_warning = args.no_focus_warning 152 Config.no_focus_warning = args.no_focus_warning
153 if args.language != 'en':
154 gettext.translation("music_sampler",
155 localedir=path() + '/locales',
156 languages=[args.language]).install()
146 if args.music_path.endswith("/"): 157 if args.music_path.endswith("/"):
147 Config.music_path = args.music_path 158 Config.music_path = args.music_path
148 else: 159 else:
@@ -167,7 +178,7 @@ def show_version():
167 with open(path() + ".pyinstaller_commit", "r") as f: 178 with open(path() + ".pyinstaller_commit", "r") as f:
168 return f.read() 179 return f.read()
169 else: 180 else:
170 return "option '-v' can only be used in bundled package" 181 return _("option '-V' can only be used in bundled package")
171 182
172def duration_to_min_sec(duration): 183def duration_to_min_sec(duration):
173 minutes = int(duration / 60) 184 minutes = int(duration / 60)
diff --git a/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po b/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po
new file mode 100644
index 0000000..e711737
--- /dev/null
+++ b/music_sampler/locales/fr/LC_MESSAGES/music_sampler.po
@@ -0,0 +1,424 @@
1# This file is distributed under the same license as the music_sampler package.
2#
3msgid ""
4msgstr ""
5"Language: fr\n"
6"MIME-Version: 1.0\n"
7"Content-Type: text/plain; charset=UTF-8\n"
8"Content-Transfer-Encoding: 8bit\n"
9
10#: music_sampler/action.py:113
11msgid "unknown action {}"
12msgstr "Action « {} » inconnue"
13
14#: music_sampler/helpers.py:69
15msgid "A Music Sampler application."
16msgstr "Un lecteur de musique préprogrammable"
17
18#: music_sampler/helpers.py:74
19msgid "Config file to load"
20msgstr "Fichier de configuration à charger"
21
22#: music_sampler/helpers.py:78
23msgid "Folder in which to find the music files"
24msgstr "Dossier dans lequel trouver les fichiers de musiques"
25
26#: music_sampler/helpers.py:82
27msgid "Print messages in console"
28msgstr "Afficher les messages de debug"
29
30#: music_sampler/helpers.py:85
31msgid ""
32"Make the mixing of sounds manually (do it if the system "
33"cannot handle it correctly)"
34msgstr "Faire le mixage en interne (activer si le système n'y parvient pas)"
35
36#: music_sampler/helpers.py:90
37msgid "Latency: low, high or number of seconds"
38msgstr "Latence: low, high ou un nombre de secondes."
39
40#: music_sampler/helpers.py:95
41msgid ""
42"Blocksize: If not 0, the number of frames to take at each "
43"step for the mixer"
44msgstr "Taille de block: si non nul, indique le nombre de frames à prendre à chaque étape de mixage"
45
46#: music_sampler/helpers.py:101
47msgid "Frame rate to play the musics"
48msgstr "Fréquence d'échantillonnage pour jouer les musiques"
49
50#: music_sampler/helpers.py:106
51msgid "Number of channels to use"
52msgstr "Nombre de canaux par musique"
53
54#: music_sampler/helpers.py:111
55msgid "Sample width (number of bytes for each frame)"
56msgstr "Largeur d'échantillonnage (nombre d'octets pour chaque frame)"
57
58#: music_sampler/helpers.py:114
59msgid ""
60"Displays the current version and exits. Only use in "
61"bundled package"
62msgstr "Affiche la version courante et quitte (utilisable uniuqement pour la version compilée)"
63
64#: music_sampler/helpers.py:119
65msgid "Select this sound device"
66msgstr "Sélectionne le périphérique de son"
67
68#: music_sampler/helpers.py:124
69msgid "List available sound devices"
70msgstr "Affiche la liste des périphériques de son disponibles"
71
72#: music_sampler/helpers.py:128
73msgid "Don't show warning when focus is lost"
74msgstr "Ne pas afficher d'avertissement lorsque l'application perd le focus."
75
76#: music_sampler/helpers.py:130
77msgid "Select another language"
78msgstr "Choix d'une autre langue"
79
80#: music_sampler/helpers.py:132
81msgid ""
82"Kivy arguments. All arguments after this are interpreted "
83"by Kivy. Pass \"-- --help\" to get Kivy's usage."
84msgstr "Arguments à passer à la librairie Kivy"
85
86#: music_sampler/helpers.py:170
87msgid "option '-v' can only be used in bundled package"
88msgstr "L'argument '-V' ne peut être utilisé que dans la version compilée"
89
90#: music_sampler/actions/interrupt_wait.py:5
91msgid "interrupt wait with id {}"
92msgstr "Interrompre l'attente d'identifiant {}"
93
94#: music_sampler/actions/pause.py:8
95msgid "pausing « {} »"
96msgstr "mise en pause de « {} »"
97
98#: music_sampler/actions/pause.py:10
99msgid "pausing all musics"
100msgstr "mise en pause des musiques"
101
102#: music_sampler/actions/play.py:50
103msgid "starting « {} » at volume {}%"
104msgstr "lance « {} » au volume {}%"
105
106#: music_sampler/actions/play.py:50
107msgid "starting all musics at volume {}%"
108msgstr "lance toutes les musiques au volume {}%"
109
110#: music_sampler/actions/play.py:50
111msgid "starting « {} » at {}s at volume {}%"
112msgstr "lance « {} » à {}s au volume {}%"
113
114#: music_sampler/actions/play.py:50
115msgid "starting all musics at {}s at volume {}%"
116msgstr "lance toutes les musiques à {}s au volume {}%"
117
118#: music_sampler/actions/play.py:50
119msgid "starting « {} » with {}s fade_in at volume {}%"
120msgstr "lance « {} » avec un fondu de {}s au volume {}%"
121
122#: music_sampler/actions/play.py:50
123msgid "starting all musics with {}s fade_in at volume {}%"
124msgstr "lance toutes les musiques avec un fondu de {}s au volume {}%"
125
126#: music_sampler/actions/play.py:50
127msgid "starting « {} » at {}s with {}s fade_in at volume {}%"
128msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}%"
129
130#: music_sampler/actions/play.py:50
131msgid "starting all musics at {}s with {}s fade_in at volume {}%"
132msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}%"
133
134#: music_sampler/actions/play.py:50
135msgid "starting « {} » at volume {}% {} times"
136msgstr "lance « {} » au volume {}% {} fois"
137
138#: music_sampler/actions/play.py:50
139msgid "starting all musics at volume {}% {} times"
140msgstr "lance toutes les musiques au volume {}% {} fois"
141
142#: music_sampler/actions/play.py:50
143msgid "starting « {} » at {}s at volume {}% {} times"
144msgstr "lance « {} » à {}s au volume {}% {} fois"
145
146#: music_sampler/actions/play.py:50
147msgid "starting all musics at {}s at volume {}% {} times"
148msgstr "lance toutes les musiques à {}s au volume {}% {} fois"
149
150#: music_sampler/actions/play.py:50
151msgid "starting « {} » with {}s fade_in at volume {}% {} times"
152msgstr "lance « {} » avec un fondu de {}s au volume {}% {} fois"
153
154#: music_sampler/actions/play.py:50
155msgid "starting all musics with {}s fade_in at volume {}% {} times"
156msgstr "lance toutes les musiques avec un fondu de {}s au volume {}% {} fois"
157
158#: music_sampler/actions/play.py:50
159msgid "starting « {} » at {}s with {}s fade_in at volume {}% {} times"
160msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% {} fois"
161
162#: music_sampler/actions/play.py:50
163msgid "starting all musics at {}s with {}s fade_in at volume {}% {} times"
164msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% {} fois"
165
166#: music_sampler/actions/play.py:50
167msgid "starting « {} » at volume {}% in loop"
168msgstr "lance « {} » au volume {}% en boucle"
169
170#: music_sampler/actions/play.py:50
171msgid "starting all musics at volume {}% in loop"
172msgstr "lance toutes les musiques au volume {}% en boucle"
173
174#: music_sampler/actions/play.py:50
175msgid "starting « {} » at {}s at volume {}% in loop"
176msgstr "lance « {} » à {}s au volume {}% en boucle"
177
178#: music_sampler/actions/play.py:50
179msgid "starting all musics at {}s at volume {}% in loop"
180msgstr "lance toutes les musiques à {}s au volume {}% en boucle"
181
182#: music_sampler/actions/play.py:50
183msgid "starting « {} » with {}s fade_in at volume {}% in loop"
184msgstr "lance « {} » avec un fondu de {}s au volume {}% en boucle"
185
186#: music_sampler/actions/play.py:50
187msgid "starting all musics with {}s fade_in at volume {}% in loop"
188msgstr "lance toutes les musiques avec un fondu de {}s au volume {}% en boucle"
189
190#: music_sampler/actions/play.py:50
191msgid "starting « {} » at {}s with {}s fade_in at volume {}% in loop"
192msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% en boucle"
193
194#: music_sampler/actions/play.py:50
195msgid "starting all musics at {}s with {}s fade_in at volume {}% in loop"
196msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% en boucle"
197
198#: music_sampler/actions/play.py:50
199msgid "starting « {} » at volume {}% (restarting if already running)"
200msgstr "lance « {} » au volume {}% (redémarre si déjà lancée)"
201
202#: music_sampler/actions/play.py:50
203msgid "starting all musics at volume {}% (restarting if already running)"
204msgstr "lance toutes les musiques au volume {}% (redémarre si déjà lancée)"
205
206#: music_sampler/actions/play.py:50
207msgid "starting « {} » at {}s at volume {}% (restarting if already running)"
208msgstr "lance « {} » à {}s au volume {}% (redémarre si déjà lancée)"
209
210#: music_sampler/actions/play.py:50
211msgid "starting all musics at {}s at volume {}% (restarting if already running)"
212msgstr "lance toutes les musiques à {}s au volume {}% (redémarre si déjà lancée)"
213
214#: music_sampler/actions/play.py:50
215msgid "starting « {} » with {}s fade_in at volume {}% (restarting if already running)"
216msgstr "lance « {} » avec un fondu de {}s au volume {}% (redémarre si déjà lancée)"
217
218#: music_sampler/actions/play.py:50
219msgid "starting all musics with {}s fade_in at volume {}% (restarting if already running)"
220msgstr "lance toutes les musiques avec un fondu de {}s au volume {}% (redémarre si déjà lancée)"
221
222#: music_sampler/actions/play.py:50
223msgid "starting « {} » at {}s with {}s fade_in at volume {}% (restarting if already running)"
224msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% (redémarre si déjà lancée)"
225
226#: music_sampler/actions/play.py:50
227msgid "starting all musics at {}s with {}s fade_in at volume {}% (restarting if already running)"
228msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% (redémarre si déjà lancée)"
229
230#: music_sampler/actions/play.py:50
231msgid "starting « {} » at volume {}% {} times (restarting if already running)"
232msgstr "lance « {} » au volume {}% {} fois (redémarre si déjà lancée)"
233
234#: music_sampler/actions/play.py:50
235msgid "starting all musics at volume {}% {} times (restarting if already running)"
236msgstr "lance toutes les musiques au volume {}% {} fois (redémarre si déjà lancée)"
237
238#: music_sampler/actions/play.py:50
239msgid "starting « {} » at {}s at volume {}% {} times (restarting if already running)"
240msgstr "lance « {} » à {}s au volume {}% {} fois (redémarre si déjà lancée)"
241
242#: music_sampler/actions/play.py:50
243msgid "starting all musics at {}s at volume {}% {} times (restarting if already running)"
244msgstr "lance toutes les musiques à {}s au volume {}% {} fois (redémarre si déjà lancée)"
245
246#: music_sampler/actions/play.py:50
247msgid "starting « {} » with {}s fade_in at volume {}% {} times (restarting if already running)"
248msgstr "lance « {} » avec un fondu de {}s au volume {}% {} fois (redémarre si déjà lancée)"
249
250#: music_sampler/actions/play.py:50
251msgid "starting all musics with {}s fade_in at volume {}% {} times (restarting if already running)"
252msgstr "lance toutes les musiques avec un fondu de {}s au volume {}% {} fois (redémarre si déjà lancée)"
253
254#: music_sampler/actions/play.py:50
255msgid "starting « {} » at {}s with {}s fade_in at volume {}% {} times (restarting if already running)"
256msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% {} fois (redémarre si déjà lancée)"
257
258#: music_sampler/actions/play.py:50
259msgid "starting all musics at {}s with {}s fade_in at volume {}% {} times (restarting if already running)"
260msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% {} fois (redémarre si déjà lancée)"
261
262#: music_sampler/actions/play.py:50
263msgid "starting « {} » at volume {}% in loop (restarting if already running)"
264msgstr "lance « {} » au volume {}% en boucle (redémarre si déjà lancée)"
265
266#: music_sampler/actions/play.py:50
267msgid "starting all musics at volume {}% in loop (restarting if already running)"
268msgstr "lance toutes les musiques au volume {}% en boucle (redémarre si déjà lancée)"
269
270#: music_sampler/actions/play.py:50
271msgid "starting « {} » at {}s at volume {}% in loop (restarting if already running)"
272msgstr "lance « {} » à {}s au volume {}% en boucle (redémarre si déjà lancée)"
273
274#: music_sampler/actions/play.py:50
275msgid "starting all musics at {}s at volume {}% in loop (restarting if already running)"
276msgstr "lance toutes les musiques à {}s au volume {}% en boucle (redémarre si déjà lancée)"
277
278#: music_sampler/actions/play.py:50
279msgid "starting « {} » with {}s fade_in at volume {}% in loop (restarting if already running)"
280msgstr "lance « {} » avec un fondu de {}s au volume {}% en boucle (redémarre si déjà lancée)"
281
282#: music_sampler/actions/play.py:50
283msgid "starting all musics with {}s fade_in at volume {}% in loop (restarting if already running)"
284msgstr "lance toutes les musiques avec un fondu de {}s au volume {}% en boucle (redémarre si déjà lancée)"
285
286#: music_sampler/actions/play.py:50
287msgid "starting « {} » at {}s with {}s fade_in at volume {}% in loop (restarting if already running)"
288msgstr "lance « {} » à {}s avec un fondu de {}s au volume {}% en boucle (redémarre si déjà lancée)"
289
290#: music_sampler/actions/play.py:50
291msgid "starting all musics at {}s with {}s fade_in at volume {}% in loop (restarting if already running)"
292msgstr "lance toutes les musiques à {}s avec un fondu de {}s au volume {}% en boucle (redémarre si déjà lancée)"
293
294#: music_sampler/actions/run_command.py:15
295msgid "running command {}"
296msgstr "lance la commande {}"
297
298#: music_sampler/actions/run_command.py:15
299msgid "running command {} (waiting for its execution to finish)"
300msgstr "lance la commande {} (attend la fin de son exécution)"
301
302#: music_sampler/actions/seek.py:8
303msgid "moving music « {} » by {:+d}s"
304msgstr "avance la musique « {} » de {:+d}s"
305
306#: music_sampler/actions/seek.py:11
307msgid "moving all musics by {:+d}s"
308msgstr "avance les musiques de {:+d}s"
309
310#: music_sampler/actions/seek.py:15
311msgid "moving music « {} » to position {}s"
312msgstr "avance la musique « {} » en position {}s"
313
314#: music_sampler/actions/seek.py:18
315msgid "moving all musics to position {}s"
316msgstr "avance les musiques en position {}s"
317
318#: music_sampler/actions/stop.py:40
319msgid "stopping music « {} »"
320msgstr "arrête la musique « {} »"
321
322#: music_sampler/actions/stop.py:40
323msgid "stopping all musics"
324msgstr "arrête toutes les musiques"
325
326#: music_sampler/actions/stop.py:40
327msgid "stopping music « {} » with {}s fadeout"
328msgstr "arrête la musique « {} » avec un fadeout de {}s"
329
330#: music_sampler/actions/stop.py:40
331msgid "stopping all musics with {}s fadeout"
332msgstr "arrête toutes les musiques avec un fadeout de {}s"
333
334#: music_sampler/actions/stop.py:40
335msgid "stopping music « {} » with {}s fadeout (waiting the end of fadeout, with id {})"
336msgstr "arrête la musique « {} » avec un fadeout de {}s (attend la fin du fadeout, avec l'identifiant {})"
337
338#: music_sampler/actions/stop.py:40
339msgid "stopping all musics with {}s fadeout (waiting the end of fadeout, with id {})"
340msgstr "arrête toutes les musiques avec un fadeout de {}s (attend la fin du fadeout, avec l'identifiant {})"
341
342#: music_sampler/actions/stop.py:40
343msgid "stopping music « {} » with {}s fadeout (waiting the end of fadeout)"
344msgstr "arrête la musique « {} » avec un fadeout de {}s (attend la fin du fadeout)"
345
346#: music_sampler/actions/stop.py:40
347msgid "stopping all musics with {}s fadeout (waiting the end of fadeout)"
348msgstr "arrête toutes les musiques avec un fadeout de {}s (attend la fin du fadeout)"
349
350#: music_sampler/actions/unpause.py:8
351msgid "unpausing « {} »"
352msgstr "reprend « {} »"
353
354#: music_sampler/actions/unpause.py:10
355msgid "unpausing all musics"
356msgstr "reprend toutes les musiques"
357
358#: music_sampler/actions/volume.py:32
359msgid "{:+d}% to volume of « {} »"
360msgstr "{:+d}% sur le volume de « {} »"
361
362#: music_sampler/actions/volume.py:32
363msgid "{:+d}% to volume"
364msgstr "{:+d}% sur le volume global"
365
366#: music_sampler/actions/volume.py:32
367msgid "{:+d}% to volume of « {} » with {}s fade"
368msgstr "{:+d}% sur le volume de « {} » avec {}s de fade"
369
370#: music_sampler/actions/volume.py:32
371msgid "{:+d}% to volume with {}s fade"
372msgstr "{:+d}% sur le volume global avec {}s de fade"
373
374#: music_sampler/actions/volume.py:32
375msgid "setting volume of « {} » to {}%"
376msgstr "changement du volume de « {} » à {}%"
377
378#: music_sampler/actions/volume.py:32
379msgid "setting volume to {}%"
380msgstr "changement du volume global à {}%"
381
382#: music_sampler/actions/volume.py:32
383msgid "setting volume of « {} » to {}% with {}s fade"
384msgstr "changement du volume de « {} » à {}% avec {}s de fade"
385
386#: music_sampler/actions/volume.py:32
387msgid "setting volume to {}% with {}s fade"
388msgstr "changement du volume global à {}% avec {}s de fade"
389
390#: music_sampler/actions/wait.py:36
391msgid "waiting {}s"
392msgstr "attend {}s"
393
394#: music_sampler/actions/wait.py:36
395msgid "waiting the end of « {} »"
396msgstr "attend la fin de « {} »"
397
398#: music_sampler/actions/wait.py:36
399msgid "waiting the end of « {} » + {}s"
400msgstr "attend la fin de « {} » + {}s"
401
402#: music_sampler/actions/wait.py:36
403msgid "waiting {}s (setting id = {})"
404msgstr "attend {}s (définit l'identifiant {})"
405
406#: music_sampler/actions/wait.py:36
407msgid "waiting the end of « {} » (setting id = {})"
408msgstr "attend la fin de « {} » (définit l'identifiant {})"
409
410#: music_sampler/actions/wait.py:36
411msgid "waiting the end of « {} » + {}s (setting id = {})"
412msgstr "attend la fin de « {} » + {}s (définit l'identifiant {})"
413
414#: music_sampler/app_blocks/actionlist.py:18
415msgid "actions linked to key {}:"
416msgstr "actions liées à la touche {} :"
417
418#: music_sampler/music_sampler.kv:93
419msgid "Focus lost!"
420msgstr "Focus perdu !"
421
422#: music_sampler/music_sampler.kv:369
423msgid "volume: {}%"
424msgstr "volume : {}%"
diff --git a/music_sampler/music_sampler.kv b/music_sampler/music_sampler.kv
index ae5dbd7..0432e14 100644
--- a/music_sampler/music_sampler.kv
+++ b/music_sampler/music_sampler.kv
@@ -90,7 +90,7 @@
90 font_name: "Ubuntu" 90 font_name: "Ubuntu"
91 font_size: self.parent and 2 * self.parent.key_size or 42 91 font_size: self.parent and 2 * self.parent.key_size or 42
92 text_size: self.size 92 text_size: self.size
93 text: "Focus lost!" 93 text: _("Focus lost!")
94 94
95<Screen>: 95<Screen>:
96 canvas: 96 canvas:
@@ -366,7 +366,7 @@
366 font_name: "Ubuntu" 366 font_name: "Ubuntu"
367 font_size: self.parent.font_size or 10 367 font_size: self.parent.font_size or 10
368 color: 0, 0, 0, 1 368 color: 0, 0, 0, 1
369 text: "volume: {}%".format(self.parent.master_volume) 369 text: _("volume: {}%").format(self.parent.master_volume)
370 valign: "top" 370 valign: "top"
371 size_hint: None, None 371 size_hint: None, None
372 size: self.texture_size[0], self.texture_size[1] 372 size: self.texture_size[0], self.texture_size[1]