Hubzilla core code
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.
Mario de7891771d update strings 8 months ago
fpostit fpostit by Devlon Duthied added to utils 8 years ago
generate-hooks-index Update git repo URLs with URLs 2 years ago
hubzilla_er bring back the schemaspy makefile 4 years ago
shredder shebang portable 2 years ago
zotsh fix bitrot in util/zotsh 10 months ago
.htaccess Compatible update for .htaccess. 5 years ago
Doxyfile Publish doxygen API documentation at gitlab pages. 1 year ago
Doxygen.footer remove date on the footer 7 years ago
Doxygen_phpvarfilter.php 💡 Add Doxygen fix for @var member variable documentation. 3 years ago
README static App 4 years ago
add_addon_repo address globbing issue in #1170 2 years ago
add_theme_repo address globbing issue in #1170 2 years ago
add_widget_repo address globbing issue in #1170 2 years ago
addons Add reload to util/addons 1 year ago
admins cleanup of cli admin tool 1 year ago
config issue #531 - util/config and postgres 3 years ago document the config cli tool 7 years ago
connect command line connect utility. 3 years ago
db_update.php move db_upgrade to zlib 3 years ago
dcp hubzilla core issue #1276 1 year ago
dmkdir a few file activities were not getting synced 2 years ago
docblox_errorchecker.php Enabled automated doc building. Changes: 8 years ago
extract.php static App 4 years ago
fresh get rid of get_app() 3 years ago doc cleanup 7 years ago more work on settings - move template utils to utils and get rid of mods 7 years ago
hmessages.po update strings 8 months ago
hstrings.php static App 4 years ago
hz shebang portable 2 years ago
importdoc module updates 4 years ago
makedocs disable pcss when installing since modules don't yet work and pcss uses the view module, plus weekly doc update 7 years ago
messages.po renamed include files identity.php (channel.php) and Contact.php (connections.php) 4 years ago
nconfig.php Drop on switch for notifications 3 years ago
pconfig util/pconfig - don't enumerate empty arrays, mod_acl - add more comments 3 years ago
php2po.php php2po.php unify quote/unquote 1 year ago
po2php.php Better plural function detection 9 months 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. 6 years ago shebang portable 2 years ago
safemode new utility: util/safemode (on or off); requires util/addons 4 years ago
schemaspy Correct directory (this runs from inside hubzilla_er 4 years ago
service_class clone systems apps to the extent possible, auto-configure imagick thumbnail binary during setup if possible 1 year ago
storageconv resolve merge conflict 1 year ago
strings.php static App 4 years ago
thumbrepair Prevent image blurring 9 months ago
tpldebug.php quick and dirty (real dirty) template doco 7 years ago
typo.php util/typo - perform php -l and then include the file. We'll catch a bunch more stuff. 2 years ago
typohelper.php ditto for typohelper 4 years ago
udall Recreate MR#1419 for dev branch 1 year ago
update_addon_repo update_addon_repo: scan the addon dir after updating and remove dead symlinks (which represent deprecated/removed addons). 2 years ago
update_theme_repo merge util/update_theme_repo from dev 1 year ago
update_widget_repo address globbing issue in #1170 2 years ago allow empty path input to use '.' rather than bail with error 7 years 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.


extract.php - extracts translatable strings from our project files. It
currently doesn't pick up strings in other libraries we might be using such as
tinymce, simplepie, and the HTML parsers.

In order for extract to do its job, every use of the t() translation function
must be preceded by one space. The string also can not contain parentheses. If
parens are required in a string which requires translation, please use hex escapes.

\x28 = (
\x29 = )

This only applies to English. Other languages may use parens in strings
because they don't require extraction.

strings.php - a recent run of the strings 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.