Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Good way to eliminate duplicates in pot file #73

Open
ngocphamm opened this issue Feb 7, 2018 · 8 comments
Open

Good way to eliminate duplicates in pot file #73

ngocphamm opened this issue Feb 7, 2018 · 8 comments

Comments

@ngocphamm
Copy link

As the title says, I'm trying to find a way to eliminate duplicates in pot file.

The job can be achieved by using msguniq command and I can run it manually in Terminal but I'm wondering if I can do that from within this plugin. I know there is the processPot callback function to play with the resulted pot file, but I'm not quite familiar with how it should work.

Does anyone have experience with this? If yes can you let me know how it should be done?

Thank you all!

@bradyvercher
Copy link
Member

Hi @ngocphamm, duplicate strings should already be removed from the generated POT file if your'e using this module. Let me know if you're seeing duplicates after running it, though.

@ngocphamm
Copy link
Author

ngocphamm commented Feb 7, 2018

Thanks for super fast response @bradyvercher!

So for now I have this in Gruntfile.js

makepot: {
    plg: {
        options: {
            cwd: '<%= dir.dest %>',
            domainPath: '/languages',               // Where to save the POT file.
            mainFile: '<%= cfg.mainFile %>',        // Main project file.
            potFilename: '<%= cfg.slug %>.pot',     // Name of the POT file.
            type: 'wp-plugin',                      // Type of project (wp-plugin or wp-theme).
            exclude: [],                            // List of files or directories to ignore.
            potHeaders: {
                poedit: true,
                'report-msgid-bugs-to': '<%= cfg.contactLink %>',
                'plural-forms': 'nplurals=2; plural=n != ',
                'last-translator': '<%= cfg.langTeamEmail %>',
                'language-team': '<%= cfg.langTeamEmail %>',
                'x-textdomain-support': 'yes',
                'x-poedit-keywordslist': true
            },
            processPot: null
        }
    }
},

Then the generated pot file has these 2 duplicated entries

#. Plugin Name of the plugin/theme
msgid "My Plugin Name"
msgstr ""

#: class/class-plugin.php:56
msgid "My Plugin Name"
msgstr ""

because of this piece of code, I suppose.

add_action( 'admin_menu', function() {
			add_menu_page(
				__( 'My Plugin Name', 'plg-slug' ),       // Page title.
				__( 'My Plugin Name', 'plg-slug' ), // Menu title.
				'manage_options',
				SETTING_PAGE,
				array( '\MyPlugin\Plugin', 'config_page' ),
				Helper::get_base64_icon(),
				'99.999'
			);
		} );

Should there not be duplicates in this case?

@bradyvercher
Copy link
Member

Hmm, I'm not sure about that one.

That first entry is the name of the plugin from the header in your main plugin file.

The second entry comes from that add_menu_page() call, but even though you have two gettext calls there with the same string, those aren't being duplicated.

Deduplication in this module relies on the gettext-parser module, so it may consider something about those strings to be unique. Maybe the presence of a comment for the plugin header entry? The delimiter is different (#. vs #:), so the comment may be serving as context to differentiate the strings.

I haven't looked into this before, so that's all I have for now without digging in deeper.

@ngocphamm
Copy link
Author

I think you are right, as the 2 lines for Page title and Menu title don't get duplicates.

But there's probably nothing to do for now. Do you have an idea of how to run the msguniq within processPot method? That could be one way to fix it at this time.

@bradyvercher
Copy link
Member

If the header is being disambiguated with context, then even msguniq should treat them as separate strings.

For example, you can try adding a call to _x( 'My Plugin Name', 'context comment', 'plg-slug' ) in one of your plugin files and running the makepot task. You should see a third entry for the same string.

processPot wouldn't be the best place to call msguniq if you wanted to go down that road. That callback lets you work with the POT object in JavaScript before it's serialized into a POT file. You would want to wait until after the makepot task had completed before running msguniq against the generated POT file.

If you really want to remove the plugin header, this example should help.

@ngocphamm
Copy link
Author

I ran msguniq against the resulted pot file and it did merge the entries so I guess it works.

Thanks for the example! I will look around for some more info. I really appreciate your help!

@bradyvercher
Copy link
Member

Thanks for letting me know about msguniq merging them and keep me updated if you discover anything new!

@ngocphamm
Copy link
Author

So now I have a separate task, which will be executed after makepot to make sure the pot file will only have unique msgids.

        exec: {
            potunique: {
                expand: true,
                cwd: '<%= dir.dest %>/languages',
                cmd: '/usr/local/bin/msguniq <%= cfg.slug %>.pot -o <%= cfg.slug %>.pot'
            }
        }```

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants