You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nobody 5e3b466b9b simplify logic, generate strings file 3 weeks ago
generate-hooks-index Update git repo URLs with URLs 4 years ago
hubzilla_er bring back the schemaspy makefile 6 years ago
py httpsig: improve cache lookups 2 months ago
.htaccess Compatible update for .htaccess. 7 years ago
Doxyfile modify item export api call, plus a few changes from upstream 3 years ago
Doxygen.footer remove date on the footer 9 years ago
Doxygen_phpvarfilter.php 💡 Add Doxygen fix for @var member variable documentation. 5 years ago
README cleanup of really old and obsolete stuff from util 1 year ago
add_addon_repo add versioning to plugin repo 2 years ago
add_theme_repo address globbing issue in #1170 4 years ago
add_widget_repo address globbing issue in #1170 4 years ago
addons scripted replace of 'array()' with '[]' 9 months ago
admins share fixes 3 years ago
config share fixes 3 years ago document the config cli tool 9 years ago
connect cleanup of really old and obsolete stuff from util 1 year ago
db_update allow running util/db_update directly from the shell 1 year ago
dcp Deprecate the term 'master' from the codebase. 1 year ago
dmkdir split off libsync from libzot 4 years ago
docblox_errorchecker.php scripted replace of 'array()' with '[]' 9 months ago
genhook begin hook documentation yet again 8 months ago
gtfiles update 5 months ago
importdoc module updates 6 years ago
maintenance Bring back maintenance mode. I personally dislike this because when things go wrong you have to know that you need to disable maintenance mode manually and people never discover this until they are locked out of their sites and panicking. But we absolutely need a way to shut down server activity so we can work on it. 1 year ago
makedocs disable pcss when installing since modules don't yet work and pcss uses the view module, plus weekly doc update 9 years ago
messages.po simplify logic, generate strings file 3 weeks ago
nsh nsh: provide wildcard matching on "ls" filenames 2 months ago
pconfig util/pconfig: when called with no arguments this script returns a list of local channels. That's fine, but we really shouldn't include deleted channels 8 months ago
php2po.php undo hmessages.po and hstrings.php hack 3 years ago
phplogtime addd followers/following counts to chanview 5 months ago
po2php.php cleanup of really old and obsolete stuff from util 1 year ago
precompile_smarty3.php move smarty compiled files to store/[data]/smarty3 - which puts all writeable areas of the server except the config file and logs under the "store" directory. We'll do logs at a future time. 8 years ago update 5 months ago
safemode new utility: util/safemode (on or off); requires util/addons 6 years ago
schemaspy Correct directory (this runs from inside hubzilla_er 6 years ago
service_class update util/service_class to use serialise (with an s) 3 years ago
storageconv revisit the hyperdrive settings and remove some obsolete "federation" settings. 3 years ago
strings.php cleanup of really old and obsolete stuff from util 1 year ago
typo.php undo hmessages.po and hstrings.php hack 3 years ago
typohelper.php ditto for typohelper 6 years ago
udall udall - fix from upstream 3 years ago
update_addon_repo wrong test 2 years ago
update_theme_repo address globbing issue in #1170 4 years ago
update_widget_repo address globbing issue in #1170 4 years ago
zap_post cleanup of really old and obsolete stuff from util 1 year ago



typo.php - is a crude syntax checker to avoid checking in files with simple
typos. It basically just loads each of our project files at once. Run from
cmdline and see if any parsing errors are reported.

Internationalisation - extracts translatable strings from our project files.

strings.php - a recent run of the po2php program. This provides output that
is suitable for direct inclusion in the program.

There are also translatable strings in the various files in the view/en
directory. By setting $lang = 'something' in .htconfig.php, the application
will search for view/something/filename prior to the English version in
view/en/filename when loading templates and view files.

The translated string table should be placed in view/$lang/strings.php for
automatic inclusion.

You are not restricted to using known languages. You may also use this to
translate the software into "pirate", "surfer" or merely to replace certain
text which you don't care for.

Note: The view/en directory contains many HTML template files, some of which
only have a few words of English text amongst the HTML. Over time we will move
the translation to the replace_macros() function which calls these files and
then relocate the files to the view directory. The files in the top-level view
directory are template files which do not require translation.


Do not translate placeholders in strings! Things like %s, %d, %1$s and $somename
are used to add dynamic content to the string.

%s represents a dynamic string, like in "Welcome to %s"
%d represents a dynamic number, like in "%d new messages"
$somename is a variable like in php
In %1$s %2$s, the numbers are the position index of multiple dynamic content.
You could swap position in string of indexed placeholders.
"%1$s's %2$s" => "John's photo", "John's item"
"%2$s di %1$s" => "foto di John", "elemento di John"


The tt() function supports plural form. Script extract.php write this in
strings.php as an array, one string for every plural form language supports:

App::$string["%d message sent"] = Array(
0 => "%d message sent",
1 => "%d messages sent",

The function string_plural_select($n) defined in strings.php, return the string
index to use, related to the numbers of item (value of $n).

This is modelled after ngettext function of GNU gettext.
More info at

Xgettext and .po workflow

1. Run util/ script (on *unix sistems, with GNU xgettext installed)
This script runs xgettext on source tree, extracting strings from t() and tt()
functions, and creates a util/messages.po file.

% cd util; ./ ../view/{language}/messages.po

Replace {language} with the language you are working on - e.g. 'es', 'fr', 'de', etc.

2. copy util/messages.po to view/<langauage>/messages.po
3. open view/<langauage>/messages.po with a text editor and fill in infos in
"Last-Translator: FULL NAME <EMAIL@ADDRESS>"
"Language-Team: LANGUAGE <>\n"
"Language: \n"

"Last-Translator: Guybrush Threepwood <>"
"Language-Team: Pirate Friendika <>\n"
"Language: pi\n"

For the line
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
read GNU gettext manual at

4. You could then translate the strings in text editor, but I suggest to use one
of the many .po editors out there, like QtLinguist

5. run
$ php util/po2php.php view/<language>/messages.po
to create the strings.php file

When strings are added or modified in source, you could run
$ cd util; ./ ../view/<language>/messages.po
to extract strings from source files and join them with the existing .po file:
new strings are added, the existing are not overwritten.

If you already translated the Hubzilla using strings.php, you could import your old
translation to messages.po. Run:
$ php util/php2po.php view/<language>/strings.php

You may also use the util/string_translator.php web interface to translate the string file, but it is disabled for website security reasons. The web server will need write permission to your language directories and the "Deny ..." line in util/.htaccess will need to be modified or commented to use the utility.