summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBharat Mediratta <bharat@menalto.com>2009-08-29 10:49:25 -0700
committerBharat Mediratta <bharat@menalto.com>2009-08-29 10:49:25 -0700
commit1527f149a90a46428c48b4b811d4b8ecc10b9d2c (patch)
tree5132259e5e703dce92e8a025d007de3b220d8457
parentb833cb607323000b987428c94995e18a9d07df65 (diff)
parentb518a5173da57d65d454518fd2400fe28cdfef3c (diff)
Merge branch 'master' of git@github.com:gallery/gallery3
-rw-r--r--installer/installer.php7
-rw-r--r--installer/views/invalid_db_version.html.php5
-rw-r--r--installer/web.php2
-rw-r--r--lib/gallery.common.js15
-rw-r--r--lib/gallery.dialog.js8
-rw-r--r--modules/comment/helpers/comment_theme.php2
-rw-r--r--modules/comment/js/comment.js10
-rw-r--r--modules/comment/views/comments.html.php10
-rw-r--r--modules/gallery/controllers/admin_languages.php52
-rw-r--r--modules/gallery/controllers/l10n_client.php13
-rw-r--r--modules/gallery/views/admin_languages.html.php103
-rw-r--r--themes/admin_default/css/admin_screen.css28
-rw-r--r--themes/admin_default/css/screen.css2
-rw-r--r--themes/default/css/screen.css32
-rw-r--r--themes/default/js/ui.init.js72
-rw-r--r--themes/default/views/movie.html.php3
-rw-r--r--themes/default/views/photo.html.php3
17 files changed, 235 insertions, 132 deletions
diff --git a/installer/installer.php b/installer/installer.php
index b0af561e..456cffaa 100644
--- a/installer/installer.php
+++ b/installer/installer.php
@@ -104,6 +104,13 @@ class installer {
mysql_select_db($config["dbname"]);
}
+ static function verify_version($config) {
+ $result = mysql_query("SHOW VARIABLES WHERE variable_name = \"version\"");
+ $row = mysql_fetch_object($result);
+ $version = substr($row->Value, 0, strpos($row->Value, "-"));
+ return version_compare($version, "5.0.0", ">=");
+ }
+
static function db_empty($config) {
$query = "SHOW TABLES IN {$config['dbname']} LIKE '{$config['prefix']}items'";
return mysql_num_rows(mysql_query($query)) == 0;
diff --git a/installer/views/invalid_db_version.html.php b/installer/views/invalid_db_version.html.php
new file mode 100644
index 00000000..8776ac35
--- /dev/null
+++ b/installer/views/invalid_db_version.html.php
@@ -0,0 +1,5 @@
+<?php defined("SYSPATH") or die("No direct script access.") ?>
+<h1> Uh oh! </h1>
+<p class="error">
+ The MySql database that you are referencing is less than the minimum version of 5.0.0.
+</p>
diff --git a/installer/web.php b/installer/web.php
index f31c0644..aceb5368 100644
--- a/installer/web.php
+++ b/installer/web.php
@@ -41,6 +41,8 @@ if (installer::already_installed()) {
if (!installer::connect($config)) {
$content = render("invalid_db_info.html.php");
+ } else if (!installer::verify_version($config)) {
+ $content = render("invalid_db_version.html.php");
} else if (!installer::select_db($config)) {
$content = render("missing_db.html.php");
} else if (!installer::db_empty($config)) {
diff --git a/lib/gallery.common.js b/lib/gallery.common.js
index a959d90d..c6a619c1 100644
--- a/lib/gallery.common.js
+++ b/lib/gallery.common.js
@@ -140,19 +140,18 @@
/* after scaling the width, check that the height fits */
if (imageHeight > height) {
- ratio = height / imageHeight;
- imageWidth *= ratio;
- imageHeight *= ratio;
+ ratio = height / imageHeight;
+ imageWidth *= ratio;
+ imageHeight *= ratio;
}
// handle the case where the calculation is almost zero (2.14e-14)
return {
- top: Number((height - imageHeight) / 2),
- left: Number((width - imageWidth) / 2),
- width: Number(imageWidth),
- height: Number(imageHeight)
+ top: Number((height - imageHeight) / 2),
+ left: Number((width - imageWidth) / 2),
+ width: Number(imageWidth),
+ height: Number(imageHeight)
};
};
})(jQuery);
-
diff --git a/lib/gallery.dialog.js b/lib/gallery.dialog.js
index ace588f6..d1ea3edf 100644
--- a/lib/gallery.dialog.js
+++ b/lib/gallery.dialog.js
@@ -30,7 +30,7 @@
$("#gDialog").html(data).gallery_show_loading();
if ($("#gDialog form").length) {
- self._trigger("form_loaded", null, $("#gDialog form"));
+ self.form_loaded(null, $("#gDialog form"));
}
self._layout();
@@ -70,7 +70,7 @@
$("#gDialog").dialog('option', 'width', dialogWidth);
},
- form_loaded: function event(event, ui) {
+ form_loaded: function(event, ui) {
// Should be defined (and localized) in the theme
MSG_CANCEL = MSG_CANCEL || 'Cancel';
var eCancel = '<a href="#" class="gCancel">' + MSG_CANCEL + '</a>';
@@ -78,7 +78,7 @@
$("#gDialog .submit").addClass("ui-state-default ui-corner-all");
$("#gDialog .submit").parent().append(eCancel);
$("#gDialog .gCancel").click(function(event) {
- $("gDialog").dialog("close");
+ $("#gDialog").dialog("close");
event.preventDefault();
});
}
@@ -92,7 +92,7 @@
);
},
- close_dialog: function (event, ui) {
+ close_dialog: function(event, ui) {
var self = $("#gDialog").dialog("option", "self");
if ($("#gDialog form").length) {
self._trigger("form_closing", null, $("#gDialog form"));
diff --git a/modules/comment/helpers/comment_theme.php b/modules/comment/helpers/comment_theme.php
index b807e2cf..38a00b5c 100644
--- a/modules/comment/helpers/comment_theme.php
+++ b/modules/comment/helpers/comment_theme.php
@@ -26,7 +26,6 @@ class comment_theme_Core {
static function photo_bottom($theme) {
$block = new Block;
$block->css_id = "gComments";
- $block->anchor = t("comments");
$block->title = t("Comments");
$view = new View("comments.html");
@@ -37,7 +36,6 @@ class comment_theme_Core {
->find_all();
$block->content = $view;
- $block->content .= comment::get_add_form($theme->item())->render("form.html");
return $block;
}
} \ No newline at end of file
diff --git a/modules/comment/js/comment.js b/modules/comment/js/comment.js
index 00fc6027..9fd63c1a 100644
--- a/modules/comment/js/comment.js
+++ b/modules/comment/js/comment.js
@@ -1,5 +1,13 @@
$("document").ready(function() {
- ajaxify_comment_form();
+ $("#gAddCommentButton").click(function(event) {
+ event.preventDefault();
+ $.get($(this).attr("href"),
+ {},
+ function(data) {
+ $("#gCommentDetail").append(data);
+ ajaxify_comment_form();
+ });
+ });
});
function ajaxify_comment_form() {
diff --git a/modules/comment/views/comments.html.php b/modules/comment/views/comments.html.php
index f7251389..6dce9971 100644
--- a/modules/comment/views/comments.html.php
+++ b/modules/comment/views/comments.html.php
@@ -1,11 +1,17 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
+ <a href="<?= url::site("form/add/comments/{$item->id})") ?>" id="gAddCommentButton"
+ class="gButtonLink ui-corner-all ui-icon-left ui-state-default right">
+ <span class="ui-icon ui-icon-comment"></span>
+ <?= t("Add a comment") ?>
+</a>
+<div id="gCommentDetail">
<? if (!$comments->count()): ?>
<p id="gNoCommentsYet">
<?= t("No comments yet. Be the first to <a %attrs>comment</a>!",
array("attrs" => "href=\"#add_comment_form\" class=\"showCommentForm\"")) ?>
</p>
<? endif ?>
-<ul id="gComments">
+<ul>
<? foreach ($comments as $comment): ?>
<li id="gComment-<?= $comment->id ?>">
<p class="gAuthor">
@@ -26,4 +32,4 @@
</li>
<? endforeach ?>
</ul>
-<a name="add_comment_form"></a>
+</div>
diff --git a/modules/gallery/controllers/admin_languages.php b/modules/gallery/controllers/admin_languages.php
index ae90ad07..6dc242c6 100644
--- a/modules/gallery/controllers/admin_languages.php
+++ b/modules/gallery/controllers/admin_languages.php
@@ -21,7 +21,10 @@ class Admin_Languages_Controller extends Admin_Controller {
public function index($share_translations_form=null) {
$v = new Admin_View("admin.html");
$v->content = new View("admin_languages.html");
- $v->content->settings_form = $this->_languages_form();
+ $v->content->available_locales = locales::available();
+ $v->content->installed_locales = locales::installed();
+ $v->content->default_locale = module::get_var("gallery", "default_locale");
+
if (empty($share_translations_form)) {
$share_translations_form = $this->_share_translations_form();
}
@@ -32,14 +35,21 @@ class Admin_Languages_Controller extends Admin_Controller {
public function save() {
access::verify_csrf();
-
- $form = $this->_languages_form();
- if ($form->validate()) {
- module::set_var("gallery", "default_locale", $form->choose_language->locale->value);
- locales::update_installed($form->choose_language->installed_locales->value);
- message::success(t("Settings saved"));
- }
- url::redirect("admin/languages");
+
+ locales::update_installed($this->input->post("installed_locales"));
+
+ $installed_locales = array_keys(locales::installed());
+ $new_default_locale = $this->input->post("default_locale");
+ if (!in_array($new_default_locale, $installed_locales)) {
+ if (!empty($installed_locales)) {
+ $new_default_locale = $installed_locales[0];
+ } else {
+ $new_default_locale = "en_US";
+ }
+ }
+ module::set_var("gallery", "default_locale", $new_default_locale);
+
+ print json_encode(array("result" => "success"));
}
public function share() {
@@ -88,30 +98,6 @@ class Admin_Languages_Controller extends Admin_Controller {
}
}
- private function _languages_form() {
- $all_locales = locales::available();
- $installed_locales = locales::installed();
- $form = new Forge("admin/languages/save", "", "post", array("id" => "gLanguageSettingsForm"));
- $group = $form->group("choose_language")
- ->label(t("Language settings"));
- $group->dropdown("locale")
- ->options($installed_locales)
- ->selected(module::get_var("gallery", "default_locale"))
- ->label(t("Default language"))
- ->rules('required');
-
- $installation_options = array();
- foreach ($all_locales as $code => $display_name) {
- $installation_options[$code] = array($display_name, isset($installed_locales->$code));
- }
- $group->checklist("installed_locales")
- ->label(t("Installed Languages"))
- ->options($installation_options)
- ->rules("required");
- $group->submit("save")->value(t("Save settings"));
- return $form;
- }
-
private function _outgoing_translations_count() {
return ORM::factory("outgoing_translation")->count_all();
}
diff --git a/modules/gallery/controllers/l10n_client.php b/modules/gallery/controllers/l10n_client.php
index 831c79c1..0775791e 100644
--- a/modules/gallery/controllers/l10n_client.php
+++ b/modules/gallery/controllers/l10n_client.php
@@ -90,10 +90,15 @@ class L10n_Client_Controller extends Controller {
}
$session = Session::instance();
- $session->set("l10n_mode",
- !$session->get("l10n_mode", false));
-
- url::redirect("albums/1");
+ $l10n_mode = $session->get("l10n_mode", false);
+ $session->set("l10n_mode", !$l10n_mode);
+
+ $redirect_url = "admin/languages";
+ if (!$l10n_mode) {
+ $redirect_url .= "#l10n-client";
+ }
+
+ url::redirect($redirect_url);
}
private static function _l10n_client_search_form() {
diff --git a/modules/gallery/views/admin_languages.html.php b/modules/gallery/views/admin_languages.html.php
index f41694b4..4025437a 100644
--- a/modules/gallery/views/admin_languages.html.php
+++ b/modules/gallery/views/admin_languages.html.php
@@ -1,15 +1,100 @@
<?php defined("SYSPATH") or die("No direct script access.") ?>
<div id="gLanguages">
- <h2> <?= t("Languages") ?> </h2>
+ <h1> <?= t("Languages") ?> </h1>
+ <p>
+ <?= t("Install new languages, update installed ones and set the default language for your Gallery.") ?>
+ </p>
- <?= $settings_form ?>
-
- <h2> <?= t("Download translations") ?> </h2>
- <a href="<?= url::site("admin/maintenance/start/gallery_task::update_l10n?csrf=$csrf") ?>"
- class="gDialogLink">
- <?= t("Get updates") ?>
- </a>
+ <form id="gLanguagesForm" method="post" action="<?= url::site("admin/languages/save") ?>">
+ <?= access::csrf_form_field() ?>
+ <table>
+ <tr>
+ <th> <?= t("Installed") ?> </th>
+ <th> <?= t("Language") ?> </th>
+ <th> <?= t("Default language") ?> </th>
+ </tr>
+ <? $i = 0 ?>
+ <? foreach ($available_locales as $code => $display_name): ?>
+
+ <? if ($i == (count($available_locales)/2)): ?>
+ <table>
+ <tr>
+ <th> <?= t("Installed") ?> </th>
+ <th> <?= t("Language") ?> </th>
+ <th> <?= t("Default language") ?> </th>
+ </tr>
+ <? endif ?>
+
+ <tr class="<?= (isset($installed_locales[$code])) ? "installed" : "" ?><?= ($default_locale == $code) ? " default" : "" ?>">
+ <td> <?= form::checkbox("installed_locales[]", $code, isset($installed_locales[$code])) ?> </td>
+ <td> <?= $display_name ?> </td>
+ <td>
+ <?= form::radio("default_locale", $code, ($default_locale == $code), ((isset($installed_locales[$code]))?'':'disabled="disabled"') ) ?>
+ </td>
+ </tr>
+ <? $i++ ?>
+
+ <? endforeach ?>
+ </table>
+ <input type="submit" value="<?= t("Update languages") ?>" />
+ </form>
+
+ <script type="text/javascript">
+ var old_default_locale = "<?= $default_locale ?>";
+
+ $("input[name='installed_locales[]']").change(function (event) {
+ if (this.checked) {
+ $("input[type='radio'][value='" + this.value + "']").enable();
+ } else {
+ if ($("input[type='radio'][value='" + this.value + "']").selected()) { // if you deselect your default language, switch to some other installed language
+ $("input[type='radio'][value='" + old_default_locale + "']").attr("checked", "checked");
+ }
+ $("input[type='radio'][value='" + this.value + "']").attr("disabled", "disabled");
+ }
+ });
+
+ $("#gLanguagesForm").ajaxForm({
+ dataType: "json",
+ success: function(data) {
+ if (data.result == "success") {
+ el = $('<a href="<?= url::site("admin/maintenance/start/gallery_task::update_l10n?csrf=$csrf") ?>"></a>'); // this is a little hack to trigger the update_l10n task in a dialog
+ el.gallery_dialog();
+ el.trigger('click');
+ }
+ }
+ });
+ </script>
+</div>
- <h2> <?= t("Your Own Translations") ?> </h2>
+<div id="gTranslations">
+ <h1> <?= t("Translations") ?> </h1>
+ <p>
+ <?= t("Create your own translations and share them with the rest of the Gallery community.") ?>
+ </p>
+
+ <h3><?= t("Translating Gallery") ?></h3>
+
+ <div class="gBlock">
+ <a href="http://codex.gallery2.org/Gallery3:Localization" target="_blank"
+ class="gDocLink ui-state-default ui-corner-all ui-icon ui-icon-help"
+ title="<?= t("Localization documentation") ?>">
+ <?= t("Localization documentation") ?>
+ </a>
+
+ <p><strong><?= t("Step 1") ?>:</strong> <?= t("Make sure the target language is installed and updated (check above).") ?></p>
+
+ <p><strong><?= t("Step 2") ?>:</strong> <?= t("Make sure the target language is the active one (currently '").locales::display_name()."')." ?></p>
+
+ <p><strong><?= t("Step 3") ?>:</strong> <?= t("Start the translation mode and the translation interface will appear at the bottom of each Gallery page.") ?></p>
+
+ <a href="<?= url::site("l10n_client/toggle_l10n_mode?csrf=".access::csrf_token()) ?>"
+ class="gButtonLink ui-state-default ui-corner-all ui-icon-left">
+ <span class="ui-icon ui-icon-power"></span>
+ <?= t((Session::instance()->get("l10n_mode", false)) ? "Stop translation mode" : "Start translation mode") ?>
+ </a>
+ </div>
+
+ <h3>Sharing your translations</h3>
+
<?= $share_translations_form ?>
</div>
diff --git a/themes/admin_default/css/admin_screen.css b/themes/admin_default/css/admin_screen.css
index d408acf0..3083114c 100644
--- a/themes/admin_default/css/admin_screen.css
+++ b/themes/admin_default/css/admin_screen.css
@@ -451,8 +451,30 @@ li.gDefaultGroup h4, li.gDefaultGroup .gUser {
cursor: pointer;
}
-#gLanguageSettingsForm .checklist li {
- width: 150px;
- overflow: hidden;
+#gLanguagesForm table {
+ width: 400px;
+ float: left;
+ margin: 0 3em 1em 0;
+}
+#gLanguagesForm .installed {
+ background-color: #EEEEEE;
+}
+#gLanguagesForm .default {
+ background-color: #C5DBEC;
+ font-weight: bold;
+}
+#gLanguagesForm input {
+ clear: both;
}
+#gTranslations {
+ padding: 2em 0 0 0;
+ clear: both;
+}
+#gTranslations .gButtonLink {
+ padding: .5em;
+}
+
+.gDocLink {
+ float: right;
+}
diff --git a/themes/admin_default/css/screen.css b/themes/admin_default/css/screen.css
index 88631e81..062c0e41 100644
--- a/themes/admin_default/css/screen.css
+++ b/themes/admin_default/css/screen.css
@@ -276,7 +276,7 @@ li.gError select {
/* Status messages ~~~~~~~~~~~~~~~~~~~~~~~ */
#gMessage {
- width: 99%;
+ width: 100%;
}
#gAdminAkismet .gSuccess,
diff --git a/themes/default/css/screen.css b/themes/default/css/screen.css
index ecae2bb2..d39152e4 100644
--- a/themes/default/css/screen.css
+++ b/themes/default/css/screen.css
@@ -276,7 +276,7 @@ li.gError select {
/* Status messages ~~~~~~~~~~~~~~~~~~~~~~~ */
#gMessage {
- width: 99%;
+ width: 100%;
}
#gAdminAkismet .gSuccess,
@@ -406,7 +406,6 @@ form .gError,
}
#gSidebar {
- background-color: #fff;
font-size: .9em;
padding: 0 20px;
width: 220px;
@@ -492,23 +491,13 @@ form .gError,
width: 16px;
}
-#gContent #gAlbumGrid #gHoverItem {
+#gContent #gAlbumGrid .gHoverItem {
background-color: #fff;
border: 1px solid #000;
- display: none;
- height: auto;
- padding: 0;
- position: absolute;
- width: auto;
- z-index: 100;
}
-#gContent #gAlbumGrid #gHoverItem .gItem {
- border: none;
-}
-
-#gContent #gHoverItem .gItem h2,
-#gContent #gHoverItem .gItem .gMetadata {
+#gContent .gHoverItem h2,
+#gContent .gHoverItem .gMetadata {
display: block;
}
@@ -530,6 +519,7 @@ form .gError,
#gContent #gComments {
margin-top: 2em;
+ position: relative;
}
#gContent #gComments ul li {
@@ -561,6 +551,12 @@ form .gError,
width: 32px;
}
+#gAddCommentButton {
+ position: absolute;
+ right: 0;
+ top: 2px;
+}
+
#gContent #gAddCommentForm {
margin-top: 2em;
}
@@ -647,15 +643,15 @@ form .gError,
line-height: 1.6em;
}
-#gHoverItem .gContextMenu {
+.gHoverItem .gContextMenu {
display: block;
}
-#gHoverItem .gContextMenu li {
+.gHoverItem .gContextMenu li {
text-align: left;
}
-#gHoverItem .gContextMenu a:hover {
+.gHoverItem .gContextMenu a:hover {
text-decoration: none;
}
diff --git a/themes/default/js/ui.init.js b/themes/default/js/ui.init.js
index 2391f638..949933e9 100644
--- a/themes/default/js/ui.init.js
+++ b/themes/default/js/ui.init.js
@@ -62,39 +62,41 @@ $(document).ready(function() {
// Initialize context menus
$(".gItem").hover(
function(){
+ // Insert invisible placeholder to hold the item's position in the grid
+ var placeHolder = $(this).clone();
+ $(placeHolder).attr("id", "gPlaceHolder");
+ $(placeHolder).css("visibility", "hidden");
+ $(this).after($(placeHolder));
+ // Style and position the item
+ $(this).addClass("gHoverItem");
var position = $(this).position();
- var item_classes = $(this).attr("class");
- var bg_color = $(this).css("background-color");
- var container = $(this).parent();
- $("#gHoverItem").remove();
- container.append("<div id=\"gHoverItem\"><div class=\"" + item_classes + "\">"
- + $(this).html() + "</div></div>");
- $("#gHoverItem").css("top", position.top);
- $("#gHoverItem").css("left", position.left);
- $("#gHoverItem").css("background-color", bg_color);
- $.fn.gallery_hover_init();
- var v_align = $(this).find(".gValign");
+ $(this).css("position", "absolute");
+ $(this).css("top", position.top);
+ $(this).css("left", position.left);
+ $(this).css("z-index", "1000");
+ // Initialize the contextual menu
+ $(this).gallery_context_menu();
+ // Set height based on height of descendents
var title = $(this).find("h2");
var meta = $(this).find(".gMetadata");
- var context = $(this).find(".gContextMenu");
var context_label = $(this).find(".gContextMenu li:first");
- $("#gHoverItem .gItem").height(
- $(v_align).gallery_height()
- + $(title).gallery_height()
- + $(meta).gallery_height()
- + parseInt($(context).css("margin-top").replace("px",""))
- + $(context_label).gallery_height()
- );
-
- $("#gHoverItem").fadeIn("fast");
- $("#gHoverItem").hover(
- function(){
- $(this).gallery_context_menu();
- },
- function() {
- $(this).hide();
- }
- );
+ var item_ht = $(this).height();
+ var title_ht = $(title).gallery_height();
+ var meta_ht = $(meta).gallery_height();
+ var context_label_ht = $(context_label).gallery_height();
+ $(this).height(item_ht + title_ht + meta_ht + context_label_ht);
+ },
+ function() {
+ // Reset item height, position, and z-index
+ var sib_height = $(this).next().height();
+ $(this).css("height", sib_height);
+ $(this).css("position", "relative");
+ $(this).css("top", null);
+ $(this).css("left", null);
+ $(this).css("z-index", null);
+ // Remove the placeholder and hover class from the item
+ $("#gPlaceHolder").remove();
+ $(this).removeClass("gHoverItem");
}
);
}
@@ -110,18 +112,6 @@ $(document).ready(function() {
$(this).gallery_context_menu();
});
- // Collapse comments form, insert button to expand
- if ($("#gAddCommentForm").length) {
- var showCommentForm = '<a href="#add_comment_form"'
- + ' class="showCommentForm gButtonLink ui-corner-all ui-icon-left ui-state-default right">'
- + '<span class="ui-icon ui-icon-comment"></span>' + ADD_A_COMMENT + '</a>';
- $("#gAddCommentForm").hide();
- $("#gComments").prepend(showCommentForm);
- $(".showCommentForm").click(function(){
- $("#gAddCommentForm").show(1000);
- });
- }
-
// Add scroll effect for links to named anchors
$.localScroll({
queue: true,
diff --git a/themes/default/views/movie.html.php b/themes/default/views/movie.html.php
index c8ecd769..29789f8e 100644
--- a/themes/default/views/movie.html.php
+++ b/themes/default/views/movie.html.php
@@ -32,9 +32,6 @@
<div><?= nl2br(p::purify($item->description)) ?></div>
</div>
- <script type="text/javascript">
- var ADD_A_COMMENT = "<?= t("Add a comment") ?>";
- </script>
<?= $theme->photo_bottom() ?>
<?= $theme->context_menu($item, "#gMovieId-{$item->id}") ?>
</div>
diff --git a/themes/default/views/photo.html.php b/themes/default/views/photo.html.php
index fa5def47..39e61ef6 100644
--- a/themes/default/views/photo.html.php
+++ b/themes/default/views/photo.html.php
@@ -55,8 +55,5 @@
<div><?= nl2br(p::purify($item->description)) ?></div>
</div>
- <script type="text/javascript">
- var ADD_A_COMMENT = "<?= t("Add a comment") ?>";
- </script>
<?= $theme->photo_bottom() ?>
</div>