diff --git a/app/controller/issues.php b/app/controller/issues.php index d04c04ac..e574405e 100644 --- a/app/controller/issues.php +++ b/app/controller/issues.php @@ -77,7 +77,7 @@ protected function _buildFilter() { // Build SQL ORDER BY string $orderby = !empty($args['orderby']) ? $args['orderby'] : "priority"; $filter["orderby"] = $orderby; - $ascdesc = !empty($args['ascdesc']) && $args['ascdesc'] == 'asc' ? "ASC" : "DESC"; + $ascdesc = !empty($args['ascdesc']) && strtolower($args['ascdesc']) == 'asc' ? "ASC" : "DESC"; $filter["ascdesc"] = $ascdesc; switch($orderby) { case "id": @@ -1031,31 +1031,43 @@ public function project_overview($f3, $params) { } /** - * Helper function to get a percentage of completed issues across the entire tree + * Helper function to get a percentage of completed issues and some totals across the entire tree * @param Issue $issue * @var callable $completeCount This function, required for recursive calls * @return array */ - $completeCount = function(\Model\Issue &$issue) use(&$completeCount) { + $projectStats = function(\Model\Issue &$issue) use(&$projectStats) { $total = 0; $complete = 0; + $hoursSpent = 0; + $hoursTotal = 0; if($issue->id) { $total ++; if($issue->closed_date) { $complete ++; } + if($issue->hours_spent > 0) { + $hoursSpent += $issue->hours_spent; + } + if($issue->hours_total > 0) { + $hoursTotal += $issue->hours_total; + } foreach($issue->getChildren() as $child) { - $result = $completeCount($child); + $result = $projectStats($child); $total += $result["total"]; $complete += $result["complete"]; + $hoursSpent += $result["hours_spent"]; + $hoursTotal += $result["hours_total"]; } } return array( "total" => $total, - "complete" => $complete + "complete" => $complete, + "hours_spent" => $hoursSpent, + "hours_total" => $hoursTotal, ); }; - $f3->set("stats", $completeCount($project)); + $f3->set("stats", $projectStats($project)); /** * Helper function for recursive tree rendering diff --git a/app/controller/user.php b/app/controller/user.php index d3a0de32..e7d5278f 100644 --- a/app/controller/user.php +++ b/app/controller/user.php @@ -17,6 +17,9 @@ public function __construct() { "pt" => \ISO::LC_pt . " (Português)", "ru" => \ISO::LC_ru . " (Pу́сский)", "nl" => \ISO::LC_nl . " (Nederlands)", + "de" => \ISO::LC_de . " (Deutsche)", + "cs" => \ISO::LC_cs . " (Češka)", + "zh" => \ISO::LC_zh . " (中国)", ); } @@ -100,7 +103,7 @@ private function _loadThemes() { $f3 = \Base::instance(); // Get theme list - $hidden_themes = array("backlog", "style", "taskboard", "datepicker", "jquery-ui-1.10.3", "bootstrap-tagsinput", "emote"); + $hidden_themes = array("backlog", "style", "taskboard", "datepicker", "jquery-ui-1.10.3", "bootstrap-tagsinput", "emote", "fontawesome"); $themes = array(); foreach (glob("css/*.css") as $file) { $name = pathinfo($file, PATHINFO_FILENAME); diff --git a/app/dict/cs.ini b/app/dict/cs.ini new file mode 100644 index 00000000..5a9fea30 --- /dev/null +++ b/app/dict/cs.ini @@ -0,0 +1,329 @@ +; Index, login, password reset +log_in=Přihlísit +register=Registrovat +username=Uživatel +password=Heslo +email=Email +email_address=Email address + +reset_password=Reset Password +new_password=Nové heslo +confirm_password=Opakujte heslo + + +cancel=Zrušit + +logged_out=Odhlásit +session_ended_message=Your session has ended. Please log in again. + +; Footer +n_queries={0,number,integer} queries +n_total_queries_n_cached={0,number,integer} total queries, {1,number,integer} cached +page_generated_in_n_seconds=Page generated in {0,number} seconds +real_usage_n_bytes=Real usage: {0,number,integer} bytes +current_commit_n=Current commit: {0} + +; Installer +install_phproject=Instalovat Phpproject + +; Navbar, basic terminology +new=Nový +sprint=Sprint +sprints=Sprints +browse=Hledat +open=Otevřít +closed=Closed +created_by_me=Created by me +assigned_to_me=Assigned to me +issue_search=Quickly find an issue +administration=Administration +dashboard=Dashboard +issues=Issues +my_issues=My Issues +my_account=My Account +configuration=Configuration +plugins=Plugins +users=Users +groups=Groups +log_out=Log Out +demo_notice=This site is running in demo mode. All content is public and may be reset at any time. +loading=Loading… +close=Close +related=Related +current_issue=Current issue +toggle_navigation=Toggle Navigation + +; Errors +error.loading_issue_history=Error loading issue history. +error.loading_issue_watchers=Error loading issue watchers. +error.loading_related_issues=Error loading related issues. +error.loading_dependencies=Error loading dependencies. +error.404_text=The page you requested is not available. + +; Dashboard +taskboard=Taskboard +my_projects=Moje projekty +my_subprojects=Moje podprojekty +my_tasks=My Tasks +my_bugs=My Bugs +repeat_work=Repeat Work +my_watchlist=My Watch List +add_project=Přidat projekt +add_task=Přidat úkol +add_bug=Přidat chybu + +; User pages +created_issues=Created Issues +assigned_issues=Assigned Issues +overdue_issues=Overdue Issues +issue_tree=Stom chyb + +; Account +name=Název +theme=Téma +language=Jazyk + +task_color=Barva pro úlohi +avatar=Avatar +edit_on_gravatar=Edit on Gravatar +save=Uložit +current_password=Stávající heslo +profile=Profil +default=Default + +; Browse +general=General +exact_match=Exact Match +submit=Odeslat +export=Export +go_previous=Předchozí +go_next=Další + +; Issue fields +cols.id=Id +cols.title=Název +cols.description=Popis +cols.type=Typ +cols.priority=Priorita +cols.status=Stav +cols.author=Autor +cols.assignee=Přiřazeno +cols.total_spent_hours=Strávené hodiny +cols.planned_hours=Plánované hodiny +cols.remaining_hours=Zbývající hodiny +cols.start_date=Datum počátku +cols.due_date=Due Date +cols.repeat_cycle=Opakovat +cols.parent_id=Nadřazené ID +cols.parent=Rodič +cols.sprint=Sprint +cols.created=Vytvořeno +cols.start=Počátek +cols.due=Probíhá +cols.closed=Zavřeno +cols.hours_spent=Strávené hodiny +cols.depends_on=Závisí na + +; Issue editing +not_assigned=Nepřiřazeno +choose_option=Vyberte + +repeating=Opakování +not_repeating=Neopakuje se +daily=Denně +weekly=Týdně +monthly=Měsíčně + +no_sprint=No Sprint + +comment=Komentář + +send_notifications=Poslat oznámení +reset=Reset +new_n=New {0} +edit_n=Edit {0} +create_n=Create {0} +save_n=Save {0} + +; Issue page +mark_complete=Mark Complete +complete=Complete +reopen=Reopen +show_on_taskboard=Show on Taskboard +copy=Copy +watch=Watch +unwatch=Unwatch +edit=Edit +delete=Delete + +files=Files +upload=Upload +upload_a_file=Upload a File +attached_file=Attached file +deleted=Deleted +file_name=File Name +uploaded_by=Uploaded By +upload_date=Upload Date +file_size=File Size +file_deleted=File deleted. +undo=Undo + +comments=Comments +history=History +watchers=Watchers +child_tasks=Child Tasks +sibling_tasks=Sibling Tasks +related_tasks=Related Tasks + +notifications_sent=Notifications sent +notifications_not_sent=Notifications not sent +a_changed={0} changed: +a_changed_from_b_to_c={0} changed from {1} to {2} +a_set_to_b={0} set to {1} +a_removed={0} removed + +dependencies=Dependencies +dependency=Dependency +dependent=Dependent +task_depends=This task depends on: +add_dependency=Add Dependency +task_dependency=This task is a dependency for: +add_dependent=Add Dependent + +; Dependency Types (Finish-Start, Finish-Finish, Start-Start, Start-Finish) +fs=FS +ff=FF +ss=SS +sf=SF + +write_a_comment=Write a comment… +save_comment=Save Comment + +no_history_available=No history available +add_watcher=Add Watcher + +new_sub_project=New Sub-Project +new_task=New Task +under_n=Under {0} +no_related_issues=No related issues + +copy_issue=Copy Issue +copy_issue_details=Copying this issue will duplicate it and all of its descendants. No comments, files, history, or watchers will be copied. + +deleted_success=Issue #{0} successfully deleted. +deleted_notice=This issue has been deleted. Editing it will still send notifications, but the recipients will not be able to view the issue unless they are administrators. +restore_issue=Restore Issue + +comment_delete_confirm=Are you sure you want to delete this comment? + +bulk_actions=Show Bulk Actions +bulk_update=Update All Selected Tasks + +project_overview=Project Overview +project_tree=Project Tree +n_complete={0} complete +n_child_issues={0} child issues + +; Tags +issue_tags=Issue Tags +no_tags_created=No issue tags have been created yet. +tag_help_1=Tag an issue by adding a #hashtag to its description. +tag_help_2=Hashtags can contain letters, numbers, and hyphens, and must start with a letter. +view_all_tags=View all tags + +; Taskboard/Backlog +backlog=Backlog +filter_tasks=Filter Tasks +filter_projects=Filter Projects +all_projects=All Projects +all_tasks=All Tasks +my_groups=My Groups +burndown=Burndown +hours_remaining=Hours Remaining +ideal_hours_remaining=Ideal Hours Remaining +daily_hours_remaining=Daily Hours Remaining +project=Project +subproject=Subproject +track_time_spent=Track Time Spent +burn_hours=Burn hours +backlog_old_help_text=Drag projects here to remove from a sprint +previous_sprints=Show Previous Sprints +future_sprints=Show Future Sprints + +; Administration +overview=Overview +new_user=New User +edit_user=Edit User +require_new_password=Require a new password on next login +role=Role +user=User +deactivate=Deactivate +reactivate=Reactivate +administrator=Administrator +members=Members +group_name=Group Name +group_name_saved=Group name saved +manager=Manager +set_as_manager=Set as Manager +add_to_group=Add to Group +no_groups_exist=No groups exist. +new_sprint=New Sprint +edit_sprint=Edit Sprint +start_date=Start Date +end_date=End Date +version=Version +current_version=Current Version +update_available=Update Available +update_to_n=Update to {0} +backup_db=Are you sure?\nYou should back up your database before you proceed. +show_deactivated_users=Show Deactivated Users + +; User Ranks +rank=Rank +ranks.0=Guest +ranks.1=Client +ranks.2=User +ranks.3=Manager +ranks.4=Admin +ranks.5=Super Admin +rank_permissions.0=Read-only +rank_permissions.1=Can post comments +rank_permissions.2=Can create/edit issues +rank_permissions.3=Can delete issues/comments +rank_permissions.4=Can create/edit/delete users/groups/sprints +rank_permissions.5=Can edit configuration + +; Config +site_basics=Site Basics +text_parsing=Text Parsing +email_smtp_imap=Email (SMTP/IMAP) +advanced=Advanced +site_name=Site Name +site_description=Site Description +timezone=Timezone +default_theme=Default Theme +logo=Logo +allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) +convert_ids=Convert IDs to Links +convert_hashtags=Convert Hashtags to Links +convert_urls=Convert URLs to links +convert_emoticons=Convert emoticons to glyphs +outgoing_mail=Outgoing Mail (SMTP) +from_address=From Address +incoming_mail=Incoming Mail (IMAP) +hostname=Hostname +debug_level=Debug Level (DEBUG) +cache_mode=Cache Mode (CACHE) +cookie_expiration=Cookie Expiration (JAR.expire) +max_upload_size=Max Upload Size (files.maxsize) +censor_credit_card_numbers=Censor Credit Card Numbers (security.block_ccs) +demo_user=Demo User (site.demo) +config_note=Note +imap_truncate_lines=IMAP Message Truncate Lines (mail.truncate_lines) +package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. +imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. +email_leave_blank=Leave blank to disable outgoing email +advanced_config_note=These values can be changed by editing the values in the {0} database table. + diff --git a/app/dict/de.ini b/app/dict/de.ini index 603a1942..c2358030 100644 --- a/app/dict/de.ini +++ b/app/dict/de.ini @@ -302,6 +302,8 @@ timezone=Timezone default_theme=Default Theme logo=Logo allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) convert_ids=Convert IDs to Links convert_hashtags=Convert Hashtags to Links convert_urls=Convert URLs to links @@ -321,5 +323,5 @@ imap_truncate_lines=IMAP Message Truncate Lines (mail.truncate_lines) package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. email_leave_blank=Leave blank to disable outgoing email -advanced_config_note==These values can be changed by editing the values in the {0} database table. +advanced_config_note=These values can be changed by editing the values in the {0} database table. diff --git a/app/dict/en.ini b/app/dict/en.ini index 1782f9dd..8b63c283 100644 --- a/app/dict/en.ini +++ b/app/dict/en.ini @@ -302,6 +302,8 @@ timezone=Timezone default_theme=Default Theme logo=Logo allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) convert_ids=Convert IDs to Links convert_hashtags=Convert Hashtags to Links convert_urls=Convert URLs to links diff --git a/app/dict/es.ini b/app/dict/es.ini index 1d76ea62..a35a2189 100644 --- a/app/dict/es.ini +++ b/app/dict/es.ini @@ -170,7 +170,7 @@ comments=Comentarios history=Historia watchers=Observadores child_tasks=Tareas Secundarias -sibling_tasks=Sibling Tasks +sibling_tasks=Tareas Hermanos related_tasks=Tareas Relacionadas notifications_sent=Las notificaciones enviadas @@ -292,33 +292,36 @@ rank_permissions.4=Puede crear/editar/borrar usuarios/grupos/carreras rank_permissions.5=Puede editar configuración ; Config -site_basics=Site Basics +site_basics=Principios Del Sitio text_parsing=Análisis de texto -email_smtp_imap=Email (SMTP/IMAP) +email_smtp_imap=Correo electrónico (SMTP/IMAP) advanced=Avanzado site_name=Nombre del sitio site_description=Descripción del sitio timezone=Zona horaria -default_theme=Default Theme +default_theme=Tema por defecto logo=Logo allow_public_registration=Permiten el registro público -convert_ids=Convert IDs to Links -convert_hashtags=Convert Hashtags to Links -convert_urls=Convert URLs to links -convert_emoticons=Convert emoticons to glyphs -outgoing_mail=Outgoing Mail (SMTP) +parser_syntax=Sintaxis De Analizador +advanced_options=Opciones Avanzadas (todos activado por defecto) +convert_ids=Convertir IDs en Enlaces +convert_hashtags=Convertir Hashtags en Enlaces +convert_urls=Convertir URLs en Enlaces +convert_emoticons=Convertir emoticonos en glifos +outgoing_mail=Correo Saliente (SMTP) from_address=From Address -incoming_mail=Incoming Mail (IMAP) +incoming_mail=Correo Entrante (IMAP) hostname=Hostname -debug_level=Debug Level (DEBUG) -cache_mode=Cache Mode (CACHE) -cookie_expiration=Cookie Expiration (JAR.expire) -max_upload_size=Max Upload Size (files.maxsize) -censor_credit_card_numbers=Censor Credit Card Numbers (security.block_ccs) +debug_level=El Nivel de depuración (DEBUG) +cache_mode=Modo de caché (CACHE) +cookie_expiration=Caducidad de las cookies (JAR.expire) +max_upload_size=Tamaño máximo de carga (files.maxsize) +censor_credit_card_numbers=Censurar a los Números de Tarjeta de Crédito (security.block_ccs) demo_user=Usuario demo (site.demo) config_note=Nota imap_truncate_lines=Líneas de truncar mensajes IMAP (mail.truncate_lines) -package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. +package_mail_config_note={0} utiliza su defecto de PHP configuración de correo electrónico para el correo electrónico saliente. imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. email_leave_blank=Deje en blanco para desactivar el correo electrónico saliente -advanced_config_note=These values can be changed by editing the values in the {0} database table. +advanced_config_note=Estos valores pueden ser modificados por el tratamiento de los valores en la {0} tabla de base de datos. + diff --git a/app/dict/fr.ini b/app/dict/fr.ini index 2a0dcadc..7d00bdb0 100644 --- a/app/dict/fr.ini +++ b/app/dict/fr.ini @@ -302,6 +302,8 @@ timezone=Timezone default_theme=Default Theme logo=Logo allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) convert_ids=Convert IDs to Links convert_hashtags=Convert Hashtags to Links convert_urls=Convert URLs to links @@ -321,5 +323,5 @@ imap_truncate_lines=IMAP Message Truncate Lines (mail.truncate_lines) package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. email_leave_blank=Leave blank to disable outgoing email -advanced_config_note==These values can be changed by editing the values in the {0} database table. +advanced_config_note=These values can be changed by editing the values in the {0} database table. diff --git a/app/dict/nl.ini b/app/dict/nl.ini index a21d0df0..c7f81047 100644 --- a/app/dict/nl.ini +++ b/app/dict/nl.ini @@ -302,6 +302,8 @@ timezone=Tijdzone default_theme=Standaard thema logo=Logo allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) convert_ids=Zet IDs om naar links convert_hashtags=Zet hashtags om naar links convert_urls=Zet URLs om naar links @@ -321,5 +323,5 @@ imap_truncate_lines=IMAP bericht afbreek lijnen (mail.truncate_lines) package_mail_config_note={0} gebruikt uw standaard PHP mail configuratie voor uitgaande mail. imap_settings_note=IMAP instellingen hebben geen effect tenzij het script {0} gestart wordt met cron. email_leave_blank=Laat dit leeg om uitgaande mail uit te schakelen. -advanced_config_note==These values can be changed by editing the values in the {0} database table. +advanced_config_note=These values can be changed by editing the values in the {0} database table. diff --git a/app/dict/pt.ini b/app/dict/pt.ini index 903f4dd9..5cb6efa1 100644 --- a/app/dict/pt.ini +++ b/app/dict/pt.ini @@ -16,7 +16,7 @@ logged_out=Desconectado session_ended_message=Sua sessão foi encerrada. Por favor, faça o login novamente. ; Footer -n_queries={0,number,integer} queries +n_queries={0,number,integer} consultas n_total_queries_n_cached={0,number,integer} queries totais, {1,number,integer} em cache page_generated_in_n_seconds=Página gerada em 5 {0,number} segundos real_usage_n_bytes=Uso real: {0,number,integer} bytes @@ -37,10 +37,10 @@ assigned_to_me=Atribuído a mim issue_search=Pesquisar os problemas administration=Administração dashboard=Minha Página -issues=Issues +issues=Problema my_issues=Meus Problemas my_account=Minha Conta -configuration=Configuration +configuration=Configuração plugins=Plugins users=Usuários groups=Grupos @@ -49,14 +49,14 @@ demo_notice=Este site está sendo executado em modo de demonstração. Todo o co loading=Carregando… close=Fechar related=Relacionados -current_issue=Current issue +current_issue=Problema atual toggle_navigation=Navegação toggle ; Errors -error.loading_issue_history=Erro ao carregar a história questão. -error.loading_issue_watchers=Erro ao carregar a questão observadores. +error.loading_issue_history=Erro ao carregar a história problema. +error.loading_issue_watchers=Erro ao carregar a problema observadores. error.loading_related_issues=Erro ao carregar os problemas relacionados. -error.loading_dependencies=Error loading dependencies. +error.loading_dependencies=Erro ao carregar as dependências. error.404_text=A página que você solicitou não está disponível. ; Dashboard @@ -74,7 +74,7 @@ add_bug=Adicionar Erro ; User pages created_issues=Problemas Criados assigned_issues=Problemas atribuído -overdue_issues=Overdue Issues +overdue_issues=Problemas de atraso issue_tree=Árvore de Problemas ; Account @@ -87,7 +87,7 @@ edit_on_gravatar=Editar na Gravatar save=Salvar current_password=Senha atual profile=Informação Pessoal -default=Default +default=Padrão ; Browse general=Geral @@ -132,7 +132,7 @@ daily=Diariamente weekly=Semanalmente monthly=Mensalmente -no_sprint=No Sprint +no_sprint=Não Sprint comment=Comentário @@ -170,7 +170,7 @@ comments=Comentários history=Hiistória watchers=Observadores child_tasks=Tarefas filho -sibling_tasks=Sibling Tasks +sibling_tasks=Irmão Tarefas related_tasks=Tarefas relacionadas notifications_sent=Notifications sent @@ -189,10 +189,10 @@ task_dependency=Esta tarefa é uma dependência para: add_dependent=Adicionar dependente ; Dependency Types (Finish-Start, Finish-Finish, Start-Start, Start-Finish) -fs=FS -ff=FF -ss=SS -sf=SF +fs=TC +ff=TT +ss=CC +sf=CT write_a_comment=Escrever um comentário… save_comment=Salvar comentário @@ -205,7 +205,7 @@ new_task=Nova tarefa under_n=Sob a {0} no_related_issues=Não há problemas relacionados -copy_issue=copiar a problema +copy_issue=Cópia Problema copy_issue_details=Copiar este problema vai duplicá-lo e todos os seus descendentes. Sem comentários, arquivos, história, ou observadores serão copiados. deleted_success=Problema #{0} foi excluído com sucesso. @@ -220,7 +220,7 @@ bulk_update=Atualizar estes problemas project_overview=Visão geral do projeto project_tree=Projeto árvore n_complete={0} completa -n_child_issues={0} questões de criança +n_child_issues={0} problemas de criança ; Tags issue_tags=Etiquetas @@ -255,8 +255,8 @@ edit_user=Editar usuário require_new_password=Exigem uma nova senha no próximo logon role=Função user=Usuário -deactivate=Deactivate -reactivate=Reactivate +deactivate=Desativar +reactivate=Reativar administrator=Administrador members=Membros group_name=Nome do grupo @@ -269,57 +269,59 @@ new_sprint=Novo sprint edit_sprint=Editar sprint start_date=Data de início end_date=Data de término -version=Version +version=Versão current_version=Versão atual update_available=Atualização disponível update_to_n=Actualização de {0} backup_db=Você tem certeza?\nVocê deve fazer backup de seu banco de dados antes de continuar. -show_deactivated_users=Show Deactivated Users +show_deactivated_users=Mostrar Usuários Desativados ; User Ranks rank=Classificação -ranks.0=Guest +ranks.0=Visitante ranks.1=Cliente ranks.2=Usuário ranks.3=Manager ranks.4=Admin -ranks.5=Super Admin -rank_permissions.0=Read-only +ranks.5=Super Administrador +rank_permissions.0=Somente leitura rank_permissions.1=Pode postar comentários -rank_permissions.2=Can create/edit issues -rank_permissions.3=Can delete issues/comments +rank_permissions.2=Pode criar/editar problemas +rank_permissions.3=Pode apagar problemas/comentários rank_permissions.4=Pode criar/editar/excluir usuários/grupos/sprints rank_permissions.5=Pode editar a configuração ; Config -site_basics=Site Basics -text_parsing=Text Parsing -email_smtp_imap=Email (SMTP/IMAP) -advanced=Advanced -site_name=Site Name -site_description=Site Description -timezone=Timezone -default_theme=Default Theme +site_basics=Fundamentos Do Site +text_parsing=Análise de texto +email_smtp_imap=E-mail (SMTP/IMAP) +advanced=Avançado +site_name=Nome Do Site +site_description=Descrição Do Site +timezone=Fuso horário +default_theme=Tema Padrão logo=Logo -allow_public_registration=Allow public registration -convert_ids=Convert IDs to Links -convert_hashtags=Convert Hashtags to Links -convert_urls=Convert URLs to links -convert_emoticons=Convert emoticons to glyphs -outgoing_mail=Outgoing Mail (SMTP) +allow_public_registration=Permitir o registro público +parser_syntax=Parser Syntax +advanced_options=Opções avançadas (todos habilitado por padrão) +convert_ids=Converter IDs para Links +convert_hashtags=Converter Hashtags para Links +convert_urls=Converter URLs para links +convert_emoticons=Converter emoticons para glifos +outgoing_mail=Email de saída (SMTP) from_address=From Address -incoming_mail=Incoming Mail (IMAP) -hostname=Hostname -debug_level=Debug Level (DEBUG) -cache_mode=Cache Mode (CACHE) -cookie_expiration=Cookie Expiration (JAR.expire) -max_upload_size=Max Upload Size (files.maxsize) -censor_credit_card_numbers=Censor Credit Card Numbers (security.block_ccs) -demo_user=Demo User (site.demo) -config_note=Note -imap_truncate_lines=IMAP Message Truncate Lines (mail.truncate_lines) -package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. +incoming_mail=Email de entrada (IMAP) +hostname=Nome do host +debug_level=Nível de depuração (DEBUG) +cache_mode=Modo de cache (CACHE) +cookie_expiration=Expiração do cookie (JAR.expire) +max_upload_size=Tamanho máximo de upload (files.maxsize) +censor_credit_card_numbers=Censor de números de cartão de crédito (security.block_ccs) +demo_user=Usuário de demonstração (site.demo) +config_note=Nota +imap_truncate_lines=Linhas de truncar mensagem IMAP (mail.truncate_lines) +package_mail_config_note={0} usa a configuração de correio padrão PHP para e-mail de saída. imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. -email_leave_blank=Leave blank to disable outgoing email -advanced_config_note==These values can be changed by editing the values in the {0} database table. +email_leave_blank=Deixe em branco para desactivar o envio de e-mail +advanced_config_note=Estes valores podem ser alteradas editando os valores na {0} tabela de banco de dados. diff --git a/app/dict/ru.ini b/app/dict/ru.ini index 55f7fcca..cb4b6cfb 100644 --- a/app/dict/ru.ini +++ b/app/dict/ru.ini @@ -299,9 +299,11 @@ advanced=Advanced site_name=Site Name site_description=Site Description timezone=Timezone -default_theme=Default Theme +default_theme=Тема по умолчанию logo=Logo allow_public_registration=Allow public registration +parser_syntax=Parser Syntax +advanced_options=Advanced Options (all enabled by default) convert_ids=Convert IDs to Links convert_hashtags=Convert Hashtags to Links convert_urls=Convert URLs to links @@ -321,5 +323,5 @@ imap_truncate_lines=IMAP Message Truncate Lines (mail.truncate_lines) package_mail_config_note={0} uses your default PHP mail configuration for outgoing email. imap_settings_note=IMAP settings here will have no effect unless the {0} cron is being run. email_leave_blank=Leave blank to disable outgoing email -advanced_config_note==These values can be changed by editing the values in the {0} database table. +advanced_config_note=These values can be changed by editing the values in the {0} database table. diff --git a/app/dict/zh.ini b/app/dict/zh.ini new file mode 100644 index 00000000..7810ac81 --- /dev/null +++ b/app/dict/zh.ini @@ -0,0 +1,327 @@ +; Index, login, password reset +log_in=登录 +register=注册 +username=用户名 +password=密码 +email=邮箱 +email_address=邮箱地址 + +reset_password=重置密码 +new_password=新密码 +confirm_password=确认密码 + +cancel=取消 + +logged_out=已退出 +session_ended_message=您的会话已结束,请重新登录。 + +; Footer +n_queries={0,number,integer} queries +n_total_queries_n_cached=查询 {0,number,integer} 次,缓存 {1,number,integer} 次 +page_generated_in_n_seconds=页面生成耗时 {0,number} 秒 +real_usage_n_bytes=实际用量 {0,number,integer} 字节 +current_commit_n=当前提交: {0} + +; Installer +install_phproject=安装 Phproject + +; Navbar, basic terminology +new=新建 +sprint=冲刺 +sprints=冲刺 +browse=浏览 +open=开放 +closed=已关闭 +created_by_me=由我创建 +assigned_to_me=分配给我 +issue_search=快速查找问题 +administration=行政管理 +dashboard=信息中心 +issues=工单数 +my_issues=我的工单 +my_account=我的帐户 +configuration=配置 +plugins=插件 +users=用户 +groups=群组 +log_out=注销 +demo_notice=这个网站在演示模式下运行。所有内容是公开的并可能随时被重置。 +loading=加载中... +close=关闭 +related=相关 +current_issue=当前工单 +toggle_navigation=切换导航 + +; Errors +error.loading_issue_history=加载工单历史记录时出错。 +error.loading_issue_watchers=加载工单观察员时出错。 +error.loading_related_issues=加载相关工单时出错。 +error.loading_dependencies=加载依赖项时出错。 +error.404_text=您请求的页面不可用。 + +; Dashboard +taskboard=任务板 +my_projects=我的项目 +my_subprojects=我的子项目 +my_tasks=我的任务 +my_bugs=我的 Bug +repeat_work=重复工作 +my_watchlist=我的观察名单 +add_project=添加项目 +add_task=添加任务 +add_bug=添加 Bug + +; User pages +created_issues=以创建工单 +assigned_issues=已分配工单 +overdue_issues=逾期工单 +issue_tree=工单树 + +; Account +name=名称 +theme=主题 +language=语言 +task_color=任务颜色 +avatar=头像 +edit_on_gravatar=在 Gravatar 上编辑 +save=保存​​ +current_password=当前密码 +profile=个人信息 +default=默认​​​​​ + +; Browse +general=通用 +exact_match=精确匹配 +submit=提交 +export=导出 +go_previous=上一项 +go_next=下一个 + +; Issue fields +cols.id=ID +cols.title=标题​​​ +cols.description=描述 +cols.type=类型 +cols.priority=优先级 +cols.status=状态 +cols.author=作者 +cols.assignee=分配给 +cols.total_spent_hours=总花费工时 +cols.planned_hours=计划的工时 +cols.remaining_hours=剩余工时 +cols.start_date=开始日期 +cols.due_date=截止日期 +cols.repeat_cycle=重复周期 +cols.parent_id=上级 ID +cols.parent=上级 +cols.sprint=冲刺 +cols.created=已创建 +cols.start=开始 +cols.due=截止 +cols.closed=关闭 +cols.hours_spent=已花费工时 +cols.depends_on=依赖于 + +; Issue editing +not_assigned=未分配 +choose_option=选择一个选项 + +repeating=重复 +not_repeating=不重复 +daily=每日 +weekly=每周 +monthly=每月 + +no_sprint=没有冲刺 + +comment=注释 + +send_notifications=发送通知 +reset=重置 +new_n=新建 {0} +edit_n=编辑 {0} +create_n=创建 {0} +save_n=保存 {0} + +; Issue page +mark_complete=标记为已完成 +complete=完成 +reopen=重新打开 +show_on_taskboard=在任务板上显示 +copy=复制 +watch=观察 +unwatch=取消观察 +edit=编辑 +delete=删除 + +files=文件 +upload=上传 +upload_a_file=上传文件 +attached_file=附加文件 +deleted=已删除 +file_name=文件名 +uploaded_by=上传者 +upload_date=上传日期 +file_size=文件大小 +file_deleted=文件已删除。 +undo=撤消 + +comments=评论 +history=历史记录 +watchers=观察员 +child_tasks=子任务 +sibling_tasks=同级任务 +related_tasks=关联任务 + +notifications_sent=已发出的通知 +notifications_not_sent=未发送通知 +a_changed={0} 更改: +a_changed_from_b_to_c={0} 从 {1} 改为 {2} +a_set_to_b={0} 设置为 {1} +a_removed={0} 删除 + +dependencies=依赖项 +dependency=依赖项 +dependent=依赖 +task_depends=这项任务依赖于: +add_dependency=添加依赖关系 +task_dependency=这项任务是其依赖项: +add_dependent=添加依赖 + +; Dependency Types (Finish-Start, Finish-Finish, Start-Start, Start-Finish) +fs=FS +ff=FF +ss=SS +sf=SF + +write_a_comment=写评论... +save_comment=保存评论 + +no_history_available=无历史记录 +add_watcher=添加观察员 + +new_sub_project=新建子项目 +new_task=新建任务 +under_n=在 {0} 下 +no_related_issues=无关联工单 + +copy_issue=复制工单 +copy_issue_details=复制此工单将复制所有其子项。但不会复制评论、文件、历史记录或观察员。 + +deleted_success=工单 #{0} 已成功删除。 +deleted_notice=此工单已被删除。 对其编辑仍会发送通知,但除管理员以外的收件人将无法查看此工单。 +restore_issue=恢复工单 + +comment_delete_confirm=您确定要删除该评论? + +bulk_actions=显示批量操作 +bulk_update=更新所有选定的任务 + +project_overview=项目概述 +project_tree=项目树 +n_complete={0} 完成 +n_child_issues={0} 子工单 + +; Tags +issue_tags=工单标签 +no_tags_created=尚无工单标签被创建。 +tag_help_1=通过将 #标签 添加到工单描述中来创建标签。 +tag_help_2=#标签 可以包含字母、 数字和连字符,并且必须以字母开头。 +view_all_tags=查看所有标签 + +; Taskboard/Backlog +backlog=积压工单 +filter_tasks=筛选任务 +filter_projects=筛选项目 +all_projects=所有项目 +all_tasks=所有任务 +my_groups=我的群组 +burndown=燃尽 +hours_remaining=剩余工时 +ideal_hours_remaining=理想剩余工时 +daily_hours_remaining=每天剩余工时 +project=项目 +subproject=子项目 +track_time_spent=跟踪时间 +burn_hours=燃烧工时 +backlog_old_help_text=拖移项目至此以从冲刺中删除 +previous_sprints=显示以前的冲刺 +future_sprints=显示未来冲刺 + +; Administration +overview=概况 +new_user=新增用户 +edit_user=编辑用户 +require_new_password=下次登录时要求设置新密码 +role=角色 +user=用户 +deactivate=停用 +reactivate=重新激活 +administrator=管理员 +members=成员 +group_name=群组名称 +group_name_saved=群组名称已保存 +manager=经理 +set_as_manager=设为经理 +add_to_group=添加到组 +no_groups_exist=无群组存在。 +new_sprint=新建冲刺 +edit_sprint=编辑冲刺 +start_date=起始日期 +end_date=结束日期 +version=版本 +current_version=当前版本 +update_available=有可用更新 +update_to_n=更新到 {0} +backup_db=您确定吗? \n在继续之前,建议先备份您的数据库。 +show_deactivated_users=显示停用用户。 + +; User Ranks +rank=等级 +ranks.0=访客 +ranks.1=客户 +ranks.2=用户 +ranks.3=经理 +ranks.4=管理员 +ranks.5=超级管理员 +rank_permissions.0=只读 +rank_permissions.1=可以发表评论 +rank_permissions.2=可以创建/编辑工单 +rank_permissions.3=可以删除工单/评论 +rank_permissions.4=可以创建、 编辑或删除用户/群组/冲刺 +rank_permissions.5=可以编辑配置 + +; Config +site_basics=基本设置 +text_parsing=文本解析 +email_smtp_imap=电子邮件 (SMTP/IMAP) +advanced=高级选项 +site_name=站点名称 +site_description=站点描述 +timezone=时区 +default_theme=默认主题 +logo=标志 +allow_public_registration=允许公开注册 +parser_syntax=解析器语法 +advanced_options=高级选项 (默认全部启用) +convert_ids=转换 ID 为链接 +convert_hashtags=转换#标签#为链接 +convert_urls=转换 URL 为链接 +convert_emoticons=转换表情符号为图片 +outgoing_mail=传出邮件 (SMTP) +from_address=寄件地址 +incoming_mail=传入邮件 (IMAP) +hostname=主机名 +debug_level=调试级别 (DEBUG) +cache_mode=缓存模式 (CACHE) +cookie_expiration=Cookie 有效期 (JAR.expire) +max_upload_size=最大上传文件大小 (files.maxsize) +censor_credit_card_numbers=审查信用卡号码(security.block_ccs) +demo_user=演示用户 (site.demo) +config_note=备注 +imap_truncate_lines=IMAP 邮件截断行 (mail.truncate_lines) +package_mail_config_note={0} 使用默认 PHP 邮件配置发送电子邮件。 +imap_settings_note=这里的 IMAP 设置只有在计划任务 {0} 运行时才起作用。 +email_leave_blank=留空禁止外发邮件 +advanced_config_note=可以通过编辑 {0} 数据库表来更改这些值。 + diff --git a/app/model/config.php b/app/model/config.php index d2da6d5c..a36e3b0a 100644 --- a/app/model/config.php +++ b/app/model/config.php @@ -66,7 +66,7 @@ public static function setVal($key, $value) { $f3->set($key, $value); $item = new static(); $item->load(array('attribute = ?', $key)); - $item->attribute = $attribute; + $item->attribute = $key; $item->value = $value; $item->save(); return $item; diff --git a/app/view/admin/config.html b/app/view/admin/config.html index 29398f8b..eaf20216 100644 --- a/app/view/admin/config.html +++ b/app/view/admin/config.html @@ -7,12 +7,6 @@
- - -
@@ -49,16 +43,11 @@
- {{ @dict.allow_public_registration }}
-
- - -
@@ -66,8 +55,8 @@
+

{{ @dict.parser_syntax }}

-

{{ @dict.parser_syntax }}

+

{{ @dict.advanced_options }}

-
- -
-
- -
-
- -
-
- -
@@ -184,11 +154,11 @@
- +
- +
@@ -235,13 +205,6 @@ }, 'json'); }); - // Update classes on active btns - /*$('.btn-group .btn.active').addClass('btn-success'); - $('#frm-config').on('click', '.btn-group', function(e) { - $(this).find('.btn').removeClass('btn-success'); - $(this).find('.active').addClass('btn-success'); - });*/ - }); diff --git a/app/view/blocks/navbar.html b/app/view/blocks/navbar.html index d498b48e..306a3f2c 100644 --- a/app/view/blocks/navbar.html +++ b/app/view/blocks/navbar.html @@ -39,7 +39,7 @@
  • {{ @navitem.title }}
  • - + diff --git a/app/view/install.html b/app/view/install.html index 3e7da063..7712b3b2 100644 --- a/app/view/install.html +++ b/app/view/install.html @@ -61,6 +61,11 @@

    Site Configuration

    + + + + +
    diff --git a/app/view/issues/edit-form.html b/app/view/issues/edit-form.html index b81c3eaa..21a5dad5 100644 --- a/app/view/issues/edit-form.html +++ b/app/view/issues/edit-form.html @@ -16,7 +16,7 @@

    {{ @dict.edit_n,@type.name | format }}

    - +
    @@ -120,7 +120,7 @@

    {{ @dict.edit_n,@type.name | format }}

    - +
    @@ -128,28 +128,28 @@

    {{ @dict.edit_n,@type.name | format }}

    - +
    - +
    - +
    - +
    @@ -169,10 +169,10 @@

    {{ @dict.edit_n,@type.name | format }}

    - + - +
    diff --git a/app/view/issues/project.html b/app/view/issues/project.html index c3e92f37..7c001ca9 100644 --- a/app/view/issues/project.html +++ b/app/view/issues/project.html @@ -30,14 +30,30 @@

    {{ @project.name | esc }} #{{ @project.id }}

    {{ @project.description | parseText }}

    -

    {{ @dict.project_overview }}

    - -
    -
    - {{ @dict.n_complete, @percentComplete.'%' | format }} + +
    +
    +

    {{ @dict.project_overview }}

    + +
    +
    + {{ @dict.n_complete, @percentComplete.'%' | format }} +
    +
    + {{ @dict.n_complete,@stats.complete.'/'.@stats.total | format }} +
    +
    + +
    + {{ @dict.cols.hours_spent }} +
    {{ @stats.hours_spent }}
    +
    +
    + {{ @dict.cols.planned_hours }} +
    {{ @stats.hours_total }}
    +
    - {{ @dict.n_complete,@stats.complete.'/'.@stats.total | format }}
    diff --git a/app/view/issues/single.html b/app/view/issues/single.html index 8c62efcc..54d574c7 100644 --- a/app/view/issues/single.html +++ b/app/view/issues/single.html @@ -253,6 +253,7 @@

    +
    @@ -554,11 +555,13 @@ $("#form-edit").slideToggle("fast"); if(!hasClickedEdit) { hasClickedEdit = true; - var simplemde = new SimpleMDE({ - element: $('input[name="description"]')[0], - toolbar: ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', '|', 'preview', 'guide'] - }); - simplemde.render(); + if(typeof window.SimpleMDE != 'undefined') { + var simplemde = new SimpleMDE({ + element: $('input[name="description"]')[0], + toolbar: ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', '|', 'preview', 'guide'] + }); + simplemde.render(); + } } e.preventDefault(); }); @@ -571,24 +574,24 @@ }); // Handle file deletion - $(".file-list").on("click", ".delete", function(e) { - var $file = $(this).parents("li, tr"); - $file.fadeTo(100, 0.5).popover("hide"); - $.post(BASE + "/issues/file/delete", {id: $file.data("id")}, function(data) { - $("#alert span").html('{{ @dict.file_deleted }} {{ @dict.undo }}'); - $("#alert").show(); + $('.file-list').on('click', '.delete', function(e) { + var $file = $(this).parents('li, tr'); + $file.fadeTo(100, 0.5).popover('hide'); + $.post(BASE + '/issues/file/delete', {id: $file.data('id')}, function(data) { + $('#alert span').html('{{ @dict.file_deleted }} {{ @dict.undo }}'); + $('#alert').show(); $(".file-list li[data-id='" + data.id + "'], .file-list tr[data-id='" + data.id + "']").remove(); - }, "json"); + }, 'json'); }); // Handle alert hide - $("#alert .close").click(function(e) { - $("#alert span").empty(); - $("#alert").hide(); + $('#alert .close').click(function(e) { + $('#alert span').empty(); + $('#alert').hide(); }); // Handle comment deletion - $(".comments").on("click", ".comment-delete", function(e) { + $('.comments').on('click', '.comment-delete', function(e) { if(confirm("{{ @dict.comment_delete_confirm }}")) { var $comment = $(this).parents(".media"); $comment.css("text-decoration", "line-through"); @@ -598,6 +601,16 @@ } }); + // Handle attachment adding button + $('#btn-attach-file').click(function(e) { + $('#file_comment_textarea').val($('#comment_textarea').val()); + }); + + // Reset file upload form on close + $('#upload').on('hidden.bs.modal', function() { + $('#upload')[0].reset(); + }); + $('input[name="parent_id"]').typeahead({ classNames: { menu: 'dropdown-menu', diff --git a/css/bootstrap-thrive.css b/css/bootstrap-thrive.css index 47112667..d1d5b40f 100644 --- a/css/bootstrap-thrive.css +++ b/css/bootstrap-thrive.css @@ -5101,7 +5101,7 @@ a{transition:color .25s;} .navbar-default .navbar-brand:hover, .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #B7FF00; + color: #7BC243; } .navbar-form[role="search"] input[type="search"] { border: none; diff --git a/index.php b/index.php index e744c70b..66c11a62 100644 --- a/index.php +++ b/index.php @@ -25,7 +25,7 @@ // Get current Git revision if(is_file(".git/refs/heads/master")) { - $f3->set("revision", file_get_contents(".git/refs/heads/master")); + $f3->set("revision", trim(file_get_contents(".git/refs/heads/master"))); } else { $f3->set("revision", ""); } diff --git a/js/global.js b/js/global.js index 4236ff2b..f760b499 100644 --- a/js/global.js +++ b/js/global.js @@ -153,7 +153,6 @@ $(document).ready(function() { } break; default: - console.log(e); if(!e.shiftKey && !e.ctrlKey && e.altKey && issue_types.indexOf(e.which - 48) >= 0) { window.location = BASE + '/issues/new/' + (e.which - 48); }