InDefero

Sign in or create your account | Project List | Help

InDefero Commit Details

Date:2008-08-07 15:35:03 (5 months 4 hours ago)
Author:Loïc d'Anterroches
Commit:7383e18dff19e7e6a1e56d55cdfbfa109e91bfb3
Message:Fixed issue 4, with fine control over the tabs access.

For each tab, at the exception of the project home and the administration area, it possible to control the access rights if the user is anonymous, signed in, member or owner.
Files: src/IDF/Form/TabsConf.php (1 diff)
src/IDF/Middleware.php (3 diffs)
src/IDF/Precondition.php (1 diff)
src/IDF/Template/IssueComment.php (1 diff)
src/IDF/Views/Download.php (5 diffs)
src/IDF/Views/Issue.php (6 diffs)
src/IDF/Views/Project.php (2 diffs)
src/IDF/Views/Source.php (5 diffs)
src/IDF/conf/idf.php-dist (1 diff)
src/IDF/conf/views.php (1 diff)
src/IDF/locale/fr/idf.po (18 diffs)
src/IDF/locale/idf.pot (8 diffs)
src/IDF/templates/admin/base.html (1 diff)
src/IDF/templates/admin/tabs.html (1 diff)
src/IDF/templates/base.html (1 diff)
src/IDF/templates/issues/view.html (1 diff)
src/IDF/templates/js-hotkeys.html (1 diff)
src/IDF/templates/project-home.html (1 diff)
src/IDF/templates/source/changelog.html (1 diff)
src/IDF/templates/source/commit.html (1 diff)

Change Details

src/IDF/Form/TabsConf.php
1<?php
2/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3/*
4# ***** BEGIN LICENSE BLOCK *****
5# This file is part of InDefero, an open source project management application.
6# Copyright (C) 2008 Céondo Ltd and contributors.
7#
8# InDefero is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# InDefero is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21#
22# ***** END LICENSE BLOCK ***** */
23
24
25/**
26 * Configuration of the tabs access.
27 */
28class IDF_Form_TabsConf extends Pluf_Form
29{
30    public $conf = null;
31    public function initFields($extra=array())
32    {
33        $this->conf = $extra['conf'];
34        $ak = array('downloads_access_rights' => __('Downloads'),
35                    'source_access_rights' => __('Source'),
36                    'issues_access_rights' => __('Issues'),);
37        foreach ($ak as $key=>$label) {
38            $this->fields[$key] = new Pluf_Form_Field_Varchar(
39                                      array('required' => true,
40                                            'label' => $label,
41                                            'initial' => $this->conf->getVal($key, 'all'),
42                                            'widget_attrs' => array('choices' =>
43                                          array(
44                                                __('Open to all') => 'all',
45                                                __('Signed in users') => 'login',
46                                                __('Project members') => 'members',
47                                                __('Project owners') => 'owners',
48                                                __('Closed') => 'none',
49                                                )
50                                                                    ),
51                                            'widget' => 'Pluf_Form_Widget_SelectInput',
52                                            ));
53        }
54    }
55}
56
57
src/IDF/Middleware.php
2424/**
2525 * Project middleware.
2626 *
27 * It must be after the session middleware.
2728 */
2829class IDF_Middleware
2930{
...... 
4950            } catch (Pluf_HTTP_Error404 $e) {
5051                return new Pluf_HTTP_Response_NotFound(sprintf(__('The page <em>%s</em> was not found on the server.'), htmlspecialchars($request->query)));
5152            }
53            $request->conf = new IDF_Conf();
54            $request->conf->setProject($request->project);
55            $ak = array('downloads_access_rights' => 'hasDownloadsAccess',
56                        'source_access_rights' => 'hasSourceAccess',
57                        'issues_access_rights' => 'hasIssuesAccess');
58            $request->rights = array();
59            foreach ($ak as $key=>$val) {
60                $request->rights[$val] = (true === IDF_Precondition::accessTabGeneric($request, $key));
61            }
5262        }
5363        return false;
5464    }
...... 
5868function IDF_Middleware_ContextPreProcessor($request)
5969{
6070    $c = array();
71    $c['request'] = $request;
6172    if (isset($request->project)) {
6273        $c['project'] = $request->project;
6374        $c['isOwner'] = $request->user->hasPerm('IDF.project-owner',
6475                                                $request->project);
6576        $c['isMember'] = $request->user->hasPerm('IDF.project-member',
6677                                                 $request->project);
78        $c = array_merge($c, $request->rights);
6779    }
6880    return $c;
6981}
src/IDF/Precondition.php
6161        }
6262        return new Pluf_HTTP_Response_Forbidden($request);
6363    }
64
65    /**
66     * Check if the user can access a given element.
67     *
68     * The rights are:
69     * - 'all' (default)
70     * - 'none'
71     * - 'login'
72     * - 'members'
73     * - 'owners'
74     *
75     * The order of the rights is such that a 'owner' is also a
76     * 'member' and of course a logged in person.
77     *
78     * @param Pluf_HTTP_Request
79     * @param string Control key
80     * @return mixed
81     */
82    static public function accessTabGeneric($request, $key)
83    {
84        switch ($request->conf->getVal($key, 'all')) {
85        case 'none':
86            return new Pluf_HTTP_Response_Forbidden($request);
87        case 'login':
88            return Pluf_Precondition::loginRequired($request);
89        case 'members':
90            return self::projectMemberOrOwner($request);
91        case 'owners':
92            return self::projectOwner($request);
93        case 'all':
94        default:
95            return true;
96        }
97    }
98
99    static public function accessSource($request)
100    {
101        return self::accessTabGeneric($request, 'source_access_rights');
102    }
103
104    static public function accessIssues($request)
105    {
106        return self::accessTabGeneric($request, 'issues_access_rights');
107    }
108
109    static public function accessDownloads($request)
110    {
111        return self::accessTabGeneric($request, 'downloads_access_rights');
112    }
64113}
src/IDF/Template/IssueComment.php
2929class IDF_Template_IssueComment extends Pluf_Template_Tag
3030{
3131    private $project = null;
32    private $request = null;
3233    private $git = null;
33    function start($text, $project)
34    function start($text, $request)
3435    {
35        $this->project = $project;
36        $this->project = $request->project;
37        $this->request = $request;
3638        $this->git = new IDF_Git($this->project->getGitRepository());
3739        $text = wordwrap($text, 69, "\n", true);
3840        $text = Pluf_esc($text);
3941        $text = ereg_replace('[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]',
4042                             '<a href="\\0" rel="nofollow">\\0</a>',
4143                             $text);
42        $text = preg_replace_callback('#(issues?|bugs?|tickets?)\s+(\d+)((\s+and|\s+or|,)\s+(\d+)){0,}#im',
43                                      array($this, 'callbackIssues'), $text);
44        $text = preg_replace_callback('#(commit\s+)([0-9a-f]{5,40})#im',
45                                      array($this, 'callbackCommit'), $text);
44        if ($request->rights['hasIssuesAccess']) {
45            $text = preg_replace_callback('#(issues?|bugs?|tickets?)\s+(\d+)((\s+and|\s+or|,)\s+(\d+)){0,}#im',
46                                          array($this, 'callbackIssues'), $text);
47        }
48        if ($request->rights['hasSourceAccess']) {
49            $text = preg_replace_callback('#(commit\s+)([0-9a-f]{5,40})#im',
50                                          array($this, 'callbackCommit'), $text);
51        }
4652        echo $text;
4753    }
src/IDF/Views/Download.php
3838    /**
3939     * List the files available for download.
4040     */
41    public $index_precond = array('IDF_Precondition::accessDownloads');
4142    public function index($request, $match)
4243    {
4344        $prj = $request->project;
...... 
7576    /**
7677     * View details of a file.
7778     */
79    public $view_precond = array('IDF_Precondition::accessDownloads');
7880    public function view($request, $match)
7981    {
8082        $prj = $request->project;
...... 
123125    /**
124126     * Download a file.
125127     */
128    public $download_precond = array('IDF_Precondition::accessDownloads');
126129    public function download($request, $match)
127130    {
128131        $prj = $request->project;
...... 
136139    /**
137140     * Submit a new file for download.
138141     */
139    public $submit_precond = array('IDF_Precondition::projectMemberOrOwner');
142    public $submit_precond = array('IDF_Precondition::accessDownloads',
143                                   'IDF_Precondition::projectMemberOrOwner');
140144    public function submit($request, $match)
141145    {
142146        $prj = $request->project;
...... 
197201    /**
198202     * View list of downloads with a given label.
199203     */
204    public $listLabel_precond = array('IDF_Precondition::accessDownloads');
200205    public function listLabel($request, $match)
201206    {
202207        $prj = $request->project;
src/IDF/Views/Issue.php
3434    /**
3535     * View list of issues for a given project.
3636     */
37    public $index_precond = array('IDF_Precondition::accessIssues');
3738    public function index($request, $match)
3839    {
3940        $prj = $request->project;
...... 
7778     *
7879     * Only open issues are shown.
7980     */
80    public $myIssues_precond = array('Pluf_Precondition::loginRequired');
81    public $myIssues_precond = array('IDF_Precondition::accessIssues',
82                                     'Pluf_Precondition::loginRequired');
8183    public function myIssues($request, $match)
8284    {
8385        $prj = $request->project;
...... 
124126                                               $request);
125127    }
126    public $create_precond = array('Pluf_Precondition::loginRequired');
128    public $create_precond = array('IDF_Precondition::accessIssues',
129                                   'Pluf_Precondition::loginRequired');
127130    public function create($request, $match)
128131    {
129132        $prj = $request->project;
...... 
157160                                               $request);
158161    }
162    public $view_precond = array('IDF_Precondition::accessIssues');
159163    public function view($request, $match)
160164    {
161165        $prj = $request->project;
...... 
204208    /**
205209     * View list of issues for a given project with a given status.
206210     */
211    public $listStatus_precond = array('IDF_Precondition::accessIssues');
207212    public function listStatus($request, $match)
208213    {
209214        $prj = $request->project;
...... 
246251    /**
247252     * View list of issues for a given project with a given label.
248253     */
254    public $listLabel_precond = array('IDF_Precondition::accessIssues');
249255    public function listLabel($request, $match)
250256    {
251257        $prj = $request->project;
src/IDF/Views/Project.php
3939        $prj = $request->project;
4040        $team = $prj->getMembershipData();
4141        $title = (string) $prj;
42        $tags = IDF_Views_Download::getDownloadTags($prj);
43        // the first tag is the featured, the last is the deprecated.
44        $downloads = $tags[0]->get_idf_upload_list();
42        $downloads = array();
43        if ($request->rights['hasDownloadsAccess']) {
44            $tags = IDF_Views_Download::getDownloadTags($prj);
45            // the first tag is the featured, the last is the deprecated.
46            $downloads = $tags[0]->get_idf_upload_list();
47        }
4548        return Pluf_Shortcuts_RenderToResponse('project-home.html',
4649                                               array(
4750                                                     'page_title' => $title,
...... 
201204                                                     ),
202205                                               $request);
203206    }
207
208    /**
209     * Administrate the access rights to the tabs.
210     */
211    public $adminTabs_precond = array('IDF_Precondition::projectOwner');
212    public function adminTabs($request, $match)
213    {
214        $prj = $request->project;
215        $title = sprintf(__('%s Tabs Access Rights'), (string) $prj);
216        $extra = array(
217                       'conf' => $request->conf,
218                       );
219        if ($request->method == 'POST') {
220            $form = new IDF_Form_TabsConf($request->POST, $extra);
221            if ($form->isValid()) {
222                foreach ($form->cleaned_data as $key=>$val) {
223                    $request->conf->setVal($key, $val);
224                }
225                $request->user->setMessage(__('The project tabs access rights have been saved.'));
226                $url = Pluf_HTTP_URL_urlForView('IDF_Views_Project::adminTabs',
227                                                array($prj->shortname));
228                return new Pluf_HTTP_Response_Redirect($url);
229            }
230        } else {
231            $params = array();
232            $keys = array('downloads_access_rights', 'source_access_rights',
233                          'issues_access_rights');
234            foreach ($keys as $key) {
235                $_val = $request->conf->getVal($key, false);
236                if ($_val !== false) {
237                    $params[$key] = $_val;
238                }
239            }
240            if (count($params) == 0) {
241                $params = null; //Nothing in the db, so new form.
242            }
243            $form = new IDF_Form_TabsConf($params, $extra);
244        }
245        return Pluf_Shortcuts_RenderToResponse('admin/tabs.html',
246                                               array(
247                                                     'page_title' => $title,
248                                                     'form' => $form,
249                                                     ),
250                                               $request);
251    }
204252}
src/IDF/Views/Source.php
3131 */
3232class IDF_Views_Source
3333{
34    public $changeLog_precond = array('IDF_Precondition::accessSource');
3435    public function changeLog($request, $match)
3536    {
3637        $title = sprintf(__('%s Git Change Log'), (string) $request->project);
...... 
4950                                               $request);
5051    }
52    public $treeBase_precond = array('IDF_Precondition::accessSource');
5153    public function treeBase($request, $match)
5254    {
5355        $title = sprintf(__('%s Git Source Tree'), (string) $request->project);
...... 
7880                                               $request);
7981    }
82    public $tree_precond = array('IDF_Precondition::accessSource');
8083    public function tree($request, $match)
8184    {
8285        $title = sprintf(__('%s Git Source Tree'), (string) $request->project);
...... 
149152        return '<span class="breadcrumb">'.implode('<span class="sep">'.$sep.'</span>', $out).'</span>';
150153    }
154    public $commit_precond = array('IDF_Precondition::accessSource');
151155    public function commit($request, $match)
152156    {
153157        $git = new IDF_Git($request->project->getGitRepository());
...... 
182186     * Get a zip archive of the current commit.
183187     *
184188     */
189    public $download_precond = array('IDF_Precondition::accessSource');
185190    public function download($request, $match)
186191    {
187192        $commit = trim($match[2]);
src/IDF/conf/idf.php-dist
103103$cfg['installed_apps'] = array('Pluf', 'IDF');
104104$cfg['pluf_use_rowpermission'] = true;
105105$cfg['middleware_classes'] = array(
106         'IDF_Middleware',
107106         'Pluf_Middleware_Session',
107         'IDF_Middleware',
108108         'Pluf_Middleware_Translation',
109109         );
110110$cfg['template_context_processors'] = array('IDF_Middleware_ContextPreProcessor');
src/IDF/conf/views.php
206206               'model' => 'IDF_Views_Project',
207207               'method' => 'adminMembers');
208$ctl[] = array('regex' => '#^/p/(\w+)/admin/tabs/$#',
209               'base' => $base,
210               'priority' => 4,
211               'model' => 'IDF_Views_Project',
212               'method' => 'adminTabs');
213
208214return $ctl;
src/IDF/locale/fr/idf.po
22msgstr ""
33"Project-Id-Version: InDefero\n"
44"Report-Msgid-Bugs-To: \n"
5"POT-Creation-Date: 2008-08-06 22:28+0200\n"
6"PO-Revision-Date: 2008-08-06 22:30+0100\n"
5"POT-Creation-Date: 2008-08-07 15:31+0200\n"
6"PO-Revision-Date: 2008-08-07 15:34+0100\n"
77"Last-Translator: Loïc d'Anterroches <titoo@users.sourceforge.net>\n"
88"Language-Team: Translation team <titoo@users.sourceforge.net>\n"
99"MIME-Version: 1.0\n"
...... 
101101msgstr "date de modification"
102102#: IDF/Middleware.php:50
103#: IDF/Middleware.php:51
103104#, php-format
104105msgid "The page <em>%s</em> was not found on the server."
105106msgstr "Cette page <em>%s</em> n'a pas été trouvée sur le serveur."
...... 
186187msgstr "Ici pour vous aider !"
187188#: IDF/Views/Project.php:62
189#: IDF/Views/Project.php:65
188190#, php-format
189191msgid "%s Project Summary"
190192msgstr "Résumé du projet %s"
191193#: IDF/Views/Project.php:69
194#: IDF/Views/Project.php:72
192195msgid "The project has been updated."
193196msgstr "Le projet a été mis à jour."
194197#: IDF/Views/Project.php:93
198#: IDF/Views/Project.php:96
195199#, php-format
196200msgid "%s Issue Tracking Configuration"
197201msgstr "Configuration du gestionnaire de tickets de %s"
198202#: IDF/Views/Project.php:102
203#: IDF/Views/Project.php:105
199204msgid "The issue tracking configuration has been saved."
200205msgstr "La configuration du gestionnaire de tickets a été sauvegardée."
201206#: IDF/Views/Project.php:137
207#: IDF/Views/Project.php:140
202208#, php-format
203209msgid "%s Downloads Configuration"
204210msgstr "Configuration des Téléchargements de %s"
205211#: IDF/Views/Project.php:146
212#: IDF/Views/Project.php:149
206213msgid "The downloads configuration has been saved."
207214msgstr "La configuration des téléchargements a été sauvegardée."
208215#: IDF/Views/Project.php:180
216#: IDF/Views/Project.php:183
209217#, php-format
210218msgid "%s Project Members"
211219msgstr "Membres du projet %s"
212220#: IDF/Views/Project.php:189
221#: IDF/Views/Project.php:192
213222msgid "The project membership has been saved."
214223msgstr "Les membres du projet ont été sauvegardés."
215224#: IDF/Views/Download.php:44
225#: IDF/Views/Download.php:45
216226#, php-format
217227msgid "%s Downloads"
218228msgstr "Téléchargements de %s"
219229#: IDF/Views/Download.php:50
220230#: IDF/Views/Download.php:52
231#: IDF/Views/Download.php:51
221232msgid "This table shows the files to download."
222233msgstr "Ce tableau présente la liste des fichiers en téléchargement."
...... 
237248#: IDF/Views/Download.php:56
238249#: IDF/Views/Download.php:212
239250#: IDF/Views/Download.php:218
251#: IDF/Views/Download.php:55
252#: IDF/Views/Download.php:223
240253msgid "File"
241254msgstr "Fichier"
...... 
252265#: IDF/Views/Download.php:57
253266#: IDF/Views/Download.php:213
254267#: IDF/Views/Download.php:219
268#: IDF/Views/Download.php:56
269#: IDF/Views/Download.php:224
270#: IDF/Views/Issue.php:58
271#: IDF/Views/Issue.php:111
272#: IDF/Views/Issue.php:233
273#: IDF/Views/Issue.php:287
255274msgid "Summary"
256275msgstr "Résumé"
...... 
260279#: IDF/Views/Download.php:58
261280#: IDF/Views/Download.php:214
262281#: IDF/Views/Download.php:220
282#: IDF/Views/Download.php:57
283#: IDF/Views/Download.php:225
263284msgid "Size"
264285msgstr "Taille"
...... 
267288#: IDF/Views/Download.php:59
268289#: IDF/Views/Download.php:215
269290#: IDF/Views/Download.php:221
291#: IDF/Views/Download.php:58
292#: IDF/Views/Download.php:226
270293msgid "Uploaded"
271294msgstr "Mis en ligne"
...... 
274297#: IDF/Views/Download.php:63
275298#: IDF/Views/Download.php:219
276299#: IDF/Views/Download.php:225
300#: IDF/Views/Download.php:62
301#: IDF/Views/Download.php:230
277302msgid "No downloads were found."
278303msgstr "Aucun fichier n'a été trouvé."
279304#: IDF/Views/Download.php:81
280305#: IDF/Views/Download.php:83
306#: IDF/Views/Download.php:85
281307#, php-format
282308msgid "Download %s"
283309msgstr "Télécharger %s"
...... 
286312#: IDF/Views/Download.php:94
287313#: IDF/Views/Download.php:96
288314#: IDF/Views/Download.php:100
315#: IDF/Views/Download.php:102
289316#, php-format
290317msgid "The file <a href=\"%1$s\">%2$s</a> has been updated."
291318msgstr "Le fichier <a href=\"%1$s\">%2$s</a> a été mis à jour."
...... 
295322#: IDF/gettexttemplates/downloads/index.html.php:3
296323#: IDF/Views/Download.php:137
297324#: IDF/Views/Download.php:143
325#: IDF/Views/Download.php:147
298326msgid "New Download"
299327msgstr "Nouveau téléchargement"
300328#: IDF/Views/Download.php:144
301329#: IDF/Views/Download.php:146
302330#: IDF/Views/Download.php:152
331#: IDF/Views/Download.php:156
303332#, php-format
304333msgid "The <a href=\"%s\">file</a> has been uploaded."
305334msgstr "Le <a href=\"%s\">fichier</a> a été mis en ligne."
306335#: IDF/Views/Issue.php:40
336#: IDF/Views/Issue.php:41
307337#, php-format
308338msgid "%s Recent Issues"
309339msgstr "Tickets récents de %s"
310340#: IDF/Views/Issue.php:49
311341#: IDF/Views/Issue.php:103
342#: IDF/Views/Issue.php:50
343#: IDF/Views/Issue.php:105
312344msgid "This table shows the open recent issues."
313345msgstr "Ce tableau montre les tickets récents."
...... 
319351#: IDF/Views/Issue.php:108
320352#: IDF/Views/Issue.php:227
321353#: IDF/Views/Issue.php:280
354#: IDF/Views/Issue.php:57
355#: IDF/Views/Issue.php:110
356#: IDF/Views/Issue.php:232
357#: IDF/Views/Issue.php:286
322358msgid "Id"
323359msgstr "Id"
...... 
328364#: IDF/Views/Issue.php:282
329365#: IDF/Form/IssueCreate.php:70
330366#: IDF/Form/IssueUpdate.php:66
367#: IDF/Views/Issue.php:59
368#: IDF/Views/Issue.php:112
369#: IDF/Views/Issue.php:234
370#: IDF/Views/Issue.php:288
331371msgid "Status"
332372msgstr "Statut"
...... 
335375#: IDF/Views/Issue.php:111
336376#: IDF/Views/Issue.php:230
337377#: IDF/Views/Issue.php:283
378#: IDF/Views/Issue.php:60
379#: IDF/Views/Issue.php:113
380#: IDF/Views/Issue.php:235
381#: IDF/Views/Issue.php:289
338382msgid "Last Updated"
339383msgstr "Dernière mise à jour"
...... 
342386#: IDF/Views/Issue.php:115
343387#: IDF/Views/Issue.php:234
344388#: IDF/Views/Issue.php:287
389#: IDF/Views/Issue.php:64
390#: IDF/Views/Issue.php:117
391#: IDF/Views/Issue.php:239
392#: IDF/Views/Issue.php:293
345393msgid "No issues were found."
346394msgstr "Aucun ticket n'a été trouvé."
347395#: IDF/Views/Issue.php:87
396#: IDF/Views/Issue.php:89
348397#, php-format
349398msgid "My Submitted %s Issues"
350399msgstr "Mes tickets soumis pour %s"
351400#: IDF/Views/Issue.php:90
401#: IDF/Views/Issue.php:92
352402#, php-format
353403msgid "My Working %s Issues"
354404msgstr "Mes tickets en cours pour %s"
355405#: IDF/Views/Issue.php:131
406#: IDF/Views/Issue.php:134
356407msgid "Submit a new issue"
357408msgstr "Soumettre un nouveau ticket"
358409#: IDF/Views/Issue.php:143
410#: IDF/Views/Issue.php:146
359411#, php-format
360412msgid "<a href=\"%s\">Issue %d</a> has been created."
361413msgstr "Le <a href=\"%s\">ticket %d</a> a été créé."
362414#: IDF/Views/Issue.php:168
415#: IDF/Views/Issue.php:172
363416#, php-format
364417msgid "Issue <a href=\"%s\">%d</a>: %s"
365418msgstr "Ticket <a href=\"%s\">%d</a> : %s"
366419#: IDF/Views/Issue.php:184
420#: IDF/Views/Issue.php:188
367421#, php-format
368422msgid "<a href=\"%s\">Issue %d</a> has been updated."
369423msgstr "Le <a href=\"%s\">ticket %d</a> a été mise à jour."
370424#: IDF/Views/Issue.php:211
425#: IDF/Views/Issue.php:216
371426#, php-format
372427msgid "%s Closed Issues"
373428msgstr "Tickets fermés de %s"
374429#: IDF/Views/Issue.php:220
430#: IDF/Views/Issue.php:225
375431msgid "This table shows the closed issues."
376432msgstr "Ce tableau montre les tickets fermés."
377433#: IDF/Views/Issue.php:258
434#: IDF/Views/Issue.php:264
378435#, php-format
379436msgid "%1$s Issues with Label %2$s"
380437msgstr "%1$s tickets avec l'étiquette %2$s"
381438#: IDF/Views/Issue.php:261
439#: IDF/Views/Issue.php:267
382440#, php-format
383441msgid "%1$s Closed Issues with Label %2$s"
384442msgstr "Tickets fermés de %1$s avec l'étiquette %2$s"
385443#: IDF/Views/Issue.php:273
444#: IDF/Views/Issue.php:279
386445#, php-format
387446msgid "This table shows the issues with label %s."
388447msgstr "Ce tableau montre les tickets avec l'étiquette %s."
...... 
429488msgstr "Page d'Accueil"
430489#: IDF/gettexttemplates/base.html.php:9
490#: IDF/Form/TabsConf.php:36
431491msgid "Issues"
432492msgstr "Tickets"
433493#: IDF/gettexttemplates/base.html.php:10
434494#: IDF/gettexttemplates/downloads/base.html.php:3
435495#: IDF/gettexttemplates/admin/base.html.php:6
496#: IDF/Form/TabsConf.php:34
436497msgid "Downloads"
437498msgstr "Téléchargements"
438499#: IDF/gettexttemplates/base.html.php:11
500#: IDF/Form/TabsConf.php:35
439501msgid "Source"
440502msgstr "Source"
...... 
636698#: IDF/gettexttemplates/admin/issue-tracking.html.php:8
637699#: IDF/gettexttemplates/admin/members.html.php:13
638700#: IDF/gettexttemplates/admin/summary.html.php:8
701#: IDF/gettexttemplates/admin/tabs.html.php:5
639702msgid "Save Changes"
640703msgstr "Enregistrer les changements"
...... 
12141277msgstr "Aucun changement n'a été entré."
12151278#: IDF/Form/MembersConf.php:46
1279#: IDF/Form/TabsConf.php:47
12161280msgid "Project owners"
12171281msgstr "Propriétaires du projet"
12181282#: IDF/Form/MembersConf.php:54
1283#: IDF/Form/TabsConf.php:46
12191284msgid "Project members"
12201285msgstr "Membres du projet"
12211286#: IDF/Views/Source.php:36
1287#: IDF/Views/Source.php:37
12221288#, php-format
12231289msgid "%s Git Change Log"
12241290msgstr "Changements Git de %s"
12251291#: IDF/Views/Source.php:54
12261292#: IDF/Views/Source.php:83
1293#: IDF/Views/Source.php:56
1294#: IDF/Views/Source.php:86
12271295#, php-format
12281296msgid "%s Git Source Tree"
12291297msgstr "Arbre des sources Git de %s"
12301298#: IDF/Views/Source.php:164
1299#: IDF/Views/Source.php:168
12311300#, php-format
12321301msgid "%s Commit Details"
12331302msgstr "Détails d'un commit de %s"
12341303#: IDF/Views/Source.php:165
1304#: IDF/Views/Source.php:169
12351305#, php-format
12361306msgid "%s Commit Details - %s"
12371307msgstr "Détails d'un commit de %s - %s"
12381308#: IDF/Views/Download.php:199
12391309#: IDF/Views/Download.php:205